From 336de7da7bf00ffa92c96a3f6664c9bbf8a465c4 Mon Sep 17 00:00:00 2001 From: Austen Stone Date: Fri, 26 Apr 2024 12:43:58 -0400 Subject: [PATCH] ncc --- LICENSE | 13 +- dist/index.js | 19 +- dist/index.js.LICENSE.txt | 3 - dist/index.js.map | 1 - dist/job-summary.js | 260 +++ dist/run.js | 117 ++ package-lock.json | 4003 ++----------------------------------- package.json | 3 +- src/run.ts | 4 +- 9 files changed, 601 insertions(+), 3822 deletions(-) delete mode 100644 dist/index.js.LICENSE.txt delete mode 100644 dist/index.js.map create mode 100644 dist/job-summary.js create mode 100644 dist/run.js diff --git a/LICENSE b/LICENSE index a426ef2..5f9e342 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,6 @@ +MIT License -The MIT License (MIT) - -Copyright (c) 2018 GitHub, Inc. and contributors +Copyright GitHub Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10,13 +9,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 03fafca..4960ae1 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1,18 @@ -(()=>{var __webpack_modules__={1119:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nconst client_1 = __webpack_require__(70900);\n__exportStar(__webpack_require__(84093), exports);\n__exportStar(__webpack_require__(14842), exports);\n__exportStar(__webpack_require__(70900), exports);\nconst client = new client_1.DefaultArtifactClient();\nexports["default"] = client;\n//# sourceMappingURL=artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTExOS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFtQjtBQUM1QyxhQUFhLG1CQUFPLENBQUMsS0FBOEI7QUFDbkQsYUFBYSxtQkFBTyxDQUFDLEtBQTBCO0FBQy9DLGFBQWEsbUJBQU8sQ0FBQyxLQUFtQjtBQUN4QztBQUNBLGtCQUFlO0FBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9hcnRpZmFjdC5qcz9hNGY1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjbGllbnRfMSA9IHJlcXVpcmUoXCIuL2ludGVybmFsL2NsaWVudFwiKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9pbnRlcm5hbC9zaGFyZWQvaW50ZXJmYWNlc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaW50ZXJuYWwvc2hhcmVkL2Vycm9yc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaW50ZXJuYWwvY2xpZW50XCIpLCBleHBvcnRzKTtcbmNvbnN0IGNsaWVudCA9IG5ldyBjbGllbnRfMS5EZWZhdWx0QXJ0aWZhY3RDbGllbnQoKTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFydGlmYWN0LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1119\n')},67091:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.Timestamp = void 0;\nconst runtime_1 = __webpack_require__(47764);\nconst runtime_2 = __webpack_require__(47764);\nconst runtime_3 = __webpack_require__(47764);\nconst runtime_4 = __webpack_require__(47764);\nconst runtime_5 = __webpack_require__(47764);\nconst runtime_6 = __webpack_require__(47764);\nconst runtime_7 = __webpack_require__(47764);\n// @generated message type with reflection information, may provide speed optimized methods\nclass Timestamp$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.Timestamp", [\n { no: 1, name: "seconds", kind: "scalar", T: 3 /*ScalarType.INT64*/ },\n { no: 2, name: "nanos", kind: "scalar", T: 5 /*ScalarType.INT32*/ }\n ]);\n }\n /**\n * Creates a new `Timestamp` for the current time.\n */\n now() {\n const msg = this.create();\n const ms = Date.now();\n msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString();\n msg.nanos = (ms % 1000) * 1000000;\n return msg;\n }\n /**\n * Converts a `Timestamp` to a JavaScript Date.\n */\n toDate(message) {\n return new Date(runtime_6.PbLong.from(message.seconds).toNumber() * 1000 + Math.ceil(message.nanos / 1000000));\n }\n /**\n * Converts a JavaScript Date to a `Timestamp`.\n */\n fromDate(date) {\n const msg = this.create();\n const ms = date.getTime();\n msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString();\n msg.nanos = (ms % 1000) * 1000000;\n return msg;\n }\n /**\n * In JSON format, the `Timestamp` type is encoded as a string\n * in the RFC 3339 format.\n */\n internalJsonWrite(message, options) {\n let ms = runtime_6.PbLong.from(message.seconds).toNumber() * 1000;\n if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z"))\n throw new Error("Unable to encode Timestamp to JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");\n if (message.nanos < 0)\n throw new Error("Unable to encode invalid Timestamp to JSON. Nanos must not be negative.");\n let z = "Z";\n if (message.nanos > 0) {\n let nanosStr = (message.nanos + 1000000000).toString().substring(1);\n if (nanosStr.substring(3) === "000000")\n z = "." + nanosStr.substring(0, 3) + "Z";\n else if (nanosStr.substring(6) === "000")\n z = "." + nanosStr.substring(0, 6) + "Z";\n else\n z = "." + nanosStr + "Z";\n }\n return new Date(ms).toISOString().replace(".000Z", z);\n }\n /**\n * In JSON format, the `Timestamp` type is encoded as a string\n * in the RFC 3339 format.\n */\n internalJsonRead(json, options, target) {\n if (typeof json !== "string")\n throw new Error("Unable to parse Timestamp from JSON " + (0, runtime_5.typeofJsonValue)(json) + ".");\n let matches = json.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);\n if (!matches)\n throw new Error("Unable to parse Timestamp from JSON. Invalid format.");\n let ms = Date.parse(matches[1] + "-" + matches[2] + "-" + matches[3] + "T" + matches[4] + ":" + matches[5] + ":" + matches[6] + (matches[8] ? matches[8] : "Z"));\n if (Number.isNaN(ms))\n throw new Error("Unable to parse Timestamp from JSON. Invalid value.");\n if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z"))\n throw new globalThis.Error("Unable to parse Timestamp from JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");\n if (!target)\n target = this.create();\n target.seconds = runtime_6.PbLong.from(ms / 1000).toString();\n target.nanos = 0;\n if (matches[7])\n target.nanos = (parseInt("1" + matches[7] + "0".repeat(9 - matches[7].length)) - 1000000000);\n return target;\n }\n create(value) {\n const message = { seconds: "0", nanos: 0 };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* int64 seconds */ 1:\n message.seconds = reader.int64().toString();\n break;\n case /* int32 nanos */ 2:\n message.nanos = reader.int32();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* int64 seconds = 1; */\n if (message.seconds !== "0")\n writer.tag(1, runtime_1.WireType.Varint).int64(message.seconds);\n /* int32 nanos = 2; */\n if (message.nanos !== 0)\n writer.tag(2, runtime_1.WireType.Varint).int32(message.nanos);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.Timestamp\n */\nexports.Timestamp = new Timestamp$Type();\n//# sourceMappingURL=timestamp.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjcwOTEuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsaUJBQWlCO0FBQ2pCLGtCQUFrQixtQkFBTyxDQUFDLEtBQXNCO0FBQ2hELGtCQUFrQixtQkFBTyxDQUFDLEtBQXNCO0FBQ2hELGtCQUFrQixtQkFBTyxDQUFDLEtBQXNCO0FBQ2hELGtCQUFrQixtQkFBTyxDQUFDLEtBQXNCO0FBQ2hELGtCQUFrQixtQkFBTyxDQUFDLEtBQXNCO0FBQ2hELGtCQUFrQixtQkFBTyxDQUFDLEtBQXNCO0FBQ2hELGtCQUFrQixtQkFBTyxDQUFDLEtBQXNCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxtRUFBbUU7QUFDakYsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsZUFBZSxJQUFJO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDRFQUE0RSxnQ0FBZ0M7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVMsYUFBYSxTQUFTLFFBQVEsY0FBYztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2dlbmVyYXRlZC9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLmpzP2ZjN2QiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRpbWVzdGFtcCA9IHZvaWQgMDtcbmNvbnN0IHJ1bnRpbWVfMSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfMiA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfMyA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNCA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNiA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNyA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIFRpbWVzdGFtcCRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuVGltZXN0YW1wXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwic2Vjb25kc1wiLCBraW5kOiBcInNjYWxhclwiLCBUOiAzIC8qU2NhbGFyVHlwZS5JTlQ2NCovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcIm5hbm9zXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgVGltZXN0YW1wYCBmb3IgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgKi9cbiAgICBub3coKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIGNvbnN0IG1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbXNnLnNlY29uZHMgPSBydW50aW1lXzYuUGJMb25nLmZyb20oTWF0aC5mbG9vcihtcyAvIDEwMDApKS50b1N0cmluZygpO1xuICAgICAgICBtc2cubmFub3MgPSAobXMgJSAxMDAwKSAqIDEwMDAwMDA7XG4gICAgICAgIHJldHVybiBtc2c7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgYFRpbWVzdGFtcGAgdG8gYSBKYXZhU2NyaXB0IERhdGUuXG4gICAgICovXG4gICAgdG9EYXRlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHJ1bnRpbWVfNi5QYkxvbmcuZnJvbShtZXNzYWdlLnNlY29uZHMpLnRvTnVtYmVyKCkgKiAxMDAwICsgTWF0aC5jZWlsKG1lc3NhZ2UubmFub3MgLyAxMDAwMDAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBEYXRlIHRvIGEgYFRpbWVzdGFtcGAuXG4gICAgICovXG4gICAgZnJvbURhdGUoZGF0ZSkge1xuICAgICAgICBjb25zdCBtc2cgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBtcyA9IGRhdGUuZ2V0VGltZSgpO1xuICAgICAgICBtc2cuc2Vjb25kcyA9IHJ1bnRpbWVfNi5QYkxvbmcuZnJvbShNYXRoLmZsb29yKG1zIC8gMTAwMCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIG1zZy5uYW5vcyA9IChtcyAlIDEwMDApICogMTAwMDAwMDtcbiAgICAgICAgcmV0dXJuIG1zZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW4gSlNPTiBmb3JtYXQsIHRoZSBgVGltZXN0YW1wYCB0eXBlIGlzIGVuY29kZWQgYXMgYSBzdHJpbmdcbiAgICAgKiBpbiB0aGUgUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG1zID0gcnVudGltZV82LlBiTG9uZy5mcm9tKG1lc3NhZ2Uuc2Vjb25kcykudG9OdW1iZXIoKSAqIDEwMDA7XG4gICAgICAgIGlmIChtcyA8IERhdGUucGFyc2UoXCIwMDAxLTAxLTAxVDAwOjAwOjAwWlwiKSB8fCBtcyA+IERhdGUucGFyc2UoXCI5OTk5LTEyLTMxVDIzOjU5OjU5WlwiKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBlbmNvZGUgVGltZXN0YW1wIHRvIEpTT04uIE11c3QgYmUgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuXCIpO1xuICAgICAgICBpZiAobWVzc2FnZS5uYW5vcyA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZW5jb2RlIGludmFsaWQgVGltZXN0YW1wIHRvIEpTT04uIE5hbm9zIG11c3Qgbm90IGJlIG5lZ2F0aXZlLlwiKTtcbiAgICAgICAgbGV0IHogPSBcIlpcIjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubmFub3MgPiAwKSB7XG4gICAgICAgICAgICBsZXQgbmFub3NTdHIgPSAobWVzc2FnZS5uYW5vcyArIDEwMDAwMDAwMDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgaWYgKG5hbm9zU3RyLnN1YnN0cmluZygzKSA9PT0gXCIwMDAwMDBcIilcbiAgICAgICAgICAgICAgICB6ID0gXCIuXCIgKyBuYW5vc1N0ci5zdWJzdHJpbmcoMCwgMykgKyBcIlpcIjtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbm9zU3RyLnN1YnN0cmluZyg2KSA9PT0gXCIwMDBcIilcbiAgICAgICAgICAgICAgICB6ID0gXCIuXCIgKyBuYW5vc1N0ci5zdWJzdHJpbmcoMCwgNikgKyBcIlpcIjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB6ID0gXCIuXCIgKyBuYW5vc1N0ciArIFwiWlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShtcykudG9JU09TdHJpbmcoKS5yZXBsYWNlKFwiLjAwMFpcIiwgeik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluIEpTT04gZm9ybWF0LCB0aGUgYFRpbWVzdGFtcGAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nXG4gICAgICogaW4gdGhlIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcGFyc2UgVGltZXN0YW1wIGZyb20gSlNPTiBcIiArICgwLCBydW50aW1lXzUudHlwZW9mSnNvblZhbHVlKShqc29uKSArIFwiLlwiKTtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBqc29uLm1hdGNoKC9eKFswLTldezR9KS0oWzAtOV17Mn0pLShbMC05XXsyfSlUKFswLTldezJ9KTooWzAtOV17Mn0pOihbMC05XXsyfSkoPzpafFxcLihbMC05XXszLDl9KVp8KFsrLV1bMC05XVswLTldOlswLTldWzAtOV0pKSQvKTtcbiAgICAgICAgaWYgKCFtYXRjaGVzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHBhcnNlIFRpbWVzdGFtcCBmcm9tIEpTT04uIEludmFsaWQgZm9ybWF0LlwiKTtcbiAgICAgICAgbGV0IG1zID0gRGF0ZS5wYXJzZShtYXRjaGVzWzFdICsgXCItXCIgKyBtYXRjaGVzWzJdICsgXCItXCIgKyBtYXRjaGVzWzNdICsgXCJUXCIgKyBtYXRjaGVzWzRdICsgXCI6XCIgKyBtYXRjaGVzWzVdICsgXCI6XCIgKyBtYXRjaGVzWzZdICsgKG1hdGNoZXNbOF0gPyBtYXRjaGVzWzhdIDogXCJaXCIpKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihtcykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcGFyc2UgVGltZXN0YW1wIGZyb20gSlNPTi4gSW52YWxpZCB2YWx1ZS5cIik7XG4gICAgICAgIGlmIChtcyA8IERhdGUucGFyc2UoXCIwMDAxLTAxLTAxVDAwOjAwOjAwWlwiKSB8fCBtcyA+IERhdGUucGFyc2UoXCI5OTk5LTEyLTMxVDIzOjU5OjU5WlwiKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKFwiVW5hYmxlIHRvIHBhcnNlIFRpbWVzdGFtcCBmcm9tIEpTT04uIE11c3QgYmUgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuXCIpO1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC5zZWNvbmRzID0gcnVudGltZV82LlBiTG9uZy5mcm9tKG1zIC8gMTAwMCkudG9TdHJpbmcoKTtcbiAgICAgICAgdGFyZ2V0Lm5hbm9zID0gMDtcbiAgICAgICAgaWYgKG1hdGNoZXNbN10pXG4gICAgICAgICAgICB0YXJnZXQubmFub3MgPSAocGFyc2VJbnQoXCIxXCIgKyBtYXRjaGVzWzddICsgXCIwXCIucmVwZWF0KDkgLSBtYXRjaGVzWzddLmxlbmd0aCkpIC0gMTAwMDAwMDAwMCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyBzZWNvbmRzOiBcIjBcIiwgbmFub3M6IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50NjQgc2Vjb25kcyAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlY29uZHMgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIG5hbm9zICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFub3MgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogaW50NjQgc2Vjb25kcyA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNlY29uZHMgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLnNlY29uZHMpO1xuICAgICAgICAvKiBpbnQzMiBuYW5vcyA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbm9zICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLm5hbm9zKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wXG4gKi9cbmV4cG9ydHMuVGltZXN0YW1wID0gbmV3IFRpbWVzdGFtcCRUeXBlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lc3RhbXAuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///67091\n')},63003:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.BytesValue = exports.StringValue = exports.BoolValue = exports.UInt32Value = exports.Int32Value = exports.UInt64Value = exports.Int64Value = exports.FloatValue = exports.DoubleValue = void 0;\n// @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies\n// @generated from protobuf file "google/protobuf/wrappers.proto" (package "google.protobuf", syntax proto3)\n// tslint:disable\n//\n// Protocol Buffers - Google\'s data interchange format\n// Copyright 2008 Google Inc. All rights reserved.\n// https://developers.google.com/protocol-buffers/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//\n// Wrappers for primitive (non-message) types. These types are useful\n// for embedding primitives in the `google.protobuf.Any` type and for places\n// where we need to distinguish between the absence of a primitive\n// typed field and its default value.\n//\nconst runtime_1 = __webpack_require__(47764);\nconst runtime_2 = __webpack_require__(47764);\nconst runtime_3 = __webpack_require__(47764);\nconst runtime_4 = __webpack_require__(47764);\nconst runtime_5 = __webpack_require__(47764);\nconst runtime_6 = __webpack_require__(47764);\nconst runtime_7 = __webpack_require__(47764);\n// @generated message type with reflection information, may provide speed optimized methods\nclass DoubleValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.DoubleValue", [\n { no: 1, name: "value", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ }\n ]);\n }\n /**\n * Encode `DoubleValue` to JSON number.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(2, message.value, "value", false, true);\n }\n /**\n * Decode `DoubleValue` from JSON number.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 1, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: 0 };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* double value */ 1:\n message.value = reader.double();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* double value = 1; */\n if (message.value !== 0)\n writer.tag(1, runtime_3.WireType.Bit64).double(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.DoubleValue\n */\nexports.DoubleValue = new DoubleValue$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass FloatValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.FloatValue", [\n { no: 1, name: "value", kind: "scalar", T: 2 /*ScalarType.FLOAT*/ }\n ]);\n }\n /**\n * Encode `FloatValue` to JSON number.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(1, message.value, "value", false, true);\n }\n /**\n * Decode `FloatValue` from JSON number.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 1, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: 0 };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* float value */ 1:\n message.value = reader.float();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* float value = 1; */\n if (message.value !== 0)\n writer.tag(1, runtime_3.WireType.Bit32).float(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.FloatValue\n */\nexports.FloatValue = new FloatValue$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass Int64Value$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.Int64Value", [\n { no: 1, name: "value", kind: "scalar", T: 3 /*ScalarType.INT64*/ }\n ]);\n }\n /**\n * Encode `Int64Value` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(runtime_1.ScalarType.INT64, message.value, "value", false, true);\n }\n /**\n * Decode `Int64Value` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, runtime_1.ScalarType.INT64, runtime_2.LongType.STRING, "value");\n return target;\n }\n create(value) {\n const message = { value: "0" };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* int64 value */ 1:\n message.value = reader.int64().toString();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* int64 value = 1; */\n if (message.value !== "0")\n writer.tag(1, runtime_3.WireType.Varint).int64(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.Int64Value\n */\nexports.Int64Value = new Int64Value$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass UInt64Value$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.UInt64Value", [\n { no: 1, name: "value", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }\n ]);\n }\n /**\n * Encode `UInt64Value` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(runtime_1.ScalarType.UINT64, message.value, "value", false, true);\n }\n /**\n * Decode `UInt64Value` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, runtime_1.ScalarType.UINT64, runtime_2.LongType.STRING, "value");\n return target;\n }\n create(value) {\n const message = { value: "0" };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* uint64 value */ 1:\n message.value = reader.uint64().toString();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* uint64 value = 1; */\n if (message.value !== "0")\n writer.tag(1, runtime_3.WireType.Varint).uint64(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.UInt64Value\n */\nexports.UInt64Value = new UInt64Value$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass Int32Value$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.Int32Value", [\n { no: 1, name: "value", kind: "scalar", T: 5 /*ScalarType.INT32*/ }\n ]);\n }\n /**\n * Encode `Int32Value` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(5, message.value, "value", false, true);\n }\n /**\n * Decode `Int32Value` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 5, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: 0 };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* int32 value */ 1:\n message.value = reader.int32();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* int32 value = 1; */\n if (message.value !== 0)\n writer.tag(1, runtime_3.WireType.Varint).int32(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.Int32Value\n */\nexports.Int32Value = new Int32Value$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass UInt32Value$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.UInt32Value", [\n { no: 1, name: "value", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }\n ]);\n }\n /**\n * Encode `UInt32Value` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(13, message.value, "value", false, true);\n }\n /**\n * Decode `UInt32Value` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 13, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: 0 };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* uint32 value */ 1:\n message.value = reader.uint32();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* uint32 value = 1; */\n if (message.value !== 0)\n writer.tag(1, runtime_3.WireType.Varint).uint32(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.UInt32Value\n */\nexports.UInt32Value = new UInt32Value$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass BoolValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.BoolValue", [\n { no: 1, name: "value", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }\n ]);\n }\n /**\n * Encode `BoolValue` to JSON bool.\n */\n internalJsonWrite(message, options) {\n return message.value;\n }\n /**\n * Decode `BoolValue` from JSON bool.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 8, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: false };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bool value */ 1:\n message.value = reader.bool();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bool value = 1; */\n if (message.value !== false)\n writer.tag(1, runtime_3.WireType.Varint).bool(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.BoolValue\n */\nexports.BoolValue = new BoolValue$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass StringValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.StringValue", [\n { no: 1, name: "value", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n /**\n * Encode `StringValue` to JSON string.\n */\n internalJsonWrite(message, options) {\n return message.value;\n }\n /**\n * Decode `StringValue` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 9, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: "" };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string value */ 1:\n message.value = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string value = 1; */\n if (message.value !== "")\n writer.tag(1, runtime_3.WireType.LengthDelimited).string(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.StringValue\n */\nexports.StringValue = new StringValue$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass BytesValue$Type extends runtime_7.MessageType {\n constructor() {\n super("google.protobuf.BytesValue", [\n { no: 1, name: "value", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }\n ]);\n }\n /**\n * Encode `BytesValue` to JSON string.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.scalar(12, message.value, "value", false, true);\n }\n /**\n * Decode `BytesValue` from JSON string.\n */\n internalJsonRead(json, options, target) {\n if (!target)\n target = this.create();\n target.value = this.refJsonReader.scalar(json, 12, undefined, "value");\n return target;\n }\n create(value) {\n const message = { value: new Uint8Array(0) };\n globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_5.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bytes value */ 1:\n message.value = reader.bytes();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bytes value = 1; */\n if (message.value.length)\n writer.tag(1, runtime_3.WireType.LengthDelimited).bytes(message.value);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message google.protobuf.BytesValue\n */\nexports.BytesValue = new BytesValue$Type();\n//# sourceMappingURL=wrappers.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQiw0RUFBNEUsZ0NBQWdDO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxTQUFTLGFBQWEsU0FBUyxRQUFRLGNBQWM7QUFDekg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvZ2VuZXJhdGVkL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5qcz84MmU5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CeXRlc1ZhbHVlID0gZXhwb3J0cy5TdHJpbmdWYWx1ZSA9IGV4cG9ydHMuQm9vbFZhbHVlID0gZXhwb3J0cy5VSW50MzJWYWx1ZSA9IGV4cG9ydHMuSW50MzJWYWx1ZSA9IGV4cG9ydHMuVUludDY0VmFsdWUgPSBleHBvcnRzLkludDY0VmFsdWUgPSBleHBvcnRzLkZsb2F0VmFsdWUgPSBleHBvcnRzLkRvdWJsZVZhbHVlID0gdm9pZCAwO1xuLy8gQGdlbmVyYXRlZCBieSBwcm90b2J1Zi10cyAyLjkuMSB3aXRoIHBhcmFtZXRlciBsb25nX3R5cGVfc3RyaW5nLGNsaWVudF9ub25lLGdlbmVyYXRlX2RlcGVuZGVuY2llc1xuLy8gQGdlbmVyYXRlZCBmcm9tIHByb3RvYnVmIGZpbGUgXCJnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG9cIiAocGFja2FnZSBcImdvb2dsZS5wcm90b2J1ZlwiLCBzeW50YXggcHJvdG8zKVxuLy8gdHNsaW50OmRpc2FibGVcbi8vXG4vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXRcbi8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbi8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbi8vIG1ldDpcbi8vXG4vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuLy8gZGlzdHJpYnV0aW9uLlxuLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbi8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4vL1xuLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuLy8gXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbi8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuLy9cbi8vXG4vLyBXcmFwcGVycyBmb3IgcHJpbWl0aXZlIChub24tbWVzc2FnZSkgdHlwZXMuIFRoZXNlIHR5cGVzIGFyZSB1c2VmdWxcbi8vIGZvciBlbWJlZGRpbmcgcHJpbWl0aXZlcyBpbiB0aGUgYGdvb2dsZS5wcm90b2J1Zi5BbnlgIHR5cGUgYW5kIGZvciBwbGFjZXNcbi8vIHdoZXJlIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgYWJzZW5jZSBvZiBhIHByaW1pdGl2ZVxuLy8gdHlwZWQgZmllbGQgYW5kIGl0cyBkZWZhdWx0IHZhbHVlLlxuLy9cbmNvbnN0IHJ1bnRpbWVfMSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfMiA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfMyA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNCA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNiA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbmNvbnN0IHJ1bnRpbWVfNyA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIERvdWJsZVZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDEgLypTY2FsYXJUeXBlLkRPVUJMRSovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBgRG91YmxlVmFsdWVgIHRvIEpTT04gbnVtYmVyLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIoMiwgbWVzc2FnZS52YWx1ZSwgXCJ2YWx1ZVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgRG91YmxlVmFsdWVgIGZyb20gSlNPTiBudW1iZXIuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDEsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiAwIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGRvdWJsZSB2YWx1ZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBkb3VibGUgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLkJpdDY0KS5kb3VibGUobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlXG4gKi9cbmV4cG9ydHMuRG91YmxlVmFsdWUgPSBuZXcgRG91YmxlVmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgRmxvYXRWYWx1ZSRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDIgLypTY2FsYXJUeXBlLkZMT0FUKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBGbG9hdFZhbHVlYCB0byBKU09OIG51bWJlci5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZkpzb25Xcml0ZXIuc2NhbGFyKDEsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEZsb2F0VmFsdWVgIGZyb20gSlNPTiBudW1iZXIuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDEsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiAwIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGZsb2F0IHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogZmxvYXQgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLkJpdDMyKS5mbG9hdChtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZVxuICovXG5leHBvcnRzLkZsb2F0VmFsdWUgPSBuZXcgRmxvYXRWYWx1ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBJbnQ2NFZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYEludDY0VmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIocnVudGltZV8xLlNjYWxhclR5cGUuSU5UNjQsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEludDY0VmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIHJ1bnRpbWVfMS5TY2FsYXJUeXBlLklOVDY0LCBydW50aW1lXzIuTG9uZ1R5cGUuU1RSSU5HLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IFwiMFwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDY0IHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBpbnQ2NCB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSBcIjBcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLlZhcmludCkuaW50NjQobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWVcbiAqL1xuZXhwb3J0cy5JbnQ2NFZhbHVlID0gbmV3IEludDY0VmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgVUludDY0VmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNCAvKlNjYWxhclR5cGUuVUlOVDY0Ki8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBVSW50NjRWYWx1ZWAgdG8gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZKc29uV3JpdGVyLnNjYWxhcihydW50aW1lXzEuU2NhbGFyVHlwZS5VSU5UNjQsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYFVJbnQ2NFZhbHVlYCBmcm9tIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvblJlYWQoanNvbiwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgdGFyZ2V0LnZhbHVlID0gdGhpcy5yZWZKc29uUmVhZGVyLnNjYWxhcihqc29uLCBydW50aW1lXzEuU2NhbGFyVHlwZS5VSU5UNjQsIHJ1bnRpbWVfMi5Mb25nVHlwZS5TVFJJTkcsIFwidmFsdWVcIik7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB2YWx1ZTogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogdWludDY0IHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIudWludDY0KCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogdWludDY0IHZhbHVlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuVmFyaW50KS51aW50NjQobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlXG4gKi9cbmV4cG9ydHMuVUludDY0VmFsdWUgPSBuZXcgVUludDY0VmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgSW50MzJWYWx1ZSRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBJbnQzMlZhbHVlYCB0byBKU09OIHN0cmluZy5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZkpzb25Xcml0ZXIuc2NhbGFyKDUsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEludDMyVmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDUsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiAwIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogaW50MzIgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVcbiAqL1xuZXhwb3J0cy5JbnQzMlZhbHVlID0gbmV3IEludDMyVmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgVUludDMyVmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMTMgLypTY2FsYXJUeXBlLlVJTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBgVUludDMyVmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIoMTMsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYFVJbnQzMlZhbHVlYCBmcm9tIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvblJlYWQoanNvbiwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgdGFyZ2V0LnZhbHVlID0gdGhpcy5yZWZKc29uUmVhZGVyLnNjYWxhcihqc29uLCAxMywgdW5kZWZpbmVkLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogdWludDMyIHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHVpbnQzMiB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuVmFyaW50KS51aW50MzIobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlXG4gKi9cbmV4cG9ydHMuVUludDMyVmFsdWUgPSBuZXcgVUludDMyVmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgQm9vbFZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ2YWx1ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA4IC8qU2NhbGFyVHlwZS5CT09MKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBCb29sVmFsdWVgIHRvIEpTT04gYm9vbC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEJvb2xWYWx1ZWAgZnJvbSBKU09OIGJvb2wuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDgsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiBmYWxzZSB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzYuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV81LnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBib29sIHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBib29sIHZhbHVlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2UudmFsdWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVcbiAqL1xuZXhwb3J0cy5Cb29sVmFsdWUgPSBuZXcgQm9vbFZhbHVlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIFN0cmluZ1ZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBgU3RyaW5nVmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgU3RyaW5nVmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDksIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB2YWx1ZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudmFsdWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVxuICovXG5leHBvcnRzLlN0cmluZ1ZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEJ5dGVzVmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ2YWx1ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiAxMiAvKlNjYWxhclR5cGUuQllURVMqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYEJ5dGVzVmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIoMTIsIG1lc3NhZ2UudmFsdWUsIFwidmFsdWVcIiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYEJ5dGVzVmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDEyLCB1bmRlZmluZWQsIFwidmFsdWVcIik7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkoMCkgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYnl0ZXMgdmFsdWUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBieXRlcyB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlLmxlbmd0aClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8zLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuYnl0ZXMobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWVcbiAqL1xuZXhwb3J0cy5CeXRlc1ZhbHVlID0gbmV3IEJ5dGVzVmFsdWUkVHlwZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d3JhcHBlcnMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///63003\n')},10735:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\n__exportStar(__webpack_require__(67091), exports);\n__exportStar(__webpack_require__(63003), exports);\n__exportStar(__webpack_require__(51585), exports);\n__exportStar(__webpack_require__(69565), exports);\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3MzUuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsYUFBYSxtQkFBTyxDQUFDLEtBQTZCO0FBQ2xELGFBQWEsbUJBQU8sQ0FBQyxLQUE0QjtBQUNqRCxhQUFhLG1CQUFPLENBQUMsS0FBMkI7QUFDaEQsYUFBYSxtQkFBTyxDQUFDLEtBQWlDO0FBQ3REIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvZ2VuZXJhdGVkL2luZGV4LmpzPzM2NGYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3Jlc3VsdHMvYXBpL3YxL2FydGlmYWN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9yZXN1bHRzL2FwaS92MS9hcnRpZmFjdC50d2lycFwiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///10735\n')},51585:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.ArtifactService = exports.DeleteArtifactResponse = exports.DeleteArtifactRequest = exports.GetSignedArtifactURLResponse = exports.GetSignedArtifactURLRequest = exports.ListArtifactsResponse_MonolithArtifact = exports.ListArtifactsResponse = exports.ListArtifactsRequest = exports.FinalizeArtifactResponse = exports.FinalizeArtifactRequest = exports.CreateArtifactResponse = exports.CreateArtifactRequest = void 0;\n// @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies\n// @generated from protobuf file "results/api/v1/artifact.proto" (package "github.actions.results.api.v1", syntax proto3)\n// tslint:disable\nconst runtime_rpc_1 = __webpack_require__(28003);\nconst runtime_1 = __webpack_require__(47764);\nconst runtime_2 = __webpack_require__(47764);\nconst runtime_3 = __webpack_require__(47764);\nconst runtime_4 = __webpack_require__(47764);\nconst runtime_5 = __webpack_require__(47764);\nconst wrappers_1 = __webpack_require__(63003);\nconst wrappers_2 = __webpack_require__(63003);\nconst timestamp_1 = __webpack_require__(67091);\n// @generated message type with reflection information, may provide speed optimized methods\nclass CreateArtifactRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.CreateArtifactRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 4, name: "expires_at", kind: "message", T: () => timestamp_1.Timestamp },\n { no: 5, name: "version", kind: "scalar", T: 5 /*ScalarType.INT32*/ }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "", version: 0 };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* string name */ 3:\n message.name = reader.string();\n break;\n case /* google.protobuf.Timestamp expires_at */ 4:\n message.expiresAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.expiresAt);\n break;\n case /* int32 version */ 5:\n message.version = reader.int32();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* string name = 3; */\n if (message.name !== "")\n writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name);\n /* google.protobuf.Timestamp expires_at = 4; */\n if (message.expiresAt)\n timestamp_1.Timestamp.internalBinaryWrite(message.expiresAt, writer.tag(4, runtime_1.WireType.LengthDelimited).fork(), options).join();\n /* int32 version = 5; */\n if (message.version !== 0)\n writer.tag(5, runtime_1.WireType.Varint).int32(message.version);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.CreateArtifactRequest\n */\nexports.CreateArtifactRequest = new CreateArtifactRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass CreateArtifactResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.CreateArtifactResponse", [\n { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },\n { no: 2, name: "signed_upload_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n create(value) {\n const message = { ok: false, signedUploadUrl: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bool ok */ 1:\n message.ok = reader.bool();\n break;\n case /* string signed_upload_url */ 2:\n message.signedUploadUrl = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bool ok = 1; */\n if (message.ok !== false)\n writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);\n /* string signed_upload_url = 2; */\n if (message.signedUploadUrl !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.signedUploadUrl);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.CreateArtifactResponse\n */\nexports.CreateArtifactResponse = new CreateArtifactResponse$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass FinalizeArtifactRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.FinalizeArtifactRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 4, name: "size", kind: "scalar", T: 3 /*ScalarType.INT64*/ },\n { no: 5, name: "hash", kind: "message", T: () => wrappers_2.StringValue }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "", size: "0" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* string name */ 3:\n message.name = reader.string();\n break;\n case /* int64 size */ 4:\n message.size = reader.int64().toString();\n break;\n case /* google.protobuf.StringValue hash */ 5:\n message.hash = wrappers_2.StringValue.internalBinaryRead(reader, reader.uint32(), options, message.hash);\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* string name = 3; */\n if (message.name !== "")\n writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name);\n /* int64 size = 4; */\n if (message.size !== "0")\n writer.tag(4, runtime_1.WireType.Varint).int64(message.size);\n /* google.protobuf.StringValue hash = 5; */\n if (message.hash)\n wrappers_2.StringValue.internalBinaryWrite(message.hash, writer.tag(5, runtime_1.WireType.LengthDelimited).fork(), options).join();\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeArtifactRequest\n */\nexports.FinalizeArtifactRequest = new FinalizeArtifactRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass FinalizeArtifactResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.FinalizeArtifactResponse", [\n { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },\n { no: 2, name: "artifact_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ }\n ]);\n }\n create(value) {\n const message = { ok: false, artifactId: "0" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bool ok */ 1:\n message.ok = reader.bool();\n break;\n case /* int64 artifact_id */ 2:\n message.artifactId = reader.int64().toString();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bool ok = 1; */\n if (message.ok !== false)\n writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);\n /* int64 artifact_id = 2; */\n if (message.artifactId !== "0")\n writer.tag(2, runtime_1.WireType.Varint).int64(message.artifactId);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeArtifactResponse\n */\nexports.FinalizeArtifactResponse = new FinalizeArtifactResponse$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass ListArtifactsRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.ListArtifactsRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name_filter", kind: "message", T: () => wrappers_2.StringValue },\n { no: 4, name: "id_filter", kind: "message", T: () => wrappers_1.Int64Value }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* google.protobuf.StringValue name_filter */ 3:\n message.nameFilter = wrappers_2.StringValue.internalBinaryRead(reader, reader.uint32(), options, message.nameFilter);\n break;\n case /* google.protobuf.Int64Value id_filter */ 4:\n message.idFilter = wrappers_1.Int64Value.internalBinaryRead(reader, reader.uint32(), options, message.idFilter);\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* google.protobuf.StringValue name_filter = 3; */\n if (message.nameFilter)\n wrappers_2.StringValue.internalBinaryWrite(message.nameFilter, writer.tag(3, runtime_1.WireType.LengthDelimited).fork(), options).join();\n /* google.protobuf.Int64Value id_filter = 4; */\n if (message.idFilter)\n wrappers_1.Int64Value.internalBinaryWrite(message.idFilter, writer.tag(4, runtime_1.WireType.LengthDelimited).fork(), options).join();\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.ListArtifactsRequest\n */\nexports.ListArtifactsRequest = new ListArtifactsRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass ListArtifactsResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.ListArtifactsResponse", [\n { no: 1, name: "artifacts", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => exports.ListArtifactsResponse_MonolithArtifact }\n ]);\n }\n create(value) {\n const message = { artifacts: [] };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* repeated github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact artifacts */ 1:\n message.artifacts.push(exports.ListArtifactsResponse_MonolithArtifact.internalBinaryRead(reader, reader.uint32(), options));\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* repeated github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact artifacts = 1; */\n for (let i = 0; i < message.artifacts.length; i++)\n exports.ListArtifactsResponse_MonolithArtifact.internalBinaryWrite(message.artifacts[i], writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.ListArtifactsResponse\n */\nexports.ListArtifactsResponse = new ListArtifactsResponse$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass ListArtifactsResponse_MonolithArtifact$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "database_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ },\n { no: 4, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 5, name: "size", kind: "scalar", T: 3 /*ScalarType.INT64*/ },\n { no: 6, name: "created_at", kind: "message", T: () => timestamp_1.Timestamp }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", databaseId: "0", name: "", size: "0" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* int64 database_id */ 3:\n message.databaseId = reader.int64().toString();\n break;\n case /* string name */ 4:\n message.name = reader.string();\n break;\n case /* int64 size */ 5:\n message.size = reader.int64().toString();\n break;\n case /* google.protobuf.Timestamp created_at */ 6:\n message.createdAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.createdAt);\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* int64 database_id = 3; */\n if (message.databaseId !== "0")\n writer.tag(3, runtime_1.WireType.Varint).int64(message.databaseId);\n /* string name = 4; */\n if (message.name !== "")\n writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.name);\n /* int64 size = 5; */\n if (message.size !== "0")\n writer.tag(5, runtime_1.WireType.Varint).int64(message.size);\n /* google.protobuf.Timestamp created_at = 6; */\n if (message.createdAt)\n timestamp_1.Timestamp.internalBinaryWrite(message.createdAt, writer.tag(6, runtime_1.WireType.LengthDelimited).fork(), options).join();\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact\n */\nexports.ListArtifactsResponse_MonolithArtifact = new ListArtifactsResponse_MonolithArtifact$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass GetSignedArtifactURLRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.GetSignedArtifactURLRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* string name */ 3:\n message.name = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* string name = 3; */\n if (message.name !== "")\n writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.GetSignedArtifactURLRequest\n */\nexports.GetSignedArtifactURLRequest = new GetSignedArtifactURLRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass GetSignedArtifactURLResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.GetSignedArtifactURLResponse", [\n { no: 1, name: "signed_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n create(value) {\n const message = { signedUrl: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string signed_url */ 1:\n message.signedUrl = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string signed_url = 1; */\n if (message.signedUrl !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.signedUrl);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.GetSignedArtifactURLResponse\n */\nexports.GetSignedArtifactURLResponse = new GetSignedArtifactURLResponse$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass DeleteArtifactRequest$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.DeleteArtifactRequest", [\n { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },\n { no: 3, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }\n ]);\n }\n create(value) {\n const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* string workflow_run_backend_id */ 1:\n message.workflowRunBackendId = reader.string();\n break;\n case /* string workflow_job_run_backend_id */ 2:\n message.workflowJobRunBackendId = reader.string();\n break;\n case /* string name */ 3:\n message.name = reader.string();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* string workflow_run_backend_id = 1; */\n if (message.workflowRunBackendId !== "")\n writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId);\n /* string workflow_job_run_backend_id = 2; */\n if (message.workflowJobRunBackendId !== "")\n writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId);\n /* string name = 3; */\n if (message.name !== "")\n writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.DeleteArtifactRequest\n */\nexports.DeleteArtifactRequest = new DeleteArtifactRequest$Type();\n// @generated message type with reflection information, may provide speed optimized methods\nclass DeleteArtifactResponse$Type extends runtime_5.MessageType {\n constructor() {\n super("github.actions.results.api.v1.DeleteArtifactResponse", [\n { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },\n { no: 2, name: "artifact_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ }\n ]);\n }\n create(value) {\n const message = { ok: false, artifactId: "0" };\n globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });\n if (value !== undefined)\n (0, runtime_3.reflectionMergePartial)(this, message, value);\n return message;\n }\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case /* bool ok */ 1:\n message.ok = reader.bool();\n break;\n case /* int64 artifact_id */ 2:\n message.artifactId = reader.int64().toString();\n break;\n default:\n let u = options.readUnknownField;\n if (u === "throw")\n throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);\n }\n }\n return message;\n }\n internalBinaryWrite(message, writer, options) {\n /* bool ok = 1; */\n if (message.ok !== false)\n writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);\n /* int64 artifact_id = 2; */\n if (message.artifactId !== "0")\n writer.tag(2, runtime_1.WireType.Varint).int64(message.artifactId);\n let u = options.writeUnknownFields;\n if (u !== false)\n (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);\n return writer;\n }\n}\n/**\n * @generated MessageType for protobuf message github.actions.results.api.v1.DeleteArtifactResponse\n */\nexports.DeleteArtifactResponse = new DeleteArtifactResponse$Type();\n/**\n * @generated ServiceType for protobuf service github.actions.results.api.v1.ArtifactService\n */\nexports.ArtifactService = new runtime_rpc_1.ServiceType("github.actions.results.api.v1.ArtifactService", [\n { name: "CreateArtifact", options: {}, I: exports.CreateArtifactRequest, O: exports.CreateArtifactResponse },\n { name: "FinalizeArtifact", options: {}, I: exports.FinalizeArtifactRequest, O: exports.FinalizeArtifactResponse },\n { name: "ListArtifacts", options: {}, I: exports.ListArtifactsRequest, O: exports.ListArtifactsResponse },\n { name: "GetSignedArtifactURL", options: {}, I: exports.GetSignedArtifactURLRequest, O: exports.GetSignedArtifactURLResponse },\n { name: "DeleteArtifact", options: {}, I: exports.DeleteArtifactRequest, O: exports.DeleteArtifactResponse }\n]);\n//# sourceMappingURL=artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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b3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9nZW5lcmF0ZWQvcmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QuanM/YmEzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlID0gZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlc3BvbnNlID0gZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlcXVlc3QgPSBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UgPSBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCA9IGV4cG9ydHMuTGlzdEFydGlmYWN0c1Jlc3BvbnNlX01vbm9saXRoQXJ0aWZhY3QgPSBleHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZSA9IGV4cG9ydHMuTGlzdEFydGlmYWN0c1JlcXVlc3QgPSBleHBvcnRzLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZSA9IGV4cG9ydHMuRmluYWxpemVBcnRpZmFjdFJlcXVlc3QgPSBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UgPSBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVxdWVzdCA9IHZvaWQgMDtcbi8vIEBnZW5lcmF0ZWQgYnkgcHJvdG9idWYtdHMgMi45LjEgd2l0aCBwYXJhbWV0ZXIgbG9uZ190eXBlX3N0cmluZyxjbGllbnRfbm9uZSxnZW5lcmF0ZV9kZXBlbmRlbmNpZXNcbi8vIEBnZW5lcmF0ZWQgZnJvbSBwcm90b2J1ZiBmaWxlIFwicmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QucHJvdG9cIiAocGFja2FnZSBcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxXCIsIHN5bnRheCBwcm90bzMpXG4vLyB0c2xpbnQ6ZGlzYWJsZVxuY29uc3QgcnVudGltZV9ycGNfMSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZS1ycGNcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzIgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzMgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzQgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzUgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCB3cmFwcGVyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVyc1wiKTtcbmNvbnN0IHdyYXBwZXJzXzIgPSByZXF1aXJlKFwiLi4vLi4vLi4vZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzXCIpO1xuY29uc3QgdGltZXN0YW1wXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcFwiKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIENyZWF0ZUFydGlmYWN0UmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJleHBpcmVzX2F0XCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB0aW1lc3RhbXBfMS5UaW1lc3RhbXAgfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwidmVyc2lvblwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB3b3JrZmxvd1J1bkJhY2tlbmRJZDogXCJcIiwgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IFwiXCIsIG5hbWU6IFwiXCIsIHZlcnNpb246IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGV4cGlyZXNfYXQgKi8gNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5leHBpcmVzQXQgPSB0aW1lc3RhbXBfMS5UaW1lc3RhbXAuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCBtZXNzYWdlLmV4cGlyZXNBdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgdmVyc2lvbiAqLyA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZlcnNpb24gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkKTtcbiAgICAgICAgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyBuYW1lID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubmFtZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UubmFtZSk7XG4gICAgICAgIC8qIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgZXhwaXJlc19hdCA9IDQ7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmV4cGlyZXNBdClcbiAgICAgICAgICAgIHRpbWVzdGFtcF8xLlRpbWVzdGFtcC5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UuZXhwaXJlc0F0LCB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICAvKiBpbnQzMiB2ZXJzaW9uID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmVyc2lvbiAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNSwgcnVudGltZV8xLldpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS52ZXJzaW9uKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlcXVlc3RcbiAqL1xuZXhwb3J0cy5DcmVhdGVBcnRpZmFjdFJlcXVlc3QgPSBuZXcgQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIENyZWF0ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcIm9rXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDggLypTY2FsYXJUeXBlLkJPT0wqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJzaWduZWRfdXBsb2FkX3VybFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgb2s6IGZhbHNlLCBzaWduZWRVcGxvYWRVcmw6IFwiXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgc2lnbmVkX3VwbG9hZF91cmwgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaWduZWRVcGxvYWRVcmwgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIGJvb2wgb2sgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5vayAhPT0gZmFsc2UpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5WYXJpbnQpLmJvb2wobWVzc2FnZS5vayk7XG4gICAgICAgIC8qIHN0cmluZyBzaWduZWRfdXBsb2FkX3VybCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpZ25lZFVwbG9hZFVybCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2lnbmVkVXBsb2FkVXJsKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlc3BvbnNlXG4gKi9cbmV4cG9ydHMuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZSA9IG5ldyBDcmVhdGVBcnRpZmFjdFJlc3BvbnNlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0JFR5cGUgZXh0ZW5kcyBydW50aW1lXzUuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwid29ya2Zsb3dfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwid29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcIm5hbWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwic2l6ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiAzIC8qU2NhbGFyVHlwZS5JTlQ2NCovIH0sXG4gICAgICAgICAgICB7IG5vOiA1LCBuYW1lOiBcImhhc2hcIiwga2luZDogXCJtZXNzYWdlXCIsIFQ6ICgpID0+IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiwgbmFtZTogXCJcIiwgc2l6ZTogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBzaXplICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSA9IHJlYWRlci5pbnQ2NCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIGhhc2ggKi8gNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oYXNoID0gd3JhcHBlcnNfMi5TdHJpbmdWYWx1ZS5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMsIG1lc3NhZ2UuaGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICAvKiBpbnQ2NCBzaXplID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2l6ZSAhPT0gXCIwXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5WYXJpbnQpLmludDY0KG1lc3NhZ2Uuc2l6ZSk7XG4gICAgICAgIC8qIGdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSBoYXNoID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGFzaClcbiAgICAgICAgICAgIHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmhhc2gsIHdyaXRlci50YWcoNSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKS5qb2luKCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuRmluYWxpemVBcnRpZmFjdFJlcXVlc3RcbiAqL1xuZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCA9IG5ldyBGaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBGaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwib2tcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImFydGlmYWN0X2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDMgLypTY2FsYXJUeXBlLklOVDY0Ki8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IG9rOiBmYWxzZSwgYXJ0aWZhY3RJZDogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBhcnRpZmFjdF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFydGlmYWN0SWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBib29sIG9rID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uub2sgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2Uub2spO1xuICAgICAgICAvKiBpbnQ2NCBhcnRpZmFjdF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmFydGlmYWN0SWQgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLmFydGlmYWN0SWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZVxuICovXG5leHBvcnRzLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZSA9IG5ldyBGaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1JlcXVlc3QkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuTGlzdEFydGlmYWN0c1JlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZV9maWx0ZXJcIiwga2luZDogXCJtZXNzYWdlXCIsIFQ6ICgpID0+IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUgfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwiaWRfZmlsdGVyXCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB3cmFwcGVyc18xLkludDY0VmFsdWUgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzQuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV8zLnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgd29ya2Zsb3dfcnVuX2JhY2tlbmRfaWQgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgd29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIG5hbWVfZmlsdGVyICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZUZpbHRlciA9IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCBtZXNzYWdlLm5hbWVGaWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIGlkX2ZpbHRlciAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkRmlsdGVyID0gd3JhcHBlcnNfMS5JbnQ2NFZhbHVlLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgbWVzc2FnZS5pZEZpbHRlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUgbmFtZV9maWx0ZXIgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lRmlsdGVyKVxuICAgICAgICAgICAgd3JhcHBlcnNfMi5TdHJpbmdWYWx1ZS5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UubmFtZUZpbHRlciwgd3JpdGVyLnRhZygzLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpLmpvaW4oKTtcbiAgICAgICAgLyogZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUgaWRfZmlsdGVyID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuaWRGaWx0ZXIpXG4gICAgICAgICAgICB3cmFwcGVyc18xLkludDY0VmFsdWUuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmlkRmlsdGVyLCB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXF1ZXN0XG4gKi9cbmV4cG9ydHMuTGlzdEFydGlmYWN0c1JlcXVlc3QgPSBuZXcgTGlzdEFydGlmYWN0c1JlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1Jlc3BvbnNlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzUuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXNwb25zZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcImFydGlmYWN0c1wiLCBraW5kOiBcIm1lc3NhZ2VcIiwgcmVwZWF0OiAxIC8qUmVwZWF0VHlwZS5QQUNLRUQqLywgVDogKCkgPT4gZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2VfTW9ub2xpdGhBcnRpZmFjdCB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgYXJ0aWZhY3RzOiBbXSB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzQuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV8zLnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiByZXBlYXRlZCBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdCBhcnRpZmFjdHMgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcnRpZmFjdHMucHVzaChleHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0LmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiByZXBlYXRlZCBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdCBhcnRpZmFjdHMgPSAxOyAqL1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2UuYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2VfTW9ub2xpdGhBcnRpZmFjdC5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UuYXJ0aWZhY3RzW2ldLCB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXNwb25zZVxuICovXG5leHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZSA9IG5ldyBMaXN0QXJ0aWZhY3RzUmVzcG9uc2UkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1Jlc3BvbnNlX01vbm9saXRoQXJ0aWZhY3QkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuTGlzdEFydGlmYWN0c1Jlc3BvbnNlLk1vbm9saXRoQXJ0aWZhY3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwiZGF0YWJhc2VfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJuYW1lXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiA1LCBuYW1lOiBcInNpemVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9LFxuICAgICAgICAgICAgeyBubzogNiwgbmFtZTogXCJjcmVhdGVkX2F0XCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB0aW1lc3RhbXBfMS5UaW1lc3RhbXAgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiwgZGF0YWJhc2VJZDogXCIwXCIsIG5hbWU6IFwiXCIsIHNpemU6IFwiMFwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBkYXRhYmFzZV9pZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGFiYXNlSWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBzaXplICovIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSA9IHJlYWRlci5pbnQ2NCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ICovIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3JlYXRlZEF0ID0gdGltZXN0YW1wXzEuVGltZXN0YW1wLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgbWVzc2FnZS5jcmVhdGVkQXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgd29ya2Zsb3dfcnVuX2JhY2tlbmRfaWQgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgd29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkKTtcbiAgICAgICAgLyogaW50NjQgZGF0YWJhc2VfaWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhYmFzZUlkICE9PSBcIjBcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgcnVudGltZV8xLldpcmVUeXBlLlZhcmludCkuaW50NjQobWVzc2FnZS5kYXRhYmFzZUlkKTtcbiAgICAgICAgLyogc3RyaW5nIG5hbWUgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg0LCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgLyogaW50NjQgc2l6ZSA9IDU7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpemUgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg1LCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLnNpemUpO1xuICAgICAgICAvKiBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGNyZWF0ZWRfYXQgPSA2OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5jcmVhdGVkQXQpXG4gICAgICAgICAgICB0aW1lc3RhbXBfMS5UaW1lc3RhbXAuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmNyZWF0ZWRBdCwgd3JpdGVyLnRhZyg2LCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpLmpvaW4oKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdFxuICovXG5leHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0ID0gbmV3IExpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IFwiXCIsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBcIlwiLCBuYW1lOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbmFtZSAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdFxuICovXG5leHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCA9IG5ldyBHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZSRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwic2lnbmVkX3VybFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgc2lnbmVkVXJsOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzaWduZWRfdXJsICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2lnbmVkVXJsID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgc2lnbmVkX3VybCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpZ25lZFVybCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2lnbmVkVXJsKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlXG4gKi9cbmV4cG9ydHMuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZSA9IG5ldyBHZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIERlbGV0ZUFydGlmYWN0UmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5EZWxldGVBcnRpZmFjdFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IFwiXCIsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBcIlwiLCBuYW1lOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbmFtZSAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkRlbGV0ZUFydGlmYWN0UmVxdWVzdFxuICovXG5leHBvcnRzLkRlbGV0ZUFydGlmYWN0UmVxdWVzdCA9IG5ldyBEZWxldGVBcnRpZmFjdFJlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgRGVsZXRlQXJ0aWZhY3RSZXNwb25zZSRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5EZWxldGVBcnRpZmFjdFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwib2tcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImFydGlmYWN0X2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDMgLypTY2FsYXJUeXBlLklOVDY0Ki8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IG9rOiBmYWxzZSwgYXJ0aWZhY3RJZDogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBhcnRpZmFjdF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFydGlmYWN0SWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBib29sIG9rID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uub2sgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2Uub2spO1xuICAgICAgICAvKiBpbnQ2NCBhcnRpZmFjdF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmFydGlmYWN0SWQgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLmFydGlmYWN0SWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlc3BvbnNlID0gbmV3IERlbGV0ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSgpO1xuLyoqXG4gKiBAZ2VuZXJhdGVkIFNlcnZpY2VUeXBlIGZvciBwcm90b2J1ZiBzZXJ2aWNlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVxuICovXG5leHBvcnRzLkFydGlmYWN0U2VydmljZSA9IG5ldyBydW50aW1lX3JwY18xLlNlcnZpY2VUeXBlKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFtcbiAgICB7IG5hbWU6IFwiQ3JlYXRlQXJ0aWZhY3RcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LCBPOiBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiRmluYWxpemVBcnRpZmFjdFwiLCBvcHRpb25zOiB7fSwgSTogZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCwgTzogZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiTGlzdEFydGlmYWN0c1wiLCBvcHRpb25zOiB7fSwgSTogZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVxdWVzdCwgTzogZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiR2V0U2lnbmVkQXJ0aWZhY3RVUkxcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXF1ZXN0LCBPOiBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiRGVsZXRlQXJ0aWZhY3RcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LCBPOiBleHBvcnRzLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2UgfVxuXSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnRpZmFjdC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///51585\n')},69565:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.createArtifactServiceServer = exports.ArtifactServiceMethodList = exports.ArtifactServiceMethod = exports.ArtifactServiceClientProtobuf = exports.ArtifactServiceClientJSON = void 0;\nconst twirp_ts_1 = __webpack_require__(86371);\nconst artifact_1 = __webpack_require__(51585);\nclass ArtifactServiceClientJSON {\n constructor(rpc) {\n this.rpc = rpc;\n this.CreateArtifact.bind(this);\n this.FinalizeArtifact.bind(this);\n this.ListArtifacts.bind(this);\n this.GetSignedArtifactURL.bind(this);\n this.DeleteArtifact.bind(this);\n }\n CreateArtifact(request) {\n const data = artifact_1.CreateArtifactRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "CreateArtifact", "application/json", data);\n return promise.then((data) => artifact_1.CreateArtifactResponse.fromJson(data, {\n ignoreUnknownFields: true,\n }));\n }\n FinalizeArtifact(request) {\n const data = artifact_1.FinalizeArtifactRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "FinalizeArtifact", "application/json", data);\n return promise.then((data) => artifact_1.FinalizeArtifactResponse.fromJson(data, {\n ignoreUnknownFields: true,\n }));\n }\n ListArtifacts(request) {\n const data = artifact_1.ListArtifactsRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "ListArtifacts", "application/json", data);\n return promise.then((data) => artifact_1.ListArtifactsResponse.fromJson(data, { ignoreUnknownFields: true }));\n }\n GetSignedArtifactURL(request) {\n const data = artifact_1.GetSignedArtifactURLRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "GetSignedArtifactURL", "application/json", data);\n return promise.then((data) => artifact_1.GetSignedArtifactURLResponse.fromJson(data, {\n ignoreUnknownFields: true,\n }));\n }\n DeleteArtifact(request) {\n const data = artifact_1.DeleteArtifactRequest.toJson(request, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n });\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "DeleteArtifact", "application/json", data);\n return promise.then((data) => artifact_1.DeleteArtifactResponse.fromJson(data, {\n ignoreUnknownFields: true,\n }));\n }\n}\nexports.ArtifactServiceClientJSON = ArtifactServiceClientJSON;\nclass ArtifactServiceClientProtobuf {\n constructor(rpc) {\n this.rpc = rpc;\n this.CreateArtifact.bind(this);\n this.FinalizeArtifact.bind(this);\n this.ListArtifacts.bind(this);\n this.GetSignedArtifactURL.bind(this);\n this.DeleteArtifact.bind(this);\n }\n CreateArtifact(request) {\n const data = artifact_1.CreateArtifactRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "CreateArtifact", "application/protobuf", data);\n return promise.then((data) => artifact_1.CreateArtifactResponse.fromBinary(data));\n }\n FinalizeArtifact(request) {\n const data = artifact_1.FinalizeArtifactRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "FinalizeArtifact", "application/protobuf", data);\n return promise.then((data) => artifact_1.FinalizeArtifactResponse.fromBinary(data));\n }\n ListArtifacts(request) {\n const data = artifact_1.ListArtifactsRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "ListArtifacts", "application/protobuf", data);\n return promise.then((data) => artifact_1.ListArtifactsResponse.fromBinary(data));\n }\n GetSignedArtifactURL(request) {\n const data = artifact_1.GetSignedArtifactURLRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "GetSignedArtifactURL", "application/protobuf", data);\n return promise.then((data) => artifact_1.GetSignedArtifactURLResponse.fromBinary(data));\n }\n DeleteArtifact(request) {\n const data = artifact_1.DeleteArtifactRequest.toBinary(request);\n const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "DeleteArtifact", "application/protobuf", data);\n return promise.then((data) => artifact_1.DeleteArtifactResponse.fromBinary(data));\n }\n}\nexports.ArtifactServiceClientProtobuf = ArtifactServiceClientProtobuf;\nvar ArtifactServiceMethod;\n(function (ArtifactServiceMethod) {\n ArtifactServiceMethod["CreateArtifact"] = "CreateArtifact";\n ArtifactServiceMethod["FinalizeArtifact"] = "FinalizeArtifact";\n ArtifactServiceMethod["ListArtifacts"] = "ListArtifacts";\n ArtifactServiceMethod["GetSignedArtifactURL"] = "GetSignedArtifactURL";\n ArtifactServiceMethod["DeleteArtifact"] = "DeleteArtifact";\n})(ArtifactServiceMethod || (exports.ArtifactServiceMethod = ArtifactServiceMethod = {}));\nexports.ArtifactServiceMethodList = [\n ArtifactServiceMethod.CreateArtifact,\n ArtifactServiceMethod.FinalizeArtifact,\n ArtifactServiceMethod.ListArtifacts,\n ArtifactServiceMethod.GetSignedArtifactURL,\n ArtifactServiceMethod.DeleteArtifact,\n];\nfunction createArtifactServiceServer(service) {\n return new twirp_ts_1.TwirpServer({\n service,\n packageName: "github.actions.results.api.v1",\n serviceName: "ArtifactService",\n methodList: exports.ArtifactServiceMethodList,\n matchRoute: matchArtifactServiceRoute,\n });\n}\nexports.createArtifactServiceServer = createArtifactServiceServer;\nfunction matchArtifactServiceRoute(method, events) {\n switch (method) {\n case "CreateArtifact":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "CreateArtifact" });\n yield events.onMatch(ctx);\n return handleArtifactServiceCreateArtifactRequest(ctx, service, data, interceptors);\n });\n case "FinalizeArtifact":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "FinalizeArtifact" });\n yield events.onMatch(ctx);\n return handleArtifactServiceFinalizeArtifactRequest(ctx, service, data, interceptors);\n });\n case "ListArtifacts":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "ListArtifacts" });\n yield events.onMatch(ctx);\n return handleArtifactServiceListArtifactsRequest(ctx, service, data, interceptors);\n });\n case "GetSignedArtifactURL":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "GetSignedArtifactURL" });\n yield events.onMatch(ctx);\n return handleArtifactServiceGetSignedArtifactURLRequest(ctx, service, data, interceptors);\n });\n case "DeleteArtifact":\n return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {\n ctx = Object.assign(Object.assign({}, ctx), { methodName: "DeleteArtifact" });\n yield events.onMatch(ctx);\n return handleArtifactServiceDeleteArtifactRequest(ctx, service, data, interceptors);\n });\n default:\n events.onNotFound();\n const msg = `no handler found`;\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceCreateArtifactRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceCreateArtifactJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceCreateArtifactProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceFinalizeArtifactRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceFinalizeArtifactJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceFinalizeArtifactProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceListArtifactsRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceListArtifactsJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceListArtifactsProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceGetSignedArtifactURLRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceGetSignedArtifactURLJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceGetSignedArtifactURLProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceDeleteArtifactRequest(ctx, service, data, interceptors) {\n switch (ctx.contentType) {\n case twirp_ts_1.TwirpContentType.JSON:\n return handleArtifactServiceDeleteArtifactJSON(ctx, service, data, interceptors);\n case twirp_ts_1.TwirpContentType.Protobuf:\n return handleArtifactServiceDeleteArtifactProtobuf(ctx, service, data, interceptors);\n default:\n const msg = "unexpected Content-Type";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);\n }\n}\nfunction handleArtifactServiceCreateArtifactJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.CreateArtifactRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.CreateArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.CreateArtifact(ctx, request);\n }\n return JSON.stringify(artifact_1.CreateArtifactResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceFinalizeArtifactJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.FinalizeArtifactRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.FinalizeArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.FinalizeArtifact(ctx, request);\n }\n return JSON.stringify(artifact_1.FinalizeArtifactResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceListArtifactsJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.ListArtifactsRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.ListArtifacts(ctx, inputReq);\n });\n }\n else {\n response = yield service.ListArtifacts(ctx, request);\n }\n return JSON.stringify(artifact_1.ListArtifactsResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceGetSignedArtifactURLJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.GetSignedArtifactURLRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.GetSignedArtifactURL(ctx, inputReq);\n });\n }\n else {\n response = yield service.GetSignedArtifactURL(ctx, request);\n }\n return JSON.stringify(artifact_1.GetSignedArtifactURLResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceDeleteArtifactJSON(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n const body = JSON.parse(data.toString() || "{}");\n request = artifact_1.DeleteArtifactRequest.fromJson(body, {\n ignoreUnknownFields: true,\n });\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the json request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.DeleteArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.DeleteArtifact(ctx, request);\n }\n return JSON.stringify(artifact_1.DeleteArtifactResponse.toJson(response, {\n useProtoFieldName: true,\n emitDefaultValues: false,\n }));\n });\n}\nfunction handleArtifactServiceCreateArtifactProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.CreateArtifactRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.CreateArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.CreateArtifact(ctx, request);\n }\n return Buffer.from(artifact_1.CreateArtifactResponse.toBinary(response));\n });\n}\nfunction handleArtifactServiceFinalizeArtifactProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.FinalizeArtifactRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.FinalizeArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.FinalizeArtifact(ctx, request);\n }\n return Buffer.from(artifact_1.FinalizeArtifactResponse.toBinary(response));\n });\n}\nfunction handleArtifactServiceListArtifactsProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.ListArtifactsRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.ListArtifacts(ctx, inputReq);\n });\n }\n else {\n response = yield service.ListArtifacts(ctx, request);\n }\n return Buffer.from(artifact_1.ListArtifactsResponse.toBinary(response));\n });\n}\nfunction handleArtifactServiceGetSignedArtifactURLProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.GetSignedArtifactURLRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.GetSignedArtifactURL(ctx, inputReq);\n });\n }\n else {\n response = yield service.GetSignedArtifactURL(ctx, request);\n }\n return Buffer.from(artifact_1.GetSignedArtifactURLResponse.toBinary(response));\n });\n}\nfunction handleArtifactServiceDeleteArtifactProtobuf(ctx, service, data, interceptors) {\n return __awaiter(this, void 0, void 0, function* () {\n let request;\n let response;\n try {\n request = artifact_1.DeleteArtifactRequest.fromBinary(data);\n }\n catch (e) {\n if (e instanceof Error) {\n const msg = "the protobuf request could not be decoded";\n throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);\n }\n }\n if (interceptors && interceptors.length > 0) {\n const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);\n response = yield interceptor(ctx, request, (ctx, inputReq) => {\n return service.DeleteArtifact(ctx, inputReq);\n });\n }\n else {\n response = yield service.DeleteArtifact(ctx, request);\n }\n return Buffer.from(artifact_1.DeleteArtifactResponse.toBinary(response));\n });\n}\n//# sourceMappingURL=artifact.twirp.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9nZW5lcmF0ZWQvcmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QudHdpcnAuanM/Y2FkMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXIgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZExpc3QgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZCA9IGV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50UHJvdG9idWYgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZUNsaWVudEpTT04gPSB2b2lkIDA7XG5jb25zdCB0d2lycF90c18xID0gcmVxdWlyZShcInR3aXJwLXRzXCIpO1xuY29uc3QgYXJ0aWZhY3RfMSA9IHJlcXVpcmUoXCIuL2FydGlmYWN0XCIpO1xuY2xhc3MgQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50SlNPTiB7XG4gICAgY29uc3RydWN0b3IocnBjKSB7XG4gICAgICAgIHRoaXMucnBjID0gcnBjO1xuICAgICAgICB0aGlzLkNyZWF0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuRmluYWxpemVBcnRpZmFjdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkxpc3RBcnRpZmFjdHMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5HZXRTaWduZWRBcnRpZmFjdFVSTC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkRlbGV0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgfVxuICAgIENyZWF0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LnRvSnNvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJwYy5yZXF1ZXN0KFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFwiQ3JlYXRlQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBGaW5hbGl6ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJGaW5hbGl6ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vanNvblwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBMaXN0QXJ0aWZhY3RzKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJMaXN0QXJ0aWZhY3RzXCIsIFwiYXBwbGljYXRpb24vanNvblwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuZnJvbUpzb24oZGF0YSwgeyBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgR2V0U2lnbmVkQXJ0aWZhY3RVUkwocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZS5mcm9tSnNvbihkYXRhLCB7XG4gICAgICAgICAgICBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIERlbGV0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LnRvSnNvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJwYy5yZXF1ZXN0KFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFwiRGVsZXRlQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50SlNPTiA9IEFydGlmYWN0U2VydmljZUNsaWVudEpTT047XG5jbGFzcyBBcnRpZmFjdFNlcnZpY2VDbGllbnRQcm90b2J1ZiB7XG4gICAgY29uc3RydWN0b3IocnBjKSB7XG4gICAgICAgIHRoaXMucnBjID0gcnBjO1xuICAgICAgICB0aGlzLkNyZWF0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuRmluYWxpemVBcnRpZmFjdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkxpc3RBcnRpZmFjdHMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5HZXRTaWduZWRBcnRpZmFjdFVSTC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkRlbGV0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgfVxuICAgIENyZWF0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkNyZWF0ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZS5mcm9tQmluYXJ5KGRhdGEpKTtcbiAgICB9XG4gICAgRmluYWxpemVBcnRpZmFjdChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhcnRpZmFjdF8xLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkZpbmFsaXplQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9wcm90b2J1ZlwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUJpbmFyeShkYXRhKSk7XG4gICAgfVxuICAgIExpc3RBcnRpZmFjdHMocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVxdWVzdC50b0JpbmFyeShyZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJMaXN0QXJ0aWZhY3RzXCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1Jlc3BvbnNlLmZyb21CaW5hcnkoZGF0YSkpO1xuICAgIH1cbiAgICBHZXRTaWduZWRBcnRpZmFjdFVSTChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhcnRpZmFjdF8xLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdC50b0JpbmFyeShyZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiLCBcImFwcGxpY2F0aW9uL3Byb3RvYnVmXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UuZnJvbUJpbmFyeShkYXRhKSk7XG4gICAgfVxuICAgIERlbGV0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkRlbGV0ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS5mcm9tQmluYXJ5KGRhdGEpKTtcbiAgICB9XG59XG5leHBvcnRzLkFydGlmYWN0U2VydmljZUNsaWVudFByb3RvYnVmID0gQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50UHJvdG9idWY7XG52YXIgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kO1xuKGZ1bmN0aW9uIChBcnRpZmFjdFNlcnZpY2VNZXRob2QpIHtcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2RbXCJDcmVhdGVBcnRpZmFjdFwiXSA9IFwiQ3JlYXRlQXJ0aWZhY3RcIjtcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2RbXCJGaW5hbGl6ZUFydGlmYWN0XCJdID0gXCJGaW5hbGl6ZUFydGlmYWN0XCI7XG4gICAgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kW1wiTGlzdEFydGlmYWN0c1wiXSA9IFwiTGlzdEFydGlmYWN0c1wiO1xuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZFtcIkdldFNpZ25lZEFydGlmYWN0VVJMXCJdID0gXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiO1xuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZFtcIkRlbGV0ZUFydGlmYWN0XCJdID0gXCJEZWxldGVBcnRpZmFjdFwiO1xufSkoQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kIHx8IChleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZCA9IEFydGlmYWN0U2VydmljZU1ldGhvZCA9IHt9KSk7XG5leHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZExpc3QgPSBbXG4gICAgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kLkNyZWF0ZUFydGlmYWN0LFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5GaW5hbGl6ZUFydGlmYWN0LFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5MaXN0QXJ0aWZhY3RzLFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5HZXRTaWduZWRBcnRpZmFjdFVSTCxcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2QuRGVsZXRlQXJ0aWZhY3QsXG5dO1xuZnVuY3Rpb24gY3JlYXRlQXJ0aWZhY3RTZXJ2aWNlU2VydmVyKHNlcnZpY2UpIHtcbiAgICByZXR1cm4gbmV3IHR3aXJwX3RzXzEuVHdpcnBTZXJ2ZXIoe1xuICAgICAgICBzZXJ2aWNlLFxuICAgICAgICBwYWNrYWdlTmFtZTogXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MVwiLFxuICAgICAgICBzZXJ2aWNlTmFtZTogXCJBcnRpZmFjdFNlcnZpY2VcIixcbiAgICAgICAgbWV0aG9kTGlzdDogZXhwb3J0cy5BcnRpZmFjdFNlcnZpY2VNZXRob2RMaXN0LFxuICAgICAgICBtYXRjaFJvdXRlOiBtYXRjaEFydGlmYWN0U2VydmljZVJvdXRlLFxuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXIgPSBjcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXI7XG5mdW5jdGlvbiBtYXRjaEFydGlmYWN0U2VydmljZVJvdXRlKG1ldGhvZCwgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgY2FzZSBcIkNyZWF0ZUFydGlmYWN0XCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiQ3JlYXRlQXJ0aWZhY3RcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgXCJGaW5hbGl6ZUFydGlmYWN0XCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiRmluYWxpemVBcnRpZmFjdFwiIH0pO1xuICAgICAgICAgICAgICAgIHlpZWxkIGV2ZW50cy5vbk1hdGNoKGN0eCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFwiTGlzdEFydGlmYWN0c1wiOlxuICAgICAgICAgICAgcmV0dXJuIChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3R4KSwgeyBtZXRob2ROYW1lOiBcIkxpc3RBcnRpZmFjdHNcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VMaXN0QXJ0aWZhY3RzUmVxdWVzdChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBcIkdldFNpZ25lZEFydGlmYWN0VVJMXCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiR2V0U2lnbmVkQXJ0aWZhY3RVUkxcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgXCJEZWxldGVBcnRpZmFjdFwiOlxuICAgICAgICAgICAgcmV0dXJuIChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3R4KSwgeyBtZXRob2ROYW1lOiBcIkRlbGV0ZUFydGlmYWN0XCIgfSk7XG4gICAgICAgICAgICAgICAgeWllbGQgZXZlbnRzLm9uTWF0Y2goY3R4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXZlbnRzLm9uTm90Rm91bmQoKTtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBubyBoYW5kbGVyIGZvdW5kYDtcbiAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5CYWRSb3V0ZSwgbXNnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUNyZWF0ZUFydGlmYWN0SlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUNyZWF0ZUFydGlmYWN0UHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ1bmV4cGVjdGVkIENvbnRlbnQtVHlwZVwiO1xuICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLkJhZFJvdXRlLCBtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgc3dpdGNoIChjdHguY29udGVudFR5cGUpIHtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuSlNPTjpcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VGaW5hbGl6ZUFydGlmYWN0SlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RQcm90b2J1ZihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBcInVuZXhwZWN0ZWQgQ29udGVudC1UeXBlXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuQmFkUm91dGUsIG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlTGlzdEFydGlmYWN0c1JlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUxpc3RBcnRpZmFjdHNKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuUHJvdG9idWY6XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlTGlzdEFydGlmYWN0c1Byb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidW5leHBlY3RlZCBDb250ZW50LVR5cGVcIjtcbiAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5CYWRSb3V0ZSwgbXNnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMSlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ1bmV4cGVjdGVkIENvbnRlbnQtVHlwZVwiO1xuICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLkJhZFJvdXRlLCBtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZURlbGV0ZUFydGlmYWN0UmVxdWVzdChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykge1xuICAgIHN3aXRjaCAoY3R4LmNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLkpTT046XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuUHJvdG9idWY6XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RQcm90b2J1ZihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBcInVuZXhwZWN0ZWQgQ29udGVudC1UeXBlXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuQmFkUm91dGUsIG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlQ3JlYXRlQXJ0aWZhY3RKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSB8fCBcInt9XCIpO1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LmZyb21Kc29uKGJvZHksIHtcbiAgICAgICAgICAgICAgICBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBqc29uIHJlcXVlc3QgY291bGQgbm90IGJlIGRlY29kZWRcIjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuTWFsZm9ybWVkLCBtc2cpLndpdGhDYXVzZShlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvciA9ICgwLCB0d2lycF90c18xLmNoYWluSW50ZXJjZXB0b3JzKSguLi5pbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBpbnRlcmNlcHRvcihjdHgsIHJlcXVlc3QsIChjdHgsIGlucHV0UmVxKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuQ3JlYXRlQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5DcmVhdGVBcnRpZmFjdChjdHgsIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UudG9Kc29uKHJlc3BvbnNlLCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRmluYWxpemVBcnRpZmFjdEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdC5mcm9tSnNvbihib2R5LCB7XG4gICAgICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUganNvbiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkZpbmFsaXplQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5GaW5hbGl6ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlLnRvSnNvbihyZXNwb25zZSwge1xuICAgICAgICAgICAgdXNlUHJvdG9GaWVsZE5hbWU6IHRydWUsXG4gICAgICAgICAgICBlbWl0RGVmYXVsdFZhbHVlczogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUxpc3RBcnRpZmFjdHNKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSB8fCBcInt9XCIpO1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5MaXN0QXJ0aWZhY3RzKGN0eCwgaW5wdXRSZXEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHNlcnZpY2UuTGlzdEFydGlmYWN0cyhjdHgsIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcnRpZmFjdF8xLkxpc3RBcnRpZmFjdHNSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5HZXRTaWduZWRBcnRpZmFjdFVSTChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkdldFNpZ25lZEFydGlmYWN0VVJMKGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VEZWxldGVBcnRpZmFjdEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5EZWxldGVBcnRpZmFjdFJlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5EZWxldGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkRlbGV0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVxdWVzdC5mcm9tQmluYXJ5KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUgcHJvdG9idWYgcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5DcmVhdGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkNyZWF0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZS50b0JpbmFyeShyZXNwb25zZSkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRmluYWxpemVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0LmZyb21CaW5hcnkoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBwcm90b2J1ZiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkZpbmFsaXplQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5GaW5hbGl6ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlLnRvQmluYXJ5KHJlc3BvbnNlKSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VMaXN0QXJ0aWZhY3RzUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QuZnJvbUJpbmFyeShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIHByb3RvYnVmIHJlcXVlc3QgY291bGQgbm90IGJlIGRlY29kZWRcIjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuTWFsZm9ybWVkLCBtc2cpLndpdGhDYXVzZShlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvciA9ICgwLCB0d2lycF90c18xLmNoYWluSW50ZXJjZXB0b3JzKSguLi5pbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBpbnRlcmNlcHRvcihjdHgsIHJlcXVlc3QsIChjdHgsIGlucHV0UmVxKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuTGlzdEFydGlmYWN0cyhjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkxpc3RBcnRpZmFjdHMoY3R4LCByZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UudG9CaW5hcnkocmVzcG9uc2UpKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXF1ZXN0LmZyb21CaW5hcnkoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBwcm90b2J1ZiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkdldFNpZ25lZEFydGlmYWN0VVJMKGN0eCwgaW5wdXRSZXEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHNlcnZpY2UuR2V0U2lnbmVkQXJ0aWZhY3RVUkwoY3R4LCByZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlLnRvQmluYXJ5KHJlc3BvbnNlKSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VEZWxldGVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkRlbGV0ZUFydGlmYWN0UmVxdWVzdC5mcm9tQmluYXJ5KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUgcHJvdG9idWYgcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5EZWxldGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkRlbGV0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS50b0JpbmFyeShyZXNwb25zZSkpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJ0aWZhY3QudHdpcnAuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///69565\n')},70900:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.DefaultArtifactClient = void 0;\nconst core_1 = __webpack_require__(66977);\nconst config_1 = __webpack_require__(6231);\nconst upload_artifact_1 = __webpack_require__(84955);\nconst download_artifact_1 = __webpack_require__(22281);\nconst delete_artifact_1 = __webpack_require__(51059);\nconst get_artifact_1 = __webpack_require__(18162);\nconst list_artifacts_1 = __webpack_require__(33925);\nconst errors_1 = __webpack_require__(14842);\n/**\n * The default artifact client that is used by the artifact action(s).\n */\nclass DefaultArtifactClient {\n uploadArtifact(name, files, rootDirectory, options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n return (0, upload_artifact_1.uploadArtifact)(name, files, rootDirectory, options);\n }\n catch (error) {\n (0, core_1.warning)(`Artifact upload failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions is operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n downloadArtifact(artifactId, options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n if (options === null || options === void 0 ? void 0 : options.findBy) {\n const { findBy: { repositoryOwner, repositoryName, token } } = options, downloadOptions = __rest(options, ["findBy"]);\n return (0, download_artifact_1.downloadArtifactPublic)(artifactId, repositoryOwner, repositoryName, token, downloadOptions);\n }\n return (0, download_artifact_1.downloadArtifactInternal)(artifactId, options);\n }\n catch (error) {\n (0, core_1.warning)(`Download Artifact failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n listArtifacts(options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n if (options === null || options === void 0 ? void 0 : options.findBy) {\n const { findBy: { workflowRunId, repositoryOwner, repositoryName, token } } = options;\n return (0, list_artifacts_1.listArtifactsPublic)(workflowRunId, repositoryOwner, repositoryName, token, options === null || options === void 0 ? void 0 : options.latest);\n }\n return (0, list_artifacts_1.listArtifactsInternal)(options === null || options === void 0 ? void 0 : options.latest);\n }\n catch (error) {\n (0, core_1.warning)(`Listing Artifacts failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n getArtifact(artifactName, options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n if (options === null || options === void 0 ? void 0 : options.findBy) {\n const { findBy: { workflowRunId, repositoryOwner, repositoryName, token } } = options;\n return (0, get_artifact_1.getArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token);\n }\n return (0, get_artifact_1.getArtifactInternal)(artifactName);\n }\n catch (error) {\n (0, core_1.warning)(`Get Artifact failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n deleteArtifact(artifactName, options) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n if ((0, config_1.isGhes)()) {\n throw new errors_1.GHESNotSupportedError();\n }\n if (options === null || options === void 0 ? void 0 : options.findBy) {\n const { findBy: { repositoryOwner, repositoryName, workflowRunId, token } } = options;\n return (0, delete_artifact_1.deleteArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token);\n }\n return (0, delete_artifact_1.deleteArtifactInternal)(artifactName);\n }\n catch (error) {\n (0, core_1.warning)(`Delete Artifact failed with error: ${error}.\n\nErrors can be temporary, so please try again and optionally run the action with debug mode enabled for more information.\n\nIf the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`);\n throw error;\n }\n });\n }\n}\nexports.DefaultArtifactClient = DefaultArtifactClient;\n//# sourceMappingURL=client.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA5MDAuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxjQUFjO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsNkJBQTZCO0FBQzdCLGVBQWUsbUJBQU8sQ0FBQyxLQUFlO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLElBQWlCO0FBQzFDLDBCQUEwQixtQkFBTyxDQUFDLEtBQTBCO0FBQzVELDRCQUE0QixtQkFBTyxDQUFDLEtBQThCO0FBQ2xFLDBCQUEwQixtQkFBTyxDQUFDLEtBQTBCO0FBQzVELHVCQUF1QixtQkFBTyxDQUFDLEtBQXFCO0FBQ3BELHlCQUF5QixtQkFBTyxDQUFDLEtBQXVCO0FBQ3hELGlCQUFpQixtQkFBTyxDQUFDLEtBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLE1BQU07O0FBRWhGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVUsMkNBQTJDO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsTUFBTTs7QUFFbEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVSwwREFBMEQ7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RSxNQUFNOztBQUVsRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVLDBEQUEwRDtBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLE1BQU07O0FBRTdFOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVUsMERBQTBEO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsTUFBTTs7QUFFaEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9jbGllbnQuanM/M2M0ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EZWZhdWx0QXJ0aWZhY3RDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4vc2hhcmVkL2NvbmZpZ1wiKTtcbmNvbnN0IHVwbG9hZF9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vdXBsb2FkL3VwbG9hZC1hcnRpZmFjdFwiKTtcbmNvbnN0IGRvd25sb2FkX2FydGlmYWN0XzEgPSByZXF1aXJlKFwiLi9kb3dubG9hZC9kb3dubG9hZC1hcnRpZmFjdFwiKTtcbmNvbnN0IGRlbGV0ZV9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vZGVsZXRlL2RlbGV0ZS1hcnRpZmFjdFwiKTtcbmNvbnN0IGdldF9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vZmluZC9nZXQtYXJ0aWZhY3RcIik7XG5jb25zdCBsaXN0X2FydGlmYWN0c18xID0gcmVxdWlyZShcIi4vZmluZC9saXN0LWFydGlmYWN0c1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vc2hhcmVkL2Vycm9yc1wiKTtcbi8qKlxuICogVGhlIGRlZmF1bHQgYXJ0aWZhY3QgY2xpZW50IHRoYXQgaXMgdXNlZCBieSB0aGUgYXJ0aWZhY3QgYWN0aW9uKHMpLlxuICovXG5jbGFzcyBEZWZhdWx0QXJ0aWZhY3RDbGllbnQge1xuICAgIHVwbG9hZEFydGlmYWN0KG5hbWUsIGZpbGVzLCByb290RGlyZWN0b3J5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgoMCwgY29uZmlnXzEuaXNHaGVzKSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5HSEVTTm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCB1cGxvYWRfYXJ0aWZhY3RfMS51cGxvYWRBcnRpZmFjdCkobmFtZSwgZmlsZXMsIHJvb3REaXJlY3RvcnksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgQXJ0aWZhY3QgdXBsb2FkIGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBpcyBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkb3dubG9hZEFydGlmYWN0KGFydGlmYWN0SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zLCBkb3dubG9hZE9wdGlvbnMgPSBfX3Jlc3Qob3B0aW9ucywgW1wiZmluZEJ5XCJdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkb3dubG9hZF9hcnRpZmFjdF8xLmRvd25sb2FkQXJ0aWZhY3RQdWJsaWMpKGFydGlmYWN0SWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuLCBkb3dubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGRvd25sb2FkX2FydGlmYWN0XzEuZG93bmxvYWRBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdElkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYERvd25sb2FkIEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsaXN0QXJ0aWZhY3RzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGxpc3RfYXJ0aWZhY3RzXzEubGlzdEFydGlmYWN0c1B1YmxpYykod29ya2Zsb3dSdW5JZCwgcmVwb3NpdG9yeU93bmVyLCByZXBvc2l0b3J5TmFtZSwgdG9rZW4sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sYXRlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGxpc3RfYXJ0aWZhY3RzXzEubGlzdEFydGlmYWN0c0ludGVybmFsKShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGF0ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYExpc3RpbmcgQXJ0aWZhY3RzIGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRBcnRpZmFjdChhcnRpZmFjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGdldF9hcnRpZmFjdF8xLmdldEFydGlmYWN0UHVibGljKShhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCBnZXRfYXJ0aWZhY3RfMS5nZXRBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgR2V0IEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWxldGVBcnRpZmFjdChhcnRpZmFjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB3b3JrZmxvd1J1bklkLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGRlbGV0ZV9hcnRpZmFjdF8xLmRlbGV0ZUFydGlmYWN0UHVibGljKShhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkZWxldGVfYXJ0aWZhY3RfMS5kZWxldGVBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgRGVsZXRlIEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuRGVmYXVsdEFydGlmYWN0Q2xpZW50ID0gRGVmYXVsdEFydGlmYWN0Q2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xpZW50LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///70900\n')},51059:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.deleteArtifactInternal = exports.deleteArtifactPublic = void 0;\nconst core_1 = __webpack_require__(66977);\nconst github_1 = __webpack_require__(66377);\nconst user_agent_1 = __webpack_require__(88070);\nconst retry_options_1 = __webpack_require__(32786);\nconst utils_1 = __webpack_require__(15133);\nconst plugin_request_log_1 = __webpack_require__(42937);\nconst plugin_retry_1 = __webpack_require__(89673);\nconst artifact_twirp_client_1 = __webpack_require__(75630);\nconst util_1 = __webpack_require__(52901);\nconst generated_1 = __webpack_require__(10735);\nconst get_artifact_1 = __webpack_require__(18162);\nconst errors_1 = __webpack_require__(14842);\nfunction deleteArtifactPublic(artifactName, workflowRunId, repositoryOwner, repositoryName, token) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults);\n const opts = {\n log: undefined,\n userAgent: (0, user_agent_1.getUserAgentString)(),\n previews: undefined,\n retry: retryOpts,\n request: requestOpts\n };\n const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog);\n const getArtifactResp = yield (0, get_artifact_1.getArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token);\n const deleteArtifactResp = yield github.rest.actions.deleteArtifact({\n owner: repositoryOwner,\n repo: repositoryName,\n artifact_id: getArtifactResp.artifact.id\n });\n if (deleteArtifactResp.status !== 204) {\n throw new errors_1.InvalidResponseError(`Invalid response from GitHub API: ${deleteArtifactResp.status} (${(_a = deleteArtifactResp === null || deleteArtifactResp === void 0 ? void 0 : deleteArtifactResp.headers) === null || _a === void 0 ? void 0 : _a['x-github-request-id']})`);\n }\n return {\n id: getArtifactResp.artifact.id\n };\n });\n}\nexports.deleteArtifactPublic = deleteArtifactPublic;\nfunction deleteArtifactInternal(artifactName) {\n return __awaiter(this, void 0, void 0, function* () {\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)();\n const listReq = {\n workflowRunBackendId,\n workflowJobRunBackendId,\n nameFilter: generated_1.StringValue.create({ value: artifactName })\n };\n const listRes = yield artifactClient.ListArtifacts(listReq);\n if (listRes.artifacts.length === 0) {\n throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName}`);\n }\n let artifact = listRes.artifacts[0];\n if (listRes.artifacts.length > 1) {\n artifact = listRes.artifacts.sort((a, b) => Number(b.databaseId) - Number(a.databaseId))[0];\n (0, core_1.debug)(`More than one artifact found for a single name, returning newest (id: ${artifact.databaseId})`);\n }\n const req = {\n workflowRunBackendId: artifact.workflowRunBackendId,\n workflowJobRunBackendId: artifact.workflowJobRunBackendId,\n name: artifact.name\n };\n const res = yield artifactClient.DeleteArtifact(req);\n (0, core_1.info)(`Artifact '${artifactName}' (ID: ${res.artifactId}) deleted`);\n return {\n id: Number(res.artifactId)\n };\n });\n}\nexports.deleteArtifactInternal = deleteArtifactInternal;\n//# sourceMappingURL=delete-artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEwNTkuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDhCQUE4QixHQUFHLDRCQUE0QjtBQUM3RCxlQUFlLG1CQUFPLENBQUMsS0FBZTtBQUN0QyxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFpQjtBQUMxQyxxQkFBcUIsbUJBQU8sQ0FBQyxLQUFzQjtBQUNuRCx3QkFBd0IsbUJBQU8sQ0FBQyxLQUF1QjtBQUN2RCxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUEyQjtBQUNuRCw2QkFBNkIsbUJBQU8sQ0FBQyxLQUE2QjtBQUNsRSx1QkFBdUIsbUJBQU8sQ0FBQyxLQUF1QjtBQUN0RCxnQ0FBZ0MsbUJBQU8sQ0FBQyxLQUFpQztBQUN6RSxlQUFlLG1CQUFPLENBQUMsS0FBZ0I7QUFDdkMsb0JBQW9CLG1CQUFPLENBQUMsS0FBaUI7QUFDN0MsdUJBQXVCLG1CQUFPLENBQUMsS0FBc0I7QUFDckQsaUJBQWlCLG1CQUFPLENBQUMsS0FBa0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHlGQUF5RiwyQkFBMkIsR0FBRyx5S0FBeUs7QUFDaFM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdEQUFnRDtBQUNoRTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQscUJBQXFCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRixhQUFhO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUdBQXVHLG9CQUFvQjtBQUMzSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxhQUFhLFNBQVMsZUFBZTtBQUMzRTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4QkFBOEI7QUFDOUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9kZWxldGUvZGVsZXRlLWFydGlmYWN0LmpzP2ZjYmIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RJbnRlcm5hbCA9IGV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RQdWJsaWMgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGdpdGh1Yl8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1YlwiKTtcbmNvbnN0IHVzZXJfYWdlbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXNlci1hZ2VudFwiKTtcbmNvbnN0IHJldHJ5X29wdGlvbnNfMSA9IHJlcXVpcmUoXCIuLi9maW5kL3JldHJ5LW9wdGlvbnNcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHNcIik7XG5jb25zdCBwbHVnaW5fcmVxdWVzdF9sb2dfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVxdWVzdC1sb2dcIik7XG5jb25zdCBwbHVnaW5fcmV0cnlfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmV0cnlcIik7XG5jb25zdCBhcnRpZmFjdF90d2lycF9jbGllbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvYXJ0aWZhY3QtdHdpcnAtY2xpZW50XCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuY29uc3QgZ2V0X2FydGlmYWN0XzEgPSByZXF1aXJlKFwiLi4vZmluZC9nZXQtYXJ0aWZhY3RcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuZnVuY3Rpb24gZGVsZXRlQXJ0aWZhY3RQdWJsaWMoYXJ0aWZhY3ROYW1lLCB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbikge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBbcmV0cnlPcHRzLCByZXF1ZXN0T3B0c10gPSAoMCwgcmV0cnlfb3B0aW9uc18xLmdldFJldHJ5T3B0aW9ucykodXRpbHNfMS5kZWZhdWx0cyk7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgICAgICBsb2c6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVzZXJBZ2VudDogKDAsIHVzZXJfYWdlbnRfMS5nZXRVc2VyQWdlbnRTdHJpbmcpKCksXG4gICAgICAgICAgICBwcmV2aWV3czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmV0cnk6IHJldHJ5T3B0cyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGdpdGh1YiA9ICgwLCBnaXRodWJfMS5nZXRPY3Rva2l0KSh0b2tlbiwgb3B0cywgcGx1Z2luX3JldHJ5XzEucmV0cnksIHBsdWdpbl9yZXF1ZXN0X2xvZ18xLnJlcXVlc3RMb2cpO1xuICAgICAgICBjb25zdCBnZXRBcnRpZmFjdFJlc3AgPSB5aWVsZCAoMCwgZ2V0X2FydGlmYWN0XzEuZ2V0QXJ0aWZhY3RQdWJsaWMpKGFydGlmYWN0TmFtZSwgd29ya2Zsb3dSdW5JZCwgcmVwb3NpdG9yeU93bmVyLCByZXBvc2l0b3J5TmFtZSwgdG9rZW4pO1xuICAgICAgICBjb25zdCBkZWxldGVBcnRpZmFjdFJlc3AgPSB5aWVsZCBnaXRodWIucmVzdC5hY3Rpb25zLmRlbGV0ZUFydGlmYWN0KHtcbiAgICAgICAgICAgIG93bmVyOiByZXBvc2l0b3J5T3duZXIsXG4gICAgICAgICAgICByZXBvOiByZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICAgIGFydGlmYWN0X2lkOiBnZXRBcnRpZmFjdFJlc3AuYXJ0aWZhY3QuaWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChkZWxldGVBcnRpZmFjdFJlc3Auc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5JbnZhbGlkUmVzcG9uc2VFcnJvcihgSW52YWxpZCByZXNwb25zZSBmcm9tIEdpdEh1YiBBUEk6ICR7ZGVsZXRlQXJ0aWZhY3RSZXNwLnN0YXR1c30gKCR7KF9hID0gZGVsZXRlQXJ0aWZhY3RSZXNwID09PSBudWxsIHx8IGRlbGV0ZUFydGlmYWN0UmVzcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZXRlQXJ0aWZhY3RSZXNwLmhlYWRlcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVsneC1naXRodWItcmVxdWVzdC1pZCddfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGdldEFydGlmYWN0UmVzcC5hcnRpZmFjdC5pZFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVBcnRpZmFjdFB1YmxpYyA9IGRlbGV0ZUFydGlmYWN0UHVibGljO1xuZnVuY3Rpb24gZGVsZXRlQXJ0aWZhY3RJbnRlcm5hbChhcnRpZmFjdE5hbWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBhcnRpZmFjdENsaWVudCA9ICgwLCBhcnRpZmFjdF90d2lycF9jbGllbnRfMS5pbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQpKCk7XG4gICAgICAgIGNvbnN0IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkIH0gPSAoMCwgdXRpbF8xLmdldEJhY2tlbmRJZHNGcm9tVG9rZW4pKCk7XG4gICAgICAgIGNvbnN0IGxpc3RSZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZUZpbHRlcjogZ2VuZXJhdGVkXzEuU3RyaW5nVmFsdWUuY3JlYXRlKHsgdmFsdWU6IGFydGlmYWN0TmFtZSB9KVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsaXN0UmVzID0geWllbGQgYXJ0aWZhY3RDbGllbnQuTGlzdEFydGlmYWN0cyhsaXN0UmVxKTtcbiAgICAgICAgaWYgKGxpc3RSZXMuYXJ0aWZhY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkFydGlmYWN0Tm90Rm91bmRFcnJvcihgQXJ0aWZhY3Qgbm90IGZvdW5kIGZvciBuYW1lOiAke2FydGlmYWN0TmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJ0aWZhY3QgPSBsaXN0UmVzLmFydGlmYWN0c1swXTtcbiAgICAgICAgaWYgKGxpc3RSZXMuYXJ0aWZhY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGFydGlmYWN0ID0gbGlzdFJlcy5hcnRpZmFjdHMuc29ydCgoYSwgYikgPT4gTnVtYmVyKGIuZGF0YWJhc2VJZCkgLSBOdW1iZXIoYS5kYXRhYmFzZUlkKSlbMF07XG4gICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgTW9yZSB0aGFuIG9uZSBhcnRpZmFjdCBmb3VuZCBmb3IgYSBzaW5nbGUgbmFtZSwgcmV0dXJuaW5nIG5ld2VzdCAoaWQ6ICR7YXJ0aWZhY3QuZGF0YWJhc2VJZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IGFydGlmYWN0LndvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IGFydGlmYWN0LndvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3QubmFtZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB5aWVsZCBhcnRpZmFjdENsaWVudC5EZWxldGVBcnRpZmFjdChyZXEpO1xuICAgICAgICAoMCwgY29yZV8xLmluZm8pKGBBcnRpZmFjdCAnJHthcnRpZmFjdE5hbWV9JyAoSUQ6ICR7cmVzLmFydGlmYWN0SWR9KSBkZWxldGVkYCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogTnVtYmVyKHJlcy5hcnRpZmFjdElkKVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVBcnRpZmFjdEludGVybmFsID0gZGVsZXRlQXJ0aWZhY3RJbnRlcm5hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlbGV0ZS1hcnRpZmFjdC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///51059\n")},22281:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.downloadArtifactInternal = exports.downloadArtifactPublic = exports.streamExtractExternal = void 0;\nconst promises_1 = __importDefault(__webpack_require__(91943));\nconst github = __importStar(__webpack_require__(66377));\nconst core = __importStar(__webpack_require__(66977));\nconst httpClient = __importStar(__webpack_require__(40677));\nconst unzip_stream_1 = __importDefault(__webpack_require__(10718));\nconst user_agent_1 = __webpack_require__(88070);\nconst config_1 = __webpack_require__(6231);\nconst artifact_twirp_client_1 = __webpack_require__(75630);\nconst generated_1 = __webpack_require__(10735);\nconst util_1 = __webpack_require__(52901);\nconst errors_1 = __webpack_require__(14842);\nconst scrubQueryParameters = (url) => {\n const parsed = new URL(url);\n parsed.search = '';\n return parsed.toString();\n};\nfunction exists(path) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield promises_1.default.access(path);\n return true;\n }\n catch (error) {\n if (error.code === 'ENOENT') {\n return false;\n }\n else {\n throw error;\n }\n }\n });\n}\nfunction streamExtract(url, directory) {\n return __awaiter(this, void 0, void 0, function* () {\n let retryCount = 0;\n while (retryCount < 5) {\n try {\n yield streamExtractExternal(url, directory);\n return;\n }\n catch (error) {\n retryCount++;\n core.debug(`Failed to download artifact after ${retryCount} retries due to ${error.message}. Retrying in 5 seconds...`);\n // wait 5 seconds before retrying\n yield new Promise(resolve => setTimeout(resolve, 5000));\n }\n }\n throw new Error(`Artifact download failed after ${retryCount} retries.`);\n });\n}\nfunction streamExtractExternal(url, directory) {\n return __awaiter(this, void 0, void 0, function* () {\n const client = new httpClient.HttpClient((0, user_agent_1.getUserAgentString)());\n const response = yield client.get(url);\n if (response.message.statusCode !== 200) {\n throw new Error(`Unexpected HTTP response from blob storage: ${response.message.statusCode} ${response.message.statusMessage}`);\n }\n const timeout = 30 * 1000; // 30 seconds\n return new Promise((resolve, reject) => {\n const timerFn = () => {\n response.message.destroy(new Error(`Blob storage chunk did not respond in ${timeout}ms`));\n };\n const timer = setTimeout(timerFn, timeout);\n response.message\n .on('data', () => {\n timer.refresh();\n })\n .on('error', (error) => {\n core.debug(`response.message: Artifact download failed: ${error.message}`);\n clearTimeout(timer);\n reject(error);\n })\n .pipe(unzip_stream_1.default.Extract({ path: directory }))\n .on('close', () => {\n clearTimeout(timer);\n resolve();\n })\n .on('error', (error) => {\n reject(error);\n });\n });\n });\n}\nexports.streamExtractExternal = streamExtractExternal;\nfunction downloadArtifactPublic(artifactId, repositoryOwner, repositoryName, token, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const downloadPath = yield resolveOrCreateDirectory(options === null || options === void 0 ? void 0 : options.path);\n const api = github.getOctokit(token);\n core.info(`Downloading artifact '${artifactId}' from '${repositoryOwner}/${repositoryName}'`);\n const { headers, status } = yield api.rest.actions.downloadArtifact({\n owner: repositoryOwner,\n repo: repositoryName,\n artifact_id: artifactId,\n archive_format: 'zip',\n request: {\n redirect: 'manual'\n }\n });\n if (status !== 302) {\n throw new Error(`Unable to download artifact. Unexpected status: ${status}`);\n }\n const { location } = headers;\n if (!location) {\n throw new Error(`Unable to redirect to artifact download url`);\n }\n core.info(`Redirecting to blob download url: ${scrubQueryParameters(location)}`);\n try {\n core.info(`Starting download of artifact to: ${downloadPath}`);\n yield streamExtract(location, downloadPath);\n core.info(`Artifact download completed successfully.`);\n }\n catch (error) {\n throw new Error(`Unable to download and extract artifact: ${error.message}`);\n }\n return { downloadPath };\n });\n}\nexports.downloadArtifactPublic = downloadArtifactPublic;\nfunction downloadArtifactInternal(artifactId, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const downloadPath = yield resolveOrCreateDirectory(options === null || options === void 0 ? void 0 : options.path);\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)();\n const listReq = {\n workflowRunBackendId,\n workflowJobRunBackendId,\n idFilter: generated_1.Int64Value.create({ value: artifactId.toString() })\n };\n const { artifacts } = yield artifactClient.ListArtifacts(listReq);\n if (artifacts.length === 0) {\n throw new errors_1.ArtifactNotFoundError(`No artifacts found for ID: ${artifactId}\\nAre you trying to download from a different run? Try specifying a github-token with \\`actions:read\\` scope.`);\n }\n if (artifacts.length > 1) {\n core.warning('Multiple artifacts found, defaulting to first.');\n }\n const signedReq = {\n workflowRunBackendId: artifacts[0].workflowRunBackendId,\n workflowJobRunBackendId: artifacts[0].workflowJobRunBackendId,\n name: artifacts[0].name\n };\n const { signedUrl } = yield artifactClient.GetSignedArtifactURL(signedReq);\n core.info(`Redirecting to blob download url: ${scrubQueryParameters(signedUrl)}`);\n try {\n core.info(`Starting download of artifact to: ${downloadPath}`);\n yield streamExtract(signedUrl, downloadPath);\n core.info(`Artifact download completed successfully.`);\n }\n catch (error) {\n throw new Error(`Unable to download and extract artifact: ${error.message}`);\n }\n return { downloadPath };\n });\n}\nexports.downloadArtifactInternal = downloadArtifactInternal;\nfunction resolveOrCreateDirectory(downloadPath = (0, config_1.getGitHubWorkspaceDir)()) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!(yield exists(downloadPath))) {\n core.debug(`Artifact destination folder does not exist, creating: ${downloadPath}`);\n yield promises_1.default.mkdir(downloadPath, { recursive: true });\n }\n else {\n core.debug(`Artifact destination folder already exists: ${downloadPath}`);\n }\n return downloadPath;\n });\n}\n//# sourceMappingURL=download-artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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dkY7QUFDQSwyREFBMkQsYUFBYTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxjQUFjO0FBQ3RGO0FBQ0EsaUJBQWlCO0FBQ2pCLEtBQUs7QUFDTDtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQSxnRkFBZ0YsYUFBYTtBQUM3RiwyREFBMkQsaUJBQWlCO0FBQzVFO0FBQ0E7QUFDQSxzRUFBc0UsYUFBYTtBQUNuRjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9kb3dubG9hZC9kb3dubG9hZC1hcnRpZmFjdC5qcz8xOGRiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZG93bmxvYWRBcnRpZmFjdEludGVybmFsID0gZXhwb3J0cy5kb3dubG9hZEFydGlmYWN0UHVibGljID0gZXhwb3J0cy5zdHJlYW1FeHRyYWN0RXh0ZXJuYWwgPSB2b2lkIDA7XG5jb25zdCBwcm9taXNlc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJmcy9wcm9taXNlc1wiKSk7XG5jb25zdCBnaXRodWIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1YlwiKSk7XG5jb25zdCBjb3JlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpKTtcbmNvbnN0IGh0dHBDbGllbnQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2h0dHAtY2xpZW50XCIpKTtcbmNvbnN0IHVuemlwX3N0cmVhbV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJ1bnppcC1zdHJlYW1cIikpO1xuY29uc3QgdXNlcl9hZ2VudF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91c2VyLWFnZW50XCIpO1xuY29uc3QgY29uZmlnXzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2NvbmZpZ1wiKTtcbmNvbnN0IGFydGlmYWN0X3R3aXJwX2NsaWVudF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9hcnRpZmFjdC10d2lycC1jbGllbnRcIik7XG5jb25zdCBnZW5lcmF0ZWRfMSA9IHJlcXVpcmUoXCIuLi8uLi9nZW5lcmF0ZWRcIik7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL3V0aWxcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuY29uc3Qgc2NydWJRdWVyeVBhcmFtZXRlcnMgPSAodXJsKSA9PiB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgIHBhcnNlZC5zZWFyY2ggPSAnJztcbiAgICByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG59O1xuZnVuY3Rpb24gZXhpc3RzKHBhdGgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgeWllbGQgcHJvbWlzZXNfMS5kZWZhdWx0LmFjY2VzcyhwYXRoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHN0cmVhbUV4dHJhY3QodXJsLCBkaXJlY3RvcnkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG4gICAgICAgIHdoaWxlIChyZXRyeUNvdW50IDwgNSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBzdHJlYW1FeHRyYWN0RXh0ZXJuYWwodXJsLCBkaXJlY3RvcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICAgICAgICBjb3JlLmRlYnVnKGBGYWlsZWQgdG8gZG93bmxvYWQgYXJ0aWZhY3QgYWZ0ZXIgJHtyZXRyeUNvdW50fSByZXRyaWVzIGR1ZSB0byAke2Vycm9yLm1lc3NhZ2V9LiBSZXRyeWluZyBpbiA1IHNlY29uZHMuLi5gKTtcbiAgICAgICAgICAgICAgICAvLyB3YWl0IDUgc2Vjb25kcyBiZWZvcmUgcmV0cnlpbmdcbiAgICAgICAgICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJ0aWZhY3QgZG93bmxvYWQgZmFpbGVkIGFmdGVyICR7cmV0cnlDb3VudH0gcmV0cmllcy5gKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHN0cmVhbUV4dHJhY3RFeHRlcm5hbCh1cmwsIGRpcmVjdG9yeSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBodHRwQ2xpZW50Lkh0dHBDbGllbnQoKDAsIHVzZXJfYWdlbnRfMS5nZXRVc2VyQWdlbnRTdHJpbmcpKCkpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGNsaWVudC5nZXQodXJsKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgSFRUUCByZXNwb25zZSBmcm9tIGJsb2Igc3RvcmFnZTogJHtyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGV9ICR7cmVzcG9uc2UubWVzc2FnZS5zdGF0dXNNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSAzMCAqIDEwMDA7IC8vIDMwIHNlY29uZHNcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVyRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZS5kZXN0cm95KG5ldyBFcnJvcihgQmxvYiBzdG9yYWdlIGNodW5rIGRpZCBub3QgcmVzcG9uZCBpbiAke3RpbWVvdXR9bXNgKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KHRpbWVyRm4sIHRpbWVvdXQpO1xuICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZVxuICAgICAgICAgICAgICAgIC5vbignZGF0YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aW1lci5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb3JlLmRlYnVnKGByZXNwb25zZS5tZXNzYWdlOiBBcnRpZmFjdCBkb3dubG9hZCBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5waXBlKHVuemlwX3N0cmVhbV8xLmRlZmF1bHQuRXh0cmFjdCh7IHBhdGg6IGRpcmVjdG9yeSB9KSlcbiAgICAgICAgICAgICAgICAub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc3RyZWFtRXh0cmFjdEV4dGVybmFsID0gc3RyZWFtRXh0cmFjdEV4dGVybmFsO1xuZnVuY3Rpb24gZG93bmxvYWRBcnRpZmFjdFB1YmxpYyhhcnRpZmFjdElkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiwgb3B0aW9ucykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkUGF0aCA9IHlpZWxkIHJlc29sdmVPckNyZWF0ZURpcmVjdG9yeShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucGF0aCk7XG4gICAgICAgIGNvbnN0IGFwaSA9IGdpdGh1Yi5nZXRPY3Rva2l0KHRva2VuKTtcbiAgICAgICAgY29yZS5pbmZvKGBEb3dubG9hZGluZyBhcnRpZmFjdCAnJHthcnRpZmFjdElkfScgZnJvbSAnJHtyZXBvc2l0b3J5T3duZXJ9LyR7cmVwb3NpdG9yeU5hbWV9J2ApO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMsIHN0YXR1cyB9ID0geWllbGQgYXBpLnJlc3QuYWN0aW9ucy5kb3dubG9hZEFydGlmYWN0KHtcbiAgICAgICAgICAgIG93bmVyOiByZXBvc2l0b3J5T3duZXIsXG4gICAgICAgICAgICByZXBvOiByZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICAgIGFydGlmYWN0X2lkOiBhcnRpZmFjdElkLFxuICAgICAgICAgICAgYXJjaGl2ZV9mb3JtYXQ6ICd6aXAnLFxuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnbWFudWFsJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gMzAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkb3dubG9hZCBhcnRpZmFjdC4gVW5leHBlY3RlZCBzdGF0dXM6ICR7c3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbG9jYXRpb24gfSA9IGhlYWRlcnM7XG4gICAgICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlZGlyZWN0IHRvIGFydGlmYWN0IGRvd25sb2FkIHVybGApO1xuICAgICAgICB9XG4gICAgICAgIGNvcmUuaW5mbyhgUmVkaXJlY3RpbmcgdG8gYmxvYiBkb3dubG9hZCB1cmw6ICR7c2NydWJRdWVyeVBhcmFtZXRlcnMobG9jYXRpb24pfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29yZS5pbmZvKGBTdGFydGluZyBkb3dubG9hZCBvZiBhcnRpZmFjdCB0bzogJHtkb3dubG9hZFBhdGh9YCk7XG4gICAgICAgICAgICB5aWVsZCBzdHJlYW1FeHRyYWN0KGxvY2F0aW9uLCBkb3dubG9hZFBhdGgpO1xuICAgICAgICAgICAgY29yZS5pbmZvKGBBcnRpZmFjdCBkb3dubG9hZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZG93bmxvYWQgYW5kIGV4dHJhY3QgYXJ0aWZhY3Q6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb3dubG9hZFBhdGggfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZG93bmxvYWRBcnRpZmFjdFB1YmxpYyA9IGRvd25sb2FkQXJ0aWZhY3RQdWJsaWM7XG5mdW5jdGlvbiBkb3dubG9hZEFydGlmYWN0SW50ZXJuYWwoYXJ0aWZhY3RJZCwgb3B0aW9ucykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkUGF0aCA9IHlpZWxkIHJlc29sdmVPckNyZWF0ZURpcmVjdG9yeShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucGF0aCk7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0Q2xpZW50ID0gKDAsIGFydGlmYWN0X3R3aXJwX2NsaWVudF8xLmludGVybmFsQXJ0aWZhY3RUd2lycENsaWVudCkoKTtcbiAgICAgICAgY29uc3QgeyB3b3JrZmxvd1J1bkJhY2tlbmRJZCwgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQgfSA9ICgwLCB1dGlsXzEuZ2V0QmFja2VuZElkc0Zyb21Ub2tlbikoKTtcbiAgICAgICAgY29uc3QgbGlzdFJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICBpZEZpbHRlcjogZ2VuZXJhdGVkXzEuSW50NjRWYWx1ZS5jcmVhdGUoeyB2YWx1ZTogYXJ0aWZhY3RJZC50b1N0cmluZygpIH0pXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgYXJ0aWZhY3RzIH0gPSB5aWVsZCBhcnRpZmFjdENsaWVudC5MaXN0QXJ0aWZhY3RzKGxpc3RSZXEpO1xuICAgICAgICBpZiAoYXJ0aWZhY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkFydGlmYWN0Tm90Rm91bmRFcnJvcihgTm8gYXJ0aWZhY3RzIGZvdW5kIGZvciBJRDogJHthcnRpZmFjdElkfVxcbkFyZSB5b3UgdHJ5aW5nIHRvIGRvd25sb2FkIGZyb20gYSBkaWZmZXJlbnQgcnVuPyBUcnkgc3BlY2lmeWluZyBhIGdpdGh1Yi10b2tlbiB3aXRoIFxcYGFjdGlvbnM6cmVhZFxcYCBzY29wZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJ0aWZhY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvcmUud2FybmluZygnTXVsdGlwbGUgYXJ0aWZhY3RzIGZvdW5kLCBkZWZhdWx0aW5nIHRvIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpZ25lZFJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkOiBhcnRpZmFjdHNbMF0ud29ya2Zsb3dSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogYXJ0aWZhY3RzWzBdLndvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3RzWzBdLm5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBzaWduZWRVcmwgfSA9IHlpZWxkIGFydGlmYWN0Q2xpZW50LkdldFNpZ25lZEFydGlmYWN0VVJMKHNpZ25lZFJlcSk7XG4gICAgICAgIGNvcmUuaW5mbyhgUmVkaXJlY3RpbmcgdG8gYmxvYiBkb3dubG9hZCB1cmw6ICR7c2NydWJRdWVyeVBhcmFtZXRlcnMoc2lnbmVkVXJsKX1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvcmUuaW5mbyhgU3RhcnRpbmcgZG93bmxvYWQgb2YgYXJ0aWZhY3QgdG86ICR7ZG93bmxvYWRQYXRofWApO1xuICAgICAgICAgICAgeWllbGQgc3RyZWFtRXh0cmFjdChzaWduZWRVcmwsIGRvd25sb2FkUGF0aCk7XG4gICAgICAgICAgICBjb3JlLmluZm8oYEFydGlmYWN0IGRvd25sb2FkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkb3dubG9hZCBhbmQgZXh0cmFjdCBhcnRpZmFjdDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvd25sb2FkUGF0aCB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5kb3dubG9hZEFydGlmYWN0SW50ZXJuYWwgPSBkb3dubG9hZEFydGlmYWN0SW50ZXJuYWw7XG5mdW5jdGlvbiByZXNvbHZlT3JDcmVhdGVEaXJlY3RvcnkoZG93bmxvYWRQYXRoID0gKDAsIGNvbmZpZ18xLmdldEdpdEh1YldvcmtzcGFjZURpcikoKSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghKHlpZWxkIGV4aXN0cyhkb3dubG9hZFBhdGgpKSkge1xuICAgICAgICAgICAgY29yZS5kZWJ1ZyhgQXJ0aWZhY3QgZGVzdGluYXRpb24gZm9sZGVyIGRvZXMgbm90IGV4aXN0LCBjcmVhdGluZzogJHtkb3dubG9hZFBhdGh9YCk7XG4gICAgICAgICAgICB5aWVsZCBwcm9taXNlc18xLmRlZmF1bHQubWtkaXIoZG93bmxvYWRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvcmUuZGVidWcoYEFydGlmYWN0IGRlc3RpbmF0aW9uIGZvbGRlciBhbHJlYWR5IGV4aXN0czogJHtkb3dubG9hZFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvd25sb2FkUGF0aDtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRvd25sb2FkLWFydGlmYWN0LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///22281\n")},18162:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getArtifactInternal = exports.getArtifactPublic = void 0;\nconst github_1 = __webpack_require__(66377);\nconst plugin_retry_1 = __webpack_require__(89673);\nconst core = __importStar(__webpack_require__(66977));\nconst utils_1 = __webpack_require__(15133);\nconst retry_options_1 = __webpack_require__(32786);\nconst plugin_request_log_1 = __webpack_require__(42937);\nconst util_1 = __webpack_require__(52901);\nconst user_agent_1 = __webpack_require__(88070);\nconst artifact_twirp_client_1 = __webpack_require__(75630);\nconst generated_1 = __webpack_require__(10735);\nconst errors_1 = __webpack_require__(14842);\nfunction getArtifactPublic(artifactName, workflowRunId, repositoryOwner, repositoryName, token) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults);\n const opts = {\n log: undefined,\n userAgent: (0, user_agent_1.getUserAgentString)(),\n previews: undefined,\n retry: retryOpts,\n request: requestOpts\n };\n const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog);\n const getArtifactResp = yield github.request(\'GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts{?name}\', {\n owner: repositoryOwner,\n repo: repositoryName,\n run_id: workflowRunId,\n name: artifactName\n });\n if (getArtifactResp.status !== 200) {\n throw new errors_1.InvalidResponseError(`Invalid response from GitHub API: ${getArtifactResp.status} (${(_a = getArtifactResp === null || getArtifactResp === void 0 ? void 0 : getArtifactResp.headers) === null || _a === void 0 ? void 0 : _a[\'x-github-request-id\']})`);\n }\n if (getArtifactResp.data.artifacts.length === 0) {\n throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName}\n Please ensure that your artifact is not expired and the artifact was uploaded using a compatible version of toolkit/upload-artifact.\n For more information, visit the GitHub Artifacts FAQ: https://github.com/actions/toolkit/blob/main/packages/artifact/docs/faq.md`);\n }\n let artifact = getArtifactResp.data.artifacts[0];\n if (getArtifactResp.data.artifacts.length > 1) {\n artifact = getArtifactResp.data.artifacts.sort((a, b) => b.id - a.id)[0];\n core.debug(`More than one artifact found for a single name, returning newest (id: ${artifact.id})`);\n }\n return {\n artifact: {\n name: artifact.name,\n id: artifact.id,\n size: artifact.size_in_bytes,\n createdAt: artifact.created_at ? new Date(artifact.created_at) : undefined\n }\n };\n });\n}\nexports.getArtifactPublic = getArtifactPublic;\nfunction getArtifactInternal(artifactName) {\n return __awaiter(this, void 0, void 0, function* () {\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)();\n const req = {\n workflowRunBackendId,\n workflowJobRunBackendId,\n nameFilter: generated_1.StringValue.create({ value: artifactName })\n };\n const res = yield artifactClient.ListArtifacts(req);\n if (res.artifacts.length === 0) {\n throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName}\n Please ensure that your artifact is not expired and the artifact was uploaded using a compatible version of toolkit/upload-artifact.\n For more information, visit the GitHub Artifacts FAQ: https://github.com/actions/toolkit/blob/main/packages/artifact/docs/faq.md`);\n }\n let artifact = res.artifacts[0];\n if (res.artifacts.length > 1) {\n artifact = res.artifacts.sort((a, b) => Number(b.databaseId) - Number(a.databaseId))[0];\n core.debug(`More than one artifact found for a single name, returning newest (id: ${artifact.databaseId})`);\n }\n return {\n artifact: {\n name: artifact.name,\n id: Number(artifact.databaseId),\n size: Number(artifact.size),\n createdAt: artifact.createdAt\n ? generated_1.Timestamp.toDate(artifact.createdAt)\n : undefined\n }\n };\n });\n}\nexports.getArtifactInternal = getArtifactInternal;\n//# sourceMappingURL=get-artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgxNjIuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCwyQkFBMkIsR0FBRyx5QkFBeUI7QUFDdkQsaUJBQWlCLG1CQUFPLENBQUMsS0FBaUI7QUFDMUMsdUJBQXVCLG1CQUFPLENBQUMsS0FBdUI7QUFDdEQsMEJBQTBCLG1CQUFPLENBQUMsS0FBZTtBQUNqRCxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUEyQjtBQUNuRCx3QkFBd0IsbUJBQU8sQ0FBQyxLQUFpQjtBQUNqRCw2QkFBNkIsbUJBQU8sQ0FBQyxLQUE2QjtBQUNsRSxlQUFlLG1CQUFPLENBQUMsS0FBZ0I7QUFDdkMscUJBQXFCLG1CQUFPLENBQUMsS0FBc0I7QUFDbkQsZ0NBQWdDLG1CQUFPLENBQUMsS0FBaUM7QUFDekUsb0JBQW9CLG1CQUFPLENBQUMsS0FBaUI7QUFDN0MsaUJBQWlCLG1CQUFPLENBQUMsS0FBa0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLE1BQU0sRUFBRSxLQUFLLGVBQWUsT0FBTyxXQUFXLE1BQU07QUFDdEg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx5RkFBeUYsd0JBQXdCLEdBQUcsZ0tBQWdLO0FBQ3BSO0FBQ0E7QUFDQSxxRkFBcUY7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHLFlBQVk7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnREFBZ0Q7QUFDaEU7QUFDQTtBQUNBO0FBQ0EseURBQXlELHFCQUFxQjtBQUM5RTtBQUNBO0FBQ0E7QUFDQSxxRkFBcUY7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHLG9CQUFvQjtBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsMkJBQTJCO0FBQzNCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvZmluZC9nZXQtYXJ0aWZhY3QuanM/NjhkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFydGlmYWN0SW50ZXJuYWwgPSBleHBvcnRzLmdldEFydGlmYWN0UHVibGljID0gdm9pZCAwO1xuY29uc3QgZ2l0aHViXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvZ2l0aHViXCIpO1xuY29uc3QgcGx1Z2luX3JldHJ5XzEgPSByZXF1aXJlKFwiQG9jdG9raXQvcGx1Z2luLXJldHJ5XCIpO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHNcIik7XG5jb25zdCByZXRyeV9vcHRpb25zXzEgPSByZXF1aXJlKFwiLi9yZXRyeS1vcHRpb25zXCIpO1xuY29uc3QgcGx1Z2luX3JlcXVlc3RfbG9nXzEgPSByZXF1aXJlKFwiQG9jdG9raXQvcGx1Z2luLXJlcXVlc3QtbG9nXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgdXNlcl9hZ2VudF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91c2VyLWFnZW50XCIpO1xuY29uc3QgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2FydGlmYWN0LXR3aXJwLWNsaWVudFwiKTtcbmNvbnN0IGdlbmVyYXRlZF8xID0gcmVxdWlyZShcIi4uLy4uL2dlbmVyYXRlZFwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9lcnJvcnNcIik7XG5mdW5jdGlvbiBnZXRBcnRpZmFjdFB1YmxpYyhhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IFtyZXRyeU9wdHMsIHJlcXVlc3RPcHRzXSA9ICgwLCByZXRyeV9vcHRpb25zXzEuZ2V0UmV0cnlPcHRpb25zKSh1dGlsc18xLmRlZmF1bHRzKTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgICAgIGxvZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdXNlckFnZW50OiAoMCwgdXNlcl9hZ2VudF8xLmdldFVzZXJBZ2VudFN0cmluZykoKSxcbiAgICAgICAgICAgIHByZXZpZXdzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZXRyeTogcmV0cnlPcHRzLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdE9wdHNcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ2l0aHViID0gKDAsIGdpdGh1Yl8xLmdldE9jdG9raXQpKHRva2VuLCBvcHRzLCBwbHVnaW5fcmV0cnlfMS5yZXRyeSwgcGx1Z2luX3JlcXVlc3RfbG9nXzEucmVxdWVzdExvZyk7XG4gICAgICAgIGNvbnN0IGdldEFydGlmYWN0UmVzcCA9IHlpZWxkIGdpdGh1Yi5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcnRpZmFjdHN7P25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlOYW1lLFxuICAgICAgICAgICAgcnVuX2lkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3ROYW1lXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZ2V0QXJ0aWZhY3RSZXNwLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuSW52YWxpZFJlc3BvbnNlRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgZnJvbSBHaXRIdWIgQVBJOiAke2dldEFydGlmYWN0UmVzcC5zdGF0dXN9ICgkeyhfYSA9IGdldEFydGlmYWN0UmVzcCA9PT0gbnVsbCB8fCBnZXRBcnRpZmFjdFJlc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdldEFydGlmYWN0UmVzcC5oZWFkZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbJ3gtZ2l0aHViLXJlcXVlc3QtaWQnXX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldEFydGlmYWN0UmVzcC5kYXRhLmFydGlmYWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5BcnRpZmFjdE5vdEZvdW5kRXJyb3IoYEFydGlmYWN0IG5vdCBmb3VuZCBmb3IgbmFtZTogJHthcnRpZmFjdE5hbWV9XG4gICAgICAgIFBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGFydGlmYWN0IGlzIG5vdCBleHBpcmVkIGFuZCB0aGUgYXJ0aWZhY3Qgd2FzIHVwbG9hZGVkIHVzaW5nIGEgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRvb2xraXQvdXBsb2FkLWFydGlmYWN0LlxuICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdmlzaXQgdGhlIEdpdEh1YiBBcnRpZmFjdHMgRkFROiBodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy90b29sa2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9hcnRpZmFjdC9kb2NzL2ZhcS5tZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcnRpZmFjdCA9IGdldEFydGlmYWN0UmVzcC5kYXRhLmFydGlmYWN0c1swXTtcbiAgICAgICAgaWYgKGdldEFydGlmYWN0UmVzcC5kYXRhLmFydGlmYWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBhcnRpZmFjdCA9IGdldEFydGlmYWN0UmVzcC5kYXRhLmFydGlmYWN0cy5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZClbMF07XG4gICAgICAgICAgICBjb3JlLmRlYnVnKGBNb3JlIHRoYW4gb25lIGFydGlmYWN0IGZvdW5kIGZvciBhIHNpbmdsZSBuYW1lLCByZXR1cm5pbmcgbmV3ZXN0IChpZDogJHthcnRpZmFjdC5pZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFydGlmYWN0OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3QubmFtZSxcbiAgICAgICAgICAgICAgICBpZDogYXJ0aWZhY3QuaWQsXG4gICAgICAgICAgICAgICAgc2l6ZTogYXJ0aWZhY3Quc2l6ZV9pbl9ieXRlcyxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGFydGlmYWN0LmNyZWF0ZWRfYXQgPyBuZXcgRGF0ZShhcnRpZmFjdC5jcmVhdGVkX2F0KSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRBcnRpZmFjdFB1YmxpYyA9IGdldEFydGlmYWN0UHVibGljO1xuZnVuY3Rpb24gZ2V0QXJ0aWZhY3RJbnRlcm5hbChhcnRpZmFjdE5hbWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBhcnRpZmFjdENsaWVudCA9ICgwLCBhcnRpZmFjdF90d2lycF9jbGllbnRfMS5pbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQpKCk7XG4gICAgICAgIGNvbnN0IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkIH0gPSAoMCwgdXRpbF8xLmdldEJhY2tlbmRJZHNGcm9tVG9rZW4pKCk7XG4gICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICBuYW1lRmlsdGVyOiBnZW5lcmF0ZWRfMS5TdHJpbmdWYWx1ZS5jcmVhdGUoeyB2YWx1ZTogYXJ0aWZhY3ROYW1lIH0pXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIGFydGlmYWN0Q2xpZW50Lkxpc3RBcnRpZmFjdHMocmVxKTtcbiAgICAgICAgaWYgKHJlcy5hcnRpZmFjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuQXJ0aWZhY3ROb3RGb3VuZEVycm9yKGBBcnRpZmFjdCBub3QgZm91bmQgZm9yIG5hbWU6ICR7YXJ0aWZhY3ROYW1lfVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91ciBhcnRpZmFjdCBpcyBub3QgZXhwaXJlZCBhbmQgdGhlIGFydGlmYWN0IHdhcyB1cGxvYWRlZCB1c2luZyBhIGNvbXBhdGlibGUgdmVyc2lvbiBvZiB0b29sa2l0L3VwbG9hZC1hcnRpZmFjdC5cbiAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSBHaXRIdWIgQXJ0aWZhY3RzIEZBUTogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvdG9vbGtpdC9ibG9iL21haW4vcGFja2FnZXMvYXJ0aWZhY3QvZG9jcy9mYXEubWRgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJ0aWZhY3QgPSByZXMuYXJ0aWZhY3RzWzBdO1xuICAgICAgICBpZiAocmVzLmFydGlmYWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBhcnRpZmFjdCA9IHJlcy5hcnRpZmFjdHMuc29ydCgoYSwgYikgPT4gTnVtYmVyKGIuZGF0YWJhc2VJZCkgLSBOdW1iZXIoYS5kYXRhYmFzZUlkKSlbMF07XG4gICAgICAgICAgICBjb3JlLmRlYnVnKGBNb3JlIHRoYW4gb25lIGFydGlmYWN0IGZvdW5kIGZvciBhIHNpbmdsZSBuYW1lLCByZXR1cm5pbmcgbmV3ZXN0IChpZDogJHthcnRpZmFjdC5kYXRhYmFzZUlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJ0aWZhY3Q6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBhcnRpZmFjdC5uYW1lLFxuICAgICAgICAgICAgICAgIGlkOiBOdW1iZXIoYXJ0aWZhY3QuZGF0YWJhc2VJZCksXG4gICAgICAgICAgICAgICAgc2l6ZTogTnVtYmVyKGFydGlmYWN0LnNpemUpLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogYXJ0aWZhY3QuY3JlYXRlZEF0XG4gICAgICAgICAgICAgICAgICAgID8gZ2VuZXJhdGVkXzEuVGltZXN0YW1wLnRvRGF0ZShhcnRpZmFjdC5jcmVhdGVkQXQpXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEFydGlmYWN0SW50ZXJuYWwgPSBnZXRBcnRpZmFjdEludGVybmFsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0LWFydGlmYWN0LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///18162\n')},33925:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.listArtifactsInternal = exports.listArtifactsPublic = void 0;\nconst core_1 = __webpack_require__(66977);\nconst github_1 = __webpack_require__(66377);\nconst user_agent_1 = __webpack_require__(88070);\nconst retry_options_1 = __webpack_require__(32786);\nconst utils_1 = __webpack_require__(15133);\nconst plugin_request_log_1 = __webpack_require__(42937);\nconst plugin_retry_1 = __webpack_require__(89673);\nconst artifact_twirp_client_1 = __webpack_require__(75630);\nconst util_1 = __webpack_require__(52901);\nconst generated_1 = __webpack_require__(10735);\n// Limiting to 1000 for perf reasons\nconst maximumArtifactCount = 1000;\nconst paginationCount = 100;\nconst maxNumberOfPages = maximumArtifactCount / paginationCount;\nfunction listArtifactsPublic(workflowRunId, repositoryOwner, repositoryName, token, latest = false) {\n return __awaiter(this, void 0, void 0, function* () {\n (0, core_1.info)(`Fetching artifact list for workflow run ${workflowRunId} in repository ${repositoryOwner}/${repositoryName}`);\n let artifacts = [];\n const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults);\n const opts = {\n log: undefined,\n userAgent: (0, user_agent_1.getUserAgentString)(),\n previews: undefined,\n retry: retryOpts,\n request: requestOpts\n };\n const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog);\n let currentPageNumber = 1;\n const { data: listArtifactResponse } = yield github.rest.actions.listWorkflowRunArtifacts({\n owner: repositoryOwner,\n repo: repositoryName,\n run_id: workflowRunId,\n per_page: paginationCount,\n page: currentPageNumber\n });\n let numberOfPages = Math.ceil(listArtifactResponse.total_count / paginationCount);\n const totalArtifactCount = listArtifactResponse.total_count;\n if (totalArtifactCount > maximumArtifactCount) {\n (0, core_1.warning)(`Workflow run ${workflowRunId} has more than 1000 artifacts. Results will be incomplete as only the first ${maximumArtifactCount} artifacts will be returned`);\n numberOfPages = maxNumberOfPages;\n }\n // Iterate over the first page\n for (const artifact of listArtifactResponse.artifacts) {\n artifacts.push({\n name: artifact.name,\n id: artifact.id,\n size: artifact.size_in_bytes,\n createdAt: artifact.created_at ? new Date(artifact.created_at) : undefined\n });\n }\n // Iterate over any remaining pages\n for (currentPageNumber; currentPageNumber < numberOfPages; currentPageNumber++) {\n currentPageNumber++;\n (0, core_1.debug)(`Fetching page ${currentPageNumber} of artifact list`);\n const { data: listArtifactResponse } = yield github.rest.actions.listWorkflowRunArtifacts({\n owner: repositoryOwner,\n repo: repositoryName,\n run_id: workflowRunId,\n per_page: paginationCount,\n page: currentPageNumber\n });\n for (const artifact of listArtifactResponse.artifacts) {\n artifacts.push({\n name: artifact.name,\n id: artifact.id,\n size: artifact.size_in_bytes,\n createdAt: artifact.created_at\n ? new Date(artifact.created_at)\n : undefined\n });\n }\n }\n if (latest) {\n artifacts = filterLatest(artifacts);\n }\n (0, core_1.info)(`Found ${artifacts.length} artifact(s)`);\n return {\n artifacts\n };\n });\n}\nexports.listArtifactsPublic = listArtifactsPublic;\nfunction listArtifactsInternal(latest = false) {\n return __awaiter(this, void 0, void 0, function* () {\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)();\n const req = {\n workflowRunBackendId,\n workflowJobRunBackendId\n };\n const res = yield artifactClient.ListArtifacts(req);\n let artifacts = res.artifacts.map(artifact => ({\n name: artifact.name,\n id: Number(artifact.databaseId),\n size: Number(artifact.size),\n createdAt: artifact.createdAt\n ? generated_1.Timestamp.toDate(artifact.createdAt)\n : undefined\n }));\n if (latest) {\n artifacts = filterLatest(artifacts);\n }\n (0, core_1.info)(`Found ${artifacts.length} artifact(s)`);\n return {\n artifacts\n };\n });\n}\nexports.listArtifactsInternal = listArtifactsInternal;\n/**\n * Filters a list of artifacts to only include the latest artifact for each name\n * @param artifacts The artifacts to filter\n * @returns The filtered list of artifacts\n */\nfunction filterLatest(artifacts) {\n artifacts.sort((a, b) => b.id - a.id);\n const latestArtifacts = [];\n const seenArtifactNames = new Set();\n for (const artifact of artifacts) {\n if (!seenArtifactNames.has(artifact.name)) {\n latestArtifacts.push(artifact);\n seenArtifactNames.add(artifact.name);\n }\n }\n return latestArtifacts;\n}\n//# sourceMappingURL=list-artifacts.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM5MjUuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDZCQUE2QixHQUFHLDJCQUEyQjtBQUMzRCxlQUFlLG1CQUFPLENBQUMsS0FBZTtBQUN0QyxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFpQjtBQUMxQyxxQkFBcUIsbUJBQU8sQ0FBQyxLQUFzQjtBQUNuRCx3QkFBd0IsbUJBQU8sQ0FBQyxLQUFpQjtBQUNqRCxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUEyQjtBQUNuRCw2QkFBNkIsbUJBQU8sQ0FBQyxLQUE2QjtBQUNsRSx1QkFBdUIsbUJBQU8sQ0FBQyxLQUF1QjtBQUN0RCxnQ0FBZ0MsbUJBQU8sQ0FBQyxLQUFpQztBQUN6RSxlQUFlLG1CQUFPLENBQUMsS0FBZ0I7QUFDdkMsb0JBQW9CLG1CQUFPLENBQUMsS0FBaUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLGVBQWUsZ0JBQWdCLGdCQUFnQixHQUFHLGVBQWU7QUFDckk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw2QkFBNkI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsZUFBZSw2RUFBNkUsc0JBQXNCO0FBQ2xLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsZ0NBQWdDLG1DQUFtQztBQUNuRTtBQUNBLCtDQUErQyxtQkFBbUI7QUFDbEUsb0JBQW9CLDZCQUE2QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxrQkFBa0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnREFBZ0Q7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxrQkFBa0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL2ZpbmQvbGlzdC1hcnRpZmFjdHMuanM/MTg3MyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5saXN0QXJ0aWZhY3RzSW50ZXJuYWwgPSBleHBvcnRzLmxpc3RBcnRpZmFjdHNQdWJsaWMgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGdpdGh1Yl8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1YlwiKTtcbmNvbnN0IHVzZXJfYWdlbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXNlci1hZ2VudFwiKTtcbmNvbnN0IHJldHJ5X29wdGlvbnNfMSA9IHJlcXVpcmUoXCIuL3JldHJ5LW9wdGlvbnNcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHNcIik7XG5jb25zdCBwbHVnaW5fcmVxdWVzdF9sb2dfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVxdWVzdC1sb2dcIik7XG5jb25zdCBwbHVnaW5fcmV0cnlfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmV0cnlcIik7XG5jb25zdCBhcnRpZmFjdF90d2lycF9jbGllbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvYXJ0aWZhY3QtdHdpcnAtY2xpZW50XCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuLy8gTGltaXRpbmcgdG8gMTAwMCBmb3IgcGVyZiByZWFzb25zXG5jb25zdCBtYXhpbXVtQXJ0aWZhY3RDb3VudCA9IDEwMDA7XG5jb25zdCBwYWdpbmF0aW9uQ291bnQgPSAxMDA7XG5jb25zdCBtYXhOdW1iZXJPZlBhZ2VzID0gbWF4aW11bUFydGlmYWN0Q291bnQgLyBwYWdpbmF0aW9uQ291bnQ7XG5mdW5jdGlvbiBsaXN0QXJ0aWZhY3RzUHVibGljKHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuLCBsYXRlc3QgPSBmYWxzZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICgwLCBjb3JlXzEuaW5mbykoYEZldGNoaW5nIGFydGlmYWN0IGxpc3QgZm9yIHdvcmtmbG93IHJ1biAke3dvcmtmbG93UnVuSWR9IGluIHJlcG9zaXRvcnkgJHtyZXBvc2l0b3J5T3duZXJ9LyR7cmVwb3NpdG9yeU5hbWV9YCk7XG4gICAgICAgIGxldCBhcnRpZmFjdHMgPSBbXTtcbiAgICAgICAgY29uc3QgW3JldHJ5T3B0cywgcmVxdWVzdE9wdHNdID0gKDAsIHJldHJ5X29wdGlvbnNfMS5nZXRSZXRyeU9wdGlvbnMpKHV0aWxzXzEuZGVmYXVsdHMpO1xuICAgICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICAgICAgbG9nOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICgwLCB1c2VyX2FnZW50XzEuZ2V0VXNlckFnZW50U3RyaW5nKSgpLFxuICAgICAgICAgICAgcHJldmlld3M6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJldHJ5OiByZXRyeU9wdHMsXG4gICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0c1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnaXRodWIgPSAoMCwgZ2l0aHViXzEuZ2V0T2N0b2tpdCkodG9rZW4sIG9wdHMsIHBsdWdpbl9yZXRyeV8xLnJldHJ5LCBwbHVnaW5fcmVxdWVzdF9sb2dfMS5yZXF1ZXN0TG9nKTtcbiAgICAgICAgbGV0IGN1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgICAgICAgY29uc3QgeyBkYXRhOiBsaXN0QXJ0aWZhY3RSZXNwb25zZSB9ID0geWllbGQgZ2l0aHViLnJlc3QuYWN0aW9ucy5saXN0V29ya2Zsb3dSdW5BcnRpZmFjdHMoe1xuICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlOYW1lLFxuICAgICAgICAgICAgcnVuX2lkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgcGVyX3BhZ2U6IHBhZ2luYXRpb25Db3VudCxcbiAgICAgICAgICAgIHBhZ2U6IGN1cnJlbnRQYWdlTnVtYmVyXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbnVtYmVyT2ZQYWdlcyA9IE1hdGguY2VpbChsaXN0QXJ0aWZhY3RSZXNwb25zZS50b3RhbF9jb3VudCAvIHBhZ2luYXRpb25Db3VudCk7XG4gICAgICAgIGNvbnN0IHRvdGFsQXJ0aWZhY3RDb3VudCA9IGxpc3RBcnRpZmFjdFJlc3BvbnNlLnRvdGFsX2NvdW50O1xuICAgICAgICBpZiAodG90YWxBcnRpZmFjdENvdW50ID4gbWF4aW11bUFydGlmYWN0Q291bnQpIHtcbiAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYFdvcmtmbG93IHJ1biAke3dvcmtmbG93UnVuSWR9IGhhcyBtb3JlIHRoYW4gMTAwMCBhcnRpZmFjdHMuIFJlc3VsdHMgd2lsbCBiZSBpbmNvbXBsZXRlIGFzIG9ubHkgdGhlIGZpcnN0ICR7bWF4aW11bUFydGlmYWN0Q291bnR9IGFydGlmYWN0cyB3aWxsIGJlIHJldHVybmVkYCk7XG4gICAgICAgICAgICBudW1iZXJPZlBhZ2VzID0gbWF4TnVtYmVyT2ZQYWdlcztcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGZpcnN0IHBhZ2VcbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBsaXN0QXJ0aWZhY3RSZXNwb25zZS5hcnRpZmFjdHMpIHtcbiAgICAgICAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBhcnRpZmFjdC5uYW1lLFxuICAgICAgICAgICAgICAgIGlkOiBhcnRpZmFjdC5pZCxcbiAgICAgICAgICAgICAgICBzaXplOiBhcnRpZmFjdC5zaXplX2luX2J5dGVzLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogYXJ0aWZhY3QuY3JlYXRlZF9hdCA/IG5ldyBEYXRlKGFydGlmYWN0LmNyZWF0ZWRfYXQpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYW55IHJlbWFpbmluZyBwYWdlc1xuICAgICAgICBmb3IgKGN1cnJlbnRQYWdlTnVtYmVyOyBjdXJyZW50UGFnZU51bWJlciA8IG51bWJlck9mUGFnZXM7IGN1cnJlbnRQYWdlTnVtYmVyKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlTnVtYmVyKys7XG4gICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgRmV0Y2hpbmcgcGFnZSAke2N1cnJlbnRQYWdlTnVtYmVyfSBvZiBhcnRpZmFjdCBsaXN0YCk7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGE6IGxpc3RBcnRpZmFjdFJlc3BvbnNlIH0gPSB5aWVsZCBnaXRodWIucmVzdC5hY3Rpb25zLmxpc3RXb3JrZmxvd1J1bkFydGlmYWN0cyh7XG4gICAgICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgICAgICByZXBvOiByZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICAgICAgICBydW5faWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgcGVyX3BhZ2U6IHBhZ2luYXRpb25Db3VudCxcbiAgICAgICAgICAgICAgICBwYWdlOiBjdXJyZW50UGFnZU51bWJlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGxpc3RBcnRpZmFjdFJlc3BvbnNlLmFydGlmYWN0cykge1xuICAgICAgICAgICAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3QubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGFydGlmYWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBhcnRpZmFjdC5zaXplX2luX2J5dGVzLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGFydGlmYWN0LmNyZWF0ZWRfYXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoYXJ0aWZhY3QuY3JlYXRlZF9hdClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVzdCkge1xuICAgICAgICAgICAgYXJ0aWZhY3RzID0gZmlsdGVyTGF0ZXN0KGFydGlmYWN0cyk7XG4gICAgICAgIH1cbiAgICAgICAgKDAsIGNvcmVfMS5pbmZvKShgRm91bmQgJHthcnRpZmFjdHMubGVuZ3RofSBhcnRpZmFjdChzKWApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJ0aWZhY3RzXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RBcnRpZmFjdHNQdWJsaWMgPSBsaXN0QXJ0aWZhY3RzUHVibGljO1xuZnVuY3Rpb24gbGlzdEFydGlmYWN0c0ludGVybmFsKGxhdGVzdCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RDbGllbnQgPSAoMCwgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50KSgpO1xuICAgICAgICBjb25zdCB7IHdvcmtmbG93UnVuQmFja2VuZElkLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCB9ID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIGFydGlmYWN0Q2xpZW50Lkxpc3RBcnRpZmFjdHMocmVxKTtcbiAgICAgICAgbGV0IGFydGlmYWN0cyA9IHJlcy5hcnRpZmFjdHMubWFwKGFydGlmYWN0ID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBhcnRpZmFjdC5uYW1lLFxuICAgICAgICAgICAgaWQ6IE51bWJlcihhcnRpZmFjdC5kYXRhYmFzZUlkKSxcbiAgICAgICAgICAgIHNpemU6IE51bWJlcihhcnRpZmFjdC5zaXplKSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogYXJ0aWZhY3QuY3JlYXRlZEF0XG4gICAgICAgICAgICAgICAgPyBnZW5lcmF0ZWRfMS5UaW1lc3RhbXAudG9EYXRlKGFydGlmYWN0LmNyZWF0ZWRBdClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmIChsYXRlc3QpIHtcbiAgICAgICAgICAgIGFydGlmYWN0cyA9IGZpbHRlckxhdGVzdChhcnRpZmFjdHMpO1xuICAgICAgICB9XG4gICAgICAgICgwLCBjb3JlXzEuaW5mbykoYEZvdW5kICR7YXJ0aWZhY3RzLmxlbmd0aH0gYXJ0aWZhY3QocylgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFydGlmYWN0c1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5saXN0QXJ0aWZhY3RzSW50ZXJuYWwgPSBsaXN0QXJ0aWZhY3RzSW50ZXJuYWw7XG4vKipcbiAqIEZpbHRlcnMgYSBsaXN0IG9mIGFydGlmYWN0cyB0byBvbmx5IGluY2x1ZGUgdGhlIGxhdGVzdCBhcnRpZmFjdCBmb3IgZWFjaCBuYW1lXG4gKiBAcGFyYW0gYXJ0aWZhY3RzIFRoZSBhcnRpZmFjdHMgdG8gZmlsdGVyXG4gKiBAcmV0dXJucyBUaGUgZmlsdGVyZWQgbGlzdCBvZiBhcnRpZmFjdHNcbiAqL1xuZnVuY3Rpb24gZmlsdGVyTGF0ZXN0KGFydGlmYWN0cykge1xuICAgIGFydGlmYWN0cy5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCk7XG4gICAgY29uc3QgbGF0ZXN0QXJ0aWZhY3RzID0gW107XG4gICAgY29uc3Qgc2VlbkFydGlmYWN0TmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBhcnRpZmFjdHMpIHtcbiAgICAgICAgaWYgKCFzZWVuQXJ0aWZhY3ROYW1lcy5oYXMoYXJ0aWZhY3QubmFtZSkpIHtcbiAgICAgICAgICAgIGxhdGVzdEFydGlmYWN0cy5wdXNoKGFydGlmYWN0KTtcbiAgICAgICAgICAgIHNlZW5BcnRpZmFjdE5hbWVzLmFkZChhcnRpZmFjdC5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF0ZXN0QXJ0aWZhY3RzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGlzdC1hcnRpZmFjdHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///33925\n')},32786:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getRetryOptions = void 0;\nconst core = __importStar(__webpack_require__(66977));\n// Defaults for fetching artifacts\nconst defaultMaxRetryNumber = 5;\nconst defaultExemptStatusCodes = [400, 401, 403, 404, 422]; // https://github.com/octokit/plugin-retry.js/blob/9a2443746c350b3beedec35cf26e197ea318a261/src/index.ts#L14\nfunction getRetryOptions(defaultOptions, retries = defaultMaxRetryNumber, exemptStatusCodes = defaultExemptStatusCodes) {\n var _a;\n if (retries <= 0) {\n return [{ enabled: false }, defaultOptions.request];\n }\n const retryOptions = {\n enabled: true\n };\n if (exemptStatusCodes.length > 0) {\n retryOptions.doNotRetry = exemptStatusCodes;\n }\n // The GitHub type has some defaults for `options.request`\n // see: https://github.com/actions/toolkit/blob/4fbc5c941a57249b19562015edbd72add14be93d/packages/github/src/utils.ts#L15\n // We pass these in here so they are not overridden.\n const requestOptions = Object.assign(Object.assign({}, defaultOptions.request), { retries });\n core.debug(`GitHub client configured with: (retries: ${requestOptions.retries}, retry-exempt-status-code: ${(_a = retryOptions.doNotRetry) !== null && _a !== void 0 ? _a : \'octokit default: [400, 401, 403, 404, 422]\'})`);\n return [retryOptions, requestOptions];\n}\nexports.getRetryOptions = getRetryOptions;\n//# sourceMappingURL=retry-options.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI3ODYuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHVCQUF1QjtBQUN2QiwwQkFBMEIsbUJBQU8sQ0FBQyxLQUFlO0FBQ2pEO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCw2QkFBNkIsU0FBUztBQUMvRiwyREFBMkQsdUJBQXVCLDhCQUE4Qiw2R0FBNkc7QUFDN047QUFDQTtBQUNBLHVCQUF1QjtBQUN2QiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL2ZpbmQvcmV0cnktb3B0aW9ucy5qcz9lMGM3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFJldHJ5T3B0aW9ucyA9IHZvaWQgMDtcbmNvbnN0IGNvcmUgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2NvcmVcIikpO1xuLy8gRGVmYXVsdHMgZm9yIGZldGNoaW5nIGFydGlmYWN0c1xuY29uc3QgZGVmYXVsdE1heFJldHJ5TnVtYmVyID0gNTtcbmNvbnN0IGRlZmF1bHRFeGVtcHRTdGF0dXNDb2RlcyA9IFs0MDAsIDQwMSwgNDAzLCA0MDQsIDQyMl07IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9vY3Rva2l0L3BsdWdpbi1yZXRyeS5qcy9ibG9iLzlhMjQ0Mzc0NmMzNTBiM2JlZWRlYzM1Y2YyNmUxOTdlYTMxOGEyNjEvc3JjL2luZGV4LnRzI0wxNFxuZnVuY3Rpb24gZ2V0UmV0cnlPcHRpb25zKGRlZmF1bHRPcHRpb25zLCByZXRyaWVzID0gZGVmYXVsdE1heFJldHJ5TnVtYmVyLCBleGVtcHRTdGF0dXNDb2RlcyA9IGRlZmF1bHRFeGVtcHRTdGF0dXNDb2Rlcykge1xuICAgIHZhciBfYTtcbiAgICBpZiAocmV0cmllcyA8PSAwKSB7XG4gICAgICAgIHJldHVybiBbeyBlbmFibGVkOiBmYWxzZSB9LCBkZWZhdWx0T3B0aW9ucy5yZXF1ZXN0XTtcbiAgICB9XG4gICAgY29uc3QgcmV0cnlPcHRpb25zID0ge1xuICAgICAgICBlbmFibGVkOiB0cnVlXG4gICAgfTtcbiAgICBpZiAoZXhlbXB0U3RhdHVzQ29kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXRyeU9wdGlvbnMuZG9Ob3RSZXRyeSA9IGV4ZW1wdFN0YXR1c0NvZGVzO1xuICAgIH1cbiAgICAvLyBUaGUgR2l0SHViIHR5cGUgaGFzIHNvbWUgZGVmYXVsdHMgZm9yIGBvcHRpb25zLnJlcXVlc3RgXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy90b29sa2l0L2Jsb2IvNGZiYzVjOTQxYTU3MjQ5YjE5NTYyMDE1ZWRiZDcyYWRkMTRiZTkzZC9wYWNrYWdlcy9naXRodWIvc3JjL3V0aWxzLnRzI0wxNVxuICAgIC8vIFdlIHBhc3MgdGhlc2UgaW4gaGVyZSBzbyB0aGV5IGFyZSBub3Qgb3ZlcnJpZGRlbi5cbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMucmVxdWVzdCksIHsgcmV0cmllcyB9KTtcbiAgICBjb3JlLmRlYnVnKGBHaXRIdWIgY2xpZW50IGNvbmZpZ3VyZWQgd2l0aDogKHJldHJpZXM6ICR7cmVxdWVzdE9wdGlvbnMucmV0cmllc30sIHJldHJ5LWV4ZW1wdC1zdGF0dXMtY29kZTogJHsoX2EgPSByZXRyeU9wdGlvbnMuZG9Ob3RSZXRyeSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ29jdG9raXQgZGVmYXVsdDogWzQwMCwgNDAxLCA0MDMsIDQwNCwgNDIyXSd9KWApO1xuICAgIHJldHVybiBbcmV0cnlPcHRpb25zLCByZXF1ZXN0T3B0aW9uc107XG59XG5leHBvcnRzLmdldFJldHJ5T3B0aW9ucyA9IGdldFJldHJ5T3B0aW9ucztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldHJ5LW9wdGlvbnMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///32786\n')},75630:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.internalArtifactTwirpClient = void 0;\nconst http_client_1 = __webpack_require__(40677);\nconst auth_1 = __webpack_require__(69259);\nconst core_1 = __webpack_require__(66977);\nconst generated_1 = __webpack_require__(10735);\nconst config_1 = __webpack_require__(6231);\nconst user_agent_1 = __webpack_require__(88070);\nconst errors_1 = __webpack_require__(14842);\nclass ArtifactHttpClient {\n constructor(userAgent, maxAttempts, baseRetryIntervalMilliseconds, retryMultiplier) {\n this.maxAttempts = 5;\n this.baseRetryIntervalMilliseconds = 3000;\n this.retryMultiplier = 1.5;\n const token = (0, config_1.getRuntimeToken)();\n this.baseUrl = (0, config_1.getResultsServiceUrl)();\n if (maxAttempts) {\n this.maxAttempts = maxAttempts;\n }\n if (baseRetryIntervalMilliseconds) {\n this.baseRetryIntervalMilliseconds = baseRetryIntervalMilliseconds;\n }\n if (retryMultiplier) {\n this.retryMultiplier = retryMultiplier;\n }\n this.httpClient = new http_client_1.HttpClient(userAgent, [\n new auth_1.BearerCredentialHandler(token)\n ]);\n }\n // This function satisfies the Rpc interface. It is compatible with the JSON\n // JSON generated client.\n request(service, method, contentType, data) {\n return __awaiter(this, void 0, void 0, function* () {\n const url = new URL(`/twirp/${service}/${method}`, this.baseUrl).href;\n (0, core_1.debug)(`[Request] ${method} ${url}`);\n const headers = {\n 'Content-Type': contentType\n };\n try {\n const { body } = yield this.retryableRequest(() => __awaiter(this, void 0, void 0, function* () { return this.httpClient.post(url, JSON.stringify(data), headers); }));\n return body;\n }\n catch (error) {\n throw new Error(`Failed to ${method}: ${error.message}`);\n }\n });\n }\n retryableRequest(operation) {\n return __awaiter(this, void 0, void 0, function* () {\n let attempt = 0;\n let errorMessage = '';\n let rawBody = '';\n while (attempt < this.maxAttempts) {\n let isRetryable = false;\n try {\n const response = yield operation();\n const statusCode = response.message.statusCode;\n rawBody = yield response.readBody();\n (0, core_1.debug)(`[Response] - ${response.message.statusCode}`);\n (0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`);\n const body = JSON.parse(rawBody);\n (0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`);\n if (this.isSuccessStatusCode(statusCode)) {\n return { response, body };\n }\n isRetryable = this.isRetryableHttpStatusCode(statusCode);\n errorMessage = `Failed request: (${statusCode}) ${response.message.statusMessage}`;\n if (body.msg) {\n if (errors_1.UsageError.isUsageErrorMessage(body.msg)) {\n throw new errors_1.UsageError();\n }\n errorMessage = `${errorMessage}: ${body.msg}`;\n }\n }\n catch (error) {\n if (error instanceof SyntaxError) {\n (0, core_1.debug)(`Raw Body: ${rawBody}`);\n }\n if (error instanceof errors_1.UsageError) {\n throw error;\n }\n if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === void 0 ? void 0 : error.code)) {\n throw new errors_1.NetworkError(error === null || error === void 0 ? void 0 : error.code);\n }\n isRetryable = true;\n errorMessage = error.message;\n }\n if (!isRetryable) {\n throw new Error(`Received non-retryable error: ${errorMessage}`);\n }\n if (attempt + 1 === this.maxAttempts) {\n throw new Error(`Failed to make request after ${this.maxAttempts} attempts: ${errorMessage}`);\n }\n const retryTimeMilliseconds = this.getExponentialRetryTimeMilliseconds(attempt);\n (0, core_1.info)(`Attempt ${attempt + 1} of ${this.maxAttempts} failed with error: ${errorMessage}. Retrying request in ${retryTimeMilliseconds} ms...`);\n yield this.sleep(retryTimeMilliseconds);\n attempt++;\n }\n throw new Error(`Request failed`);\n });\n }\n isSuccessStatusCode(statusCode) {\n if (!statusCode)\n return false;\n return statusCode >= 200 && statusCode < 300;\n }\n isRetryableHttpStatusCode(statusCode) {\n if (!statusCode)\n return false;\n const retryableStatusCodes = [\n http_client_1.HttpCodes.BadGateway,\n http_client_1.HttpCodes.GatewayTimeout,\n http_client_1.HttpCodes.InternalServerError,\n http_client_1.HttpCodes.ServiceUnavailable,\n http_client_1.HttpCodes.TooManyRequests\n ];\n return retryableStatusCodes.includes(statusCode);\n }\n sleep(milliseconds) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise(resolve => setTimeout(resolve, milliseconds));\n });\n }\n getExponentialRetryTimeMilliseconds(attempt) {\n if (attempt < 0) {\n throw new Error('attempt should be a positive integer');\n }\n if (attempt === 0) {\n return this.baseRetryIntervalMilliseconds;\n }\n const minTime = this.baseRetryIntervalMilliseconds * Math.pow(this.retryMultiplier, attempt);\n const maxTime = minTime * this.retryMultiplier;\n // returns a random number between minTime and maxTime (exclusive)\n return Math.trunc(Math.random() * (maxTime - minTime) + minTime);\n }\n}\nfunction internalArtifactTwirpClient(options) {\n const client = new ArtifactHttpClient((0, user_agent_1.getUserAgentString)(), options === null || options === void 0 ? void 0 : options.maxAttempts, options === null || options === void 0 ? void 0 : options.retryIntervalMs, options === null || options === void 0 ? void 0 : options.retryMultiplier);\n return new generated_1.ArtifactServiceClientJSON(client);\n}\nexports.internalArtifactTwirpClient = internalArtifactTwirpClient;\n//# sourceMappingURL=artifact-twirp-client.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzU2MzAuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELG1DQUFtQztBQUNuQyxzQkFBc0IsbUJBQU8sQ0FBQyxLQUFzQjtBQUNwRCxlQUFlLG1CQUFPLENBQUMsS0FBK0I7QUFDdEQsZUFBZSxtQkFBTyxDQUFDLEtBQWU7QUFDdEMsb0JBQW9CLG1CQUFPLENBQUMsS0FBaUI7QUFDN0MsaUJBQWlCLG1CQUFPLENBQUMsSUFBVTtBQUNuQyxxQkFBcUIsbUJBQU8sQ0FBQyxLQUFjO0FBQzNDLGlCQUFpQixtQkFBTyxDQUFDLEtBQVU7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVEsR0FBRyxPQUFPO0FBQzVELDJDQUEyQyxRQUFRLEVBQUUsSUFBSTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPLG1GQUFtRixrRUFBa0U7QUFDcEw7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLE9BQU8sSUFBSSxjQUFjO0FBQ3RFO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCw0QkFBNEI7QUFDbEYsa0RBQWtELGtEQUFrRDtBQUNwRztBQUNBLCtDQUErQyw4QkFBOEI7QUFDN0U7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLHVEQUF1RCxXQUFXLElBQUksK0JBQStCO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLGFBQWEsSUFBSSxTQUFTO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRSxhQUFhO0FBQ2xGO0FBQ0E7QUFDQSxvRUFBb0Usa0JBQWtCLFlBQVksYUFBYTtBQUMvRztBQUNBO0FBQ0EsNENBQTRDLGFBQWEsS0FBSyxrQkFBa0IscUJBQXFCLGFBQWEsd0JBQXdCLHVCQUF1QjtBQUNqSztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvc2hhcmVkL2FydGlmYWN0LXR3aXJwLWNsaWVudC5qcz80NmVhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmludGVybmFsQXJ0aWZhY3RUd2lycENsaWVudCA9IHZvaWQgMDtcbmNvbnN0IGh0dHBfY2xpZW50XzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIik7XG5jb25zdCBhdXRoXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL2F1dGhcIik7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGdlbmVyYXRlZF8xID0gcmVxdWlyZShcIi4uLy4uL2dlbmVyYXRlZFwiKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4vY29uZmlnXCIpO1xuY29uc3QgdXNlcl9hZ2VudF8xID0gcmVxdWlyZShcIi4vdXNlci1hZ2VudFwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY2xhc3MgQXJ0aWZhY3RIdHRwQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1c2VyQWdlbnQsIG1heEF0dGVtcHRzLCBiYXNlUmV0cnlJbnRlcnZhbE1pbGxpc2Vjb25kcywgcmV0cnlNdWx0aXBsaWVyKSB7XG4gICAgICAgIHRoaXMubWF4QXR0ZW1wdHMgPSA1O1xuICAgICAgICB0aGlzLmJhc2VSZXRyeUludGVydmFsTWlsbGlzZWNvbmRzID0gMzAwMDtcbiAgICAgICAgdGhpcy5yZXRyeU11bHRpcGxpZXIgPSAxLjU7XG4gICAgICAgIGNvbnN0IHRva2VuID0gKDAsIGNvbmZpZ18xLmdldFJ1bnRpbWVUb2tlbikoKTtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gKDAsIGNvbmZpZ18xLmdldFJlc3VsdHNTZXJ2aWNlVXJsKSgpO1xuICAgICAgICBpZiAobWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgIHRoaXMubWF4QXR0ZW1wdHMgPSBtYXhBdHRlbXB0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZVJldHJ5SW50ZXJ2YWxNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZVJldHJ5SW50ZXJ2YWxNaWxsaXNlY29uZHMgPSBiYXNlUmV0cnlJbnRlcnZhbE1pbGxpc2Vjb25kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0cnlNdWx0aXBsaWVyKSB7XG4gICAgICAgICAgICB0aGlzLnJldHJ5TXVsdGlwbGllciA9IHJldHJ5TXVsdGlwbGllcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmh0dHBDbGllbnQgPSBuZXcgaHR0cF9jbGllbnRfMS5IdHRwQ2xpZW50KHVzZXJBZ2VudCwgW1xuICAgICAgICAgICAgbmV3IGF1dGhfMS5CZWFyZXJDcmVkZW50aWFsSGFuZGxlcih0b2tlbilcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8vIFRoaXMgZnVuY3Rpb24gc2F0aXNmaWVzIHRoZSBScGMgaW50ZXJmYWNlLiBJdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEpTT05cbiAgICAvLyBKU09OIGdlbmVyYXRlZCBjbGllbnQuXG4gICAgcmVxdWVzdChzZXJ2aWNlLCBtZXRob2QsIGNvbnRlbnRUeXBlLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAvdHdpcnAvJHtzZXJ2aWNlfS8ke21ldGhvZH1gLCB0aGlzLmJhc2VVcmwpLmhyZWY7XG4gICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgW1JlcXVlc3RdICR7bWV0aG9kfSAke3VybH1gKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGJvZHkgfSA9IHlpZWxkIHRoaXMucmV0cnlhYmxlUmVxdWVzdCgoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdCh1cmwsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCBoZWFkZXJzKTsgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gJHttZXRob2R9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXRyeWFibGVSZXF1ZXN0KG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9ICcnO1xuICAgICAgICAgICAgbGV0IHJhd0JvZHkgPSAnJztcbiAgICAgICAgICAgIHdoaWxlIChhdHRlbXB0IDwgdGhpcy5tYXhBdHRlbXB0cykge1xuICAgICAgICAgICAgICAgIGxldCBpc1JldHJ5YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgb3BlcmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGU7XG4gICAgICAgICAgICAgICAgICAgIHJhd0JvZHkgPSB5aWVsZCByZXNwb25zZS5yZWFkQm9keSgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgW1Jlc3BvbnNlXSAtICR7cmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlfWApO1xuICAgICAgICAgICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgSGVhZGVyczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZS5tZXNzYWdlLmhlYWRlcnMsIG51bGwsIDIpfWApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyYXdCb2R5KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGNvcmVfMS5kZWJ1ZykoYEJvZHk6ICR7SlNPTi5zdHJpbmdpZnkoYm9keSwgbnVsbCwgMil9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU3VjY2Vzc1N0YXR1c0NvZGUoc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3BvbnNlLCBib2R5IH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXNSZXRyeWFibGUgPSB0aGlzLmlzUmV0cnlhYmxlSHR0cFN0YXR1c0NvZGUoc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBGYWlsZWQgcmVxdWVzdDogKCR7c3RhdHVzQ29kZX0pICR7cmVzcG9uc2UubWVzc2FnZS5zdGF0dXNNZXNzYWdlfWA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChib2R5Lm1zZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yc18xLlVzYWdlRXJyb3IuaXNVc2FnZUVycm9yTWVzc2FnZShib2R5Lm1zZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuVXNhZ2VFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZXJyb3JNZXNzYWdlfTogJHtib2R5Lm1zZ31gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGNvcmVfMS5kZWJ1ZykoYFJhdyBCb2R5OiAke3Jhd0JvZHl9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgZXJyb3JzXzEuVXNhZ2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yc18xLk5ldHdvcmtFcnJvci5pc05ldHdvcmtFcnJvckNvZGUoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLmNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuTmV0d29ya0Vycm9yKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5jb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpc1JldHJ5YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaXNSZXRyeWFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBub24tcmV0cnlhYmxlIGVycm9yOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgKyAxID09PSB0aGlzLm1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIG1ha2UgcmVxdWVzdCBhZnRlciAke3RoaXMubWF4QXR0ZW1wdHN9IGF0dGVtcHRzOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0cnlUaW1lTWlsbGlzZWNvbmRzID0gdGhpcy5nZXRFeHBvbmVudGlhbFJldHJ5VGltZU1pbGxpc2Vjb25kcyhhdHRlbXB0KTtcbiAgICAgICAgICAgICAgICAoMCwgY29yZV8xLmluZm8pKGBBdHRlbXB0ICR7YXR0ZW1wdCArIDF9IG9mICR7dGhpcy5tYXhBdHRlbXB0c30gZmFpbGVkIHdpdGggZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfS4gUmV0cnlpbmcgcmVxdWVzdCBpbiAke3JldHJ5VGltZU1pbGxpc2Vjb25kc30gbXMuLi5gKTtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNsZWVwKHJldHJ5VGltZU1pbGxpc2Vjb25kcyk7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZGApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaXNTdWNjZXNzU3RhdHVzQ29kZShzdGF0dXNDb2RlKSB7XG4gICAgICAgIGlmICghc3RhdHVzQ29kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGUgPj0gMjAwICYmIHN0YXR1c0NvZGUgPCAzMDA7XG4gICAgfVxuICAgIGlzUmV0cnlhYmxlSHR0cFN0YXR1c0NvZGUoc3RhdHVzQ29kZSkge1xuICAgICAgICBpZiAoIXN0YXR1c0NvZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJldHJ5YWJsZVN0YXR1c0NvZGVzID0gW1xuICAgICAgICAgICAgaHR0cF9jbGllbnRfMS5IdHRwQ29kZXMuQmFkR2F0ZXdheSxcbiAgICAgICAgICAgIGh0dHBfY2xpZW50XzEuSHR0cENvZGVzLkdhdGV3YXlUaW1lb3V0LFxuICAgICAgICAgICAgaHR0cF9jbGllbnRfMS5IdHRwQ29kZXMuSW50ZXJuYWxTZXJ2ZXJFcnJvcixcbiAgICAgICAgICAgIGh0dHBfY2xpZW50XzEuSHR0cENvZGVzLlNlcnZpY2VVbmF2YWlsYWJsZSxcbiAgICAgICAgICAgIGh0dHBfY2xpZW50XzEuSHR0cENvZGVzLlRvb01hbnlSZXF1ZXN0c1xuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gcmV0cnlhYmxlU3RhdHVzQ29kZXMuaW5jbHVkZXMoc3RhdHVzQ29kZSk7XG4gICAgfVxuICAgIHNsZWVwKG1pbGxpc2Vjb25kcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldEV4cG9uZW50aWFsUmV0cnlUaW1lTWlsbGlzZWNvbmRzKGF0dGVtcHQpIHtcbiAgICAgICAgaWYgKGF0dGVtcHQgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2F0dGVtcHQgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRlbXB0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlUmV0cnlJbnRlcnZhbE1pbGxpc2Vjb25kcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW5UaW1lID0gdGhpcy5iYXNlUmV0cnlJbnRlcnZhbE1pbGxpc2Vjb25kcyAqIE1hdGgucG93KHRoaXMucmV0cnlNdWx0aXBsaWVyLCBhdHRlbXB0KTtcbiAgICAgICAgY29uc3QgbWF4VGltZSA9IG1pblRpbWUgKiB0aGlzLnJldHJ5TXVsdGlwbGllcjtcbiAgICAgICAgLy8gcmV0dXJucyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiBtaW5UaW1lIGFuZCBtYXhUaW1lIChleGNsdXNpdmUpXG4gICAgICAgIHJldHVybiBNYXRoLnRydW5jKE1hdGgucmFuZG9tKCkgKiAobWF4VGltZSAtIG1pblRpbWUpICsgbWluVGltZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50KG9wdGlvbnMpIHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQXJ0aWZhY3RIdHRwQ2xpZW50KCgwLCB1c2VyX2FnZW50XzEuZ2V0VXNlckFnZW50U3RyaW5nKSgpLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWF4QXR0ZW1wdHMsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZXRyeUludGVydmFsTXMsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZXRyeU11bHRpcGxpZXIpO1xuICAgIHJldHVybiBuZXcgZ2VuZXJhdGVkXzEuQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50SlNPTihjbGllbnQpO1xufVxuZXhwb3J0cy5pbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQgPSBpbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnRpZmFjdC10d2lycC1jbGllbnQuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///75630\n")},6231:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getConcurrency = exports.getGitHubWorkspaceDir = exports.isGhes = exports.getResultsServiceUrl = exports.getRuntimeToken = exports.getUploadChunkSize = void 0;\nconst os_1 = __importDefault(__webpack_require__(70857));\n// Used for controlling the highWaterMark value of the zip that is being streamed\n// The same value is used as the chunk size that is use during upload to blob storage\nfunction getUploadChunkSize() {\n return 8 * 1024 * 1024; // 8 MB Chunks\n}\nexports.getUploadChunkSize = getUploadChunkSize;\nfunction getRuntimeToken() {\n const token = process.env['ACTIONS_RUNTIME_TOKEN'];\n if (!token) {\n throw new Error('Unable to get the ACTIONS_RUNTIME_TOKEN env variable');\n }\n return token;\n}\nexports.getRuntimeToken = getRuntimeToken;\nfunction getResultsServiceUrl() {\n const resultsUrl = process.env['ACTIONS_RESULTS_URL'];\n if (!resultsUrl) {\n throw new Error('Unable to get the ACTIONS_RESULTS_URL env variable');\n }\n return new URL(resultsUrl).origin;\n}\nexports.getResultsServiceUrl = getResultsServiceUrl;\nfunction isGhes() {\n const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');\n const hostname = ghUrl.hostname.trimEnd().toUpperCase();\n const isGitHubHost = hostname === 'GITHUB.COM';\n const isGheHost = hostname.endsWith('.GHE.COM') || hostname.endsWith('.GHE.LOCALHOST');\n return !isGitHubHost && !isGheHost;\n}\nexports.isGhes = isGhes;\nfunction getGitHubWorkspaceDir() {\n const ghWorkspaceDir = process.env['GITHUB_WORKSPACE'];\n if (!ghWorkspaceDir) {\n throw new Error('Unable to get the GITHUB_WORKSPACE env variable');\n }\n return ghWorkspaceDir;\n}\nexports.getGitHubWorkspaceDir = getGitHubWorkspaceDir;\n// Mimics behavior of azcopy: https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-optimize\n// If your machine has fewer than 5 CPUs, then the value of this variable is set to 32.\n// Otherwise, the default value is equal to 16 multiplied by the number of CPUs. The maximum value of this variable is 300.\nfunction getConcurrency() {\n const numCPUs = os_1.default.cpus().length;\n if (numCPUs <= 4) {\n return 32;\n }\n const concurrency = 16 * numCPUs;\n return concurrency > 300 ? 300 : concurrency;\n}\nexports.getConcurrency = getConcurrency;\n//# sourceMappingURL=config.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIzMS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHNCQUFzQixHQUFHLDZCQUE2QixHQUFHLGNBQWMsR0FBRyw0QkFBNEIsR0FBRyx1QkFBdUIsR0FBRywwQkFBMEI7QUFDN0osNkJBQTZCLG1CQUFPLENBQUMsS0FBSTtBQUN6QztBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3NoYXJlZC9jb25maWcuanM/ZWYzNiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0Q29uY3VycmVuY3kgPSBleHBvcnRzLmdldEdpdEh1YldvcmtzcGFjZURpciA9IGV4cG9ydHMuaXNHaGVzID0gZXhwb3J0cy5nZXRSZXN1bHRzU2VydmljZVVybCA9IGV4cG9ydHMuZ2V0UnVudGltZVRva2VuID0gZXhwb3J0cy5nZXRVcGxvYWRDaHVua1NpemUgPSB2b2lkIDA7XG5jb25zdCBvc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJvc1wiKSk7XG4vLyBVc2VkIGZvciBjb250cm9sbGluZyB0aGUgaGlnaFdhdGVyTWFyayB2YWx1ZSBvZiB0aGUgemlwIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbi8vIFRoZSBzYW1lIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGNodW5rIHNpemUgdGhhdCBpcyB1c2UgZHVyaW5nIHVwbG9hZCB0byBibG9iIHN0b3JhZ2VcbmZ1bmN0aW9uIGdldFVwbG9hZENodW5rU2l6ZSgpIHtcbiAgICByZXR1cm4gOCAqIDEwMjQgKiAxMDI0OyAvLyA4IE1CIENodW5rc1xufVxuZXhwb3J0cy5nZXRVcGxvYWRDaHVua1NpemUgPSBnZXRVcGxvYWRDaHVua1NpemU7XG5mdW5jdGlvbiBnZXRSdW50aW1lVG9rZW4oKSB7XG4gICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnQUNUSU9OU19SVU5USU1FX1RPS0VOJ107XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgdGhlIEFDVElPTlNfUlVOVElNRV9UT0tFTiBlbnYgdmFyaWFibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xufVxuZXhwb3J0cy5nZXRSdW50aW1lVG9rZW4gPSBnZXRSdW50aW1lVG9rZW47XG5mdW5jdGlvbiBnZXRSZXN1bHRzU2VydmljZVVybCgpIHtcbiAgICBjb25zdCByZXN1bHRzVXJsID0gcHJvY2Vzcy5lbnZbJ0FDVElPTlNfUkVTVUxUU19VUkwnXTtcbiAgICBpZiAoIXJlc3VsdHNVcmwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IHRoZSBBQ1RJT05TX1JFU1VMVFNfVVJMIGVudiB2YXJpYWJsZScpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVSTChyZXN1bHRzVXJsKS5vcmlnaW47XG59XG5leHBvcnRzLmdldFJlc3VsdHNTZXJ2aWNlVXJsID0gZ2V0UmVzdWx0c1NlcnZpY2VVcmw7XG5mdW5jdGlvbiBpc0doZXMoKSB7XG4gICAgY29uc3QgZ2hVcmwgPSBuZXcgVVJMKHByb2Nlc3MuZW52WydHSVRIVUJfU0VSVkVSX1VSTCddIHx8ICdodHRwczovL2dpdGh1Yi5jb20nKTtcbiAgICBjb25zdCBob3N0bmFtZSA9IGdoVXJsLmhvc3RuYW1lLnRyaW1FbmQoKS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IGlzR2l0SHViSG9zdCA9IGhvc3RuYW1lID09PSAnR0lUSFVCLkNPTSc7XG4gICAgY29uc3QgaXNHaGVIb3N0ID0gaG9zdG5hbWUuZW5kc1dpdGgoJy5HSEUuQ09NJykgfHwgaG9zdG5hbWUuZW5kc1dpdGgoJy5HSEUuTE9DQUxIT1NUJyk7XG4gICAgcmV0dXJuICFpc0dpdEh1Ykhvc3QgJiYgIWlzR2hlSG9zdDtcbn1cbmV4cG9ydHMuaXNHaGVzID0gaXNHaGVzO1xuZnVuY3Rpb24gZ2V0R2l0SHViV29ya3NwYWNlRGlyKCkge1xuICAgIGNvbnN0IGdoV29ya3NwYWNlRGlyID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9XT1JLU1BBQ0UnXTtcbiAgICBpZiAoIWdoV29ya3NwYWNlRGlyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCB0aGUgR0lUSFVCX1dPUktTUEFDRSBlbnYgdmFyaWFibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGdoV29ya3NwYWNlRGlyO1xufVxuZXhwb3J0cy5nZXRHaXRIdWJXb3Jrc3BhY2VEaXIgPSBnZXRHaXRIdWJXb3Jrc3BhY2VEaXI7XG4vLyBNaW1pY3MgYmVoYXZpb3Igb2YgYXpjb3B5OiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS11c2UtYXpjb3B5LW9wdGltaXplXG4vLyBJZiB5b3VyIG1hY2hpbmUgaGFzIGZld2VyIHRoYW4gNSBDUFVzLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byAzMi5cbi8vIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgZXF1YWwgdG8gMTYgbXVsdGlwbGllZCBieSB0aGUgbnVtYmVyIG9mIENQVXMuIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgMzAwLlxuZnVuY3Rpb24gZ2V0Q29uY3VycmVuY3koKSB7XG4gICAgY29uc3QgbnVtQ1BVcyA9IG9zXzEuZGVmYXVsdC5jcHVzKCkubGVuZ3RoO1xuICAgIGlmIChudW1DUFVzIDw9IDQpIHtcbiAgICAgICAgcmV0dXJuIDMyO1xuICAgIH1cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IDE2ICogbnVtQ1BVcztcbiAgICByZXR1cm4gY29uY3VycmVuY3kgPiAzMDAgPyAzMDAgOiBjb25jdXJyZW5jeTtcbn1cbmV4cG9ydHMuZ2V0Q29uY3VycmVuY3kgPSBnZXRDb25jdXJyZW5jeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmZpZy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6231\n")},14842:(__unused_webpack_module,exports)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.UsageError = exports.NetworkError = exports.GHESNotSupportedError = exports.ArtifactNotFoundError = exports.InvalidResponseError = exports.FilesNotFoundError = void 0;\nclass FilesNotFoundError extends Error {\n constructor(files = []) {\n let message = 'No files were found to upload';\n if (files.length > 0) {\n message += `: ${files.join(', ')}`;\n }\n super(message);\n this.files = files;\n this.name = 'FilesNotFoundError';\n }\n}\nexports.FilesNotFoundError = FilesNotFoundError;\nclass InvalidResponseError extends Error {\n constructor(message) {\n super(message);\n this.name = 'InvalidResponseError';\n }\n}\nexports.InvalidResponseError = InvalidResponseError;\nclass ArtifactNotFoundError extends Error {\n constructor(message = 'Artifact not found') {\n super(message);\n this.name = 'ArtifactNotFoundError';\n }\n}\nexports.ArtifactNotFoundError = ArtifactNotFoundError;\nclass GHESNotSupportedError extends Error {\n constructor(message = '@actions/artifact v2.0.0+, upload-artifact@v4+ and download-artifact@v4+ are not currently supported on GHES.') {\n super(message);\n this.name = 'GHESNotSupportedError';\n }\n}\nexports.GHESNotSupportedError = GHESNotSupportedError;\nclass NetworkError extends Error {\n constructor(code) {\n const message = `Unable to make request: ${code}\\nIf you are using self-hosted runners, please make sure your runner has access to all GitHub endpoints: https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#communication-between-self-hosted-runners-and-github`;\n super(message);\n this.code = code;\n this.name = 'NetworkError';\n }\n}\nexports.NetworkError = NetworkError;\nNetworkError.isNetworkErrorCode = (code) => {\n if (!code)\n return false;\n return [\n 'ECONNRESET',\n 'ENOTFOUND',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'EHOSTUNREACH'\n ].includes(code);\n};\nclass UsageError extends Error {\n constructor() {\n const message = `Artifact storage quota has been hit. Unable to upload any new artifacts. Usage is recalculated every 6-12 hours.\\nMore info on storage limits: https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#calculating-minute-and-storage-spending`;\n super(message);\n this.name = 'UsageError';\n }\n}\nexports.UsageError = UsageError;\nUsageError.isUsageErrorMessage = (msg) => {\n if (!msg)\n return false;\n return msg.includes('insufficient usage');\n};\n//# sourceMappingURL=errors.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ4NDIuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsa0JBQWtCLEdBQUcsb0JBQW9CLEdBQUcsNkJBQTZCLEdBQUcsNkJBQTZCLEdBQUcsNEJBQTRCLEdBQUcsMEJBQTBCO0FBQ3JLO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGlCQUFpQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBLG1EQUFtRCxLQUFLO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3NoYXJlZC9lcnJvcnMuanM/Nzk5YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVXNhZ2VFcnJvciA9IGV4cG9ydHMuTmV0d29ya0Vycm9yID0gZXhwb3J0cy5HSEVTTm90U3VwcG9ydGVkRXJyb3IgPSBleHBvcnRzLkFydGlmYWN0Tm90Rm91bmRFcnJvciA9IGV4cG9ydHMuSW52YWxpZFJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkZpbGVzTm90Rm91bmRFcnJvciA9IHZvaWQgMDtcbmNsYXNzIEZpbGVzTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihmaWxlcyA9IFtdKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gJ05vIGZpbGVzIHdlcmUgZm91bmQgdG8gdXBsb2FkJztcbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gYDogJHtmaWxlcy5qb2luKCcsICcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlcztcbiAgICAgICAgdGhpcy5uYW1lID0gJ0ZpbGVzTm90Rm91bmRFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0cy5GaWxlc05vdEZvdW5kRXJyb3IgPSBGaWxlc05vdEZvdW5kRXJyb3I7XG5jbGFzcyBJbnZhbGlkUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJlc3BvbnNlRXJyb3InO1xuICAgIH1cbn1cbmV4cG9ydHMuSW52YWxpZFJlc3BvbnNlRXJyb3IgPSBJbnZhbGlkUmVzcG9uc2VFcnJvcjtcbmNsYXNzIEFydGlmYWN0Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0FydGlmYWN0IG5vdCBmb3VuZCcpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBcnRpZmFjdE5vdEZvdW5kRXJyb3InO1xuICAgIH1cbn1cbmV4cG9ydHMuQXJ0aWZhY3ROb3RGb3VuZEVycm9yID0gQXJ0aWZhY3ROb3RGb3VuZEVycm9yO1xuY2xhc3MgR0hFU05vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnQGFjdGlvbnMvYXJ0aWZhY3QgdjIuMC4wKywgdXBsb2FkLWFydGlmYWN0QHY0KyBhbmQgZG93bmxvYWQtYXJ0aWZhY3RAdjQrIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBHSEVTLicpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdHSEVTTm90U3VwcG9ydGVkRXJyb3InO1xuICAgIH1cbn1cbmV4cG9ydHMuR0hFU05vdFN1cHBvcnRlZEVycm9yID0gR0hFU05vdFN1cHBvcnRlZEVycm9yO1xuY2xhc3MgTmV0d29ya0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBVbmFibGUgdG8gbWFrZSByZXF1ZXN0OiAke2NvZGV9XFxuSWYgeW91IGFyZSB1c2luZyBzZWxmLWhvc3RlZCBydW5uZXJzLCBwbGVhc2UgbWFrZSBzdXJlIHlvdXIgcnVubmVyIGhhcyBhY2Nlc3MgdG8gYWxsIEdpdEh1YiBlbmRwb2ludHM6IGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvaG9zdGluZy15b3VyLW93bi1ydW5uZXJzL21hbmFnaW5nLXNlbGYtaG9zdGVkLXJ1bm5lcnMvYWJvdXQtc2VsZi1ob3N0ZWQtcnVubmVycyNjb21tdW5pY2F0aW9uLWJldHdlZW4tc2VsZi1ob3N0ZWQtcnVubmVycy1hbmQtZ2l0aHViYDtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMubmFtZSA9ICdOZXR3b3JrRXJyb3InO1xuICAgIH1cbn1cbmV4cG9ydHMuTmV0d29ya0Vycm9yID0gTmV0d29ya0Vycm9yO1xuTmV0d29ya0Vycm9yLmlzTmV0d29ya0Vycm9yQ29kZSA9IChjb2RlKSA9PiB7XG4gICAgaWYgKCFjb2RlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ0VDT05OUkVTRVQnLFxuICAgICAgICAnRU5PVEZPVU5EJyxcbiAgICAgICAgJ0VUSU1FRE9VVCcsXG4gICAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgICAnRUhPU1RVTlJFQUNIJ1xuICAgIF0uaW5jbHVkZXMoY29kZSk7XG59O1xuY2xhc3MgVXNhZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBBcnRpZmFjdCBzdG9yYWdlIHF1b3RhIGhhcyBiZWVuIGhpdC4gVW5hYmxlIHRvIHVwbG9hZCBhbnkgbmV3IGFydGlmYWN0cy4gVXNhZ2UgaXMgcmVjYWxjdWxhdGVkIGV2ZXJ5IDYtMTIgaG91cnMuXFxuTW9yZSBpbmZvIG9uIHN0b3JhZ2UgbGltaXRzOiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9iaWxsaW5nL21hbmFnaW5nLWJpbGxpbmctZm9yLWdpdGh1Yi1hY3Rpb25zL2Fib3V0LWJpbGxpbmctZm9yLWdpdGh1Yi1hY3Rpb25zI2NhbGN1bGF0aW5nLW1pbnV0ZS1hbmQtc3RvcmFnZS1zcGVuZGluZ2A7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnVXNhZ2VFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0cy5Vc2FnZUVycm9yID0gVXNhZ2VFcnJvcjtcblVzYWdlRXJyb3IuaXNVc2FnZUVycm9yTWVzc2FnZSA9IChtc2cpID0+IHtcbiAgICBpZiAoIW1zZylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBtc2cuaW5jbHVkZXMoJ2luc3VmZmljaWVudCB1c2FnZScpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14842\n")},84093:(__unused_webpack_module,exports)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\n//# sourceMappingURL=interfaces.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQwOTMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9zaGFyZWQvaW50ZXJmYWNlcy5qcz8wODFmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJmYWNlcy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///84093\n')},88070:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getUserAgentString = void 0;\n// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\nconst packageJson = __webpack_require__(2822);\n/**\n * Ensure that this User Agent String is used in all HTTP calls so that we can monitor telemetry between different versions of this package\n */\nfunction getUserAgentString() {\n return `@actions/artifact-${packageJson.version}`;\n}\nexports.getUserAgentString = getUserAgentString;\n//# sourceMappingURL=user-agent.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODgwNzAuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsMEJBQTBCO0FBQzFCO0FBQ0Esb0JBQW9CLG1CQUFPLENBQUMsSUFBdUI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msb0JBQW9CO0FBQ3BEO0FBQ0EsMEJBQTBCO0FBQzFCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvc2hhcmVkL3VzZXItYWdlbnQuanM/MzlhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0VXNlckFnZW50U3RyaW5nID0gdm9pZCAwO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBhY2thZ2VKc29uID0gcmVxdWlyZSgnLi4vLi4vLi4vcGFja2FnZS5qc29uJyk7XG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoaXMgVXNlciBBZ2VudCBTdHJpbmcgaXMgdXNlZCBpbiBhbGwgSFRUUCBjYWxscyBzbyB0aGF0IHdlIGNhbiBtb25pdG9yIHRlbGVtZXRyeSBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIHBhY2thZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0VXNlckFnZW50U3RyaW5nKCkge1xuICAgIHJldHVybiBgQGFjdGlvbnMvYXJ0aWZhY3QtJHtwYWNrYWdlSnNvbi52ZXJzaW9ufWA7XG59XG5leHBvcnRzLmdldFVzZXJBZ2VudFN0cmluZyA9IGdldFVzZXJBZ2VudFN0cmluZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZXItYWdlbnQuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///88070\n')},52901:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { "default": mod };\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getBackendIdsFromToken = void 0;\nconst core = __importStar(__webpack_require__(66977));\nconst config_1 = __webpack_require__(6231);\nconst jwt_decode_1 = __importDefault(__webpack_require__(6765));\nconst InvalidJwtError = new Error(\'Failed to get backend IDs: The provided JWT token is invalid and/or missing claims\');\n// uses the JWT token claims to get the\n// workflow run and workflow job run backend ids\nfunction getBackendIdsFromToken() {\n const token = (0, config_1.getRuntimeToken)();\n const decoded = (0, jwt_decode_1.default)(token);\n if (!decoded.scp) {\n throw InvalidJwtError;\n }\n /*\n * example decoded:\n * {\n * scp: "Actions.ExampleScope Actions.Results:ce7f54c7-61c7-4aae-887f-30da475f5f1a:ca395085-040a-526b-2ce8-bdc85f692774"\n * }\n */\n const scpParts = decoded.scp.split(\' \');\n if (scpParts.length === 0) {\n throw InvalidJwtError;\n }\n /*\n * example scpParts:\n * ["Actions.ExampleScope", "Actions.Results:ce7f54c7-61c7-4aae-887f-30da475f5f1a:ca395085-040a-526b-2ce8-bdc85f692774"]\n */\n for (const scopes of scpParts) {\n const scopeParts = scopes.split(\':\');\n if ((scopeParts === null || scopeParts === void 0 ? void 0 : scopeParts[0]) !== \'Actions.Results\') {\n // not the Actions.Results scope\n continue;\n }\n /*\n * example scopeParts:\n * ["Actions.Results", "ce7f54c7-61c7-4aae-887f-30da475f5f1a", "ca395085-040a-526b-2ce8-bdc85f692774"]\n */\n if (scopeParts.length !== 3) {\n // missing expected number of claims\n throw InvalidJwtError;\n }\n const ids = {\n workflowRunBackendId: scopeParts[1],\n workflowJobRunBackendId: scopeParts[2]\n };\n core.debug(`Workflow Run Backend ID: ${ids.workflowRunBackendId}`);\n core.debug(`Workflow Job Run Backend ID: ${ids.workflowJobRunBackendId}`);\n return ids;\n }\n throw InvalidJwtError;\n}\nexports.getBackendIdsFromToken = getBackendIdsFromToken;\n//# sourceMappingURL=util.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI5MDEuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsOEJBQThCO0FBQzlCLDBCQUEwQixtQkFBTyxDQUFDLEtBQWU7QUFDakQsaUJBQWlCLG1CQUFPLENBQUMsSUFBVTtBQUNuQyxxQ0FBcUMsbUJBQU8sQ0FBQyxJQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MseUJBQXlCO0FBQ3hFLG1EQUFtRCw0QkFBNEI7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9zaGFyZWQvdXRpbC5qcz80MDg3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEJhY2tlbmRJZHNGcm9tVG9rZW4gPSB2b2lkIDA7XG5jb25zdCBjb3JlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4vY29uZmlnXCIpO1xuY29uc3Qgand0X2RlY29kZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJqd3QtZGVjb2RlXCIpKTtcbmNvbnN0IEludmFsaWRKd3RFcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBiYWNrZW5kIElEczogVGhlIHByb3ZpZGVkIEpXVCB0b2tlbiBpcyBpbnZhbGlkIGFuZC9vciBtaXNzaW5nIGNsYWltcycpO1xuLy8gdXNlcyB0aGUgSldUIHRva2VuIGNsYWltcyB0byBnZXQgdGhlXG4vLyB3b3JrZmxvdyBydW4gYW5kIHdvcmtmbG93IGpvYiBydW4gYmFja2VuZCBpZHNcbmZ1bmN0aW9uIGdldEJhY2tlbmRJZHNGcm9tVG9rZW4oKSB7XG4gICAgY29uc3QgdG9rZW4gPSAoMCwgY29uZmlnXzEuZ2V0UnVudGltZVRva2VuKSgpO1xuICAgIGNvbnN0IGRlY29kZWQgPSAoMCwgand0X2RlY29kZV8xLmRlZmF1bHQpKHRva2VuKTtcbiAgICBpZiAoIWRlY29kZWQuc2NwKSB7XG4gICAgICAgIHRocm93IEludmFsaWRKd3RFcnJvcjtcbiAgICB9XG4gICAgLypcbiAgICAgKiBleGFtcGxlIGRlY29kZWQ6XG4gICAgICoge1xuICAgICAqICAgc2NwOiBcIkFjdGlvbnMuRXhhbXBsZVNjb3BlIEFjdGlvbnMuUmVzdWx0czpjZTdmNTRjNy02MWM3LTRhYWUtODg3Zi0zMGRhNDc1ZjVmMWE6Y2EzOTUwODUtMDQwYS01MjZiLTJjZTgtYmRjODVmNjkyNzc0XCJcbiAgICAgKiB9XG4gICAgICovXG4gICAgY29uc3Qgc2NwUGFydHMgPSBkZWNvZGVkLnNjcC5zcGxpdCgnICcpO1xuICAgIGlmIChzY3BQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgSW52YWxpZEp3dEVycm9yO1xuICAgIH1cbiAgICAvKlxuICAgICAqIGV4YW1wbGUgc2NwUGFydHM6XG4gICAgICogW1wiQWN0aW9ucy5FeGFtcGxlU2NvcGVcIiwgXCJBY3Rpb25zLlJlc3VsdHM6Y2U3ZjU0YzctNjFjNy00YWFlLTg4N2YtMzBkYTQ3NWY1ZjFhOmNhMzk1MDg1LTA0MGEtNTI2Yi0yY2U4LWJkYzg1ZjY5Mjc3NFwiXVxuICAgICAqL1xuICAgIGZvciAoY29uc3Qgc2NvcGVzIG9mIHNjcFBhcnRzKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSBzY29wZXMuc3BsaXQoJzonKTtcbiAgICAgICAgaWYgKChzY29wZVBhcnRzID09PSBudWxsIHx8IHNjb3BlUGFydHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjb3BlUGFydHNbMF0pICE9PSAnQWN0aW9ucy5SZXN1bHRzJykge1xuICAgICAgICAgICAgLy8gbm90IHRoZSBBY3Rpb25zLlJlc3VsdHMgc2NvcGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICAqIGV4YW1wbGUgc2NvcGVQYXJ0czpcbiAgICAgICAgICogW1wiQWN0aW9ucy5SZXN1bHRzXCIsIFwiY2U3ZjU0YzctNjFjNy00YWFlLTg4N2YtMzBkYTQ3NWY1ZjFhXCIsIFwiY2EzOTUwODUtMDQwYS01MjZiLTJjZTgtYmRjODVmNjkyNzc0XCJdXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoc2NvcGVQYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgIC8vIG1pc3NpbmcgZXhwZWN0ZWQgbnVtYmVyIG9mIGNsYWltc1xuICAgICAgICAgICAgdGhyb3cgSW52YWxpZEp3dEVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkcyA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkOiBzY29wZVBhcnRzWzFdLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IHNjb3BlUGFydHNbMl1cbiAgICAgICAgfTtcbiAgICAgICAgY29yZS5kZWJ1ZyhgV29ya2Zsb3cgUnVuIEJhY2tlbmQgSUQ6ICR7aWRzLndvcmtmbG93UnVuQmFja2VuZElkfWApO1xuICAgICAgICBjb3JlLmRlYnVnKGBXb3JrZmxvdyBKb2IgUnVuIEJhY2tlbmQgSUQ6ICR7aWRzLndvcmtmbG93Sm9iUnVuQmFja2VuZElkfWApO1xuICAgICAgICByZXR1cm4gaWRzO1xuICAgIH1cbiAgICB0aHJvdyBJbnZhbGlkSnd0RXJyb3I7XG59XG5leHBvcnRzLmdldEJhY2tlbmRJZHNGcm9tVG9rZW4gPSBnZXRCYWNrZW5kSWRzRnJvbVRva2VuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///52901\n')},46862:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.uploadZipToBlobStorage = void 0;\nconst storage_blob_1 = __webpack_require__(58551);\nconst config_1 = __webpack_require__(6231);\nconst core = __importStar(__webpack_require__(66977));\nconst crypto = __importStar(__webpack_require__(76982));\nconst stream = __importStar(__webpack_require__(2203));\nconst errors_1 = __webpack_require__(14842);\nfunction uploadZipToBlobStorage(authenticatedUploadURL, zipUploadStream) {\n return __awaiter(this, void 0, void 0, function* () {\n let uploadByteCount = 0;\n let lastProgressTime = Date.now();\n let timeoutId;\n const chunkTimer = (timeout) => {\n // clear the previous timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n const now = Date.now();\n // if there's been more than 30 seconds since the\n // last progress event, then we'll consider the upload stalled\n if (now - lastProgressTime > timeout) {\n throw new Error('Upload progress stalled.');\n }\n }, timeout);\n return timeoutId;\n };\n const maxConcurrency = (0, config_1.getConcurrency)();\n const bufferSize = (0, config_1.getUploadChunkSize)();\n const blobClient = new storage_blob_1.BlobClient(authenticatedUploadURL);\n const blockBlobClient = blobClient.getBlockBlobClient();\n const timeoutDuration = 300000; // 30 seconds\n core.debug(`Uploading artifact zip to blob storage with maxConcurrency: ${maxConcurrency}, bufferSize: ${bufferSize}`);\n const uploadCallback = (progress) => {\n core.info(`Uploaded bytes ${progress.loadedBytes}`);\n uploadByteCount = progress.loadedBytes;\n chunkTimer(timeoutDuration);\n lastProgressTime = Date.now();\n };\n const options = {\n blobHTTPHeaders: { blobContentType: 'zip' },\n onProgress: uploadCallback\n };\n let sha256Hash = undefined;\n const uploadStream = new stream.PassThrough();\n const hashStream = crypto.createHash('sha256');\n zipUploadStream.pipe(uploadStream); // This stream is used for the upload\n zipUploadStream.pipe(hashStream).setEncoding('hex'); // This stream is used to compute a hash of the zip content that gets used. Integrity check\n core.info('Beginning upload of artifact content to blob storage');\n try {\n // Start the chunk timer\n timeoutId = chunkTimer(timeoutDuration);\n yield blockBlobClient.uploadStream(uploadStream, bufferSize, maxConcurrency, options);\n }\n catch (error) {\n if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === void 0 ? void 0 : error.code)) {\n throw new errors_1.NetworkError(error === null || error === void 0 ? void 0 : error.code);\n }\n throw error;\n }\n finally {\n // clear the timeout whether or not the upload completes\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n core.info('Finished uploading artifact content to blob storage!');\n hashStream.end();\n sha256Hash = hashStream.read();\n core.info(`SHA256 hash of uploaded artifact zip is ${sha256Hash}`);\n if (uploadByteCount === 0) {\n core.warning(`No data was uploaded to blob storage. Reported upload byte count is 0.`);\n }\n return {\n uploadSize: uploadByteCount,\n sha256Hash\n };\n });\n}\nexports.uploadZipToBlobStorage = uploadZipToBlobStorage;\n//# sourceMappingURL=blob-upload.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY4NjIuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCw4QkFBOEI7QUFDOUIsdUJBQXVCLG1CQUFPLENBQUMsS0FBcUI7QUFDcEQsaUJBQWlCLG1CQUFPLENBQUMsSUFBa0I7QUFDM0MsMEJBQTBCLG1CQUFPLENBQUMsS0FBZTtBQUNqRCw0QkFBNEIsbUJBQU8sQ0FBQyxLQUFRO0FBQzVDLDRCQUE0QixtQkFBTyxDQUFDLElBQVE7QUFDNUMsaUJBQWlCLG1CQUFPLENBQUMsS0FBa0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEMsa0ZBQWtGLGVBQWUsZ0JBQWdCLFdBQVc7QUFDNUg7QUFDQSx3Q0FBd0MscUJBQXFCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isd0JBQXdCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsNkRBQTZEO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxXQUFXO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOEJBQThCO0FBQzlCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvdXBsb2FkL2Jsb2ItdXBsb2FkLmpzP2QwODkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cGxvYWRaaXBUb0Jsb2JTdG9yYWdlID0gdm9pZCAwO1xuY29uc3Qgc3RvcmFnZV9ibG9iXzEgPSByZXF1aXJlKFwiQGF6dXJlL3N0b3JhZ2UtYmxvYlwiKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9jb25maWdcIik7XG5jb25zdCBjb3JlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpKTtcbmNvbnN0IGNyeXB0byA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY3J5cHRvXCIpKTtcbmNvbnN0IHN0cmVhbSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwic3RyZWFtXCIpKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9lcnJvcnNcIik7XG5mdW5jdGlvbiB1cGxvYWRaaXBUb0Jsb2JTdG9yYWdlKGF1dGhlbnRpY2F0ZWRVcGxvYWRVUkwsIHppcFVwbG9hZFN0cmVhbSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB1cGxvYWRCeXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgbGFzdFByb2dyZXNzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCB0aW1lb3V0SWQ7XG4gICAgICAgIGNvbnN0IGNodW5rVGltZXIgPSAodGltZW91dCkgPT4ge1xuICAgICAgICAgICAgLy8gY2xlYXIgdGhlIHByZXZpb3VzIHRpbWVvdXRcbiAgICAgICAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBiZWVuIG1vcmUgdGhhbiAzMCBzZWNvbmRzIHNpbmNlIHRoZVxuICAgICAgICAgICAgICAgIC8vIGxhc3QgcHJvZ3Jlc3MgZXZlbnQsIHRoZW4gd2UnbGwgY29uc2lkZXIgdGhlIHVwbG9hZCBzdGFsbGVkXG4gICAgICAgICAgICAgICAgaWYgKG5vdyAtIGxhc3RQcm9ncmVzc1RpbWUgPiB0aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIHByb2dyZXNzIHN0YWxsZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICByZXR1cm4gdGltZW91dElkO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9ICgwLCBjb25maWdfMS5nZXRDb25jdXJyZW5jeSkoKTtcbiAgICAgICAgY29uc3QgYnVmZmVyU2l6ZSA9ICgwLCBjb25maWdfMS5nZXRVcGxvYWRDaHVua1NpemUpKCk7XG4gICAgICAgIGNvbnN0IGJsb2JDbGllbnQgPSBuZXcgc3RvcmFnZV9ibG9iXzEuQmxvYkNsaWVudChhdXRoZW50aWNhdGVkVXBsb2FkVVJMKTtcbiAgICAgICAgY29uc3QgYmxvY2tCbG9iQ2xpZW50ID0gYmxvYkNsaWVudC5nZXRCbG9ja0Jsb2JDbGllbnQoKTtcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gMzAwMDAwOyAvLyAzMCBzZWNvbmRzXG4gICAgICAgIGNvcmUuZGVidWcoYFVwbG9hZGluZyBhcnRpZmFjdCB6aXAgdG8gYmxvYiBzdG9yYWdlIHdpdGggbWF4Q29uY3VycmVuY3k6ICR7bWF4Q29uY3VycmVuY3l9LCBidWZmZXJTaXplOiAke2J1ZmZlclNpemV9YCk7XG4gICAgICAgIGNvbnN0IHVwbG9hZENhbGxiYWNrID0gKHByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgICBjb3JlLmluZm8oYFVwbG9hZGVkIGJ5dGVzICR7cHJvZ3Jlc3MubG9hZGVkQnl0ZXN9YCk7XG4gICAgICAgICAgICB1cGxvYWRCeXRlQ291bnQgPSBwcm9ncmVzcy5sb2FkZWRCeXRlcztcbiAgICAgICAgICAgIGNodW5rVGltZXIodGltZW91dER1cmF0aW9uKTtcbiAgICAgICAgICAgIGxhc3RQcm9ncmVzc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgYmxvYkhUVFBIZWFkZXJzOiB7IGJsb2JDb250ZW50VHlwZTogJ3ppcCcgfSxcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IHVwbG9hZENhbGxiYWNrXG4gICAgICAgIH07XG4gICAgICAgIGxldCBzaGEyNTZIYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB1cGxvYWRTdHJlYW0gPSBuZXcgc3RyZWFtLlBhc3NUaHJvdWdoKCk7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJlYW0gPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG4gICAgICAgIHppcFVwbG9hZFN0cmVhbS5waXBlKHVwbG9hZFN0cmVhbSk7IC8vIFRoaXMgc3RyZWFtIGlzIHVzZWQgZm9yIHRoZSB1cGxvYWRcbiAgICAgICAgemlwVXBsb2FkU3RyZWFtLnBpcGUoaGFzaFN0cmVhbSkuc2V0RW5jb2RpbmcoJ2hleCcpOyAvLyBUaGlzIHN0cmVhbSBpcyB1c2VkIHRvIGNvbXB1dGUgYSBoYXNoIG9mIHRoZSB6aXAgY29udGVudCB0aGF0IGdldHMgdXNlZC4gSW50ZWdyaXR5IGNoZWNrXG4gICAgICAgIGNvcmUuaW5mbygnQmVnaW5uaW5nIHVwbG9hZCBvZiBhcnRpZmFjdCBjb250ZW50IHRvIGJsb2Igc3RvcmFnZScpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGNodW5rIHRpbWVyXG4gICAgICAgICAgICB0aW1lb3V0SWQgPSBjaHVua1RpbWVyKHRpbWVvdXREdXJhdGlvbik7XG4gICAgICAgICAgICB5aWVsZCBibG9ja0Jsb2JDbGllbnQudXBsb2FkU3RyZWFtKHVwbG9hZFN0cmVhbSwgYnVmZmVyU2l6ZSwgbWF4Q29uY3VycmVuY3ksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yc18xLk5ldHdvcmtFcnJvci5pc05ldHdvcmtFcnJvckNvZGUoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLmNvZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLk5ldHdvcmtFcnJvcihlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IuY29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIGNsZWFyIHRoZSB0aW1lb3V0IHdoZXRoZXIgb3Igbm90IHRoZSB1cGxvYWQgY29tcGxldGVzXG4gICAgICAgICAgICBpZiAodGltZW91dElkKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29yZS5pbmZvKCdGaW5pc2hlZCB1cGxvYWRpbmcgYXJ0aWZhY3QgY29udGVudCB0byBibG9iIHN0b3JhZ2UhJyk7XG4gICAgICAgIGhhc2hTdHJlYW0uZW5kKCk7XG4gICAgICAgIHNoYTI1Nkhhc2ggPSBoYXNoU3RyZWFtLnJlYWQoKTtcbiAgICAgICAgY29yZS5pbmZvKGBTSEEyNTYgaGFzaCBvZiB1cGxvYWRlZCBhcnRpZmFjdCB6aXAgaXMgJHtzaGEyNTZIYXNofWApO1xuICAgICAgICBpZiAodXBsb2FkQnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBjb3JlLndhcm5pbmcoYE5vIGRhdGEgd2FzIHVwbG9hZGVkIHRvIGJsb2Igc3RvcmFnZS4gUmVwb3J0ZWQgdXBsb2FkIGJ5dGUgY291bnQgaXMgMC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBsb2FkU2l6ZTogdXBsb2FkQnl0ZUNvdW50LFxuICAgICAgICAgICAgc2hhMjU2SGFzaFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy51cGxvYWRaaXBUb0Jsb2JTdG9yYWdlID0gdXBsb2FkWmlwVG9CbG9iU3RvcmFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJsb2ItdXBsb2FkLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///46862\n")},91841:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.validateFilePath = exports.validateArtifactName = void 0;\nconst core_1 = __webpack_require__(66977);\n/**\n * Invalid characters that cannot be in the artifact name or an uploaded file. Will be rejected\n * from the server if attempted to be sent over. These characters are not allowed due to limitations with certain\n * file systems such as NTFS. To maintain platform-agnostic behavior, all characters that are not supported by an\n * individual filesystem/platform will not be supported on all fileSystems/platforms\n *\n * FilePaths can include characters such as \\ and / which are not permitted in the artifact name alone\n */\nconst invalidArtifactFilePathCharacters = new Map([\n ['\"', ' Double quote \"'],\n [':', ' Colon :'],\n ['<', ' Less than <'],\n ['>', ' Greater than >'],\n ['|', ' Vertical bar |'],\n ['*', ' Asterisk *'],\n ['?', ' Question mark ?'],\n ['\\r', ' Carriage return \\\\r'],\n ['\\n', ' Line feed \\\\n']\n]);\nconst invalidArtifactNameCharacters = new Map([\n ...invalidArtifactFilePathCharacters,\n ['\\\\', ' Backslash \\\\'],\n ['/', ' Forward slash /']\n]);\n/**\n * Validates the name of the artifact to check to make sure there are no illegal characters\n */\nfunction validateArtifactName(name) {\n if (!name) {\n throw new Error(`Provided artifact name input during validation is empty`);\n }\n for (const [invalidCharacterKey, errorMessageForCharacter] of invalidArtifactNameCharacters) {\n if (name.includes(invalidCharacterKey)) {\n throw new Error(`The artifact name is not valid: ${name}. Contains the following character: ${errorMessageForCharacter}\n \nInvalid characters include: ${Array.from(invalidArtifactNameCharacters.values()).toString()}\n \nThese characters are not allowed in the artifact name due to limitations with certain file systems such as NTFS. To maintain file system agnostic behavior, these characters are intentionally not allowed to prevent potential problems with downloads on different file systems.`);\n }\n }\n (0, core_1.info)(`Artifact name is valid!`);\n}\nexports.validateArtifactName = validateArtifactName;\n/**\n * Validates file paths to check for any illegal characters that can cause problems on different file systems\n */\nfunction validateFilePath(path) {\n if (!path) {\n throw new Error(`Provided file path input during validation is empty`);\n }\n for (const [invalidCharacterKey, errorMessageForCharacter] of invalidArtifactFilePathCharacters) {\n if (path.includes(invalidCharacterKey)) {\n throw new Error(`The path for one of the files in artifact is not valid: ${path}. Contains the following character: ${errorMessageForCharacter}\n \nInvalid characters include: ${Array.from(invalidArtifactFilePathCharacters.values()).toString()}\n \nThe following characters are not allowed in files that are uploaded due to limitations with certain file systems such as NTFS. To maintain file system agnostic behavior, these characters are intentionally not allowed to prevent potential problems with downloads on different file systems.\n `);\n }\n }\n}\nexports.validateFilePath = validateFilePath;\n//# sourceMappingURL=path-and-artifact-name-validation.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTE4NDEuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsd0JBQXdCLEdBQUcsNEJBQTRCO0FBQ3ZELGVBQWUsbUJBQU8sQ0FBQyxLQUFlO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxLQUFLLHNDQUFzQztBQUMxRztBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUZBQXVGLEtBQUssc0NBQXNDO0FBQ2xJO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC9wYXRoLWFuZC1hcnRpZmFjdC1uYW1lLXZhbGlkYXRpb24uanM/MmNlYSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmFsaWRhdGVGaWxlUGF0aCA9IGV4cG9ydHMudmFsaWRhdGVBcnRpZmFjdE5hbWUgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbi8qKlxuICogSW52YWxpZCBjaGFyYWN0ZXJzIHRoYXQgY2Fubm90IGJlIGluIHRoZSBhcnRpZmFjdCBuYW1lIG9yIGFuIHVwbG9hZGVkIGZpbGUuIFdpbGwgYmUgcmVqZWN0ZWRcbiAqIGZyb20gdGhlIHNlcnZlciBpZiBhdHRlbXB0ZWQgdG8gYmUgc2VudCBvdmVyLiBUaGVzZSBjaGFyYWN0ZXJzIGFyZSBub3QgYWxsb3dlZCBkdWUgdG8gbGltaXRhdGlvbnMgd2l0aCBjZXJ0YWluXG4gKiBmaWxlIHN5c3RlbXMgc3VjaCBhcyBOVEZTLiBUbyBtYWludGFpbiBwbGF0Zm9ybS1hZ25vc3RpYyBiZWhhdmlvciwgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSBhblxuICogaW5kaXZpZHVhbCBmaWxlc3lzdGVtL3BsYXRmb3JtIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBvbiBhbGwgZmlsZVN5c3RlbXMvcGxhdGZvcm1zXG4gKlxuICogRmlsZVBhdGhzIGNhbiBpbmNsdWRlIGNoYXJhY3RlcnMgc3VjaCBhcyBcXCBhbmQgLyB3aGljaCBhcmUgbm90IHBlcm1pdHRlZCBpbiB0aGUgYXJ0aWZhY3QgbmFtZSBhbG9uZVxuICovXG5jb25zdCBpbnZhbGlkQXJ0aWZhY3RGaWxlUGF0aENoYXJhY3RlcnMgPSBuZXcgTWFwKFtcbiAgICBbJ1wiJywgJyBEb3VibGUgcXVvdGUgXCInXSxcbiAgICBbJzonLCAnIENvbG9uIDonXSxcbiAgICBbJzwnLCAnIExlc3MgdGhhbiA8J10sXG4gICAgWyc+JywgJyBHcmVhdGVyIHRoYW4gPiddLFxuICAgIFsnfCcsICcgVmVydGljYWwgYmFyIHwnXSxcbiAgICBbJyonLCAnIEFzdGVyaXNrIConXSxcbiAgICBbJz8nLCAnIFF1ZXN0aW9uIG1hcmsgPyddLFxuICAgIFsnXFxyJywgJyBDYXJyaWFnZSByZXR1cm4gXFxcXHInXSxcbiAgICBbJ1xcbicsICcgTGluZSBmZWVkIFxcXFxuJ11cbl0pO1xuY29uc3QgaW52YWxpZEFydGlmYWN0TmFtZUNoYXJhY3RlcnMgPSBuZXcgTWFwKFtcbiAgICAuLi5pbnZhbGlkQXJ0aWZhY3RGaWxlUGF0aENoYXJhY3RlcnMsXG4gICAgWydcXFxcJywgJyBCYWNrc2xhc2ggXFxcXCddLFxuICAgIFsnLycsICcgRm9yd2FyZCBzbGFzaCAvJ11cbl0pO1xuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIG5hbWUgb2YgdGhlIGFydGlmYWN0IHRvIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gaWxsZWdhbCBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQXJ0aWZhY3ROYW1lKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlZCBhcnRpZmFjdCBuYW1lIGlucHV0IGR1cmluZyB2YWxpZGF0aW9uIGlzIGVtcHR5YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ludmFsaWRDaGFyYWN0ZXJLZXksIGVycm9yTWVzc2FnZUZvckNoYXJhY3Rlcl0gb2YgaW52YWxpZEFydGlmYWN0TmFtZUNoYXJhY3RlcnMpIHtcbiAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoaW52YWxpZENoYXJhY3RlcktleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFydGlmYWN0IG5hbWUgaXMgbm90IHZhbGlkOiAke25hbWV9LiBDb250YWlucyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcjogJHtlcnJvck1lc3NhZ2VGb3JDaGFyYWN0ZXJ9XG4gICAgICAgICAgXG5JbnZhbGlkIGNoYXJhY3RlcnMgaW5jbHVkZTogJHtBcnJheS5mcm9tKGludmFsaWRBcnRpZmFjdE5hbWVDaGFyYWN0ZXJzLnZhbHVlcygpKS50b1N0cmluZygpfVxuICAgICAgICAgIFxuVGhlc2UgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIGFydGlmYWN0IG5hbWUgZHVlIHRvIGxpbWl0YXRpb25zIHdpdGggY2VydGFpbiBmaWxlIHN5c3RlbXMgc3VjaCBhcyBOVEZTLiBUbyBtYWludGFpbiBmaWxlIHN5c3RlbSBhZ25vc3RpYyBiZWhhdmlvciwgdGhlc2UgY2hhcmFjdGVycyBhcmUgaW50ZW50aW9uYWxseSBub3QgYWxsb3dlZCB0byBwcmV2ZW50IHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIGRvd25sb2FkcyBvbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgICgwLCBjb3JlXzEuaW5mbykoYEFydGlmYWN0IG5hbWUgaXMgdmFsaWQhYCk7XG59XG5leHBvcnRzLnZhbGlkYXRlQXJ0aWZhY3ROYW1lID0gdmFsaWRhdGVBcnRpZmFjdE5hbWU7XG4vKipcbiAqIFZhbGlkYXRlcyBmaWxlIHBhdGhzIHRvIGNoZWNrIGZvciBhbnkgaWxsZWdhbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGNhdXNlIHByb2JsZW1zIG9uIGRpZmZlcmVudCBmaWxlIHN5c3RlbXNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWxlUGF0aChwYXRoKSB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZWQgZmlsZSBwYXRoIGlucHV0IGR1cmluZyB2YWxpZGF0aW9uIGlzIGVtcHR5YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ludmFsaWRDaGFyYWN0ZXJLZXksIGVycm9yTWVzc2FnZUZvckNoYXJhY3Rlcl0gb2YgaW52YWxpZEFydGlmYWN0RmlsZVBhdGhDaGFyYWN0ZXJzKSB7XG4gICAgICAgIGlmIChwYXRoLmluY2x1ZGVzKGludmFsaWRDaGFyYWN0ZXJLZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYXRoIGZvciBvbmUgb2YgdGhlIGZpbGVzIGluIGFydGlmYWN0IGlzIG5vdCB2YWxpZDogJHtwYXRofS4gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXI6ICR7ZXJyb3JNZXNzYWdlRm9yQ2hhcmFjdGVyfVxuICAgICAgICAgIFxuSW52YWxpZCBjaGFyYWN0ZXJzIGluY2x1ZGU6ICR7QXJyYXkuZnJvbShpbnZhbGlkQXJ0aWZhY3RGaWxlUGF0aENoYXJhY3RlcnMudmFsdWVzKCkpLnRvU3RyaW5nKCl9XG4gICAgICAgICAgXG5UaGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIG5vdCBhbGxvd2VkIGluIGZpbGVzIHRoYXQgYXJlIHVwbG9hZGVkIGR1ZSB0byBsaW1pdGF0aW9ucyB3aXRoIGNlcnRhaW4gZmlsZSBzeXN0ZW1zIHN1Y2ggYXMgTlRGUy4gVG8gbWFpbnRhaW4gZmlsZSBzeXN0ZW0gYWdub3N0aWMgYmVoYXZpb3IsIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGludGVudGlvbmFsbHkgbm90IGFsbG93ZWQgdG8gcHJldmVudCBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBkb3dubG9hZHMgb24gZGlmZmVyZW50IGZpbGUgc3lzdGVtcy5cbiAgICAgICAgICBgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMudmFsaWRhdGVGaWxlUGF0aCA9IHZhbGlkYXRlRmlsZVBhdGg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXRoLWFuZC1hcnRpZmFjdC1uYW1lLXZhbGlkYXRpb24uanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///91841\n")},60455:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getExpiration = void 0;\nconst generated_1 = __webpack_require__(10735);\nconst core = __importStar(__webpack_require__(66977));\nfunction getExpiration(retentionDays) {\n if (!retentionDays) {\n return undefined;\n }\n const maxRetentionDays = getRetentionDays();\n if (maxRetentionDays && maxRetentionDays < retentionDays) {\n core.warning(`Retention days cannot be greater than the maximum allowed retention set within the repository. Using ${maxRetentionDays} instead.`);\n retentionDays = maxRetentionDays;\n }\n const expirationDate = new Date();\n expirationDate.setDate(expirationDate.getDate() + retentionDays);\n return generated_1.Timestamp.fromDate(expirationDate);\n}\nexports.getExpiration = getExpiration;\nfunction getRetentionDays() {\n const retentionDays = process.env[\'GITHUB_RETENTION_DAYS\'];\n if (!retentionDays) {\n return undefined;\n }\n const days = parseInt(retentionDays);\n if (isNaN(days)) {\n return undefined;\n }\n return days;\n}\n//# sourceMappingURL=retention.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA0NTUuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHFCQUFxQjtBQUNyQixvQkFBb0IsbUJBQU8sQ0FBQyxLQUFpQjtBQUM3QywwQkFBMEIsbUJBQU8sQ0FBQyxLQUFlO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZIQUE2SCxrQkFBa0I7QUFDL0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC9yZXRlbnRpb24uanM/OTNlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRFeHBpcmF0aW9uID0gdm9pZCAwO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG5mdW5jdGlvbiBnZXRFeHBpcmF0aW9uKHJldGVudGlvbkRheXMpIHtcbiAgICBpZiAoIXJldGVudGlvbkRheXMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF4UmV0ZW50aW9uRGF5cyA9IGdldFJldGVudGlvbkRheXMoKTtcbiAgICBpZiAobWF4UmV0ZW50aW9uRGF5cyAmJiBtYXhSZXRlbnRpb25EYXlzIDwgcmV0ZW50aW9uRGF5cykge1xuICAgICAgICBjb3JlLndhcm5pbmcoYFJldGVudGlvbiBkYXlzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZCByZXRlbnRpb24gc2V0IHdpdGhpbiB0aGUgcmVwb3NpdG9yeS4gVXNpbmcgJHttYXhSZXRlbnRpb25EYXlzfSBpbnN0ZWFkLmApO1xuICAgICAgICByZXRlbnRpb25EYXlzID0gbWF4UmV0ZW50aW9uRGF5cztcbiAgICB9XG4gICAgY29uc3QgZXhwaXJhdGlvbkRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGV4cGlyYXRpb25EYXRlLnNldERhdGUoZXhwaXJhdGlvbkRhdGUuZ2V0RGF0ZSgpICsgcmV0ZW50aW9uRGF5cyk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZF8xLlRpbWVzdGFtcC5mcm9tRGF0ZShleHBpcmF0aW9uRGF0ZSk7XG59XG5leHBvcnRzLmdldEV4cGlyYXRpb24gPSBnZXRFeHBpcmF0aW9uO1xuZnVuY3Rpb24gZ2V0UmV0ZW50aW9uRGF5cygpIHtcbiAgICBjb25zdCByZXRlbnRpb25EYXlzID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9SRVRFTlRJT05fREFZUyddO1xuICAgIGlmICghcmV0ZW50aW9uRGF5cykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkYXlzID0gcGFyc2VJbnQocmV0ZW50aW9uRGF5cyk7XG4gICAgaWYgKGlzTmFOKGRheXMpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkYXlzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV0ZW50aW9uLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///60455\n')},84955:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.uploadArtifact = void 0;\nconst core = __importStar(__webpack_require__(66977));\nconst retention_1 = __webpack_require__(60455);\nconst path_and_artifact_name_validation_1 = __webpack_require__(91841);\nconst artifact_twirp_client_1 = __webpack_require__(75630);\nconst upload_zip_specification_1 = __webpack_require__(46142);\nconst util_1 = __webpack_require__(52901);\nconst blob_upload_1 = __webpack_require__(46862);\nconst zip_1 = __webpack_require__(59274);\nconst generated_1 = __webpack_require__(10735);\nconst errors_1 = __webpack_require__(14842);\nfunction uploadArtifact(name, files, rootDirectory, options) {\n return __awaiter(this, void 0, void 0, function* () {\n (0, path_and_artifact_name_validation_1.validateArtifactName)(name);\n (0, upload_zip_specification_1.validateRootDirectory)(rootDirectory);\n const zipSpecification = (0, upload_zip_specification_1.getUploadZipSpecification)(files, rootDirectory);\n if (zipSpecification.length === 0) {\n throw new errors_1.FilesNotFoundError(zipSpecification.flatMap(s => (s.sourcePath ? [s.sourcePath] : [])));\n }\n // get the IDs needed for the artifact creation\n const backendIds = (0, util_1.getBackendIdsFromToken)();\n // create the artifact client\n const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)();\n // create the artifact\n const createArtifactReq = {\n workflowRunBackendId: backendIds.workflowRunBackendId,\n workflowJobRunBackendId: backendIds.workflowJobRunBackendId,\n name,\n version: 4\n };\n // if there is a retention period, add it to the request\n const expiresAt = (0, retention_1.getExpiration)(options === null || options === void 0 ? void 0 : options.retentionDays);\n if (expiresAt) {\n createArtifactReq.expiresAt = expiresAt;\n }\n const createArtifactResp = yield artifactClient.CreateArtifact(createArtifactReq);\n if (!createArtifactResp.ok) {\n throw new errors_1.InvalidResponseError(\'CreateArtifact: response from backend was not ok\');\n }\n const zipUploadStream = yield (0, zip_1.createZipUploadStream)(zipSpecification, options === null || options === void 0 ? void 0 : options.compressionLevel);\n // Upload zip to blob storage\n const uploadResult = yield (0, blob_upload_1.uploadZipToBlobStorage)(createArtifactResp.signedUploadUrl, zipUploadStream);\n // finalize the artifact\n const finalizeArtifactReq = {\n workflowRunBackendId: backendIds.workflowRunBackendId,\n workflowJobRunBackendId: backendIds.workflowJobRunBackendId,\n name,\n size: uploadResult.uploadSize ? uploadResult.uploadSize.toString() : \'0\'\n };\n if (uploadResult.sha256Hash) {\n finalizeArtifactReq.hash = generated_1.StringValue.create({\n value: `sha256:${uploadResult.sha256Hash}`\n });\n }\n core.info(`Finalizing artifact upload`);\n const finalizeArtifactResp = yield artifactClient.FinalizeArtifact(finalizeArtifactReq);\n if (!finalizeArtifactResp.ok) {\n throw new errors_1.InvalidResponseError(\'FinalizeArtifact: response from backend was not ok\');\n }\n const artifactId = BigInt(finalizeArtifactResp.artifactId);\n core.info(`Artifact ${name}.zip successfully finalized. Artifact ID ${artifactId}`);\n return {\n size: uploadResult.uploadSize,\n id: Number(artifactId)\n };\n });\n}\nexports.uploadArtifact = uploadArtifact;\n//# sourceMappingURL=upload-artifact.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQ5NTUuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxzQkFBc0I7QUFDdEIsMEJBQTBCLG1CQUFPLENBQUMsS0FBZTtBQUNqRCxvQkFBb0IsbUJBQU8sQ0FBQyxLQUFhO0FBQ3pDLDRDQUE0QyxtQkFBTyxDQUFDLEtBQXFDO0FBQ3pGLGdDQUFnQyxtQkFBTyxDQUFDLEtBQWlDO0FBQ3pFLG1DQUFtQyxtQkFBTyxDQUFDLEtBQTRCO0FBQ3ZFLGVBQWUsbUJBQU8sQ0FBQyxLQUFnQjtBQUN2QyxzQkFBc0IsbUJBQU8sQ0FBQyxLQUFlO0FBQzdDLGNBQWMsbUJBQU8sQ0FBQyxLQUFPO0FBQzdCLG9CQUFvQixtQkFBTyxDQUFDLEtBQWlCO0FBQzdDLGlCQUFpQixtQkFBTyxDQUFDLEtBQWtCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHdCQUF3QjtBQUN6RCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsS0FBSywyQ0FBMkMsV0FBVztBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHNCQUFzQjtBQUN0QiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC91cGxvYWQtYXJ0aWZhY3QuanM/YWEyNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwbG9hZEFydGlmYWN0ID0gdm9pZCAwO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG5jb25zdCByZXRlbnRpb25fMSA9IHJlcXVpcmUoXCIuL3JldGVudGlvblwiKTtcbmNvbnN0IHBhdGhfYW5kX2FydGlmYWN0X25hbWVfdmFsaWRhdGlvbl8xID0gcmVxdWlyZShcIi4vcGF0aC1hbmQtYXJ0aWZhY3QtbmFtZS12YWxpZGF0aW9uXCIpO1xuY29uc3QgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2FydGlmYWN0LXR3aXJwLWNsaWVudFwiKTtcbmNvbnN0IHVwbG9hZF96aXBfc3BlY2lmaWNhdGlvbl8xID0gcmVxdWlyZShcIi4vdXBsb2FkLXppcC1zcGVjaWZpY2F0aW9uXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgYmxvYl91cGxvYWRfMSA9IHJlcXVpcmUoXCIuL2Jsb2ItdXBsb2FkXCIpO1xuY29uc3QgemlwXzEgPSByZXF1aXJlKFwiLi96aXBcIik7XG5jb25zdCBnZW5lcmF0ZWRfMSA9IHJlcXVpcmUoXCIuLi8uLi9nZW5lcmF0ZWRcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuZnVuY3Rpb24gdXBsb2FkQXJ0aWZhY3QobmFtZSwgZmlsZXMsIHJvb3REaXJlY3RvcnksIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAoMCwgcGF0aF9hbmRfYXJ0aWZhY3RfbmFtZV92YWxpZGF0aW9uXzEudmFsaWRhdGVBcnRpZmFjdE5hbWUpKG5hbWUpO1xuICAgICAgICAoMCwgdXBsb2FkX3ppcF9zcGVjaWZpY2F0aW9uXzEudmFsaWRhdGVSb290RGlyZWN0b3J5KShyb290RGlyZWN0b3J5KTtcbiAgICAgICAgY29uc3QgemlwU3BlY2lmaWNhdGlvbiA9ICgwLCB1cGxvYWRfemlwX3NwZWNpZmljYXRpb25fMS5nZXRVcGxvYWRaaXBTcGVjaWZpY2F0aW9uKShmaWxlcywgcm9vdERpcmVjdG9yeSk7XG4gICAgICAgIGlmICh6aXBTcGVjaWZpY2F0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkZpbGVzTm90Rm91bmRFcnJvcih6aXBTcGVjaWZpY2F0aW9uLmZsYXRNYXAocyA9PiAocy5zb3VyY2VQYXRoID8gW3Muc291cmNlUGF0aF0gOiBbXSkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgdGhlIElEcyBuZWVkZWQgZm9yIHRoZSBhcnRpZmFjdCBjcmVhdGlvblxuICAgICAgICBjb25zdCBiYWNrZW5kSWRzID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICAvLyBjcmVhdGUgdGhlIGFydGlmYWN0IGNsaWVudFxuICAgICAgICBjb25zdCBhcnRpZmFjdENsaWVudCA9ICgwLCBhcnRpZmFjdF90d2lycF9jbGllbnRfMS5pbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQpKCk7XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgYXJ0aWZhY3RcbiAgICAgICAgY29uc3QgY3JlYXRlQXJ0aWZhY3RSZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZDogYmFja2VuZElkcy53b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBiYWNrZW5kSWRzLndvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IDRcbiAgICAgICAgfTtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSByZXRlbnRpb24gcGVyaW9kLCBhZGQgaXQgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gKDAsIHJldGVudGlvbl8xLmdldEV4cGlyYXRpb24pKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZXRlbnRpb25EYXlzKTtcbiAgICAgICAgaWYgKGV4cGlyZXNBdCkge1xuICAgICAgICAgICAgY3JlYXRlQXJ0aWZhY3RSZXEuZXhwaXJlc0F0ID0gZXhwaXJlc0F0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNyZWF0ZUFydGlmYWN0UmVzcCA9IHlpZWxkIGFydGlmYWN0Q2xpZW50LkNyZWF0ZUFydGlmYWN0KGNyZWF0ZUFydGlmYWN0UmVxKTtcbiAgICAgICAgaWYgKCFjcmVhdGVBcnRpZmFjdFJlc3Aub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5JbnZhbGlkUmVzcG9uc2VFcnJvcignQ3JlYXRlQXJ0aWZhY3Q6IHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgbm90IG9rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgemlwVXBsb2FkU3RyZWFtID0geWllbGQgKDAsIHppcF8xLmNyZWF0ZVppcFVwbG9hZFN0cmVhbSkoemlwU3BlY2lmaWNhdGlvbiwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbXByZXNzaW9uTGV2ZWwpO1xuICAgICAgICAvLyBVcGxvYWQgemlwIHRvIGJsb2Igc3RvcmFnZVxuICAgICAgICBjb25zdCB1cGxvYWRSZXN1bHQgPSB5aWVsZCAoMCwgYmxvYl91cGxvYWRfMS51cGxvYWRaaXBUb0Jsb2JTdG9yYWdlKShjcmVhdGVBcnRpZmFjdFJlc3Auc2lnbmVkVXBsb2FkVXJsLCB6aXBVcGxvYWRTdHJlYW0pO1xuICAgICAgICAvLyBmaW5hbGl6ZSB0aGUgYXJ0aWZhY3RcbiAgICAgICAgY29uc3QgZmluYWxpemVBcnRpZmFjdFJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkOiBiYWNrZW5kSWRzLndvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IGJhY2tlbmRJZHMud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2l6ZTogdXBsb2FkUmVzdWx0LnVwbG9hZFNpemUgPyB1cGxvYWRSZXN1bHQudXBsb2FkU2l6ZS50b1N0cmluZygpIDogJzAnXG4gICAgICAgIH07XG4gICAgICAgIGlmICh1cGxvYWRSZXN1bHQuc2hhMjU2SGFzaCkge1xuICAgICAgICAgICAgZmluYWxpemVBcnRpZmFjdFJlcS5oYXNoID0gZ2VuZXJhdGVkXzEuU3RyaW5nVmFsdWUuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogYHNoYTI1Njoke3VwbG9hZFJlc3VsdC5zaGEyNTZIYXNofWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvcmUuaW5mbyhgRmluYWxpemluZyBhcnRpZmFjdCB1cGxvYWRgKTtcbiAgICAgICAgY29uc3QgZmluYWxpemVBcnRpZmFjdFJlc3AgPSB5aWVsZCBhcnRpZmFjdENsaWVudC5GaW5hbGl6ZUFydGlmYWN0KGZpbmFsaXplQXJ0aWZhY3RSZXEpO1xuICAgICAgICBpZiAoIWZpbmFsaXplQXJ0aWZhY3RSZXNwLm9rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuSW52YWxpZFJlc3BvbnNlRXJyb3IoJ0ZpbmFsaXplQXJ0aWZhY3Q6IHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgbm90IG9rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJ0aWZhY3RJZCA9IEJpZ0ludChmaW5hbGl6ZUFydGlmYWN0UmVzcC5hcnRpZmFjdElkKTtcbiAgICAgICAgY29yZS5pbmZvKGBBcnRpZmFjdCAke25hbWV9LnppcCBzdWNjZXNzZnVsbHkgZmluYWxpemVkLiBBcnRpZmFjdCBJRCAke2FydGlmYWN0SWR9YCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzaXplOiB1cGxvYWRSZXN1bHQudXBsb2FkU2l6ZSxcbiAgICAgICAgICAgIGlkOiBOdW1iZXIoYXJ0aWZhY3RJZClcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBsb2FkQXJ0aWZhY3QgPSB1cGxvYWRBcnRpZmFjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwbG9hZC1hcnRpZmFjdC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///84955\n')},46142:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getUploadZipSpecification = exports.validateRootDirectory = void 0;\nconst fs = __importStar(__webpack_require__(79896));\nconst core_1 = __webpack_require__(66977);\nconst path_1 = __webpack_require__(16928);\nconst path_and_artifact_name_validation_1 = __webpack_require__(91841);\n/**\n * Checks if a root directory exists and is valid\n * @param rootDirectory an absolute root directory path common to all input files that that will be trimmed from the final zip structure\n */\nfunction validateRootDirectory(rootDirectory) {\n if (!fs.existsSync(rootDirectory)) {\n throw new Error(`The provided rootDirectory ${rootDirectory} does not exist`);\n }\n if (!fs.statSync(rootDirectory).isDirectory()) {\n throw new Error(`The provided rootDirectory ${rootDirectory} is not a valid directory`);\n }\n (0, core_1.info)(`Root directory input is valid!`);\n}\nexports.validateRootDirectory = validateRootDirectory;\n/**\n * Creates a specification that describes how a zip file will be created for a set of input files\n * @param filesToZip a list of file that should be included in the zip\n * @param rootDirectory an absolute root directory path common to all input files that that will be trimmed from the final zip structure\n */\nfunction getUploadZipSpecification(filesToZip, rootDirectory) {\n const specification = [];\n // Normalize and resolve, this allows for either absolute or relative paths to be used\n rootDirectory = (0, path_1.normalize)(rootDirectory);\n rootDirectory = (0, path_1.resolve)(rootDirectory);\n /*\n Example\n \n Input:\n rootDirectory: '/home/user/files/plz-upload'\n artifactFiles: [\n '/home/user/files/plz-upload/file1.txt',\n '/home/user/files/plz-upload/file2.txt',\n '/home/user/files/plz-upload/dir/file3.txt'\n ]\n \n Output:\n specifications: [\n ['/home/user/files/plz-upload/file1.txt', '/file1.txt'],\n ['/home/user/files/plz-upload/file1.txt', '/file2.txt'],\n ['/home/user/files/plz-upload/file1.txt', '/dir/file3.txt']\n ]\n \n The final zip that is later uploaded will look like this:\n \n my-artifact.zip\n - file.txt\n - file2.txt\n - dir/\n - file3.txt\n */\n for (let file of filesToZip) {\n if (!fs.existsSync(file)) {\n throw new Error(`File ${file} does not exist`);\n }\n if (!fs.statSync(file).isDirectory()) {\n // Normalize and resolve, this allows for either absolute or relative paths to be used\n file = (0, path_1.normalize)(file);\n file = (0, path_1.resolve)(file);\n if (!file.startsWith(rootDirectory)) {\n throw new Error(`The rootDirectory: ${rootDirectory} is not a parent directory of the file: ${file}`);\n }\n // Check for forbidden characters in file paths that may cause ambiguous behavior if downloaded on different file systems\n const uploadPath = file.replace(rootDirectory, '');\n (0, path_and_artifact_name_validation_1.validateFilePath)(uploadPath);\n specification.push({\n sourcePath: file,\n destinationPath: uploadPath\n });\n }\n else {\n // Empty directory\n const directoryPath = file.replace(rootDirectory, '');\n (0, path_and_artifact_name_validation_1.validateFilePath)(directoryPath);\n specification.push({\n sourcePath: null,\n destinationPath: directoryPath\n });\n }\n }\n return specification;\n}\nexports.getUploadZipSpecification = getUploadZipSpecification;\n//# sourceMappingURL=upload-zip-specification.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYxNDIuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGlDQUFpQyxHQUFHLDZCQUE2QjtBQUNqRSx3QkFBd0IsbUJBQU8sQ0FBQyxLQUFJO0FBQ3BDLGVBQWUsbUJBQU8sQ0FBQyxLQUFlO0FBQ3RDLGVBQWUsbUJBQU8sQ0FBQyxLQUFNO0FBQzdCLDRDQUE0QyxtQkFBTyxDQUFDLEtBQXFDO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxlQUFlO0FBQ3JFO0FBQ0E7QUFDQSxzREFBc0QsZUFBZTtBQUNyRTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxNQUFNO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxlQUFlLHlDQUF5QyxLQUFLO0FBQ25IO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC91cGxvYWQvdXBsb2FkLXppcC1zcGVjaWZpY2F0aW9uLmpzP2MyMjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0VXBsb2FkWmlwU3BlY2lmaWNhdGlvbiA9IGV4cG9ydHMudmFsaWRhdGVSb290RGlyZWN0b3J5ID0gdm9pZCAwO1xuY29uc3QgZnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImZzXCIpKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpO1xuY29uc3QgcGF0aF8xID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBwYXRoX2FuZF9hcnRpZmFjdF9uYW1lX3ZhbGlkYXRpb25fMSA9IHJlcXVpcmUoXCIuL3BhdGgtYW5kLWFydGlmYWN0LW5hbWUtdmFsaWRhdGlvblwiKTtcbi8qKlxuICogQ2hlY2tzIGlmIGEgcm9vdCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyB2YWxpZFxuICogQHBhcmFtIHJvb3REaXJlY3RvcnkgYW4gYWJzb2x1dGUgcm9vdCBkaXJlY3RvcnkgcGF0aCBjb21tb24gdG8gYWxsIGlucHV0IGZpbGVzIHRoYXQgdGhhdCB3aWxsIGJlIHRyaW1tZWQgZnJvbSB0aGUgZmluYWwgemlwIHN0cnVjdHVyZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJvb3REaXJlY3Rvcnkocm9vdERpcmVjdG9yeSkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhyb290RGlyZWN0b3J5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm92aWRlZCByb290RGlyZWN0b3J5ICR7cm9vdERpcmVjdG9yeX0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gICAgaWYgKCFmcy5zdGF0U3luYyhyb290RGlyZWN0b3J5KS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3ZpZGVkIHJvb3REaXJlY3RvcnkgJHtyb290RGlyZWN0b3J5fSBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnlgKTtcbiAgICB9XG4gICAgKDAsIGNvcmVfMS5pbmZvKShgUm9vdCBkaXJlY3RvcnkgaW5wdXQgaXMgdmFsaWQhYCk7XG59XG5leHBvcnRzLnZhbGlkYXRlUm9vdERpcmVjdG9yeSA9IHZhbGlkYXRlUm9vdERpcmVjdG9yeTtcbi8qKlxuICogQ3JlYXRlcyBhIHNwZWNpZmljYXRpb24gdGhhdCBkZXNjcmliZXMgaG93IGEgemlwIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGZvciBhIHNldCBvZiBpbnB1dCBmaWxlc1xuICogQHBhcmFtIGZpbGVzVG9aaXAgYSBsaXN0IG9mIGZpbGUgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHppcFxuICogQHBhcmFtIHJvb3REaXJlY3RvcnkgYW4gYWJzb2x1dGUgcm9vdCBkaXJlY3RvcnkgcGF0aCBjb21tb24gdG8gYWxsIGlucHV0IGZpbGVzIHRoYXQgdGhhdCB3aWxsIGJlIHRyaW1tZWQgZnJvbSB0aGUgZmluYWwgemlwIHN0cnVjdHVyZVxuICovXG5mdW5jdGlvbiBnZXRVcGxvYWRaaXBTcGVjaWZpY2F0aW9uKGZpbGVzVG9aaXAsIHJvb3REaXJlY3RvcnkpIHtcbiAgICBjb25zdCBzcGVjaWZpY2F0aW9uID0gW107XG4gICAgLy8gTm9ybWFsaXplIGFuZCByZXNvbHZlLCB0aGlzIGFsbG93cyBmb3IgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHVzZWRcbiAgICByb290RGlyZWN0b3J5ID0gKDAsIHBhdGhfMS5ub3JtYWxpemUpKHJvb3REaXJlY3RvcnkpO1xuICAgIHJvb3REaXJlY3RvcnkgPSAoMCwgcGF0aF8xLnJlc29sdmUpKHJvb3REaXJlY3RvcnkpO1xuICAgIC8qXG4gICAgICAgRXhhbXBsZVxuICAgICAgIFxuICAgICAgIElucHV0OlxuICAgICAgICAgcm9vdERpcmVjdG9yeTogJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZCdcbiAgICAgICAgIGFydGlmYWN0RmlsZXM6IFtcbiAgICAgICAgICAgJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMS50eHQnLFxuICAgICAgICAgICAnL2hvbWUvdXNlci9maWxlcy9wbHotdXBsb2FkL2ZpbGUyLnR4dCcsXG4gICAgICAgICAgICcvaG9tZS91c2VyL2ZpbGVzL3Bsei11cGxvYWQvZGlyL2ZpbGUzLnR4dCdcbiAgICAgICAgIF1cbiAgICAgICBcbiAgICAgICBPdXRwdXQ6XG4gICAgICAgICBzcGVjaWZpY2F0aW9uczogW1xuICAgICAgICAgICBbJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMS50eHQnLCAnL2ZpbGUxLnR4dCddLFxuICAgICAgICAgICBbJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMS50eHQnLCAnL2ZpbGUyLnR4dCddLFxuICAgICAgICAgICBbJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMS50eHQnLCAnL2Rpci9maWxlMy50eHQnXVxuICAgICAgICAgXVxuICBcbiAgICAgICAgVGhlIGZpbmFsIHppcCB0aGF0IGlzIGxhdGVyIHVwbG9hZGVkIHdpbGwgbG9vayBsaWtlIHRoaXM6XG4gIFxuICAgICAgICBteS1hcnRpZmFjdC56aXBcbiAgICAgICAgICAtIGZpbGUudHh0XG4gICAgICAgICAgLSBmaWxlMi50eHRcbiAgICAgICAgICAtIGRpci9cbiAgICAgICAgICAgIC0gZmlsZTMudHh0XG4gICAgKi9cbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzVG9aaXApIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmaWxlfSBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZnMuc3RhdFN5bmMoZmlsZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgLy8gTm9ybWFsaXplIGFuZCByZXNvbHZlLCB0aGlzIGFsbG93cyBmb3IgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHVzZWRcbiAgICAgICAgICAgIGZpbGUgPSAoMCwgcGF0aF8xLm5vcm1hbGl6ZSkoZmlsZSk7XG4gICAgICAgICAgICBmaWxlID0gKDAsIHBhdGhfMS5yZXNvbHZlKShmaWxlKTtcbiAgICAgICAgICAgIGlmICghZmlsZS5zdGFydHNXaXRoKHJvb3REaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm9vdERpcmVjdG9yeTogJHtyb290RGlyZWN0b3J5fSBpcyBub3QgYSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlOiAke2ZpbGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgZm9yYmlkZGVuIGNoYXJhY3RlcnMgaW4gZmlsZSBwYXRocyB0aGF0IG1heSBjYXVzZSBhbWJpZ3VvdXMgYmVoYXZpb3IgaWYgZG93bmxvYWRlZCBvbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRQYXRoID0gZmlsZS5yZXBsYWNlKHJvb3REaXJlY3RvcnksICcnKTtcbiAgICAgICAgICAgICgwLCBwYXRoX2FuZF9hcnRpZmFjdF9uYW1lX3ZhbGlkYXRpb25fMS52YWxpZGF0ZUZpbGVQYXRoKSh1cGxvYWRQYXRoKTtcbiAgICAgICAgICAgIHNwZWNpZmljYXRpb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgc291cmNlUGF0aDogZmlsZSxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGg6IHVwbG9hZFBhdGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRW1wdHkgZGlyZWN0b3J5XG4gICAgICAgICAgICBjb25zdCBkaXJlY3RvcnlQYXRoID0gZmlsZS5yZXBsYWNlKHJvb3REaXJlY3RvcnksICcnKTtcbiAgICAgICAgICAgICgwLCBwYXRoX2FuZF9hcnRpZmFjdF9uYW1lX3ZhbGlkYXRpb25fMS52YWxpZGF0ZUZpbGVQYXRoKShkaXJlY3RvcnlQYXRoKTtcbiAgICAgICAgICAgIHNwZWNpZmljYXRpb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgc291cmNlUGF0aDogbnVsbCxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGRpcmVjdG9yeVBhdGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGVjaWZpY2F0aW9uO1xufVxuZXhwb3J0cy5nZXRVcGxvYWRaaXBTcGVjaWZpY2F0aW9uID0gZ2V0VXBsb2FkWmlwU3BlY2lmaWNhdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwbG9hZC16aXAtc3BlY2lmaWNhdGlvbi5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///46142\n")},59274:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.createZipUploadStream = exports.ZipUploadStream = exports.DEFAULT_COMPRESSION_LEVEL = void 0;\nconst stream = __importStar(__webpack_require__(2203));\nconst archiver = __importStar(__webpack_require__(99133));\nconst core = __importStar(__webpack_require__(66977));\nconst fs_1 = __webpack_require__(79896);\nconst config_1 = __webpack_require__(6231);\nexports.DEFAULT_COMPRESSION_LEVEL = 6;\n// Custom stream transformer so we can set the highWaterMark property\n// See https://github.com/nodejs/node/issues/8855\nclass ZipUploadStream extends stream.Transform {\n constructor(bufferSize) {\n super({\n highWaterMark: bufferSize\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _transform(chunk, enc, cb) {\n cb(null, chunk);\n }\n}\nexports.ZipUploadStream = ZipUploadStream;\nfunction createZipUploadStream(uploadSpecification, compressionLevel = exports.DEFAULT_COMPRESSION_LEVEL) {\n return __awaiter(this, void 0, void 0, function* () {\n core.debug(`Creating Artifact archive with compressionLevel: ${compressionLevel}`);\n const zip = archiver.create('zip', {\n highWaterMark: (0, config_1.getUploadChunkSize)(),\n zlib: { level: compressionLevel }\n });\n // register callbacks for various events during the zip lifecycle\n zip.on('error', zipErrorCallback);\n zip.on('warning', zipWarningCallback);\n zip.on('finish', zipFinishCallback);\n zip.on('end', zipEndCallback);\n for (const file of uploadSpecification) {\n if (file.sourcePath !== null) {\n // Add a normal file to the zip\n zip.append((0, fs_1.createReadStream)(file.sourcePath), {\n name: file.destinationPath\n });\n }\n else {\n // Add a directory to the zip\n zip.append('', { name: file.destinationPath });\n }\n }\n const bufferSize = (0, config_1.getUploadChunkSize)();\n const zipUploadStream = new ZipUploadStream(bufferSize);\n core.debug(`Zip write high watermark value ${zipUploadStream.writableHighWaterMark}`);\n core.debug(`Zip read high watermark value ${zipUploadStream.readableHighWaterMark}`);\n zip.pipe(zipUploadStream);\n zip.finalize();\n return zipUploadStream;\n });\n}\nexports.createZipUploadStream = createZipUploadStream;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst zipErrorCallback = (error) => {\n core.error('An error has occurred while creating the zip file for upload');\n core.info(error);\n throw new Error('An error has occurred during zip creation for the artifact');\n};\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst zipWarningCallback = (error) => {\n if (error.code === 'ENOENT') {\n core.warning('ENOENT warning during artifact zip creation. No such file or directory');\n core.info(error);\n }\n else {\n core.warning(`A non-blocking warning has occurred during artifact zip creation: ${error.code}`);\n core.info(error);\n }\n};\nconst zipFinishCallback = () => {\n core.debug('Zip stream for upload has finished.');\n};\nconst zipEndCallback = () => {\n core.debug('Zip stream for upload has ended.');\n};\n//# sourceMappingURL=zip.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkyNzQuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCw2QkFBNkIsR0FBRyx1QkFBdUIsR0FBRyxpQ0FBaUM7QUFDM0YsNEJBQTRCLG1CQUFPLENBQUMsSUFBUTtBQUM1Qyw4QkFBOEIsbUJBQU8sQ0FBQyxLQUFVO0FBQ2hELDBCQUEwQixtQkFBTyxDQUFDLEtBQWU7QUFDakQsYUFBYSxtQkFBTyxDQUFDLEtBQUk7QUFDekIsaUJBQWlCLG1CQUFPLENBQUMsSUFBa0I7QUFDM0MsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLHVFQUF1RSxpQkFBaUI7QUFDeEY7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDRCQUE0QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxzQ0FBc0M7QUFDM0Ysb0RBQW9ELHNDQUFzQztBQUMxRjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRkFBMEYsV0FBVztBQUNyRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC96aXAuanM/ODgyZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVppcFVwbG9hZFN0cmVhbSA9IGV4cG9ydHMuWmlwVXBsb2FkU3RyZWFtID0gZXhwb3J0cy5ERUZBVUxUX0NPTVBSRVNTSU9OX0xFVkVMID0gdm9pZCAwO1xuY29uc3Qgc3RyZWFtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJzdHJlYW1cIikpO1xuY29uc3QgYXJjaGl2ZXIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImFyY2hpdmVyXCIpKTtcbmNvbnN0IGNvcmUgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2NvcmVcIikpO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9jb25maWdcIik7XG5leHBvcnRzLkRFRkFVTFRfQ09NUFJFU1NJT05fTEVWRUwgPSA2O1xuLy8gQ3VzdG9tIHN0cmVhbSB0cmFuc2Zvcm1lciBzbyB3ZSBjYW4gc2V0IHRoZSBoaWdoV2F0ZXJNYXJrIHByb3BlcnR5XG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84ODU1XG5jbGFzcyBaaXBVcGxvYWRTdHJlYW0gZXh0ZW5kcyBzdHJlYW0uVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXJTaXplKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IGJ1ZmZlclNpemVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jLCBjYikge1xuICAgICAgICBjYihudWxsLCBjaHVuayk7XG4gICAgfVxufVxuZXhwb3J0cy5aaXBVcGxvYWRTdHJlYW0gPSBaaXBVcGxvYWRTdHJlYW07XG5mdW5jdGlvbiBjcmVhdGVaaXBVcGxvYWRTdHJlYW0odXBsb2FkU3BlY2lmaWNhdGlvbiwgY29tcHJlc3Npb25MZXZlbCA9IGV4cG9ydHMuREVGQVVMVF9DT01QUkVTU0lPTl9MRVZFTCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvcmUuZGVidWcoYENyZWF0aW5nIEFydGlmYWN0IGFyY2hpdmUgd2l0aCBjb21wcmVzc2lvbkxldmVsOiAke2NvbXByZXNzaW9uTGV2ZWx9YCk7XG4gICAgICAgIGNvbnN0IHppcCA9IGFyY2hpdmVyLmNyZWF0ZSgnemlwJywge1xuICAgICAgICAgICAgaGlnaFdhdGVyTWFyazogKDAsIGNvbmZpZ18xLmdldFVwbG9hZENodW5rU2l6ZSkoKSxcbiAgICAgICAgICAgIHpsaWI6IHsgbGV2ZWw6IGNvbXByZXNzaW9uTGV2ZWwgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmVnaXN0ZXIgY2FsbGJhY2tzIGZvciB2YXJpb3VzIGV2ZW50cyBkdXJpbmcgdGhlIHppcCBsaWZlY3ljbGVcbiAgICAgICAgemlwLm9uKCdlcnJvcicsIHppcEVycm9yQ2FsbGJhY2spO1xuICAgICAgICB6aXAub24oJ3dhcm5pbmcnLCB6aXBXYXJuaW5nQ2FsbGJhY2spO1xuICAgICAgICB6aXAub24oJ2ZpbmlzaCcsIHppcEZpbmlzaENhbGxiYWNrKTtcbiAgICAgICAgemlwLm9uKCdlbmQnLCB6aXBFbmRDYWxsYmFjayk7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB1cGxvYWRTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5zb3VyY2VQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGEgbm9ybWFsIGZpbGUgdG8gdGhlIHppcFxuICAgICAgICAgICAgICAgIHppcC5hcHBlbmQoKDAsIGZzXzEuY3JlYXRlUmVhZFN0cmVhbSkoZmlsZS5zb3VyY2VQYXRoKSwge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLmRlc3RpbmF0aW9uUGF0aFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSB6aXBcbiAgICAgICAgICAgICAgICB6aXAuYXBwZW5kKCcnLCB7IG5hbWU6IGZpbGUuZGVzdGluYXRpb25QYXRoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemUgPSAoMCwgY29uZmlnXzEuZ2V0VXBsb2FkQ2h1bmtTaXplKSgpO1xuICAgICAgICBjb25zdCB6aXBVcGxvYWRTdHJlYW0gPSBuZXcgWmlwVXBsb2FkU3RyZWFtKGJ1ZmZlclNpemUpO1xuICAgICAgICBjb3JlLmRlYnVnKGBaaXAgd3JpdGUgaGlnaCB3YXRlcm1hcmsgdmFsdWUgJHt6aXBVcGxvYWRTdHJlYW0ud3JpdGFibGVIaWdoV2F0ZXJNYXJrfWApO1xuICAgICAgICBjb3JlLmRlYnVnKGBaaXAgcmVhZCBoaWdoIHdhdGVybWFyayB2YWx1ZSAke3ppcFVwbG9hZFN0cmVhbS5yZWFkYWJsZUhpZ2hXYXRlck1hcmt9YCk7XG4gICAgICAgIHppcC5waXBlKHppcFVwbG9hZFN0cmVhbSk7XG4gICAgICAgIHppcC5maW5hbGl6ZSgpO1xuICAgICAgICByZXR1cm4gemlwVXBsb2FkU3RyZWFtO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVaaXBVcGxvYWRTdHJlYW0gPSBjcmVhdGVaaXBVcGxvYWRTdHJlYW07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgemlwRXJyb3JDYWxsYmFjayA9IChlcnJvcikgPT4ge1xuICAgIGNvcmUuZXJyb3IoJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyB0aGUgemlwIGZpbGUgZm9yIHVwbG9hZCcpO1xuICAgIGNvcmUuaW5mbyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBbiBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIHppcCBjcmVhdGlvbiBmb3IgdGhlIGFydGlmYWN0Jyk7XG59O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IHppcFdhcm5pbmdDYWxsYmFjayA9IChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBjb3JlLndhcm5pbmcoJ0VOT0VOVCB3YXJuaW5nIGR1cmluZyBhcnRpZmFjdCB6aXAgY3JlYXRpb24uIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKTtcbiAgICAgICAgY29yZS5pbmZvKGVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvcmUud2FybmluZyhgQSBub24tYmxvY2tpbmcgd2FybmluZyBoYXMgb2NjdXJyZWQgZHVyaW5nIGFydGlmYWN0IHppcCBjcmVhdGlvbjogJHtlcnJvci5jb2RlfWApO1xuICAgICAgICBjb3JlLmluZm8oZXJyb3IpO1xuICAgIH1cbn07XG5jb25zdCB6aXBGaW5pc2hDYWxsYmFjayA9ICgpID0+IHtcbiAgICBjb3JlLmRlYnVnKCdaaXAgc3RyZWFtIGZvciB1cGxvYWQgaGFzIGZpbmlzaGVkLicpO1xufTtcbmNvbnN0IHppcEVuZENhbGxiYWNrID0gKCkgPT4ge1xuICAgIGNvcmUuZGVidWcoJ1ppcCBzdHJlYW0gZm9yIHVwbG9hZCBoYXMgZW5kZWQuJyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emlwLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///59274\n")},54615:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Context = void 0;\nconst fs_1 = __webpack_require__(79896);\nconst os_1 = __webpack_require__(70857);\nclass Context {\n /**\n * Hydrate the context from the environment\n */\n constructor() {\n var _a, _b, _c;\n this.payload = {};\n if (process.env.GITHUB_EVENT_PATH) {\n if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) {\n this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));\n }\n else {\n const path = process.env.GITHUB_EVENT_PATH;\n process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);\n }\n }\n this.eventName = process.env.GITHUB_EVENT_NAME;\n this.sha = process.env.GITHUB_SHA;\n this.ref = process.env.GITHUB_REF;\n this.workflow = process.env.GITHUB_WORKFLOW;\n this.action = process.env.GITHUB_ACTION;\n this.actor = process.env.GITHUB_ACTOR;\n this.job = process.env.GITHUB_JOB;\n this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);\n this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);\n this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;\n this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`;\n this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`;\n }\n get issue() {\n const payload = this.payload;\n return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });\n }\n get repo() {\n if (process.env.GITHUB_REPOSITORY) {\n const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');\n return { owner, repo };\n }\n if (this.payload.repository) {\n return {\n owner: this.payload.repository.owner.login,\n repo: this.payload.repository.name\n };\n }\n throw new Error(\"context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'\");\n }\n}\nexports.Context = Context;\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ2MTUuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZUFBZTtBQUNmLGFBQWEsbUJBQU8sQ0FBQyxLQUFJO0FBQ3pCLGFBQWEsbUJBQU8sQ0FBQyxLQUFJO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZGQUE2RixrQkFBa0I7QUFDL0c7QUFDQTtBQUNBO0FBQ0EsMERBQTBELE1BQU0sZ0JBQWdCLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxnQkFBZ0IsbUVBQW1FO0FBQ2hJO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi9jb250ZXh0LmpzPzk4ZWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBmc18xID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgb3NfMSA9IHJlcXVpcmUoXCJvc1wiKTtcbmNsYXNzIENvbnRleHQge1xuICAgIC8qKlxuICAgICAqIEh5ZHJhdGUgdGhlIGNvbnRleHQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgpIHtcbiAgICAgICAgICAgIGlmIChmc18xLmV4aXN0c1N5bmMocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gSlNPTi5wYXJzZShmc18xLnJlYWRGaWxlU3luYyhwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSDtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgR0lUSFVCX0VWRU5UX1BBVEggJHtwYXRofSBkb2VzIG5vdCBleGlzdCR7b3NfMS5FT0x9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudE5hbWUgPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfTkFNRTtcbiAgICAgICAgdGhpcy5zaGEgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0hBO1xuICAgICAgICB0aGlzLnJlZiA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRUY7XG4gICAgICAgIHRoaXMud29ya2Zsb3cgPSBwcm9jZXNzLmVudi5HSVRIVUJfV09SS0ZMT1c7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FDVElPTjtcbiAgICAgICAgdGhpcy5hY3RvciA9IHByb2Nlc3MuZW52LkdJVEhVQl9BQ1RPUjtcbiAgICAgICAgdGhpcy5qb2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfSk9CO1xuICAgICAgICB0aGlzLnJ1bk51bWJlciA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9SVU5fTlVNQkVSLCAxMCk7XG4gICAgICAgIHRoaXMucnVuSWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5HSVRIVUJfUlVOX0lELCAxMCk7XG4gICAgICAgIHRoaXMuYXBpVXJsID0gKF9hID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FQSV9VUkwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGBodHRwczovL2FwaS5naXRodWIuY29tYDtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSAoX2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0VSVkVSX1VSTCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYGh0dHBzOi8vZ2l0aHViLmNvbWA7XG4gICAgICAgIHRoaXMuZ3JhcGhxbFVybCA9IChfYyA9IHByb2Nlc3MuZW52LkdJVEhVQl9HUkFQSFFMX1VSTCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vZ3JhcGhxbGA7XG4gICAgfVxuICAgIGdldCBpc3N1ZSgpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yZXBvKSwgeyBudW1iZXI6IChwYXlsb2FkLmlzc3VlIHx8IHBheWxvYWQucHVsbF9yZXF1ZXN0IHx8IHBheWxvYWQpLm51bWJlciB9KTtcbiAgICB9XG4gICAgZ2V0IHJlcG8oKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWSkge1xuICAgICAgICAgICAgY29uc3QgW293bmVyLCByZXBvXSA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRVBPU0lUT1JZLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICByZXR1cm4geyBvd25lciwgcmVwbyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBheWxvYWQucmVwb3NpdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvd25lcjogdGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkub3duZXIubG9naW4sXG4gICAgICAgICAgICAgICAgcmVwbzogdGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkubmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb250ZXh0LnJlcG8gcmVxdWlyZXMgYSBHSVRIVUJfUkVQT1NJVE9SWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBsaWtlICdvd25lci9yZXBvJ1wiKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbnRleHQgPSBDb250ZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///54615\n")},66377:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getOctokit = exports.context = void 0;\nconst Context = __importStar(__webpack_require__(54615));\nconst utils_1 = __webpack_require__(15133);\nexports.context = new Context.Context();\n/**\n * Returns a hydrated octokit ready to use for GitHub Actions\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokit(token, options, ...additionalPlugins) {\n const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);\n return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options));\n}\nexports.getOctokit = getOctokit;\n//# sourceMappingURL=github.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYzNzcuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0EsbUNBQW1DLG9DQUFvQyxnQkFBZ0I7QUFDdkYsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxrQkFBa0IsR0FBRyxlQUFlO0FBQ3BDLDZCQUE2QixtQkFBTyxDQUFDLEtBQVc7QUFDaEQsZ0JBQWdCLG1CQUFPLENBQUMsS0FBUztBQUNqQyxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2dpdGh1Yi5qcz9mNDRjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0T2N0b2tpdCA9IGV4cG9ydHMuY29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IENvbnRleHQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vY29udGV4dFwiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5leHBvcnRzLmNvbnRleHQgPSBuZXcgQ29udGV4dC5Db250ZXh0KCk7XG4vKipcbiAqIFJldHVybnMgYSBoeWRyYXRlZCBvY3Rva2l0IHJlYWR5IHRvIHVzZSBmb3IgR2l0SHViIEFjdGlvbnNcbiAqXG4gKiBAcGFyYW0gICAgIHRva2VuICAgIHRoZSByZXBvIFBBVCBvciBHSVRIVUJfVE9LRU5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgb3RoZXIgb3B0aW9ucyB0byBzZXRcbiAqL1xuZnVuY3Rpb24gZ2V0T2N0b2tpdCh0b2tlbiwgb3B0aW9ucywgLi4uYWRkaXRpb25hbFBsdWdpbnMpIHtcbiAgICBjb25zdCBHaXRIdWJXaXRoUGx1Z2lucyA9IHV0aWxzXzEuR2l0SHViLnBsdWdpbiguLi5hZGRpdGlvbmFsUGx1Z2lucyk7XG4gICAgcmV0dXJuIG5ldyBHaXRIdWJXaXRoUGx1Z2lucyh1dGlsc18xLmdldE9jdG9raXRPcHRpb25zKHRva2VuLCBvcHRpb25zKSk7XG59XG5leHBvcnRzLmdldE9jdG9raXQgPSBnZXRPY3Rva2l0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0aHViLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///66377\n')},82853:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0;\nconst httpClient = __importStar(__webpack_require__(40677));\nfunction getAuthString(token, options) {\n if (!token && !options.auth) {\n throw new Error('Parameter token or opts.auth is required');\n }\n else if (token && options.auth) {\n throw new Error('Parameters token and opts.auth may not both be specified');\n }\n return typeof options.auth === 'string' ? options.auth : `token ${token}`;\n}\nexports.getAuthString = getAuthString;\nfunction getProxyAgent(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgent(destinationUrl);\n}\nexports.getProxyAgent = getProxyAgent;\nfunction getApiBaseUrl() {\n return process.env['GITHUB_API_URL'] || 'https://api.github.com';\n}\nexports.getApiBaseUrl = getApiBaseUrl;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODI4NTMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0EsbUNBQW1DLG9DQUFvQyxnQkFBZ0I7QUFDdkYsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxxQkFBcUIsR0FBRyxxQkFBcUIsR0FBRyxxQkFBcUI7QUFDckUsZ0NBQWdDLG1CQUFPLENBQUMsS0FBc0I7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0UsTUFBTTtBQUM1RTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2ludGVybmFsL3V0aWxzLmpzPzU5NmUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRBcGlCYXNlVXJsID0gZXhwb3J0cy5nZXRQcm94eUFnZW50ID0gZXhwb3J0cy5nZXRBdXRoU3RyaW5nID0gdm9pZCAwO1xuY29uc3QgaHR0cENsaWVudCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIikpO1xuZnVuY3Rpb24gZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGlmICghdG9rZW4gJiYgIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB0b2tlbiBvciBvcHRzLmF1dGggaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4gJiYgb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVycyB0b2tlbiBhbmQgb3B0cy5hdXRoIG1heSBub3QgYm90aCBiZSBzcGVjaWZpZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zLmF1dGggPT09ICdzdHJpbmcnID8gb3B0aW9ucy5hdXRoIDogYHRva2VuICR7dG9rZW59YDtcbn1cbmV4cG9ydHMuZ2V0QXV0aFN0cmluZyA9IGdldEF1dGhTdHJpbmc7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50KGRlc3RpbmF0aW9uVXJsKSB7XG4gICAgY29uc3QgaGMgPSBuZXcgaHR0cENsaWVudC5IdHRwQ2xpZW50KCk7XG4gICAgcmV0dXJuIGhjLmdldEFnZW50KGRlc3RpbmF0aW9uVXJsKTtcbn1cbmV4cG9ydHMuZ2V0UHJveHlBZ2VudCA9IGdldFByb3h5QWdlbnQ7XG5mdW5jdGlvbiBnZXRBcGlCYXNlVXJsKCkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudlsnR0lUSFVCX0FQSV9VUkwnXSB8fCAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbSc7XG59XG5leHBvcnRzLmdldEFwaUJhc2VVcmwgPSBnZXRBcGlCYXNlVXJsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///82853\n")},15133:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;\nconst Context = __importStar(__webpack_require__(54615));\nconst Utils = __importStar(__webpack_require__(82853));\n// octokit + plugins\nconst core_1 = __webpack_require__(36082);\nconst plugin_rest_endpoint_methods_1 = __webpack_require__(66802);\nconst plugin_paginate_rest_1 = __webpack_require__(21665);\nexports.context = new Context.Context();\nconst baseUrl = Utils.getApiBaseUrl();\nexports.defaults = {\n baseUrl,\n request: {\n agent: Utils.getProxyAgent(baseUrl)\n }\n};\nexports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);\n/**\n * Convience function to correctly format Octokit Options to pass into the constructor.\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokitOptions(token, options) {\n const opts = Object.assign({}, options || {}); // Shallow clone - don\'t mutate the object provided by the caller\n // Auth\n const auth = Utils.getAuthString(token, opts);\n if (auth) {\n opts.auth = auth;\n }\n return opts;\n}\nexports.getOctokitOptions = getOctokitOptions;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUxMzMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0EsbUNBQW1DLG9DQUFvQyxnQkFBZ0I7QUFDdkYsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCx5QkFBeUIsR0FBRyxjQUFjLEdBQUcsZ0JBQWdCLEdBQUcsZUFBZTtBQUMvRSw2QkFBNkIsbUJBQU8sQ0FBQyxLQUFXO0FBQ2hELDJCQUEyQixtQkFBTyxDQUFDLEtBQWtCO0FBQ3JEO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLEtBQWU7QUFDdEMsdUNBQXVDLG1CQUFPLENBQUMsS0FBdUM7QUFDdEYsK0JBQStCLG1CQUFPLENBQUMsS0FBK0I7QUFDdEUsZUFBZTtBQUNmO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZUFBZSxHQUFHO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi91dGlscy5qcz9mYmNlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0T2N0b2tpdE9wdGlvbnMgPSBleHBvcnRzLkdpdEh1YiA9IGV4cG9ydHMuZGVmYXVsdHMgPSBleHBvcnRzLmNvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBDb250ZXh0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbnRleHRcIikpO1xuY29uc3QgVXRpbHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vaW50ZXJuYWwvdXRpbHNcIikpO1xuLy8gb2N0b2tpdCArIHBsdWdpbnNcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9jb3JlXCIpO1xuY29uc3QgcGx1Z2luX3Jlc3RfZW5kcG9pbnRfbWV0aG9kc18xID0gcmVxdWlyZShcIkBvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHNcIik7XG5jb25zdCBwbHVnaW5fcGFnaW5hdGVfcmVzdF8xID0gcmVxdWlyZShcIkBvY3Rva2l0L3BsdWdpbi1wYWdpbmF0ZS1yZXN0XCIpO1xuZXhwb3J0cy5jb250ZXh0ID0gbmV3IENvbnRleHQuQ29udGV4dCgpO1xuY29uc3QgYmFzZVVybCA9IFV0aWxzLmdldEFwaUJhc2VVcmwoKTtcbmV4cG9ydHMuZGVmYXVsdHMgPSB7XG4gICAgYmFzZVVybCxcbiAgICByZXF1ZXN0OiB7XG4gICAgICAgIGFnZW50OiBVdGlscy5nZXRQcm94eUFnZW50KGJhc2VVcmwpXG4gICAgfVxufTtcbmV4cG9ydHMuR2l0SHViID0gY29yZV8xLk9jdG9raXQucGx1Z2luKHBsdWdpbl9yZXN0X2VuZHBvaW50X21ldGhvZHNfMS5yZXN0RW5kcG9pbnRNZXRob2RzLCBwbHVnaW5fcGFnaW5hdGVfcmVzdF8xLnBhZ2luYXRlUmVzdCkuZGVmYXVsdHMoZXhwb3J0cy5kZWZhdWx0cyk7XG4vKipcbiAqIENvbnZpZW5jZSBmdW5jdGlvbiB0byBjb3JyZWN0bHkgZm9ybWF0IE9jdG9raXQgT3B0aW9ucyB0byBwYXNzIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSAgICAgdG9rZW4gICAgdGhlIHJlcG8gUEFUIG9yIEdJVEhVQl9UT0tFTlxuICogQHBhcmFtICAgICBvcHRpb25zICBvdGhlciBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBnZXRPY3Rva2l0T3B0aW9ucyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zIHx8IHt9KTsgLy8gU2hhbGxvdyBjbG9uZSAtIGRvbid0IG11dGF0ZSB0aGUgb2JqZWN0IHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXJcbiAgICAvLyBBdXRoXG4gICAgY29uc3QgYXV0aCA9IFV0aWxzLmdldEF1dGhTdHJpbmcodG9rZW4sIG9wdHMpO1xuICAgIGlmIChhdXRoKSB7XG4gICAgICAgIG9wdHMuYXV0aCA9IGF1dGg7XG4gICAgfVxuICAgIHJldHVybiBvcHRzO1xufVxuZXhwb3J0cy5nZXRPY3Rva2l0T3B0aW9ucyA9IGdldE9jdG9raXRPcHRpb25zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///15133\n')},36082:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n Octokit: () => (/* binding */ Octokit)\n});\n\n// EXTERNAL MODULE: ./node_modules/universal-user-agent/dist-web/index.js\nvar dist_web = __webpack_require__(56916);\n// EXTERNAL MODULE: ./node_modules/before-after-hook/index.js\nvar before_after_hook = __webpack_require__(80811);\n;// CONCATENATED MODULE: ./node_modules/is-plain-object/dist/is-plain-object.mjs\n/*!\n * is-plain-object \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === \'[object Object]\';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty(\'isPrototypeOf\') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/endpoint/dist-web/index.js\n\n\n\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if (isPlainObject(options[key])) {\n if (!(key in defaults))\n Object.assign(result, { [key]: options[key] });\n else\n result[key] = mergeDeep(defaults[key], options[key]);\n }\n else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === undefined) {\n delete obj[key];\n }\n }\n return obj;\n}\n\nfunction merge(defaults, route, options) {\n if (typeof route === "string") {\n let [method, url] = route.split(" ");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n }\n else {\n options = Object.assign({}, route);\n }\n // lowercase header names before merging with defaults to avoid duplicates\n options.headers = lowercaseKeys(options.headers);\n // remove properties with undefined values before merging\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n // mediaType.previews arrays are merged, instead of overwritten\n if (defaults && defaults.mediaType.previews.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews\n .filter((preview) => !mergedOptions.mediaType.previews.includes(preview))\n .concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, ""));\n return mergedOptions;\n}\n\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? "&" : "?";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return (url +\n separator +\n names\n .map((name) => {\n if (name === "q") {\n return ("q=" + parameters.q.split("+").map(encodeURIComponent).join("+"));\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n })\n .join("&"));\n}\n\nconst urlVariableRegex = /\\{[^}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/^\\W+|\\W+$/g, "").split(/,/);\n}\nfunction extractUrlVariableNames(url) {\n const matches = url.match(urlVariableRegex);\n if (!matches) {\n return [];\n }\n return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n\nfunction omit(object, keysToOmit) {\n return Object.keys(object)\n .filter((option) => !keysToOmit.includes(option))\n .reduce((obj, key) => {\n obj[key] = object[key];\n return obj;\n }, {});\n}\n\n// Based on https://github.com/bramstein/url-template, licensed under BSD\n// TODO: create separate package.\n//\n// Copyright (c) 2012-2014, Bram Stein\n// All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n// 1. Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// 3. The name of the author may not be used to endorse or promote products\n// derived from this software without specific prior written permission.\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n/* istanbul ignore file */\nfunction encodeReserved(str) {\n return str\n .split(/(%[0-9A-Fa-f]{2})/g)\n .map(function (part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");\n }\n return part;\n })\n .join("");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!\'()*]/g, function (c) {\n return "%" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value =\n operator === "+" || operator === "#"\n ? encodeReserved(value)\n : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + "=" + value;\n }\n else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== undefined && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === ";" || operator === "&" || operator === "?";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== "") {\n if (typeof value === "string" ||\n typeof value === "number" ||\n typeof value === "boolean") {\n value = value.toString();\n if (modifier && modifier !== "*") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));\n }\n else {\n if (modifier === "*") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function (value) {\n result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));\n });\n }\n else {\n Object.keys(value).forEach(function (k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n }\n else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function (value) {\n tmp.push(encodeValue(operator, value));\n });\n }\n else {\n Object.keys(value).forEach(function (k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + "=" + tmp.join(","));\n }\n else if (tmp.length !== 0) {\n result.push(tmp.join(","));\n }\n }\n }\n }\n else {\n if (operator === ";") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n }\n else if (value === "" && (operator === "&" || operator === "?")) {\n result.push(encodeUnreserved(key) + "=");\n }\n else if (value === "") {\n result.push("");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template),\n };\n}\nfunction expand(template, context) {\n var operators = ["+", "#", ".", "/", ";", "?", "&"];\n return template.replace(/\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g, function (_, expression, literal) {\n if (expression) {\n let operator = "";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function (variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== "+") {\n var separator = ",";\n if (operator === "?") {\n separator = "&";\n }\n else if (operator !== "#") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : "") + values.join(separator);\n }\n else {\n return values.join(",");\n }\n }\n else {\n return encodeReserved(literal);\n }\n });\n}\n\nfunction parse(options) {\n // https://fetch.spec.whatwg.org/#methods\n let method = options.method.toUpperCase();\n // replace :varname with {varname} to make it RFC 6570 compatible\n let url = (options.url || "/").replace(/:([a-z]\\w+)/g, "{$1}");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n "method",\n "baseUrl",\n "url",\n "headers",\n "request",\n "mediaType",\n ]);\n // extract variable names from URL to calculate remaining variables later\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options)\n .filter((option) => urlVariableNames.includes(option))\n .concat("baseUrl");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw\n headers.accept = headers.accept\n .split(/,/)\n .map((preview) => preview.replace(/application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`))\n .join(",");\n }\n if (options.mediaType.previews.length) {\n const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n headers.accept = previewsFromAcceptHeader\n .concat(options.mediaType.previews)\n .map((preview) => {\n const format = options.mediaType.format\n ? `.${options.mediaType.format}`\n : "+json";\n return `application/vnd.github.${preview}-preview${format}`;\n })\n .join(",");\n }\n }\n // for GET/HEAD requests, set URL query parameters from remaining parameters\n // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters\n if (["GET", "HEAD"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n }\n else {\n if ("data" in remainingParameters) {\n body = remainingParameters.data;\n }\n else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n else {\n headers["content-length"] = 0;\n }\n }\n }\n // default content-type for JSON if body is set\n if (!headers["content-type"] && typeof body !== "undefined") {\n headers["content-type"] = "application/json; charset=utf-8";\n }\n // GitHub expects \'content-length: 0\' header for PUT/PATCH requests without body.\n // fetch does not allow to set `content-length` header, but we can set body to an empty string\n if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {\n body = "";\n }\n // Only return body/request keys if present\n return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null);\n}\n\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS = merge(oldDefaults, newDefaults);\n const endpoint = endpointWithDefaults.bind(null, DEFAULTS);\n return Object.assign(endpoint, {\n DEFAULTS,\n defaults: withDefaults.bind(null, DEFAULTS),\n merge: merge.bind(null, DEFAULTS),\n parse,\n });\n}\n\nconst VERSION = "6.0.12";\n\nconst userAgent = `octokit-endpoint.js/${VERSION} ${(0,dist_web/* getUserAgent */.$)()}`;\n// DEFAULTS has all properties set that EndpointOptions has, except url.\n// So we use RequestParameters and add method as additional required property.\nconst DEFAULTS = {\n method: "GET",\n baseUrl: "https://api.github.com",\n headers: {\n accept: "application/vnd.github.v3+json",\n "user-agent": userAgent,\n },\n mediaType: {\n format: "",\n previews: [],\n },\n};\n\nconst endpoint = withDefaults(null, DEFAULTS);\n\n\n//# sourceMappingURL=index.js.map\n\n// EXTERNAL MODULE: ./node_modules/node-fetch/lib/index.mjs\nvar lib = __webpack_require__(78540);\n// EXTERNAL MODULE: ./node_modules/deprecation/dist-web/index.js\nvar deprecation_dist_web = __webpack_require__(62185);\n// EXTERNAL MODULE: ./node_modules/once/once.js\nvar once = __webpack_require__(83519);\nvar once_default = /*#__PURE__*/__webpack_require__.n(once);\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-web/index.js\n\n\n\nconst logOnceCode = once_default()((deprecation) => console.warn(deprecation));\nconst logOnceHeaders = once_default()((deprecation) => console.warn(deprecation));\n/**\n * Error with extra properties to help with debugging\n */\nclass RequestError extends Error {\n constructor(message, statusCode, options) {\n super(message);\n // Maintains proper stack trace (only available on V8)\n /* istanbul ignore next */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n this.name = "HttpError";\n this.status = statusCode;\n let headers;\n if ("headers" in options && typeof options.headers !== "undefined") {\n headers = options.headers;\n }\n if ("response" in options) {\n this.response = options.response;\n headers = options.response.headers;\n }\n // redact request credentials without mutating original request options\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]"),\n });\n }\n requestCopy.url = requestCopy.url\n // client_id & client_secret can be passed as URL query parameters to increase rate limit\n // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications\n .replace(/\\bclient_secret=\\w+/g, "client_secret=[REDACTED]")\n // OAuth tokens can be passed as URL query parameters, although it is not recommended\n // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header\n .replace(/\\baccess_token=\\w+/g, "access_token=[REDACTED]");\n this.request = requestCopy;\n // deprecations\n Object.defineProperty(this, "code", {\n get() {\n logOnceCode(new deprecation_dist_web/* Deprecation */.J("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));\n return statusCode;\n },\n });\n Object.defineProperty(this, "headers", {\n get() {\n logOnceHeaders(new deprecation_dist_web/* Deprecation */.J("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`."));\n return headers || {};\n },\n });\n }\n}\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/request/dist-web/index.js\n\n\n\n\n\n\nconst dist_web_VERSION = "5.6.3";\n\nfunction getBufferResponse(response) {\n return response.arrayBuffer();\n}\n\nfunction fetchWrapper(requestOptions) {\n const log = requestOptions.request && requestOptions.request.log\n ? requestOptions.request.log\n : console;\n if (isPlainObject(requestOptions.body) ||\n Array.isArray(requestOptions.body)) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n let headers = {};\n let status;\n let url;\n const fetch = (requestOptions.request && requestOptions.request.fetch) || lib/* default */.Ay;\n return fetch(requestOptions.url, Object.assign({\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers,\n redirect: requestOptions.redirect,\n }, \n // `requestOptions.request.agent` type is incompatible\n // see https://github.com/octokit/types.ts/pull/264\n requestOptions.request))\n .then(async (response) => {\n url = response.url;\n status = response.status;\n for (const keyAndValue of response.headers) {\n headers[keyAndValue[0]] = keyAndValue[1];\n }\n if ("deprecation" in headers) {\n const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/);\n const deprecationLink = matches && matches.pop();\n log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`);\n }\n if (status === 204 || status === 205) {\n return;\n }\n // GitHub API returns 200 for HEAD requests\n if (requestOptions.method === "HEAD") {\n if (status < 400) {\n return;\n }\n throw new RequestError(response.statusText, status, {\n response: {\n url,\n status,\n headers,\n data: undefined,\n },\n request: requestOptions,\n });\n }\n if (status === 304) {\n throw new RequestError("Not modified", status, {\n response: {\n url,\n status,\n headers,\n data: await getResponseData(response),\n },\n request: requestOptions,\n });\n }\n if (status >= 400) {\n const data = await getResponseData(response);\n const error = new RequestError(toErrorMessage(data), status, {\n response: {\n url,\n status,\n headers,\n data,\n },\n request: requestOptions,\n });\n throw error;\n }\n return getResponseData(response);\n })\n .then((data) => {\n return {\n status,\n url,\n headers,\n data,\n };\n })\n .catch((error) => {\n if (error instanceof RequestError)\n throw error;\n throw new RequestError(error.message, 500, {\n request: requestOptions,\n });\n });\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get("content-type");\n if (/application\\/json/.test(contentType)) {\n return response.json();\n }\n if (!contentType || /^text\\/|charset=utf-8$/.test(contentType)) {\n return response.text();\n }\n return getBufferResponse(response);\n}\nfunction toErrorMessage(data) {\n if (typeof data === "string")\n return data;\n // istanbul ignore else - just in case\n if ("message" in data) {\n if (Array.isArray(data.errors)) {\n return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`;\n }\n return data.message;\n }\n // istanbul ignore next - just in case\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\nfunction dist_web_withDefaults(oldEndpoint, newDefaults) {\n const endpoint = oldEndpoint.defaults(newDefaults);\n const newApi = function (route, parameters) {\n const endpointOptions = endpoint.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint.parse(endpointOptions));\n }\n const request = (route, parameters) => {\n return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters)));\n };\n Object.assign(request, {\n endpoint,\n defaults: dist_web_withDefaults.bind(null, endpoint),\n });\n return endpointOptions.request.hook(request, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint,\n defaults: dist_web_withDefaults.bind(null, endpoint),\n });\n}\n\nconst request = dist_web_withDefaults(endpoint, {\n headers: {\n "user-agent": `octokit-request.js/${dist_web_VERSION} ${(0,dist_web/* getUserAgent */.$)()}`,\n },\n});\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/graphql/dist-web/index.js\n\n\n\nconst graphql_dist_web_VERSION = "4.8.0";\n\nfunction _buildMessageForResponseErrors(data) {\n return (`Request failed due to following response errors:\\n` +\n data.errors.map((e) => ` - ${e.message}`).join("\\n"));\n}\nclass GraphqlResponseError extends Error {\n constructor(request, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request;\n this.headers = headers;\n this.response = response;\n this.name = "GraphqlResponseError";\n // Expose the errors and response data in their shorthand properties.\n this.errors = response.errors;\n this.data = response.data;\n // Maintains proper stack trace (only available on V8)\n /* istanbul ignore next */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nconst NON_VARIABLE_OPTIONS = [\n "method",\n "baseUrl",\n "url",\n "headers",\n "request",\n "query",\n "mediaType",\n];\nconst FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"];\nconst GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request, query, options) {\n if (options) {\n if (typeof query === "string" && "query" in options) {\n return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`));\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key))\n continue;\n return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`));\n }\n }\n const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(parsedOptions).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix\n // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451\n const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");\n }\n return request(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(requestOptions, headers, response.data);\n }\n return response.data.data;\n });\n}\n\nfunction graphql_dist_web_withDefaults(request$1, newDefaults) {\n const newRequest = request$1.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: graphql_dist_web_withDefaults.bind(null, newRequest),\n endpoint: request.endpoint,\n });\n}\n\nconst graphql$1 = graphql_dist_web_withDefaults(request, {\n headers: {\n "user-agent": `octokit-graphql.js/${graphql_dist_web_VERSION} ${(0,dist_web/* getUserAgent */.$)()}`,\n },\n method: "POST",\n url: "/graphql",\n});\nfunction withCustomRequest(customRequest) {\n return graphql_dist_web_withDefaults(customRequest, {\n method: "POST",\n url: "/graphql",\n });\n}\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/auth-token/dist-web/index.js\nconst REGEX_IS_INSTALLATION_LEGACY = /^v1\\./;\nconst REGEX_IS_INSTALLATION = /^ghs_/;\nconst REGEX_IS_USER_TO_SERVER = /^ghu_/;\nasync function auth(token) {\n const isApp = token.split(/\\./).length === 3;\n const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) ||\n REGEX_IS_INSTALLATION.test(token);\n const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token);\n const tokenType = isApp\n ? "app"\n : isInstallation\n ? "installation"\n : isUserToServer\n ? "user-to-server"\n : "oauth";\n return {\n type: "token",\n token: token,\n tokenType,\n };\n}\n\n/**\n * Prefix token for usage in the Authorization header\n *\n * @param token OAuth token or JSON Web Token\n */\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(route, parameters);\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\nconst createTokenAuth = function createTokenAuth(token) {\n if (!token) {\n throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");\n }\n if (typeof token !== "string") {\n throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");\n }\n token = token.replace(/^(token|bearer) +/i, "");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token),\n });\n};\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@actions/artifact/node_modules/@octokit/core/dist-web/index.js\n\n\n\n\n\n\nconst core_dist_web_VERSION = "3.6.0";\n\nclass Octokit {\n constructor(options = {}) {\n const hook = new before_after_hook.Collection();\n const requestDefaults = {\n baseUrl: request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n // @ts-ignore internal usage only, no need to type\n hook: hook.bind(null, "request"),\n }),\n mediaType: {\n previews: [],\n format: "",\n },\n };\n // prepend default user agent with `options.userAgent` if set\n requestDefaults.headers["user-agent"] = [\n options.userAgent,\n `octokit-core.js/${core_dist_web_VERSION} ${(0,dist_web/* getUserAgent */.$)()}`,\n ]\n .filter(Boolean)\n .join(" ");\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n if (options.timeZone) {\n requestDefaults.headers["time-zone"] = options.timeZone;\n }\n this.request = request.defaults(requestDefaults);\n this.graphql = withCustomRequest(this.request).defaults(requestDefaults);\n this.log = Object.assign({\n debug: () => { },\n info: () => { },\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n }, options.log);\n this.hook = hook;\n // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance\n // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registered.\n // (2) If only `options.auth` is set, use the default token authentication strategy.\n // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance.\n // TODO: type `options.auth` based on `options.authStrategy`.\n if (!options.authStrategy) {\n if (!options.auth) {\n // (1)\n this.auth = async () => ({\n type: "unauthenticated",\n });\n }\n else {\n // (2)\n const auth = createTokenAuth(options.auth);\n // @ts-ignore ¯\\_(ツ)_/¯\n hook.wrap("request", auth.hook);\n this.auth = auth;\n }\n }\n else {\n const { authStrategy, ...otherOptions } = options;\n const auth = authStrategy(Object.assign({\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the "event-octokit" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions,\n }, options.auth));\n // @ts-ignore ¯\\_(ツ)_/¯\n hook.wrap("request", auth.hook);\n this.auth = auth;\n }\n // apply plugins\n // https://stackoverflow.com/a/16345172\n const classConstructor = this.constructor;\n classConstructor.plugins.forEach((plugin) => {\n Object.assign(this, plugin(this, options));\n });\n }\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n if (typeof defaults === "function") {\n super(defaults(options));\n return;\n }\n super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent\n ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`,\n }\n : null));\n }\n };\n return OctokitWithDefaults;\n }\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin(...newPlugins) {\n var _a;\n const currentPlugins = this.plugins;\n const NewOctokit = (_a = class extends this {\n },\n _a.plugins = currentPlugins.concat(newPlugins.filter((plugin) => !currentPlugins.includes(plugin))),\n _a);\n return NewOctokit;\n }\n}\nOctokit.VERSION = core_dist_web_VERSION;\nOctokit.plugins = [];\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBLHVCQUF1QixPQUFPO0FBQzlCLHVCQUF1QixpQkFBaUI7QUFDeEM7QUFDQSw0QkFBNEI7QUFDNUIsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0NBQWdDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0MsbUJBQW1CLEVBQUUsbUJBQW1CO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQU87QUFDekI7O0FBRW1CO0FBQ25CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmplY3QvZGlzdC9pcy1wbGFpbi1vYmplY3QubWpzP2NiMDciLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC13ZWIvaW5kZXguanM/Y2Q0NiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9yZXF1ZXN0L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9yZXF1ZXN0LWVycm9yL2Rpc3Qtd2ViL2luZGV4LmpzPzllODMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LXdlYi9pbmRleC5qcz9iODdhIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2dyYXBocWwvZGlzdC13ZWIvaW5kZXguanM/YzgyNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9hdXRoLXRva2VuL2Rpc3Qtd2ViL2luZGV4LmpzP2RhYjciLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQG9jdG9raXQvY29yZS9kaXN0LXdlYi9pbmRleC5qcz8wNDMzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogaXMtcGxhaW4tb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1wbGFpbi1vYmplY3Q+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmZ1bmN0aW9uIGlzT2JqZWN0KG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qobykge1xuICB2YXIgY3Rvcixwcm90O1xuXG4gIGlmIChpc09iamVjdChvKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiBoYXMgbW9kaWZpZWQgY29uc3RydWN0b3JcbiAgY3RvciA9IG8uY29uc3RydWN0b3I7XG4gIGlmIChjdG9yID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gIC8vIElmIGhhcyBtb2RpZmllZCBwcm90b3R5cGVcbiAgcHJvdCA9IGN0b3IucHJvdG90eXBlO1xuICBpZiAoaXNPYmplY3QocHJvdCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgY29uc3RydWN0b3IgZG9lcyBub3QgaGF2ZSBhbiBPYmplY3Qtc3BlY2lmaWMgbWV0aG9kXG4gIGlmIChwcm90Lmhhc093blByb3BlcnR5KCdpc1Byb3RvdHlwZU9mJykgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gTW9zdCBsaWtlbHkgYSBwbGFpbiBPYmplY3RcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB7IGlzUGxhaW5PYmplY3QgfTtcbiIsImltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdpcy1wbGFpbi1vYmplY3QnO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSAndW5pdmVyc2FsLXVzZXItYWdlbnQnO1xuXG5mdW5jdGlvbiBsb3dlcmNhc2VLZXlzKG9iamVjdCkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkucmVkdWNlKChuZXdPYmosIGtleSkgPT4ge1xuICAgICAgICBuZXdPYmpba2V5LnRvTG93ZXJDYXNlKCldID0gb2JqZWN0W2tleV07XG4gICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBtZXJnZURlZXAoZGVmYXVsdHMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyk7XG4gICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnNba2V5XSkpIHtcbiAgICAgICAgICAgIGlmICghKGtleSBpbiBkZWZhdWx0cykpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHsgW2tleV06IG9wdGlvbnNba2V5XSB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG1lcmdlRGVlcChkZWZhdWx0c1trZXldLCBvcHRpb25zW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHsgW2tleV06IG9wdGlvbnNba2V5XSB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob2JqKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gbWVyZ2UoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiByb3V0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBsZXQgW21ldGhvZCwgdXJsXSA9IHJvdXRlLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24odXJsID8geyBtZXRob2QsIHVybCB9IDogeyB1cmw6IG1ldGhvZCB9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCByb3V0ZSk7XG4gICAgfVxuICAgIC8vIGxvd2VyY2FzZSBoZWFkZXIgbmFtZXMgYmVmb3JlIG1lcmdpbmcgd2l0aCBkZWZhdWx0cyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgb3B0aW9ucy5oZWFkZXJzID0gbG93ZXJjYXNlS2V5cyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIC8vIHJlbW92ZSBwcm9wZXJ0aWVzIHdpdGggdW5kZWZpbmVkIHZhbHVlcyBiZWZvcmUgbWVyZ2luZ1xuICAgIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob3B0aW9ucyk7XG4gICAgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSBtZXJnZURlZXAoZGVmYXVsdHMgfHwge30sIG9wdGlvbnMpO1xuICAgIC8vIG1lZGlhVHlwZS5wcmV2aWV3cyBhcnJheXMgYXJlIG1lcmdlZCwgaW5zdGVhZCBvZiBvdmVyd3JpdHRlblxuICAgIGlmIChkZWZhdWx0cyAmJiBkZWZhdWx0cy5tZWRpYVR5cGUucHJldmlld3MubGVuZ3RoKSB7XG4gICAgICAgIG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzID0gZGVmYXVsdHMubWVkaWFUeXBlLnByZXZpZXdzXG4gICAgICAgICAgICAuZmlsdGVyKChwcmV2aWV3KSA9PiAhbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MuaW5jbHVkZXMocHJldmlldykpXG4gICAgICAgICAgICAuY29uY2F0KG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzKTtcbiAgICB9XG4gICAgbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgPSBtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cy5tYXAoKHByZXZpZXcpID0+IHByZXZpZXcucmVwbGFjZSgvLXByZXZpZXcvLCBcIlwiKSk7XG4gICAgcmV0dXJuIG1lcmdlZE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGFkZFF1ZXJ5UGFyYW1ldGVycyh1cmwsIHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSAvXFw/Ly50ZXN0KHVybCkgPyBcIiZcIiA6IFwiP1wiO1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMocGFyYW1ldGVycyk7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICByZXR1cm4gKHVybCArXG4gICAgICAgIHNlcGFyYXRvciArXG4gICAgICAgIG5hbWVzXG4gICAgICAgICAgICAubWFwKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gXCJxXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFwicT1cIiArIHBhcmFtZXRlcnMucS5zcGxpdChcIitcIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIitcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGAke25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnNbbmFtZV0pfWA7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiZcIikpO1xufVxuXG5jb25zdCB1cmxWYXJpYWJsZVJlZ2V4ID0gL1xce1tefV0rXFx9L2c7XG5mdW5jdGlvbiByZW1vdmVOb25DaGFycyh2YXJpYWJsZU5hbWUpIHtcbiAgICByZXR1cm4gdmFyaWFibGVOYW1lLnJlcGxhY2UoL15cXFcrfFxcVyskL2csIFwiXCIpLnNwbGl0KC8sLyk7XG59XG5mdW5jdGlvbiBleHRyYWN0VXJsVmFyaWFibGVOYW1lcyh1cmwpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gdXJsLm1hdGNoKHVybFZhcmlhYmxlUmVnZXgpO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzLm1hcChyZW1vdmVOb25DaGFycykucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xufVxuXG5mdW5jdGlvbiBvbWl0KG9iamVjdCwga2V5c1RvT21pdCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gIWtleXNUb09taXQuaW5jbHVkZXMob3B0aW9uKSlcbiAgICAgICAgLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcbiAgICAgICAgb2JqW2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG59XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9icmFtc3RlaW4vdXJsLXRlbXBsYXRlLCBsaWNlbnNlZCB1bmRlciBCU0Rcbi8vIFRPRE86IGNyZWF0ZSBzZXBhcmF0ZSBwYWNrYWdlLlxuLy9cbi8vIENvcHlyaWdodCAoYykgMjAxMi0yMDE0LCBCcmFtIFN0ZWluXG4vLyBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbi8vIGFyZSBtZXQ6XG4vLyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4vLyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4vLyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbi8vICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHNcbi8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRURcbi8vIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOT1xuLy8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULFxuLy8gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXG4vLyBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWVxuLy8gT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbi8vIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcbi8vIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuZnVuY3Rpb24gZW5jb2RlUmVzZXJ2ZWQoc3RyKSB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAuc3BsaXQoLyglWzAtOUEtRmEtZl17Mn0pL2cpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHBhcnQpIHtcbiAgICAgICAgaWYgKCEvJVswLTlBLUZhLWZdLy50ZXN0KHBhcnQpKSB7XG4gICAgICAgICAgICBwYXJ0ID0gZW5jb2RlVVJJKHBhcnQpLnJlcGxhY2UoLyU1Qi9nLCBcIltcIikucmVwbGFjZSgvJTVEL2csIFwiXVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydDtcbiAgICB9KVxuICAgICAgICAuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIGVuY29kZVVucmVzZXJ2ZWQoc3RyKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIFwiJVwiICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlLCBrZXkpIHtcbiAgICB2YWx1ZSA9XG4gICAgICAgIG9wZXJhdG9yID09PSBcIitcIiB8fCBvcGVyYXRvciA9PT0gXCIjXCJcbiAgICAgICAgICAgID8gZW5jb2RlUmVzZXJ2ZWQodmFsdWUpXG4gICAgICAgICAgICA6IGVuY29kZVVucmVzZXJ2ZWQodmFsdWUpO1xuICAgIGlmIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVVucmVzZXJ2ZWQoa2V5KSArIFwiPVwiICsgdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiBpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSB7XG4gICAgcmV0dXJuIG9wZXJhdG9yID09PSBcIjtcIiB8fCBvcGVyYXRvciA9PT0gXCImXCIgfHwgb3BlcmF0b3IgPT09IFwiP1wiO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWVzKGNvbnRleHQsIG9wZXJhdG9yLCBrZXksIG1vZGlmaWVyKSB7XG4gICAgdmFyIHZhbHVlID0gY29udGV4dFtrZXldLCByZXN1bHQgPSBbXTtcbiAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSAmJiB2YWx1ZSAhPT0gXCJcIikge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChtb2RpZmllciAmJiBtb2RpZmllciAhPT0gXCIqXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBwYXJzZUludChtb2RpZmllciwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSwgaXNLZXlPcGVyYXRvcihvcGVyYXRvcikgPyBrZXkgOiBcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobW9kaWZpZXIgPT09IFwiKlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmZpbHRlcihpc0RlZmluZWQpLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlW2tdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZVtrXSwgaykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXAgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZmlsdGVyKGlzRGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlW2tdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoaykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZVtrXS50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNLZXlPcGVyYXRvcihvcGVyYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVW5yZXNlcnZlZChrZXkpICsgXCI9XCIgKyB0bXAuam9pbihcIixcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0bXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRtcC5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAob3BlcmF0b3IgPT09IFwiO1wiKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IFwiXCIgJiYgKG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCIpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFwiXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZVVybCh0ZW1wbGF0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGV4cGFuZDogZXhwYW5kLmJpbmQobnVsbCwgdGVtcGxhdGUpLFxuICAgIH07XG59XG5mdW5jdGlvbiBleHBhbmQodGVtcGxhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgb3BlcmF0b3JzID0gW1wiK1wiLCBcIiNcIiwgXCIuXCIsIFwiL1wiLCBcIjtcIiwgXCI/XCIsIFwiJlwiXTtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXFx7KFteXFx7XFx9XSspXFx9fChbXlxce1xcfV0rKS9nLCBmdW5jdGlvbiAoXywgZXhwcmVzc2lvbiwgbGl0ZXJhbCkge1xuICAgICAgICBpZiAoZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgbGV0IG9wZXJhdG9yID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgaWYgKG9wZXJhdG9ycy5pbmRleE9mKGV4cHJlc3Npb24uY2hhckF0KDApKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRvciA9IGV4cHJlc3Npb24uY2hhckF0KDApO1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cigxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4cHJlc3Npb24uc3BsaXQoLywvZykuZm9yRWFjaChmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG1wID0gLyhbXjpcXCpdKikoPzo6KFxcZCspfChcXCopKT8vLmV4ZWModmFyaWFibGUpO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKGdldFZhbHVlcyhjb250ZXh0LCBvcGVyYXRvciwgdG1wWzFdLCB0bXBbMl0gfHwgdG1wWzNdKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChvcGVyYXRvciAmJiBvcGVyYXRvciAhPT0gXCIrXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gXCIsXCI7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yID09PSBcIj9cIikge1xuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBcIiZcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3BlcmF0b3IgIT09IFwiI1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlcy5sZW5ndGggIT09IDAgPyBvcGVyYXRvciA6IFwiXCIpICsgdmFsdWVzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuam9pbihcIixcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlUmVzZXJ2ZWQobGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2Uob3B0aW9ucykge1xuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNtZXRob2RzXG4gICAgbGV0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgLy8gcmVwbGFjZSA6dmFybmFtZSB3aXRoIHt2YXJuYW1lfSB0byBtYWtlIGl0IFJGQyA2NTcwIGNvbXBhdGlibGVcbiAgICBsZXQgdXJsID0gKG9wdGlvbnMudXJsIHx8IFwiL1wiKS5yZXBsYWNlKC86KFthLXpdXFx3KykvZywgXCJ7JDF9XCIpO1xuICAgIGxldCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5oZWFkZXJzKTtcbiAgICBsZXQgYm9keTtcbiAgICBsZXQgcGFyYW1ldGVycyA9IG9taXQob3B0aW9ucywgW1xuICAgICAgICBcIm1ldGhvZFwiLFxuICAgICAgICBcImJhc2VVcmxcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJoZWFkZXJzXCIsXG4gICAgICAgIFwicmVxdWVzdFwiLFxuICAgICAgICBcIm1lZGlhVHlwZVwiLFxuICAgIF0pO1xuICAgIC8vIGV4dHJhY3QgdmFyaWFibGUgbmFtZXMgZnJvbSBVUkwgdG8gY2FsY3VsYXRlIHJlbWFpbmluZyB2YXJpYWJsZXMgbGF0ZXJcbiAgICBjb25zdCB1cmxWYXJpYWJsZU5hbWVzID0gZXh0cmFjdFVybFZhcmlhYmxlTmFtZXModXJsKTtcbiAgICB1cmwgPSBwYXJzZVVybCh1cmwpLmV4cGFuZChwYXJhbWV0ZXJzKTtcbiAgICBpZiAoIS9eaHR0cC8udGVzdCh1cmwpKSB7XG4gICAgICAgIHVybCA9IG9wdGlvbnMuYmFzZVVybCArIHVybDtcbiAgICB9XG4gICAgY29uc3Qgb21pdHRlZFBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvcHRpb25zKVxuICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IHVybFZhcmlhYmxlTmFtZXMuaW5jbHVkZXMob3B0aW9uKSlcbiAgICAgICAgLmNvbmNhdChcImJhc2VVcmxcIik7XG4gICAgY29uc3QgcmVtYWluaW5nUGFyYW1ldGVycyA9IG9taXQocGFyYW1ldGVycywgb21pdHRlZFBhcmFtZXRlcnMpO1xuICAgIGNvbnN0IGlzQmluYXJ5UmVxdWVzdCA9IC9hcHBsaWNhdGlvblxcL29jdGV0LXN0cmVhbS9pLnRlc3QoaGVhZGVycy5hY2NlcHQpO1xuICAgIGlmICghaXNCaW5hcnlSZXF1ZXN0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXQpIHtcbiAgICAgICAgICAgIC8vIGUuZy4gYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uID0+IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMucmF3XG4gICAgICAgICAgICBoZWFkZXJzLmFjY2VwdCA9IGhlYWRlcnMuYWNjZXB0XG4gICAgICAgICAgICAgICAgLnNwbGl0KC8sLylcbiAgICAgICAgICAgICAgICAubWFwKChwcmV2aWV3KSA9PiBwcmV2aWV3LnJlcGxhY2UoL2FwcGxpY2F0aW9uXFwvdm5kKFxcLlxcdyspKFxcLnYzKT8oXFwuXFx3Kyk/KFxcK2pzb24pPyQvLCBgYXBwbGljYXRpb24vdm5kJDEkMi4ke29wdGlvbnMubWVkaWFUeXBlLmZvcm1hdH1gKSlcbiAgICAgICAgICAgICAgICAuam9pbihcIixcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcHJldmlld3NGcm9tQWNjZXB0SGVhZGVyID0gaGVhZGVycy5hY2NlcHQubWF0Y2goL1tcXHctXSsoPz0tcHJldmlldykvZykgfHwgW107XG4gICAgICAgICAgICBoZWFkZXJzLmFjY2VwdCA9IHByZXZpZXdzRnJvbUFjY2VwdEhlYWRlclxuICAgICAgICAgICAgICAgIC5jb25jYXQob3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MpXG4gICAgICAgICAgICAgICAgLm1hcCgocHJldmlldykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMubWVkaWFUeXBlLmZvcm1hdFxuICAgICAgICAgICAgICAgICAgICA/IGAuJHtvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXR9YFxuICAgICAgICAgICAgICAgICAgICA6IFwiK2pzb25cIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gYGFwcGxpY2F0aW9uL3ZuZC5naXRodWIuJHtwcmV2aWV3fS1wcmV2aWV3JHtmb3JtYXR9YDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGZvciBHRVQvSEVBRCByZXF1ZXN0cywgc2V0IFVSTCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gcmVtYWluaW5nIHBhcmFtZXRlcnNcbiAgICAvLyBmb3IgUEFUQ0gvUE9TVC9QVVQvREVMRVRFIHJlcXVlc3RzLCBzZXQgcmVxdWVzdCBib2R5IGZyb20gcmVtYWluaW5nIHBhcmFtZXRlcnNcbiAgICBpZiAoW1wiR0VUXCIsIFwiSEVBRFwiXS5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICAgIHVybCA9IGFkZFF1ZXJ5UGFyYW1ldGVycyh1cmwsIHJlbWFpbmluZ1BhcmFtZXRlcnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKFwiZGF0YVwiIGluIHJlbWFpbmluZ1BhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGJvZHkgPSByZW1haW5pbmdQYXJhbWV0ZXJzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVtYWluaW5nUGFyYW1ldGVycykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYm9keSA9IHJlbWFpbmluZ1BhcmFtZXRlcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGRlZmF1bHQgY29udGVudC10eXBlIGZvciBKU09OIGlmIGJvZHkgaXMgc2V0XG4gICAgaWYgKCFoZWFkZXJzW1wiY29udGVudC10eXBlXCJdICYmIHR5cGVvZiBib2R5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIjtcbiAgICB9XG4gICAgLy8gR2l0SHViIGV4cGVjdHMgJ2NvbnRlbnQtbGVuZ3RoOiAwJyBoZWFkZXIgZm9yIFBVVC9QQVRDSCByZXF1ZXN0cyB3aXRob3V0IGJvZHkuXG4gICAgLy8gZmV0Y2ggZG9lcyBub3QgYWxsb3cgdG8gc2V0IGBjb250ZW50LWxlbmd0aGAgaGVhZGVyLCBidXQgd2UgY2FuIHNldCBib2R5IHRvIGFuIGVtcHR5IHN0cmluZ1xuICAgIGlmIChbXCJQQVRDSFwiLCBcIlBVVFwiXS5pbmNsdWRlcyhtZXRob2QpICYmIHR5cGVvZiBib2R5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGJvZHkgPSBcIlwiO1xuICAgIH1cbiAgICAvLyBPbmx5IHJldHVybiBib2R5L3JlcXVlc3Qga2V5cyBpZiBwcmVzZW50XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBtZXRob2QsIHVybCwgaGVhZGVycyB9LCB0eXBlb2YgYm9keSAhPT0gXCJ1bmRlZmluZWRcIiA/IHsgYm9keSB9IDogbnVsbCwgb3B0aW9ucy5yZXF1ZXN0ID8geyByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QgfSA6IG51bGwpO1xufVxuXG5mdW5jdGlvbiBlbmRwb2ludFdpdGhEZWZhdWx0cyhkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gcGFyc2UobWVyZ2UoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSk7XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGREZWZhdWx0cywgbmV3RGVmYXVsdHMpIHtcbiAgICBjb25zdCBERUZBVUxUUyA9IG1lcmdlKG9sZERlZmF1bHRzLCBuZXdEZWZhdWx0cyk7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludFdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihlbmRwb2ludCwge1xuICAgICAgICBERUZBVUxUUyxcbiAgICAgICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTKSxcbiAgICAgICAgbWVyZ2U6IG1lcmdlLmJpbmQobnVsbCwgREVGQVVMVFMpLFxuICAgICAgICBwYXJzZSxcbiAgICB9KTtcbn1cblxuY29uc3QgVkVSU0lPTiA9IFwiNi4wLjEyXCI7XG5cbmNvbnN0IHVzZXJBZ2VudCA9IGBvY3Rva2l0LWVuZHBvaW50LmpzLyR7VkVSU0lPTn0gJHtnZXRVc2VyQWdlbnQoKX1gO1xuLy8gREVGQVVMVFMgaGFzIGFsbCBwcm9wZXJ0aWVzIHNldCB0aGF0IEVuZHBvaW50T3B0aW9ucyBoYXMsIGV4Y2VwdCB1cmwuXG4vLyBTbyB3ZSB1c2UgUmVxdWVzdFBhcmFtZXRlcnMgYW5kIGFkZCBtZXRob2QgYXMgYWRkaXRpb25hbCByZXF1aXJlZCBwcm9wZXJ0eS5cbmNvbnN0IERFRkFVTFRTID0ge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBiYXNlVXJsOiBcImh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb25cIixcbiAgICAgICAgXCJ1c2VyLWFnZW50XCI6IHVzZXJBZ2VudCxcbiAgICB9LFxuICAgIG1lZGlhVHlwZToge1xuICAgICAgICBmb3JtYXQ6IFwiXCIsXG4gICAgICAgIHByZXZpZXdzOiBbXSxcbiAgICB9LFxufTtcblxuY29uc3QgZW5kcG9pbnQgPSB3aXRoRGVmYXVsdHMobnVsbCwgREVGQVVMVFMpO1xuXG5leHBvcnQgeyBlbmRwb2ludCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJpbXBvcnQgeyBEZXByZWNhdGlvbiB9IGZyb20gJ2RlcHJlY2F0aW9uJztcbmltcG9ydCBvbmNlIGZyb20gJ29uY2UnO1xuXG5jb25zdCBsb2dPbmNlQ29kZSA9IG9uY2UoKGRlcHJlY2F0aW9uKSA9PiBjb25zb2xlLndhcm4oZGVwcmVjYXRpb24pKTtcbmNvbnN0IGxvZ09uY2VIZWFkZXJzID0gb25jZSgoZGVwcmVjYXRpb24pID0+IGNvbnNvbGUud2FybihkZXByZWNhdGlvbikpO1xuLyoqXG4gKiBFcnJvciB3aXRoIGV4dHJhIHByb3BlcnRpZXMgdG8gaGVscCB3aXRoIGRlYnVnZ2luZ1xuICovXG5jbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzQ29kZSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSAob25seSBhdmFpbGFibGUgb24gVjgpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYW1lID0gXCJIdHRwRXJyb3JcIjtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNDb2RlO1xuICAgICAgICBsZXQgaGVhZGVycztcbiAgICAgICAgaWYgKFwiaGVhZGVyc1wiIGluIG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuaGVhZGVycyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJyZXNwb25zZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgaGVhZGVycyA9IG9wdGlvbnMucmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICAvLyByZWRhY3QgcmVxdWVzdCBjcmVkZW50aWFscyB3aXRob3V0IG11dGF0aW5nIG9yaWdpbmFsIHJlcXVlc3Qgb3B0aW9uc1xuICAgICAgICBjb25zdCByZXF1ZXN0Q29weSA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucmVxdWVzdCk7XG4gICAgICAgIGlmIChvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgICAgICByZXF1ZXN0Q29weS5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMsIHtcbiAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uOiBvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uLnJlcGxhY2UoLyAuKiQvLCBcIiBbUkVEQUNURURdXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdENvcHkudXJsID0gcmVxdWVzdENvcHkudXJsXG4gICAgICAgICAgICAvLyBjbGllbnRfaWQgJiBjbGllbnRfc2VjcmV0IGNhbiBiZSBwYXNzZWQgYXMgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jcmVhc2UgcmF0ZSBsaW1pdFxuICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvI2luY3JlYXNpbmctdGhlLXVuYXV0aGVudGljYXRlZC1yYXRlLWxpbWl0LWZvci1vYXV0aC1hcHBsaWNhdGlvbnNcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJjbGllbnRfc2VjcmV0PVxcdysvZywgXCJjbGllbnRfc2VjcmV0PVtSRURBQ1RFRF1cIilcbiAgICAgICAgICAgIC8vIE9BdXRoIHRva2VucyBjYW4gYmUgcGFzc2VkIGFzIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLCBhbHRob3VnaCBpdCBpcyBub3QgcmVjb21tZW5kZWRcbiAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzLyNvYXV0aDItdG9rZW4tc2VudC1pbi1hLWhlYWRlclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcYmFjY2Vzc190b2tlbj1cXHcrL2csIFwiYWNjZXNzX3Rva2VuPVtSRURBQ1RFRF1cIik7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RDb3B5O1xuICAgICAgICAvLyBkZXByZWNhdGlvbnNcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbG9nT25jZUNvZGUobmV3IERlcHJlY2F0aW9uKFwiW0BvY3Rva2l0L3JlcXVlc3QtZXJyb3JdIGBlcnJvci5jb2RlYCBpcyBkZXByZWNhdGVkLCB1c2UgYGVycm9yLnN0YXR1c2AuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJoZWFkZXJzXCIsIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICBsb2dPbmNlSGVhZGVycyhuZXcgRGVwcmVjYXRpb24oXCJbQG9jdG9raXQvcmVxdWVzdC1lcnJvcl0gYGVycm9yLmhlYWRlcnNgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZXJyb3IucmVzcG9uc2UuaGVhZGVyc2AuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVycyB8fCB7fTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUmVxdWVzdEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImltcG9ydCB7IGVuZHBvaW50IH0gZnJvbSAnQG9jdG9raXQvZW5kcG9pbnQnO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSAndW5pdmVyc2FsLXVzZXItYWdlbnQnO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gJ2lzLXBsYWluLW9iamVjdCc7XG5pbXBvcnQgbm9kZUZldGNoIGZyb20gJ25vZGUtZmV0Y2gnO1xuaW1wb3J0IHsgUmVxdWVzdEVycm9yIH0gZnJvbSAnQG9jdG9raXQvcmVxdWVzdC1lcnJvcic7XG5cbmNvbnN0IFZFUlNJT04gPSBcIjUuNi4zXCI7XG5cbmZ1bmN0aW9uIGdldEJ1ZmZlclJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG59XG5cbmZ1bmN0aW9uIGZldGNoV3JhcHBlcihyZXF1ZXN0T3B0aW9ucykge1xuICAgIGNvbnN0IGxvZyA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5sb2dcbiAgICAgICAgPyByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmxvZ1xuICAgICAgICA6IGNvbnNvbGU7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVxdWVzdE9wdGlvbnMuYm9keSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShyZXF1ZXN0T3B0aW9ucy5ib2R5KSkge1xuICAgICAgICByZXF1ZXN0T3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdE9wdGlvbnMuYm9keSk7XG4gICAgfVxuICAgIGxldCBoZWFkZXJzID0ge307XG4gICAgbGV0IHN0YXR1cztcbiAgICBsZXQgdXJsO1xuICAgIGNvbnN0IGZldGNoID0gKHJlcXVlc3RPcHRpb25zLnJlcXVlc3QgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5mZXRjaCkgfHwgbm9kZUZldGNoO1xuICAgIHJldHVybiBmZXRjaChyZXF1ZXN0T3B0aW9ucy51cmwsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBtZXRob2Q6IHJlcXVlc3RPcHRpb25zLm1ldGhvZCxcbiAgICAgICAgYm9keTogcmVxdWVzdE9wdGlvbnMuYm9keSxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdE9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgcmVkaXJlY3Q6IHJlcXVlc3RPcHRpb25zLnJlZGlyZWN0LFxuICAgIH0sIFxuICAgIC8vIGByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmFnZW50YCB0eXBlIGlzIGluY29tcGF0aWJsZVxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2tpdC90eXBlcy50cy9wdWxsLzI2NFxuICAgIHJlcXVlc3RPcHRpb25zLnJlcXVlc3QpKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGZvciAoY29uc3Qga2V5QW5kVmFsdWUgb2YgcmVzcG9uc2UuaGVhZGVycykge1xuICAgICAgICAgICAgaGVhZGVyc1trZXlBbmRWYWx1ZVswXV0gPSBrZXlBbmRWYWx1ZVsxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJkZXByZWNhdGlvblwiIGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBoZWFkZXJzLmxpbmsgJiYgaGVhZGVycy5saW5rLm1hdGNoKC88KFtePl0rKT47IHJlbD1cImRlcHJlY2F0aW9uXCIvKTtcbiAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTGluayA9IG1hdGNoZXMgJiYgbWF0Y2hlcy5wb3AoKTtcbiAgICAgICAgICAgIGxvZy53YXJuKGBbQG9jdG9raXQvcmVxdWVzdF0gXCIke3JlcXVlc3RPcHRpb25zLm1ldGhvZH0gJHtyZXF1ZXN0T3B0aW9ucy51cmx9XCIgaXMgZGVwcmVjYXRlZC4gSXQgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgb24gJHtoZWFkZXJzLnN1bnNldH0ke2RlcHJlY2F0aW9uTGluayA/IGAuIFNlZSAke2RlcHJlY2F0aW9uTGlua31gIDogXCJcIn1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDQgfHwgc3RhdHVzID09PSAyMDUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBHaXRIdWIgQVBJIHJldHVybnMgMjAwIGZvciBIRUFEIHJlcXVlc3RzXG4gICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tZXRob2QgPT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVlc3RFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0LCBzdGF0dXMsIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IoXCJOb3QgbW9kaWZpZWRcIiwgc3RhdHVzLCB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJlcXVlc3RFcnJvcih0b0Vycm9yTWVzc2FnZShkYXRhKSwgc3RhdHVzLCB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSk7XG4gICAgfSlcbiAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9O1xuICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUmVxdWVzdEVycm9yKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IoZXJyb3IubWVzc2FnZSwgNTAwLCB7XG4gICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpO1xuICAgIGlmICgvYXBwbGljYXRpb25cXC9qc29uLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH1cbiAgICBpZiAoIWNvbnRlbnRUeXBlIHx8IC9edGV4dFxcL3xjaGFyc2V0PXV0Zi04JC8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEJ1ZmZlclJlc3BvbnNlKHJlc3BvbnNlKTtcbn1cbmZ1bmN0aW9uIHRvRXJyb3JNZXNzYWdlKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0ganVzdCBpbiBjYXNlXG4gICAgaWYgKFwibWVzc2FnZVwiIGluIGRhdGEpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5lcnJvcnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7ZGF0YS5tZXNzYWdlfTogJHtkYXRhLmVycm9ycy5tYXAoSlNPTi5zdHJpbmdpZnkpLmpvaW4oXCIsIFwiKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhLm1lc3NhZ2U7XG4gICAgfVxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0ganVzdCBpbiBjYXNlXG4gICAgcmV0dXJuIGBVbmtub3duIGVycm9yOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWA7XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGRFbmRwb2ludCwgbmV3RGVmYXVsdHMpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9sZEVuZHBvaW50LmRlZmF1bHRzKG5ld0RlZmF1bHRzKTtcbiAgICBjb25zdCBuZXdBcGkgPSBmdW5jdGlvbiAocm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRPcHRpb25zID0gZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpO1xuICAgICAgICBpZiAoIWVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0IHx8ICFlbmRwb2ludE9wdGlvbnMucmVxdWVzdC5ob29rKSB7XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hXcmFwcGVyKGVuZHBvaW50LnBhcnNlKGVuZHBvaW50T3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSAocm91dGUsIHBhcmFtZXRlcnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaFdyYXBwZXIoZW5kcG9pbnQucGFyc2UoZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpKSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdCwge1xuICAgICAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgICAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgZW5kcG9pbnQpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0Lmhvb2socmVxdWVzdCwgZW5kcG9pbnRPcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ld0FwaSwge1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIGVuZHBvaW50KSxcbiAgICB9KTtcbn1cblxuY29uc3QgcmVxdWVzdCA9IHdpdGhEZWZhdWx0cyhlbmRwb2ludCwge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJ1c2VyLWFnZW50XCI6IGBvY3Rva2l0LXJlcXVlc3QuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWAsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgeyByZXF1ZXN0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAb2N0b2tpdC9yZXF1ZXN0JztcbmltcG9ydCB7IGdldFVzZXJBZ2VudCB9IGZyb20gJ3VuaXZlcnNhbC11c2VyLWFnZW50JztcblxuY29uc3QgVkVSU0lPTiA9IFwiNC44LjBcIjtcblxuZnVuY3Rpb24gX2J1aWxkTWVzc2FnZUZvclJlc3BvbnNlRXJyb3JzKGRhdGEpIHtcbiAgICByZXR1cm4gKGBSZXF1ZXN0IGZhaWxlZCBkdWUgdG8gZm9sbG93aW5nIHJlc3BvbnNlIGVycm9yczpcXG5gICtcbiAgICAgICAgZGF0YS5lcnJvcnMubWFwKChlKSA9PiBgIC0gJHtlLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKSk7XG59XG5jbGFzcyBHcmFwaHFsUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSkge1xuICAgICAgICBzdXBlcihfYnVpbGRNZXNzYWdlRm9yUmVzcG9uc2VFcnJvcnMocmVzcG9uc2UpKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkdyYXBocWxSZXNwb25zZUVycm9yXCI7XG4gICAgICAgIC8vIEV4cG9zZSB0aGUgZXJyb3JzIGFuZCByZXNwb25zZSBkYXRhIGluIHRoZWlyIHNob3J0aGFuZCBwcm9wZXJ0aWVzLlxuICAgICAgICB0aGlzLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycztcbiAgICAgICAgdGhpcy5kYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSAob25seSBhdmFpbGFibGUgb24gVjgpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IE5PTl9WQVJJQUJMRV9PUFRJT05TID0gW1xuICAgIFwibWV0aG9kXCIsXG4gICAgXCJiYXNlVXJsXCIsXG4gICAgXCJ1cmxcIixcbiAgICBcImhlYWRlcnNcIixcbiAgICBcInJlcXVlc3RcIixcbiAgICBcInF1ZXJ5XCIsXG4gICAgXCJtZWRpYVR5cGVcIixcbl07XG5jb25zdCBGT1JCSURERU5fVkFSSUFCTEVfT1BUSU9OUyA9IFtcInF1ZXJ5XCIsIFwibWV0aG9kXCIsIFwidXJsXCJdO1xuY29uc3QgR0hFU19WM19TVUZGSVhfUkVHRVggPSAvXFwvYXBpXFwvdjNcXC8/JC87XG5mdW5jdGlvbiBncmFwaHFsKHJlcXVlc3QsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiAmJiBcInF1ZXJ5XCIgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgW0BvY3Rva2l0L2dyYXBocWxdIFwicXVlcnlcIiBjYW5ub3QgYmUgdXNlZCBhcyB2YXJpYWJsZSBuYW1lYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghRk9SQklEREVOX1ZBUklBQkxFX09QVElPTlMuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtAb2N0b2tpdC9ncmFwaHFsXSBcIiR7a2V5fVwiIGNhbm5vdCBiZSB1c2VkIGFzIHZhcmlhYmxlIG5hbWVgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IE9iamVjdC5hc3NpZ24oeyBxdWVyeSB9LCBvcHRpb25zKSA6IHF1ZXJ5O1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gT2JqZWN0LmtleXMocGFyc2VkT3B0aW9ucykucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBpZiAoTk9OX1ZBUklBQkxFX09QVElPTlMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwYXJzZWRPcHRpb25zW2tleV07XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzdWx0LnZhcmlhYmxlcykge1xuICAgICAgICAgICAgcmVzdWx0LnZhcmlhYmxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC52YXJpYWJsZXNba2V5XSA9IHBhcnNlZE9wdGlvbnNba2V5XTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gICAgLy8gd29ya2Fyb3VuZCBmb3IgR2l0SHViIEVudGVycHJpc2UgYmFzZVVybCBzZXQgd2l0aCAvYXBpL3YzIHN1ZmZpeFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9vY3Rva2l0L2F1dGgtYXBwLmpzL2lzc3Vlcy8xMTEjaXNzdWVjb21tZW50LTY1NzYxMDQ1MVxuICAgIGNvbnN0IGJhc2VVcmwgPSBwYXJzZWRPcHRpb25zLmJhc2VVcmwgfHwgcmVxdWVzdC5lbmRwb2ludC5ERUZBVUxUUy5iYXNlVXJsO1xuICAgIGlmIChHSEVTX1YzX1NVRkZJWF9SRUdFWC50ZXN0KGJhc2VVcmwpKSB7XG4gICAgICAgIHJlcXVlc3RPcHRpb25zLnVybCA9IGJhc2VVcmwucmVwbGFjZShHSEVTX1YzX1NVRkZJWF9SRUdFWCwgXCIvYXBpL2dyYXBocWxcIik7XG4gICAgfVxuICAgIHJldHVybiByZXF1ZXN0KHJlcXVlc3RPcHRpb25zKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5lcnJvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlLmhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVyc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBocWxSZXNwb25zZUVycm9yKHJlcXVlc3RPcHRpb25zLCBoZWFkZXJzLCByZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMocmVxdWVzdCQxLCBuZXdEZWZhdWx0cykge1xuICAgIGNvbnN0IG5ld1JlcXVlc3QgPSByZXF1ZXN0JDEuZGVmYXVsdHMobmV3RGVmYXVsdHMpO1xuICAgIGNvbnN0IG5ld0FwaSA9IChxdWVyeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gZ3JhcGhxbChuZXdSZXF1ZXN0LCBxdWVyeSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXdBcGksIHtcbiAgICAgICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIG5ld1JlcXVlc3QpLFxuICAgICAgICBlbmRwb2ludDogcmVxdWVzdC5lbmRwb2ludCxcbiAgICB9KTtcbn1cblxuY29uc3QgZ3JhcGhxbCQxID0gd2l0aERlZmF1bHRzKHJlcXVlc3QsIHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwidXNlci1hZ2VudFwiOiBgb2N0b2tpdC1ncmFwaHFsLmpzLyR7VkVSU0lPTn0gJHtnZXRVc2VyQWdlbnQoKX1gLFxuICAgIH0sXG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB1cmw6IFwiL2dyYXBocWxcIixcbn0pO1xuZnVuY3Rpb24gd2l0aEN1c3RvbVJlcXVlc3QoY3VzdG9tUmVxdWVzdCkge1xuICAgIHJldHVybiB3aXRoRGVmYXVsdHMoY3VzdG9tUmVxdWVzdCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICB1cmw6IFwiL2dyYXBocWxcIixcbiAgICB9KTtcbn1cblxuZXhwb3J0IHsgR3JhcGhxbFJlc3BvbnNlRXJyb3IsIGdyYXBocWwkMSBhcyBncmFwaHFsLCB3aXRoQ3VzdG9tUmVxdWVzdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJjb25zdCBSRUdFWF9JU19JTlNUQUxMQVRJT05fTEVHQUNZID0gL152MVxcLi87XG5jb25zdCBSRUdFWF9JU19JTlNUQUxMQVRJT04gPSAvXmdoc18vO1xuY29uc3QgUkVHRVhfSVNfVVNFUl9UT19TRVJWRVIgPSAvXmdodV8vO1xuYXN5bmMgZnVuY3Rpb24gYXV0aCh0b2tlbikge1xuICAgIGNvbnN0IGlzQXBwID0gdG9rZW4uc3BsaXQoL1xcLi8pLmxlbmd0aCA9PT0gMztcbiAgICBjb25zdCBpc0luc3RhbGxhdGlvbiA9IFJFR0VYX0lTX0lOU1RBTExBVElPTl9MRUdBQ1kudGVzdCh0b2tlbikgfHxcbiAgICAgICAgUkVHRVhfSVNfSU5TVEFMTEFUSU9OLnRlc3QodG9rZW4pO1xuICAgIGNvbnN0IGlzVXNlclRvU2VydmVyID0gUkVHRVhfSVNfVVNFUl9UT19TRVJWRVIudGVzdCh0b2tlbik7XG4gICAgY29uc3QgdG9rZW5UeXBlID0gaXNBcHBcbiAgICAgICAgPyBcImFwcFwiXG4gICAgICAgIDogaXNJbnN0YWxsYXRpb25cbiAgICAgICAgICAgID8gXCJpbnN0YWxsYXRpb25cIlxuICAgICAgICAgICAgOiBpc1VzZXJUb1NlcnZlclxuICAgICAgICAgICAgICAgID8gXCJ1c2VyLXRvLXNlcnZlclwiXG4gICAgICAgICAgICAgICAgOiBcIm9hdXRoXCI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJ0b2tlblwiLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIHRva2VuVHlwZSxcbiAgICB9O1xufVxuXG4vKipcbiAqIFByZWZpeCB0b2tlbiBmb3IgdXNhZ2UgaW4gdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyXG4gKlxuICogQHBhcmFtIHRva2VuIE9BdXRoIHRva2VuIG9yIEpTT04gV2ViIFRva2VuXG4gKi9cbmZ1bmN0aW9uIHdpdGhBdXRob3JpemF0aW9uUHJlZml4KHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnNwbGl0KC9cXC4vKS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGBiZWFyZXIgJHt0b2tlbn1gO1xuICAgIH1cbiAgICByZXR1cm4gYHRva2VuICR7dG9rZW59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaG9vayh0b2tlbiwgcmVxdWVzdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHJlcXVlc3QuZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpO1xuICAgIGVuZHBvaW50LmhlYWRlcnMuYXV0aG9yaXphdGlvbiA9IHdpdGhBdXRob3JpemF0aW9uUHJlZml4KHRva2VuKTtcbiAgICByZXR1cm4gcmVxdWVzdChlbmRwb2ludCk7XG59XG5cbmNvbnN0IGNyZWF0ZVRva2VuQXV0aCA9IGZ1bmN0aW9uIGNyZWF0ZVRva2VuQXV0aCh0b2tlbikge1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIE5vIHRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGhcIik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdG9rZW4gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIFRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGggaXMgbm90IGEgc3RyaW5nXCIpO1xuICAgIH1cbiAgICB0b2tlbiA9IHRva2VuLnJlcGxhY2UoL14odG9rZW58YmVhcmVyKSArL2ksIFwiXCIpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF1dGguYmluZChudWxsLCB0b2tlbiksIHtcbiAgICAgICAgaG9vazogaG9vay5iaW5kKG51bGwsIHRva2VuKSxcbiAgICB9KTtcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZVRva2VuQXV0aCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJpbXBvcnQgeyBnZXRVc2VyQWdlbnQgfSBmcm9tICd1bml2ZXJzYWwtdXNlci1hZ2VudCc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnYmVmb3JlLWFmdGVyLWhvb2snO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0BvY3Rva2l0L3JlcXVlc3QnO1xuaW1wb3J0IHsgd2l0aEN1c3RvbVJlcXVlc3QgfSBmcm9tICdAb2N0b2tpdC9ncmFwaHFsJztcbmltcG9ydCB7IGNyZWF0ZVRva2VuQXV0aCB9IGZyb20gJ0BvY3Rva2l0L2F1dGgtdG9rZW4nO1xuXG5jb25zdCBWRVJTSU9OID0gXCIzLjYuMFwiO1xuXG5jbGFzcyBPY3Rva2l0IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgaG9vayA9IG5ldyBDb2xsZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3REZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIGJhc2VVcmw6IHJlcXVlc3QuZW5kcG9pbnQuREVGQVVMVFMuYmFzZVVybCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgcmVxdWVzdDogT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0LCB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBpbnRlcm5hbCB1c2FnZSBvbmx5LCBubyBuZWVkIHRvIHR5cGVcbiAgICAgICAgICAgICAgICBob29rOiBob29rLmJpbmQobnVsbCwgXCJyZXF1ZXN0XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZWRpYVR5cGU6IHtcbiAgICAgICAgICAgICAgICBwcmV2aWV3czogW10sXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcIlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gcHJlcGVuZCBkZWZhdWx0IHVzZXIgYWdlbnQgd2l0aCBgb3B0aW9ucy51c2VyQWdlbnRgIGlmIHNldFxuICAgICAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInVzZXItYWdlbnRcIl0gPSBbXG4gICAgICAgICAgICBvcHRpb25zLnVzZXJBZ2VudCxcbiAgICAgICAgICAgIGBvY3Rva2l0LWNvcmUuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgcmVxdWVzdERlZmF1bHRzLmJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucHJldmlld3MpIHtcbiAgICAgICAgICAgIHJlcXVlc3REZWZhdWx0cy5tZWRpYVR5cGUucHJldmlld3MgPSBvcHRpb25zLnByZXZpZXdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRpbWVab25lKSB7XG4gICAgICAgICAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInRpbWUtem9uZVwiXSA9IG9wdGlvbnMudGltZVpvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdC5kZWZhdWx0cyhyZXF1ZXN0RGVmYXVsdHMpO1xuICAgICAgICB0aGlzLmdyYXBocWwgPSB3aXRoQ3VzdG9tUmVxdWVzdCh0aGlzLnJlcXVlc3QpLmRlZmF1bHRzKHJlcXVlc3REZWZhdWx0cyk7XG4gICAgICAgIHRoaXMubG9nID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBkZWJ1ZzogKCkgPT4geyB9LFxuICAgICAgICAgICAgaW5mbzogKCkgPT4geyB9LFxuICAgICAgICAgICAgd2FybjogY29uc29sZS53YXJuLmJpbmQoY29uc29sZSksXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpLFxuICAgICAgICB9LCBvcHRpb25zLmxvZyk7XG4gICAgICAgIHRoaXMuaG9vayA9IGhvb2s7XG4gICAgICAgIC8vICgxKSBJZiBuZWl0aGVyIGBvcHRpb25zLmF1dGhTdHJhdGVneWAgbm9yIGBvcHRpb25zLmF1dGhgIGFyZSBzZXQsIHRoZSBgb2N0b2tpdGAgaW5zdGFuY2VcbiAgICAgICAgLy8gICAgIGlzIHVuYXV0aGVudGljYXRlZC4gVGhlIGB0aGlzLmF1dGgoKWAgbWV0aG9kIGlzIGEgbm8tb3AgYW5kIG5vIHJlcXVlc3QgaG9vayBpcyByZWdpc3RlcmVkLlxuICAgICAgICAvLyAoMikgSWYgb25seSBgb3B0aW9ucy5hdXRoYCBpcyBzZXQsIHVzZSB0aGUgZGVmYXVsdCB0b2tlbiBhdXRoZW50aWNhdGlvbiBzdHJhdGVneS5cbiAgICAgICAgLy8gKDMpIElmIGBvcHRpb25zLmF1dGhTdHJhdGVneWAgaXMgc2V0IHRoZW4gdXNlIGl0IGFuZCBwYXNzIGluIGBvcHRpb25zLmF1dGhgLiBBbHdheXMgcGFzcyBvd24gcmVxdWVzdCBhcyBtYW55IHN0cmF0ZWdpZXMgYWNjZXB0IGEgY3VzdG9tIHJlcXVlc3QgaW5zdGFuY2UuXG4gICAgICAgIC8vIFRPRE86IHR5cGUgYG9wdGlvbnMuYXV0aGAgYmFzZWQgb24gYG9wdGlvbnMuYXV0aFN0cmF0ZWd5YC5cbiAgICAgICAgaWYgKCFvcHRpb25zLmF1dGhTdHJhdGVneSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmF1dGgpIHtcbiAgICAgICAgICAgICAgICAvLyAoMSlcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGggPSBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInVuYXV0aGVudGljYXRlZFwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gKDIpXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aCA9IGNyZWF0ZVRva2VuQXV0aChvcHRpb25zLmF1dGgpO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgIMKvXFxfKOODhClfL8KvXG4gICAgICAgICAgICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGF1dGhTdHJhdGVneSwgLi4ub3RoZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgYXV0aCA9IGF1dGhTdHJhdGVneShPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgICAgICAgICAgICAvLyB3ZSBwYXNzIHRoZSBjdXJyZW50IG9jdG9raXQgaW5zdGFuY2UgYXMgd2VsbCBhcyBpdHMgY29uc3RydWN0b3Igb3B0aW9uc1xuICAgICAgICAgICAgICAgIC8vIHRvIGFsbG93IGZvciBhdXRoZW50aWNhdGlvbiBzdHJhdGVnaWVzIHRoYXQgcmV0dXJuIGEgbmV3IG9jdG9raXQgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHNoYXJlcyB0aGUgc2FtZSBpbnRlcm5hbCBzdGF0ZSBhcyB0aGUgY3VycmVudCBvbmUuIFRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVtZW50IGZvciB0aGlzIHdhcyB0aGUgXCJldmVudC1vY3Rva2l0XCIgYXV0aGVudGljYXRpb24gc3RyYXRlZ3lcbiAgICAgICAgICAgICAgICAvLyBvZiBodHRwczovL2dpdGh1Yi5jb20vcHJvYm90L29jdG9raXQtYXV0aC1wcm9ib3QuXG4gICAgICAgICAgICAgICAgb2N0b2tpdDogdGhpcyxcbiAgICAgICAgICAgICAgICBvY3Rva2l0T3B0aW9uczogb3RoZXJPcHRpb25zLFxuICAgICAgICAgICAgfSwgb3B0aW9ucy5hdXRoKSk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlICDCr1xcXyjjg4QpXy/Cr1xuICAgICAgICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcHBseSBwbHVnaW5zXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjM0NTE3MlxuICAgICAgICBjb25zdCBjbGFzc0NvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgY2xhc3NDb25zdHJ1Y3Rvci5wbHVnaW5zLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBwbHVnaW4odGhpcywgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGRlZmF1bHRzKGRlZmF1bHRzKSB7XG4gICAgICAgIGNvbnN0IE9jdG9raXRXaXRoRGVmYXVsdHMgPSBjbGFzcyBleHRlbmRzIHRoaXMge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhcmdzWzBdIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVmYXVsdHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBzdXBlcihkZWZhdWx0cyhvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMsIG9wdGlvbnMudXNlckFnZW50ICYmIGRlZmF1bHRzLnVzZXJBZ2VudFxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogYCR7b3B0aW9ucy51c2VyQWdlbnR9ICR7ZGVmYXVsdHMudXNlckFnZW50fWAsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBPY3Rva2l0V2l0aERlZmF1bHRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRhY2ggYSBwbHVnaW4gKG9yIG1hbnkpIHRvIHlvdXIgT2N0b2tpdCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgQVBJID0gT2N0b2tpdC5wbHVnaW4ocGx1Z2luMSwgcGx1Z2luMiwgcGx1Z2luMywgLi4uKVxuICAgICAqL1xuICAgIHN0YXRpYyBwbHVnaW4oLi4ubmV3UGx1Z2lucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQbHVnaW5zID0gdGhpcy5wbHVnaW5zO1xuICAgICAgICBjb25zdCBOZXdPY3Rva2l0ID0gKF9hID0gY2xhc3MgZXh0ZW5kcyB0aGlzIHtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfYS5wbHVnaW5zID0gY3VycmVudFBsdWdpbnMuY29uY2F0KG5ld1BsdWdpbnMuZmlsdGVyKChwbHVnaW4pID0+ICFjdXJyZW50UGx1Z2lucy5pbmNsdWRlcyhwbHVnaW4pKSksXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIHJldHVybiBOZXdPY3Rva2l0O1xuICAgIH1cbn1cbk9jdG9raXQuVkVSU0lPTiA9IFZFUlNJT047XG5PY3Rva2l0LnBsdWdpbnMgPSBbXTtcblxuZXhwb3J0IHsgT2N0b2tpdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///36082\n')},21665:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ composePaginateRest: () => (/* binding */ composePaginateRest),\n/* harmony export */ isPaginatingEndpoint: () => (/* binding */ isPaginatingEndpoint),\n/* harmony export */ paginateRest: () => (/* binding */ paginateRest),\n/* harmony export */ paginatingEndpoints: () => (/* binding */ paginatingEndpoints)\n/* harmony export */ });\nconst VERSION = "2.21.3";\n\n/**\n * Some “list” response that can be paginated have a different response structure\n *\n * They have a `total_count` key in the response (search also has `incomplete_results`,\n * /installation/repositories also has `repository_selection`), as well as a key with\n * the list of the items which name varies from endpoint to endpoint.\n *\n * Octokit normalizes these responses so that paginated results are always returned following\n * the same structure. One challenge is that if the list response has only one page, no Link\n * header is provided, so this header alone is not sufficient to check wether a response is\n * paginated or not.\n *\n * We check if a "total_count" key is present in the response data, but also make sure that\n * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would\n * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref\n */\nfunction normalizePaginatedListResponse(response) {\n // endpoints can respond with 204 if repository is empty\n if (!response.data) {\n return {\n ...response,\n data: [],\n };\n }\n const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data);\n if (!responseNeedsNormalization)\n return response;\n // keep the additional properties intact as there is currently no other way\n // to retrieve the same information.\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n if (typeof incompleteResults !== "undefined") {\n response.data.incomplete_results = incompleteResults;\n }\n if (typeof repositorySelection !== "undefined") {\n response.data.repository_selection = repositorySelection;\n }\n response.data.total_count = totalCount;\n return response;\n}\n\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === "function"\n ? route.endpoint(parameters)\n : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === "function" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url)\n return { done: true };\n try {\n const response = await requestMethod({ method, url, headers });\n const normalizedResponse = normalizePaginatedListResponse(response);\n // `response.headers.link` format:\n // \'; rel="next", ; rel="last"\'\n // sets `url` to undefined if "next" URL is not present or `link` header is not set\n url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\\s*rel="next"/) || [])[1];\n return { value: normalizedResponse };\n }\n catch (error) {\n if (error.status !== 409)\n throw error;\n url = "";\n return {\n value: {\n status: 200,\n headers: {},\n data: [],\n },\n };\n }\n },\n }),\n };\n}\n\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === "function") {\n mapFn = parameters;\n parameters = undefined;\n }\n return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn);\n}\nfunction gather(octokit, results, iterator, mapFn) {\n return iterator.next().then((result) => {\n if (result.done) {\n return results;\n }\n let earlyExit = false;\n function done() {\n earlyExit = true;\n }\n results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data);\n if (earlyExit) {\n return results;\n }\n return gather(octokit, results, iterator, mapFn);\n });\n}\n\nconst composePaginateRest = Object.assign(paginate, {\n iterator,\n});\n\nconst paginatingEndpoints = [\n "GET /app/hook/deliveries",\n "GET /app/installations",\n "GET /applications/grants",\n "GET /authorizations",\n "GET /enterprises/{enterprise}/actions/permissions/organizations",\n "GET /enterprises/{enterprise}/actions/runner-groups",\n "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations",\n "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners",\n "GET /enterprises/{enterprise}/actions/runners",\n "GET /enterprises/{enterprise}/audit-log",\n "GET /enterprises/{enterprise}/secret-scanning/alerts",\n "GET /enterprises/{enterprise}/settings/billing/advanced-security",\n "GET /events",\n "GET /gists",\n "GET /gists/public",\n "GET /gists/starred",\n "GET /gists/{gist_id}/comments",\n "GET /gists/{gist_id}/commits",\n "GET /gists/{gist_id}/forks",\n "GET /installation/repositories",\n "GET /issues",\n "GET /licenses",\n "GET /marketplace_listing/plans",\n "GET /marketplace_listing/plans/{plan_id}/accounts",\n "GET /marketplace_listing/stubbed/plans",\n "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts",\n "GET /networks/{owner}/{repo}/events",\n "GET /notifications",\n "GET /organizations",\n "GET /orgs/{org}/actions/cache/usage-by-repository",\n "GET /orgs/{org}/actions/permissions/repositories",\n "GET /orgs/{org}/actions/runner-groups",\n "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories",\n "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners",\n "GET /orgs/{org}/actions/runners",\n "GET /orgs/{org}/actions/secrets",\n "GET /orgs/{org}/actions/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/audit-log",\n "GET /orgs/{org}/blocks",\n "GET /orgs/{org}/code-scanning/alerts",\n "GET /orgs/{org}/codespaces",\n "GET /orgs/{org}/credential-authorizations",\n "GET /orgs/{org}/dependabot/secrets",\n "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/events",\n "GET /orgs/{org}/external-groups",\n "GET /orgs/{org}/failed_invitations",\n "GET /orgs/{org}/hooks",\n "GET /orgs/{org}/hooks/{hook_id}/deliveries",\n "GET /orgs/{org}/installations",\n "GET /orgs/{org}/invitations",\n "GET /orgs/{org}/invitations/{invitation_id}/teams",\n "GET /orgs/{org}/issues",\n "GET /orgs/{org}/members",\n "GET /orgs/{org}/migrations",\n "GET /orgs/{org}/migrations/{migration_id}/repositories",\n "GET /orgs/{org}/outside_collaborators",\n "GET /orgs/{org}/packages",\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n "GET /orgs/{org}/projects",\n "GET /orgs/{org}/public_members",\n "GET /orgs/{org}/repos",\n "GET /orgs/{org}/secret-scanning/alerts",\n "GET /orgs/{org}/settings/billing/advanced-security",\n "GET /orgs/{org}/team-sync/groups",\n "GET /orgs/{org}/teams",\n "GET /orgs/{org}/teams/{team_slug}/discussions",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",\n "GET /orgs/{org}/teams/{team_slug}/invitations",\n "GET /orgs/{org}/teams/{team_slug}/members",\n "GET /orgs/{org}/teams/{team_slug}/projects",\n "GET /orgs/{org}/teams/{team_slug}/repos",\n "GET /orgs/{org}/teams/{team_slug}/teams",\n "GET /projects/columns/{column_id}/cards",\n "GET /projects/{project_id}/collaborators",\n "GET /projects/{project_id}/columns",\n "GET /repos/{owner}/{repo}/actions/artifacts",\n "GET /repos/{owner}/{repo}/actions/caches",\n "GET /repos/{owner}/{repo}/actions/runners",\n "GET /repos/{owner}/{repo}/actions/runs",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs",\n "GET /repos/{owner}/{repo}/actions/secrets",\n "GET /repos/{owner}/{repo}/actions/workflows",\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",\n "GET /repos/{owner}/{repo}/assignees",\n "GET /repos/{owner}/{repo}/branches",\n "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations",\n "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs",\n "GET /repos/{owner}/{repo}/code-scanning/alerts",\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n "GET /repos/{owner}/{repo}/code-scanning/analyses",\n "GET /repos/{owner}/{repo}/codespaces",\n "GET /repos/{owner}/{repo}/codespaces/devcontainers",\n "GET /repos/{owner}/{repo}/codespaces/secrets",\n "GET /repos/{owner}/{repo}/collaborators",\n "GET /repos/{owner}/{repo}/comments",\n "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/commits",\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments",\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",\n "GET /repos/{owner}/{repo}/commits/{ref}/check-runs",\n "GET /repos/{owner}/{repo}/commits/{ref}/check-suites",\n "GET /repos/{owner}/{repo}/commits/{ref}/status",\n "GET /repos/{owner}/{repo}/commits/{ref}/statuses",\n "GET /repos/{owner}/{repo}/contributors",\n "GET /repos/{owner}/{repo}/dependabot/secrets",\n "GET /repos/{owner}/{repo}/deployments",\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",\n "GET /repos/{owner}/{repo}/environments",\n "GET /repos/{owner}/{repo}/events",\n "GET /repos/{owner}/{repo}/forks",\n "GET /repos/{owner}/{repo}/git/matching-refs/{ref}",\n "GET /repos/{owner}/{repo}/hooks",\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries",\n "GET /repos/{owner}/{repo}/invitations",\n "GET /repos/{owner}/{repo}/issues",\n "GET /repos/{owner}/{repo}/issues/comments",\n "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/issues/events",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/comments",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/events",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/labels",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline",\n "GET /repos/{owner}/{repo}/keys",\n "GET /repos/{owner}/{repo}/labels",\n "GET /repos/{owner}/{repo}/milestones",\n "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels",\n "GET /repos/{owner}/{repo}/notifications",\n "GET /repos/{owner}/{repo}/pages/builds",\n "GET /repos/{owner}/{repo}/projects",\n "GET /repos/{owner}/{repo}/pulls",\n "GET /repos/{owner}/{repo}/pulls/comments",\n "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/files",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments",\n "GET /repos/{owner}/{repo}/releases",\n "GET /repos/{owner}/{repo}/releases/{release_id}/assets",\n "GET /repos/{owner}/{repo}/releases/{release_id}/reactions",\n "GET /repos/{owner}/{repo}/secret-scanning/alerts",\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations",\n "GET /repos/{owner}/{repo}/stargazers",\n "GET /repos/{owner}/{repo}/subscribers",\n "GET /repos/{owner}/{repo}/tags",\n "GET /repos/{owner}/{repo}/teams",\n "GET /repos/{owner}/{repo}/topics",\n "GET /repositories",\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets",\n "GET /search/code",\n "GET /search/commits",\n "GET /search/issues",\n "GET /search/labels",\n "GET /search/repositories",\n "GET /search/topics",\n "GET /search/users",\n "GET /teams/{team_id}/discussions",\n "GET /teams/{team_id}/discussions/{discussion_number}/comments",\n "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n "GET /teams/{team_id}/discussions/{discussion_number}/reactions",\n "GET /teams/{team_id}/invitations",\n "GET /teams/{team_id}/members",\n "GET /teams/{team_id}/projects",\n "GET /teams/{team_id}/repos",\n "GET /teams/{team_id}/teams",\n "GET /user/blocks",\n "GET /user/codespaces",\n "GET /user/codespaces/secrets",\n "GET /user/emails",\n "GET /user/followers",\n "GET /user/following",\n "GET /user/gpg_keys",\n "GET /user/installations",\n "GET /user/installations/{installation_id}/repositories",\n "GET /user/issues",\n "GET /user/keys",\n "GET /user/marketplace_purchases",\n "GET /user/marketplace_purchases/stubbed",\n "GET /user/memberships/orgs",\n "GET /user/migrations",\n "GET /user/migrations/{migration_id}/repositories",\n "GET /user/orgs",\n "GET /user/packages",\n "GET /user/packages/{package_type}/{package_name}/versions",\n "GET /user/public_emails",\n "GET /user/repos",\n "GET /user/repository_invitations",\n "GET /user/starred",\n "GET /user/subscriptions",\n "GET /user/teams",\n "GET /users",\n "GET /users/{username}/events",\n "GET /users/{username}/events/orgs/{org}",\n "GET /users/{username}/events/public",\n "GET /users/{username}/followers",\n "GET /users/{username}/following",\n "GET /users/{username}/gists",\n "GET /users/{username}/gpg_keys",\n "GET /users/{username}/keys",\n "GET /users/{username}/orgs",\n "GET /users/{username}/packages",\n "GET /users/{username}/projects",\n "GET /users/{username}/received_events",\n "GET /users/{username}/received_events/public",\n "GET /users/{username}/repos",\n "GET /users/{username}/starred",\n "GET /users/{username}/subscriptions",\n];\n\nfunction isPaginatingEndpoint(arg) {\n if (typeof arg === "string") {\n return paginatingEndpoints.includes(arg);\n }\n else {\n return false;\n }\n}\n\n/**\n * @param octokit Octokit instance\n * @param options Options passed to Octokit constructor\n */\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit),\n }),\n };\n}\npaginateRest.VERSION = VERSION;\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMxQixpQkFBaUIsU0FBUztBQUMxQixpQkFBaUIsU0FBUztBQUMxQixpQkFBaUIsU0FBUztBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUV3RjtBQUN4RiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1wYWdpbmF0ZS1yZXN0L2Rpc3Qtd2ViL2luZGV4LmpzPzEwOWIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgVkVSU0lPTiA9IFwiMi4yMS4zXCI7XG5cbi8qKlxuICogU29tZSDigJxsaXN04oCdIHJlc3BvbnNlIHRoYXQgY2FuIGJlIHBhZ2luYXRlZCBoYXZlIGEgZGlmZmVyZW50IHJlc3BvbnNlIHN0cnVjdHVyZVxuICpcbiAqIFRoZXkgaGF2ZSBhIGB0b3RhbF9jb3VudGAga2V5IGluIHRoZSByZXNwb25zZSAoc2VhcmNoIGFsc28gaGFzIGBpbmNvbXBsZXRlX3Jlc3VsdHNgLFxuICogL2luc3RhbGxhdGlvbi9yZXBvc2l0b3JpZXMgYWxzbyBoYXMgYHJlcG9zaXRvcnlfc2VsZWN0aW9uYCksIGFzIHdlbGwgYXMgYSBrZXkgd2l0aFxuICogdGhlIGxpc3Qgb2YgdGhlIGl0ZW1zIHdoaWNoIG5hbWUgdmFyaWVzIGZyb20gZW5kcG9pbnQgdG8gZW5kcG9pbnQuXG4gKlxuICogT2N0b2tpdCBub3JtYWxpemVzIHRoZXNlIHJlc3BvbnNlcyBzbyB0aGF0IHBhZ2luYXRlZCByZXN1bHRzIGFyZSBhbHdheXMgcmV0dXJuZWQgZm9sbG93aW5nXG4gKiB0aGUgc2FtZSBzdHJ1Y3R1cmUuIE9uZSBjaGFsbGVuZ2UgaXMgdGhhdCBpZiB0aGUgbGlzdCByZXNwb25zZSBoYXMgb25seSBvbmUgcGFnZSwgbm8gTGlua1xuICogaGVhZGVyIGlzIHByb3ZpZGVkLCBzbyB0aGlzIGhlYWRlciBhbG9uZSBpcyBub3Qgc3VmZmljaWVudCB0byBjaGVjayB3ZXRoZXIgYSByZXNwb25zZSBpc1xuICogcGFnaW5hdGVkIG9yIG5vdC5cbiAqXG4gKiBXZSBjaGVjayBpZiBhIFwidG90YWxfY291bnRcIiBrZXkgaXMgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2UgZGF0YSwgYnV0IGFsc28gbWFrZSBzdXJlIHRoYXRcbiAqIGEgXCJ1cmxcIiBwcm9wZXJ0eSBpcyBub3QsIGFzIHRoZSBcIkdldCB0aGUgY29tYmluZWQgc3RhdHVzIGZvciBhIHNwZWNpZmljIHJlZlwiIGVuZHBvaW50IHdvdWxkXG4gKiBvdGhlcndpc2UgbWF0Y2g6IGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3Mvc3RhdHVzZXMvI2dldC10aGUtY29tYmluZWQtc3RhdHVzLWZvci1hLXNwZWNpZmljLXJlZlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYWdpbmF0ZWRMaXN0UmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICAvLyBlbmRwb2ludHMgY2FuIHJlc3BvbmQgd2l0aCAyMDQgaWYgcmVwb3NpdG9yeSBpcyBlbXB0eVxuICAgIGlmICghcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24gPSBcInRvdGFsX2NvdW50XCIgaW4gcmVzcG9uc2UuZGF0YSAmJiAhKFwidXJsXCIgaW4gcmVzcG9uc2UuZGF0YSk7XG4gICAgaWYgKCFyZXNwb25zZU5lZWRzTm9ybWFsaXphdGlvbilcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIC8vIGtlZXAgdGhlIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpbnRhY3QgYXMgdGhlcmUgaXMgY3VycmVudGx5IG5vIG90aGVyIHdheVxuICAgIC8vIHRvIHJldHJpZXZlIHRoZSBzYW1lIGluZm9ybWF0aW9uLlxuICAgIGNvbnN0IGluY29tcGxldGVSZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5pbmNvbXBsZXRlX3Jlc3VsdHM7XG4gICAgY29uc3QgcmVwb3NpdG9yeVNlbGVjdGlvbiA9IHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb247XG4gICAgY29uc3QgdG90YWxDb3VudCA9IHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQ7XG4gICAgZGVsZXRlIHJlc3BvbnNlLmRhdGEuaW5jb21wbGV0ZV9yZXN1bHRzO1xuICAgIGRlbGV0ZSByZXNwb25zZS5kYXRhLnJlcG9zaXRvcnlfc2VsZWN0aW9uO1xuICAgIGRlbGV0ZSByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50O1xuICAgIGNvbnN0IG5hbWVzcGFjZUtleSA9IE9iamVjdC5rZXlzKHJlc3BvbnNlLmRhdGEpWzBdO1xuICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhW25hbWVzcGFjZUtleV07XG4gICAgcmVzcG9uc2UuZGF0YSA9IGRhdGE7XG4gICAgaWYgKHR5cGVvZiBpbmNvbXBsZXRlUmVzdWx0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cyA9IGluY29tcGxldGVSZXN1bHRzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlcG9zaXRvcnlTZWxlY3Rpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcmVzcG9uc2UuZGF0YS5yZXBvc2l0b3J5X3NlbGVjdGlvbiA9IHJlcG9zaXRvcnlTZWxlY3Rpb247XG4gICAgfVxuICAgIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPSB0b3RhbENvdW50O1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gaXRlcmF0b3Iob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdHlwZW9mIHJvdXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyByb3V0ZS5lbmRwb2ludChwYXJhbWV0ZXJzKVxuICAgICAgICA6IG9jdG9raXQucmVxdWVzdC5lbmRwb2ludChyb3V0ZSwgcGFyYW1ldGVycyk7XG4gICAgY29uc3QgcmVxdWVzdE1ldGhvZCA9IHR5cGVvZiByb3V0ZSA9PT0gXCJmdW5jdGlvblwiID8gcm91dGUgOiBvY3Rva2l0LnJlcXVlc3Q7XG4gICAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gICAgY29uc3QgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICBsZXQgdXJsID0gb3B0aW9ucy51cmw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gKHtcbiAgICAgICAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1cmwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RNZXRob2QoeyBtZXRob2QsIHVybCwgaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc3BvbnNlID0gbm9ybWFsaXplUGFnaW5hdGVkTGlzdFJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYHJlc3BvbnNlLmhlYWRlcnMubGlua2AgZm9ybWF0OlxuICAgICAgICAgICAgICAgICAgICAvLyAnPGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXNlZW1rL2ZvbGxvd2Vycz9wYWdlPTI+OyByZWw9XCJuZXh0XCIsIDxodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2FzZWVtay9mb2xsb3dlcnM/cGFnZT0yPjsgcmVsPVwibGFzdFwiJ1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXRzIGB1cmxgIHRvIHVuZGVmaW5lZCBpZiBcIm5leHRcIiBVUkwgaXMgbm90IHByZXNlbnQgb3IgYGxpbmtgIGhlYWRlciBpcyBub3Qgc2V0XG4gICAgICAgICAgICAgICAgICAgIHVybCA9ICgobm9ybWFsaXplZFJlc3BvbnNlLmhlYWRlcnMubGluayB8fCBcIlwiKS5tYXRjaCgvPChbXj5dKyk+O1xccypyZWw9XCJuZXh0XCIvKSB8fCBbXSlbMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBub3JtYWxpemVkUmVzcG9uc2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDQwOSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcGFnaW5hdGUob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMsIG1hcEZuKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgbWFwRm4gPSBwYXJhbWV0ZXJzO1xuICAgICAgICBwYXJhbWV0ZXJzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gZ2F0aGVyKG9jdG9raXQsIFtdLCBpdGVyYXRvcihvY3Rva2l0LCByb3V0ZSwgcGFyYW1ldGVycylbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksIG1hcEZuKTtcbn1cbmZ1bmN0aW9uIGdhdGhlcihvY3Rva2l0LCByZXN1bHRzLCBpdGVyYXRvciwgbWFwRm4pIHtcbiAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlYXJseUV4aXQgPSBmYWxzZTtcbiAgICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgICAgIGVhcmx5RXhpdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KG1hcEZuID8gbWFwRm4ocmVzdWx0LnZhbHVlLCBkb25lKSA6IHJlc3VsdC52YWx1ZS5kYXRhKTtcbiAgICAgICAgaWYgKGVhcmx5RXhpdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdhdGhlcihvY3Rva2l0LCByZXN1bHRzLCBpdGVyYXRvciwgbWFwRm4pO1xuICAgIH0pO1xufVxuXG5jb25zdCBjb21wb3NlUGFnaW5hdGVSZXN0ID0gT2JqZWN0LmFzc2lnbihwYWdpbmF0ZSwge1xuICAgIGl0ZXJhdG9yLFxufSk7XG5cbmNvbnN0IHBhZ2luYXRpbmdFbmRwb2ludHMgPSBbXG4gICAgXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXNcIixcbiAgICBcIkdFVCAvYXBwL2luc3RhbGxhdGlvbnNcIixcbiAgICBcIkdFVCAvYXBwbGljYXRpb25zL2dyYW50c1wiLFxuICAgIFwiR0VUIC9hdXRob3JpemF0aW9uc1wiLFxuICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9vcmdhbml6YXRpb25zXCIsXG4gICAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lci1ncm91cHNcIixcbiAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcnVubmVyLWdyb3Vwcy97cnVubmVyX2dyb3VwX2lkfS9vcmdhbml6YXRpb25zXCIsXG4gICAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lci1ncm91cHMve3J1bm5lcl9ncm91cF9pZH0vcnVubmVyc1wiLFxuICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzXCIsXG4gICAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hdWRpdC1sb2dcIixcbiAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NlY3JldC1zY2FubmluZy9hbGVydHNcIixcbiAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIixcbiAgICBcIkdFVCAvZXZlbnRzXCIsXG4gICAgXCJHRVQgL2dpc3RzXCIsXG4gICAgXCJHRVQgL2dpc3RzL3B1YmxpY1wiLFxuICAgIFwiR0VUIC9naXN0cy9zdGFycmVkXCIsXG4gICAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50c1wiLFxuICAgIFwiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWl0c1wiLFxuICAgIFwiR0VUIC9naXN0cy97Z2lzdF9pZH0vZm9ya3NcIixcbiAgICBcIkdFVCAvaW5zdGFsbGF0aW9uL3JlcG9zaXRvcmllc1wiLFxuICAgIFwiR0VUIC9pc3N1ZXNcIixcbiAgICBcIkdFVCAvbGljZW5zZXNcIixcbiAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiLFxuICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnNcIixcbiAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICAgIFwiR0VUIC9uZXR3b3Jrcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIixcbiAgICBcIkdFVCAvbm90aWZpY2F0aW9uc1wiLFxuICAgIFwiR0VUIC9vcmdhbml6YXRpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9jYWNoZS91c2FnZS1ieS1yZXBvc2l0b3J5XCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lci1ncm91cHNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lci1ncm91cHMve3J1bm5lcl9ncm91cF9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXItZ3JvdXBzL3tydW5uZXJfZ3JvdXBfaWR9L3J1bm5lcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9hdWRpdC1sb2dcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3NcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9jcmVkZW50aWFsLWF1dGhvcml6YXRpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZXZlbnRzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZXh0ZXJuYWwtZ3JvdXBzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vZmFpbGVkX2ludml0YXRpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vaG9va3NcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L2luc3RhbGxhdGlvbnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfS90ZWFtc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L2lzc3Vlc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVyc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3JlcG9zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtLXN5bmMvZ3JvdXBzXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9pbnZpdGF0aW9uc1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNcIixcbiAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0c1wiLFxuICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zXCIsXG4gICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vdGVhbXNcIixcbiAgICBcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiLFxuICAgIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9yc1wiLFxuICAgIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcnRpZmFjdHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vam9ic1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vam9ic1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3NcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9L2Fubm90YXRpb25zXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9L2NoZWNrLXJ1bnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL2RldmNvbnRhaW5lcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L3B1bGxzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stcnVuc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXN1aXRlc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L3N0YXR1c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L3N0YXR1c2VzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L21hdGNoaW5nLXJlZnMve3JlZn1cIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3NcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvZXZlbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vZXZlbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vdGltZWxpbmVcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzL3ttaWxlc3RvbmVfbnVtYmVyfS9sYWJlbHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWl0c1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2ZpbGVzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmVxdWVzdGVkX3Jldmlld2Vyc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3NcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2NvbW1lbnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9hc3NldHNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vbG9jYXRpb25zXCIsXG4gICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaWJlcnNcIixcbiAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFnc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90ZWFtc1wiLFxuICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIixcbiAgICBcIkdFVCAvcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCIsXG4gICAgXCJHRVQgL3NlYXJjaC9jb2RlXCIsXG4gICAgXCJHRVQgL3NlYXJjaC9jb21taXRzXCIsXG4gICAgXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIixcbiAgICBcIkdFVCAvc2VhcmNoL2xhYmVsc1wiLFxuICAgIFwiR0VUIC9zZWFyY2gvcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL3NlYXJjaC90b3BpY3NcIixcbiAgICBcIkdFVCAvc2VhcmNoL3VzZXJzXCIsXG4gICAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9uc1wiLFxuICAgIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiLFxuICAgIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICAgIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2ludml0YXRpb25zXCIsXG4gICAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9tZW1iZXJzXCIsXG4gICAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9wcm9qZWN0c1wiLFxuICAgIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vcmVwb3NcIixcbiAgICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L3RlYW1zXCIsXG4gICAgXCJHRVQgL3VzZXIvYmxvY2tzXCIsXG4gICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlc1wiLFxuICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICAgIFwiR0VUIC91c2VyL2VtYWlsc1wiLFxuICAgIFwiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiLFxuICAgIFwiR0VUIC91c2VyL2ZvbGxvd2luZ1wiLFxuICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzXCIsXG4gICAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9uc1wiLFxuICAgIFwiR0VUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gICAgXCJHRVQgL3VzZXIvaXNzdWVzXCIsXG4gICAgXCJHRVQgL3VzZXIva2V5c1wiLFxuICAgIFwiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlc1wiLFxuICAgIFwiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlcy9zdHViYmVkXCIsXG4gICAgXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiLFxuICAgIFwiR0VUIC91c2VyL21pZ3JhdGlvbnNcIixcbiAgICBcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLFxuICAgIFwiR0VUIC91c2VyL29yZ3NcIixcbiAgICBcIkdFVCAvdXNlci9wYWNrYWdlc1wiLFxuICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLFxuICAgIFwiR0VUIC91c2VyL3JlcG9zXCIsXG4gICAgXCJHRVQgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9uc1wiLFxuICAgIFwiR0VUIC91c2VyL3N0YXJyZWRcIixcbiAgICBcIkdFVCAvdXNlci9zdWJzY3JpcHRpb25zXCIsXG4gICAgXCJHRVQgL3VzZXIvdGVhbXNcIixcbiAgICBcIkdFVCAvdXNlcnNcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHNcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHMvb3Jncy97b3JnfVwiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dlcnNcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmdcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2dwZ19rZXlzXCIsXG4gICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0va2V5c1wiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L29yZ3NcIixcbiAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3Byb2plY3RzXCIsXG4gICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCIsXG4gICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzL3B1YmxpY1wiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlcG9zXCIsXG4gICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3RhcnJlZFwiLFxuICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3N1YnNjcmlwdGlvbnNcIixcbl07XG5cbmZ1bmN0aW9uIGlzUGFnaW5hdGluZ0VuZHBvaW50KGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBwYWdpbmF0aW5nRW5kcG9pbnRzLmluY2x1ZGVzKGFyZyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBvY3Rva2l0IE9jdG9raXQgaW5zdGFuY2VcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgcGFzc2VkIHRvIE9jdG9raXQgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gcGFnaW5hdGVSZXN0KG9jdG9raXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwYWdpbmF0ZTogT2JqZWN0LmFzc2lnbihwYWdpbmF0ZS5iaW5kKG51bGwsIG9jdG9raXQpLCB7XG4gICAgICAgICAgICBpdGVyYXRvcjogaXRlcmF0b3IuYmluZChudWxsLCBvY3Rva2l0KSxcbiAgICAgICAgfSksXG4gICAgfTtcbn1cbnBhZ2luYXRlUmVzdC5WRVJTSU9OID0gVkVSU0lPTjtcblxuZXhwb3J0IHsgY29tcG9zZVBhZ2luYXRlUmVzdCwgaXNQYWdpbmF0aW5nRW5kcG9pbnQsIHBhZ2luYXRlUmVzdCwgcGFnaW5hdGluZ0VuZHBvaW50cyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///21665\n')},66802:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ legacyRestEndpointMethods: () => (/* binding */ legacyRestEndpointMethods),\n/* harmony export */ restEndpointMethods: () => (/* binding */ restEndpointMethods)\n/* harmony export */ });\nconst Endpoints = {\n actions: {\n addCustomLabelsToSelfHostedRunnerForOrg: [\n "POST /orgs/{org}/actions/runners/{runner_id}/labels",\n ],\n addCustomLabelsToSelfHostedRunnerForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels",\n ],\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}",\n ],\n approveWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve",\n ],\n cancelWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel",\n ],\n createOrUpdateEnvironmentSecret: [\n "PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}",\n ],\n createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",\n ],\n createRegistrationTokenForOrg: [\n "POST /orgs/{org}/actions/runners/registration-token",\n ],\n createRegistrationTokenForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/registration-token",\n ],\n createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"],\n createRemoveTokenForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/remove-token",\n ],\n createWorkflowDispatch: [\n "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches",\n ],\n deleteActionsCacheById: [\n "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}",\n ],\n deleteActionsCacheByKey: [\n "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}",\n ],\n deleteArtifact: [\n "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}",\n ],\n deleteEnvironmentSecret: [\n "DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}",\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",\n ],\n deleteSelfHostedRunnerFromOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}",\n ],\n deleteSelfHostedRunnerFromRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}",\n ],\n deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],\n deleteWorkflowRunLogs: [\n "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs",\n ],\n disableSelectedRepositoryGithubActionsOrganization: [\n "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}",\n ],\n disableWorkflow: [\n "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable",\n ],\n downloadArtifact: [\n "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}",\n ],\n downloadJobLogsForWorkflowRun: [\n "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs",\n ],\n downloadWorkflowRunAttemptLogs: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs",\n ],\n downloadWorkflowRunLogs: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs",\n ],\n enableSelectedRepositoryGithubActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}",\n ],\n enableWorkflow: [\n "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable",\n ],\n getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],\n getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],\n getActionsCacheUsageByRepoForOrg: [\n "GET /orgs/{org}/actions/cache/usage-by-repository",\n ],\n getActionsCacheUsageForEnterprise: [\n "GET /enterprises/{enterprise}/actions/cache/usage",\n ],\n getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],\n getAllowedActionsOrganization: [\n "GET /orgs/{org}/actions/permissions/selected-actions",\n ],\n getAllowedActionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/selected-actions",\n ],\n getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],\n getEnvironmentPublicKey: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key",\n ],\n getEnvironmentSecret: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}",\n ],\n getGithubActionsDefaultWorkflowPermissionsEnterprise: [\n "GET /enterprises/{enterprise}/actions/permissions/workflow",\n ],\n getGithubActionsDefaultWorkflowPermissionsOrganization: [\n "GET /orgs/{org}/actions/permissions/workflow",\n ],\n getGithubActionsDefaultWorkflowPermissionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/workflow",\n ],\n getGithubActionsPermissionsOrganization: [\n "GET /orgs/{org}/actions/permissions",\n ],\n getGithubActionsPermissionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions",\n ],\n getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],\n getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"],\n getPendingDeploymentsForRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments",\n ],\n getRepoPermissions: [\n "GET /repos/{owner}/{repo}/actions/permissions",\n {},\n { renamed: ["actions", "getGithubActionsPermissionsRepository"] },\n ],\n getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"],\n getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],\n getReviewsForRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals",\n ],\n getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"],\n getSelfHostedRunnerForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/{runner_id}",\n ],\n getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],\n getWorkflowAccessToRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/access",\n ],\n getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],\n getWorkflowRunAttempt: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}",\n ],\n getWorkflowRunUsage: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing",\n ],\n getWorkflowUsage: [\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing",\n ],\n listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"],\n listEnvironmentSecrets: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets",\n ],\n listJobsForWorkflowRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs",\n ],\n listJobsForWorkflowRunAttempt: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs",\n ],\n listLabelsForSelfHostedRunnerForOrg: [\n "GET /orgs/{org}/actions/runners/{runner_id}/labels",\n ],\n listLabelsForSelfHostedRunnerForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels",\n ],\n listOrgSecrets: ["GET /orgs/{org}/actions/secrets"],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"],\n listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"],\n listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"],\n listRunnerApplicationsForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/downloads",\n ],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/actions/secrets/{secret_name}/repositories",\n ],\n listSelectedRepositoriesEnabledGithubActionsOrganization: [\n "GET /orgs/{org}/actions/permissions/repositories",\n ],\n listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"],\n listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"],\n listWorkflowRunArtifacts: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts",\n ],\n listWorkflowRuns: [\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",\n ],\n listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"],\n reRunJobForWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun",\n ],\n reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],\n reRunWorkflowFailedJobs: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}/labels",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels",\n ],\n removeCustomLabelFromSelfHostedRunnerForOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}",\n ],\n removeCustomLabelFromSelfHostedRunnerForRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}",\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}",\n ],\n reviewPendingDeploymentsForRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments",\n ],\n setAllowedActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/selected-actions",\n ],\n setAllowedActionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions",\n ],\n setCustomLabelsForSelfHostedRunnerForOrg: [\n "PUT /orgs/{org}/actions/runners/{runner_id}/labels",\n ],\n setCustomLabelsForSelfHostedRunnerForRepo: [\n "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels",\n ],\n setGithubActionsDefaultWorkflowPermissionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions/workflow",\n ],\n setGithubActionsDefaultWorkflowPermissionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/workflow",\n ],\n setGithubActionsDefaultWorkflowPermissionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/workflow",\n ],\n setGithubActionsPermissionsOrganization: [\n "PUT /orgs/{org}/actions/permissions",\n ],\n setGithubActionsPermissionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions",\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories",\n ],\n setSelectedRepositoriesEnabledGithubActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/repositories",\n ],\n setWorkflowAccessToRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/access",\n ],\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"],\n deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"],\n deleteThreadSubscription: [\n "DELETE /notifications/threads/{thread_id}/subscription",\n ],\n getFeeds: ["GET /feeds"],\n getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"],\n getThread: ["GET /notifications/threads/{thread_id}"],\n getThreadSubscriptionForAuthenticatedUser: [\n "GET /notifications/threads/{thread_id}/subscription",\n ],\n listEventsForAuthenticatedUser: ["GET /users/{username}/events"],\n listNotificationsForAuthenticatedUser: ["GET /notifications"],\n listOrgEventsForAuthenticatedUser: [\n "GET /users/{username}/events/orgs/{org}",\n ],\n listPublicEvents: ["GET /events"],\n listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"],\n listPublicEventsForUser: ["GET /users/{username}/events/public"],\n listPublicOrgEvents: ["GET /orgs/{org}/events"],\n listReceivedEventsForUser: ["GET /users/{username}/received_events"],\n listReceivedPublicEventsForUser: [\n "GET /users/{username}/received_events/public",\n ],\n listRepoEvents: ["GET /repos/{owner}/{repo}/events"],\n listRepoNotificationsForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/notifications",\n ],\n listReposStarredByAuthenticatedUser: ["GET /user/starred"],\n listReposStarredByUser: ["GET /users/{username}/starred"],\n listReposWatchedByUser: ["GET /users/{username}/subscriptions"],\n listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"],\n listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"],\n listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"],\n markNotificationsAsRead: ["PUT /notifications"],\n markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"],\n markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"],\n setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"],\n setThreadSubscription: [\n "PUT /notifications/threads/{thread_id}/subscription",\n ],\n starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"],\n unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"],\n },\n apps: {\n addRepoToInstallation: [\n "PUT /user/installations/{installation_id}/repositories/{repository_id}",\n {},\n { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] },\n ],\n addRepoToInstallationForAuthenticatedUser: [\n "PUT /user/installations/{installation_id}/repositories/{repository_id}",\n ],\n checkToken: ["POST /applications/{client_id}/token"],\n createFromManifest: ["POST /app-manifests/{code}/conversions"],\n createInstallationAccessToken: [\n "POST /app/installations/{installation_id}/access_tokens",\n ],\n deleteAuthorization: ["DELETE /applications/{client_id}/grant"],\n deleteInstallation: ["DELETE /app/installations/{installation_id}"],\n deleteToken: ["DELETE /applications/{client_id}/token"],\n getAuthenticated: ["GET /app"],\n getBySlug: ["GET /apps/{app_slug}"],\n getInstallation: ["GET /app/installations/{installation_id}"],\n getOrgInstallation: ["GET /orgs/{org}/installation"],\n getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"],\n getSubscriptionPlanForAccount: [\n "GET /marketplace_listing/accounts/{account_id}",\n ],\n getSubscriptionPlanForAccountStubbed: [\n "GET /marketplace_listing/stubbed/accounts/{account_id}",\n ],\n getUserInstallation: ["GET /users/{username}/installation"],\n getWebhookConfigForApp: ["GET /app/hook/config"],\n getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],\n listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"],\n listAccountsForPlanStubbed: [\n "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts",\n ],\n listInstallationReposForAuthenticatedUser: [\n "GET /user/installations/{installation_id}/repositories",\n ],\n listInstallations: ["GET /app/installations"],\n listInstallationsForAuthenticatedUser: ["GET /user/installations"],\n listPlans: ["GET /marketplace_listing/plans"],\n listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"],\n listReposAccessibleToInstallation: ["GET /installation/repositories"],\n listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"],\n listSubscriptionsForAuthenticatedUserStubbed: [\n "GET /user/marketplace_purchases/stubbed",\n ],\n listWebhookDeliveries: ["GET /app/hook/deliveries"],\n redeliverWebhookDelivery: [\n "POST /app/hook/deliveries/{delivery_id}/attempts",\n ],\n removeRepoFromInstallation: [\n "DELETE /user/installations/{installation_id}/repositories/{repository_id}",\n {},\n { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] },\n ],\n removeRepoFromInstallationForAuthenticatedUser: [\n "DELETE /user/installations/{installation_id}/repositories/{repository_id}",\n ],\n resetToken: ["PATCH /applications/{client_id}/token"],\n revokeInstallationAccessToken: ["DELETE /installation/token"],\n scopeToken: ["POST /applications/{client_id}/token/scoped"],\n suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"],\n unsuspendInstallation: [\n "DELETE /app/installations/{installation_id}/suspended",\n ],\n updateWebhookConfigForApp: ["PATCH /app/hook/config"],\n },\n billing: {\n getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"],\n getGithubActionsBillingUser: [\n "GET /users/{username}/settings/billing/actions",\n ],\n getGithubAdvancedSecurityBillingGhe: [\n "GET /enterprises/{enterprise}/settings/billing/advanced-security",\n ],\n getGithubAdvancedSecurityBillingOrg: [\n "GET /orgs/{org}/settings/billing/advanced-security",\n ],\n getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"],\n getGithubPackagesBillingUser: [\n "GET /users/{username}/settings/billing/packages",\n ],\n getSharedStorageBillingOrg: [\n "GET /orgs/{org}/settings/billing/shared-storage",\n ],\n getSharedStorageBillingUser: [\n "GET /users/{username}/settings/billing/shared-storage",\n ],\n },\n checks: {\n create: ["POST /repos/{owner}/{repo}/check-runs"],\n createSuite: ["POST /repos/{owner}/{repo}/check-suites"],\n get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],\n getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],\n listAnnotations: [\n "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations",\n ],\n listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],\n listForSuite: [\n "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs",\n ],\n listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],\n rerequestRun: [\n "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest",\n ],\n rerequestSuite: [\n "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest",\n ],\n setSuitesPreferences: [\n "PATCH /repos/{owner}/{repo}/check-suites/preferences",\n ],\n update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"],\n },\n codeScanning: {\n deleteAnalysis: [\n "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}",\n ],\n getAlert: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",\n {},\n { renamedParameters: { alert_id: "alert_number" } },\n ],\n getAnalysis: [\n "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}",\n ],\n getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],\n listAlertInstances: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n ],\n listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"],\n listAlertsInstances: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n {},\n { renamed: ["codeScanning", "listAlertInstances"] },\n ],\n listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",\n ],\n uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"],\n },\n codesOfConduct: {\n getAllCodesOfConduct: ["GET /codes_of_conduct"],\n getConductCode: ["GET /codes_of_conduct/{key}"],\n },\n codespaces: {\n addRepositoryForSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}",\n ],\n codespaceMachinesForAuthenticatedUser: [\n "GET /user/codespaces/{codespace_name}/machines",\n ],\n createForAuthenticatedUser: ["POST /user/codespaces"],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}",\n ],\n createOrUpdateSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}",\n ],\n createWithPrForAuthenticatedUser: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces",\n ],\n createWithRepoForAuthenticatedUser: [\n "POST /repos/{owner}/{repo}/codespaces",\n ],\n deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],\n deleteFromOrganization: [\n "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}",\n ],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}",\n ],\n deleteSecretForAuthenticatedUser: [\n "DELETE /user/codespaces/secrets/{secret_name}",\n ],\n exportForAuthenticatedUser: [\n "POST /user/codespaces/{codespace_name}/exports",\n ],\n getExportDetailsForAuthenticatedUser: [\n "GET /user/codespaces/{codespace_name}/exports/{export_id}",\n ],\n getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],\n getPublicKeyForAuthenticatedUser: [\n "GET /user/codespaces/secrets/public-key",\n ],\n getRepoPublicKey: [\n "GET /repos/{owner}/{repo}/codespaces/secrets/public-key",\n ],\n getRepoSecret: [\n "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}",\n ],\n getSecretForAuthenticatedUser: [\n "GET /user/codespaces/secrets/{secret_name}",\n ],\n listDevcontainersInRepositoryForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/devcontainers",\n ],\n listForAuthenticatedUser: ["GET /user/codespaces"],\n listInOrganization: [\n "GET /orgs/{org}/codespaces",\n {},\n { renamedParameters: { org_id: "org" } },\n ],\n listInRepositoryForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces",\n ],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],\n listRepositoriesForSecretForAuthenticatedUser: [\n "GET /user/codespaces/secrets/{secret_name}/repositories",\n ],\n listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],\n removeRepositoryForSecretForAuthenticatedUser: [\n "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}",\n ],\n repoMachinesForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/machines",\n ],\n setRepositoriesForSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}/repositories",\n ],\n startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],\n stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],\n stopInOrganization: [\n "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop",\n ],\n updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"],\n },\n dependabot: {\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}",\n ],\n createOrUpdateOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}",\n ],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}",\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}",\n ],\n getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],\n getRepoPublicKey: [\n "GET /repos/{owner}/{repo}/dependabot/secrets/public-key",\n ],\n getRepoSecret: [\n "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}",\n ],\n listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories",\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}",\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories",\n ],\n },\n dependencyGraph: {\n createRepositorySnapshot: [\n "POST /repos/{owner}/{repo}/dependency-graph/snapshots",\n ],\n diffRange: [\n "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}",\n ],\n },\n emojis: { get: ["GET /emojis"] },\n enterpriseAdmin: {\n addCustomLabelsToSelfHostedRunnerForEnterprise: [\n "POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels",\n ],\n disableSelectedOrganizationGithubActionsEnterprise: [\n "DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}",\n ],\n enableSelectedOrganizationGithubActionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}",\n ],\n getAllowedActionsEnterprise: [\n "GET /enterprises/{enterprise}/actions/permissions/selected-actions",\n ],\n getGithubActionsPermissionsEnterprise: [\n "GET /enterprises/{enterprise}/actions/permissions",\n ],\n getServerStatistics: [\n "GET /enterprise-installation/{enterprise_or_org}/server-statistics",\n ],\n listLabelsForSelfHostedRunnerForEnterprise: [\n "GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels",\n ],\n listSelectedOrganizationsEnabledGithubActionsEnterprise: [\n "GET /enterprises/{enterprise}/actions/permissions/organizations",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: [\n "DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels",\n ],\n removeCustomLabelFromSelfHostedRunnerForEnterprise: [\n "DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}",\n ],\n setAllowedActionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions/selected-actions",\n ],\n setCustomLabelsForSelfHostedRunnerForEnterprise: [\n "PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels",\n ],\n setGithubActionsPermissionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions",\n ],\n setSelectedOrganizationsEnabledGithubActionsEnterprise: [\n "PUT /enterprises/{enterprise}/actions/permissions/organizations",\n ],\n },\n gists: {\n checkIsStarred: ["GET /gists/{gist_id}/star"],\n create: ["POST /gists"],\n createComment: ["POST /gists/{gist_id}/comments"],\n delete: ["DELETE /gists/{gist_id}"],\n deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"],\n fork: ["POST /gists/{gist_id}/forks"],\n get: ["GET /gists/{gist_id}"],\n getComment: ["GET /gists/{gist_id}/comments/{comment_id}"],\n getRevision: ["GET /gists/{gist_id}/{sha}"],\n list: ["GET /gists"],\n listComments: ["GET /gists/{gist_id}/comments"],\n listCommits: ["GET /gists/{gist_id}/commits"],\n listForUser: ["GET /users/{username}/gists"],\n listForks: ["GET /gists/{gist_id}/forks"],\n listPublic: ["GET /gists/public"],\n listStarred: ["GET /gists/starred"],\n star: ["PUT /gists/{gist_id}/star"],\n unstar: ["DELETE /gists/{gist_id}/star"],\n update: ["PATCH /gists/{gist_id}"],\n updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"],\n },\n git: {\n createBlob: ["POST /repos/{owner}/{repo}/git/blobs"],\n createCommit: ["POST /repos/{owner}/{repo}/git/commits"],\n createRef: ["POST /repos/{owner}/{repo}/git/refs"],\n createTag: ["POST /repos/{owner}/{repo}/git/tags"],\n createTree: ["POST /repos/{owner}/{repo}/git/trees"],\n deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],\n getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],\n getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],\n getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"],\n getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],\n getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],\n listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],\n updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"],\n },\n gitignore: {\n getAllTemplates: ["GET /gitignore/templates"],\n getTemplate: ["GET /gitignore/templates/{name}"],\n },\n interactions: {\n getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"],\n getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"],\n getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"],\n getRestrictionsForYourPublicRepos: [\n "GET /user/interaction-limits",\n {},\n { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] },\n ],\n removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"],\n removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"],\n removeRestrictionsForRepo: [\n "DELETE /repos/{owner}/{repo}/interaction-limits",\n ],\n removeRestrictionsForYourPublicRepos: [\n "DELETE /user/interaction-limits",\n {},\n { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] },\n ],\n setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"],\n setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"],\n setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"],\n setRestrictionsForYourPublicRepos: [\n "PUT /user/interaction-limits",\n {},\n { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] },\n ],\n },\n issues: {\n addAssignees: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees",\n ],\n addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],\n checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"],\n create: ["POST /repos/{owner}/{repo}/issues"],\n createComment: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/comments",\n ],\n createLabel: ["POST /repos/{owner}/{repo}/labels"],\n createMilestone: ["POST /repos/{owner}/{repo}/milestones"],\n deleteComment: [\n "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}",\n ],\n deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"],\n deleteMilestone: [\n "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}",\n ],\n get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"],\n getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],\n getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"],\n getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"],\n getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],\n list: ["GET /issues"],\n listAssignees: ["GET /repos/{owner}/{repo}/assignees"],\n listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],\n listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"],\n listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],\n listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"],\n listEventsForTimeline: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline",\n ],\n listForAuthenticatedUser: ["GET /user/issues"],\n listForOrg: ["GET /orgs/{org}/issues"],\n listForRepo: ["GET /repos/{owner}/{repo}/issues"],\n listLabelsForMilestone: [\n "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels",\n ],\n listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"],\n listLabelsOnIssue: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/labels",\n ],\n listMilestones: ["GET /repos/{owner}/{repo}/milestones"],\n lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],\n removeAllLabels: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels",\n ],\n removeAssignees: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees",\n ],\n removeLabel: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}",\n ],\n setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],\n unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],\n update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],\n updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],\n updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"],\n updateMilestone: [\n "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}",\n ],\n },\n licenses: {\n get: ["GET /licenses/{license}"],\n getAllCommonlyUsed: ["GET /licenses"],\n getForRepo: ["GET /repos/{owner}/{repo}/license"],\n },\n markdown: {\n render: ["POST /markdown"],\n renderRaw: [\n "POST /markdown/raw",\n { headers: { "content-type": "text/plain; charset=utf-8" } },\n ],\n },\n meta: {\n get: ["GET /meta"],\n getOctocat: ["GET /octocat"],\n getZen: ["GET /zen"],\n root: ["GET /"],\n },\n migrations: {\n cancelImport: ["DELETE /repos/{owner}/{repo}/import"],\n deleteArchiveForAuthenticatedUser: [\n "DELETE /user/migrations/{migration_id}/archive",\n ],\n deleteArchiveForOrg: [\n "DELETE /orgs/{org}/migrations/{migration_id}/archive",\n ],\n downloadArchiveForOrg: [\n "GET /orgs/{org}/migrations/{migration_id}/archive",\n ],\n getArchiveForAuthenticatedUser: [\n "GET /user/migrations/{migration_id}/archive",\n ],\n getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"],\n getImportStatus: ["GET /repos/{owner}/{repo}/import"],\n getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"],\n getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"],\n getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],\n listForAuthenticatedUser: ["GET /user/migrations"],\n listForOrg: ["GET /orgs/{org}/migrations"],\n listReposForAuthenticatedUser: [\n "GET /user/migrations/{migration_id}/repositories",\n ],\n listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],\n listReposForUser: [\n "GET /user/migrations/{migration_id}/repositories",\n {},\n { renamed: ["migrations", "listReposForAuthenticatedUser"] },\n ],\n mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"],\n setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"],\n startForAuthenticatedUser: ["POST /user/migrations"],\n startForOrg: ["POST /orgs/{org}/migrations"],\n startImport: ["PUT /repos/{owner}/{repo}/import"],\n unlockRepoForAuthenticatedUser: [\n "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock",\n ],\n unlockRepoForOrg: [\n "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock",\n ],\n updateImport: ["PATCH /repos/{owner}/{repo}/import"],\n },\n orgs: {\n blockUser: ["PUT /orgs/{org}/blocks/{username}"],\n cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"],\n checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"],\n checkMembershipForUser: ["GET /orgs/{org}/members/{username}"],\n checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"],\n convertMemberToOutsideCollaborator: [\n "PUT /orgs/{org}/outside_collaborators/{username}",\n ],\n createInvitation: ["POST /orgs/{org}/invitations"],\n createWebhook: ["POST /orgs/{org}/hooks"],\n deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],\n get: ["GET /orgs/{org}"],\n getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"],\n getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"],\n getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"],\n getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"],\n getWebhookDelivery: [\n "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}",\n ],\n list: ["GET /organizations"],\n listAppInstallations: ["GET /orgs/{org}/installations"],\n listBlockedUsers: ["GET /orgs/{org}/blocks"],\n listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"],\n listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],\n listForAuthenticatedUser: ["GET /user/orgs"],\n listForUser: ["GET /users/{username}/orgs"],\n listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"],\n listMembers: ["GET /orgs/{org}/members"],\n listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"],\n listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"],\n listPendingInvitations: ["GET /orgs/{org}/invitations"],\n listPublicMembers: ["GET /orgs/{org}/public_members"],\n listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],\n listWebhooks: ["GET /orgs/{org}/hooks"],\n pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],\n redeliverWebhookDelivery: [\n "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts",\n ],\n removeMember: ["DELETE /orgs/{org}/members/{username}"],\n removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"],\n removeOutsideCollaborator: [\n "DELETE /orgs/{org}/outside_collaborators/{username}",\n ],\n removePublicMembershipForAuthenticatedUser: [\n "DELETE /orgs/{org}/public_members/{username}",\n ],\n setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],\n setPublicMembershipForAuthenticatedUser: [\n "PUT /orgs/{org}/public_members/{username}",\n ],\n unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],\n update: ["PATCH /orgs/{org}"],\n updateMembershipForAuthenticatedUser: [\n "PATCH /user/memberships/orgs/{org}",\n ],\n updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"],\n updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"],\n },\n packages: {\n deletePackageForAuthenticatedUser: [\n "DELETE /user/packages/{package_type}/{package_name}",\n ],\n deletePackageForOrg: [\n "DELETE /orgs/{org}/packages/{package_type}/{package_name}",\n ],\n deletePackageForUser: [\n "DELETE /users/{username}/packages/{package_type}/{package_name}",\n ],\n deletePackageVersionForAuthenticatedUser: [\n "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n deletePackageVersionForOrg: [\n "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n deletePackageVersionForUser: [\n "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n getAllPackageVersionsForAPackageOwnedByAnOrg: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n {},\n { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] },\n ],\n getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions",\n {},\n {\n renamed: [\n "packages",\n "getAllPackageVersionsForPackageOwnedByAuthenticatedUser",\n ],\n },\n ],\n getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions",\n ],\n getAllPackageVersionsForPackageOwnedByOrg: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n ],\n getAllPackageVersionsForPackageOwnedByUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}/versions",\n ],\n getPackageForAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}",\n ],\n getPackageForOrganization: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}",\n ],\n getPackageForUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}",\n ],\n getPackageVersionForAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n getPackageVersionForOrganization: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n getPackageVersionForUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}",\n ],\n listPackagesForAuthenticatedUser: ["GET /user/packages"],\n listPackagesForOrganization: ["GET /orgs/{org}/packages"],\n listPackagesForUser: ["GET /users/{username}/packages"],\n restorePackageForAuthenticatedUser: [\n "POST /user/packages/{package_type}/{package_name}/restore{?token}",\n ],\n restorePackageForOrg: [\n "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}",\n ],\n restorePackageForUser: [\n "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}",\n ],\n restorePackageVersionForAuthenticatedUser: [\n "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore",\n ],\n restorePackageVersionForOrg: [\n "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore",\n ],\n restorePackageVersionForUser: [\n "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore",\n ],\n },\n projects: {\n addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],\n createCard: ["POST /projects/columns/{column_id}/cards"],\n createColumn: ["POST /projects/{project_id}/columns"],\n createForAuthenticatedUser: ["POST /user/projects"],\n createForOrg: ["POST /orgs/{org}/projects"],\n createForRepo: ["POST /repos/{owner}/{repo}/projects"],\n delete: ["DELETE /projects/{project_id}"],\n deleteCard: ["DELETE /projects/columns/cards/{card_id}"],\n deleteColumn: ["DELETE /projects/columns/{column_id}"],\n get: ["GET /projects/{project_id}"],\n getCard: ["GET /projects/columns/cards/{card_id}"],\n getColumn: ["GET /projects/columns/{column_id}"],\n getPermissionForUser: [\n "GET /projects/{project_id}/collaborators/{username}/permission",\n ],\n listCards: ["GET /projects/columns/{column_id}/cards"],\n listCollaborators: ["GET /projects/{project_id}/collaborators"],\n listColumns: ["GET /projects/{project_id}/columns"],\n listForOrg: ["GET /orgs/{org}/projects"],\n listForRepo: ["GET /repos/{owner}/{repo}/projects"],\n listForUser: ["GET /users/{username}/projects"],\n moveCard: ["POST /projects/columns/cards/{card_id}/moves"],\n moveColumn: ["POST /projects/columns/{column_id}/moves"],\n removeCollaborator: [\n "DELETE /projects/{project_id}/collaborators/{username}",\n ],\n update: ["PATCH /projects/{project_id}"],\n updateCard: ["PATCH /projects/columns/cards/{card_id}"],\n updateColumn: ["PATCH /projects/columns/{column_id}"],\n },\n pulls: {\n checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],\n create: ["POST /repos/{owner}/{repo}/pulls"],\n createReplyForReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies",\n ],\n createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],\n createReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments",\n ],\n deletePendingReview: [\n "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}",\n ],\n deleteReviewComment: [\n "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}",\n ],\n dismissReview: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals",\n ],\n get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"],\n getReview: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}",\n ],\n getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],\n list: ["GET /repos/{owner}/{repo}/pulls"],\n listCommentsForReview: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments",\n ],\n listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],\n listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],\n listRequestedReviewers: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",\n ],\n listReviewComments: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments",\n ],\n listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"],\n listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],\n merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],\n removeRequestedReviewers: [\n "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",\n ],\n requestReviewers: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",\n ],\n submitReview: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events",\n ],\n update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],\n updateBranch: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch",\n ],\n updateReview: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}",\n ],\n updateReviewComment: [\n "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}",\n ],\n },\n rateLimit: { get: ["GET /rate_limit"] },\n reactions: {\n createForCommitComment: [\n "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions",\n ],\n createForIssue: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions",\n ],\n createForIssueComment: [\n "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",\n ],\n createForPullRequestReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",\n ],\n createForRelease: [\n "POST /repos/{owner}/{repo}/releases/{release_id}/reactions",\n ],\n createForTeamDiscussionCommentInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n ],\n createForTeamDiscussionInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",\n ],\n deleteForCommitComment: [\n "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}",\n ],\n deleteForIssue: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}",\n ],\n deleteForIssueComment: [\n "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}",\n ],\n deleteForPullRequestComment: [\n "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}",\n ],\n deleteForRelease: [\n "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}",\n ],\n deleteForTeamDiscussion: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}",\n ],\n deleteForTeamDiscussionComment: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}",\n ],\n listForCommitComment: [\n "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions",\n ],\n listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],\n listForIssueComment: [\n "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",\n ],\n listForPullRequestReviewComment: [\n "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",\n ],\n listForRelease: [\n "GET /repos/{owner}/{repo}/releases/{release_id}/reactions",\n ],\n listForTeamDiscussionCommentInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n ],\n listForTeamDiscussionInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",\n ],\n },\n repos: {\n acceptInvitation: [\n "PATCH /user/repository_invitations/{invitation_id}",\n {},\n { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] },\n ],\n acceptInvitationForAuthenticatedUser: [\n "PATCH /user/repository_invitations/{invitation_id}",\n ],\n addAppAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" },\n ],\n addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"],\n addStatusCheckContexts: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" },\n ],\n addTeamAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" },\n ],\n addUserAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" },\n ],\n checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"],\n checkVulnerabilityAlerts: [\n "GET /repos/{owner}/{repo}/vulnerability-alerts",\n ],\n codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],\n compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],\n compareCommitsWithBasehead: [\n "GET /repos/{owner}/{repo}/compare/{basehead}",\n ],\n createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],\n createCommitComment: [\n "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments",\n ],\n createCommitSignatureProtection: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures",\n ],\n createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"],\n createDeployKey: ["POST /repos/{owner}/{repo}/keys"],\n createDeployment: ["POST /repos/{owner}/{repo}/deployments"],\n createDeploymentStatus: [\n "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",\n ],\n createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"],\n createForAuthenticatedUser: ["POST /user/repos"],\n createFork: ["POST /repos/{owner}/{repo}/forks"],\n createInOrg: ["POST /orgs/{org}/repos"],\n createOrUpdateEnvironment: [\n "PUT /repos/{owner}/{repo}/environments/{environment_name}",\n ],\n createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"],\n createPagesSite: ["POST /repos/{owner}/{repo}/pages"],\n createRelease: ["POST /repos/{owner}/{repo}/releases"],\n createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],\n createUsingTemplate: [\n "POST /repos/{template_owner}/{template_repo}/generate",\n ],\n createWebhook: ["POST /repos/{owner}/{repo}/hooks"],\n declineInvitation: [\n "DELETE /user/repository_invitations/{invitation_id}",\n {},\n { renamed: ["repos", "declineInvitationForAuthenticatedUser"] },\n ],\n declineInvitationForAuthenticatedUser: [\n "DELETE /user/repository_invitations/{invitation_id}",\n ],\n delete: ["DELETE /repos/{owner}/{repo}"],\n deleteAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions",\n ],\n deleteAdminBranchProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins",\n ],\n deleteAnEnvironment: [\n "DELETE /repos/{owner}/{repo}/environments/{environment_name}",\n ],\n deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],\n deleteBranchProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection",\n ],\n deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],\n deleteCommitSignatureProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures",\n ],\n deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"],\n deleteDeployment: [\n "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}",\n ],\n deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"],\n deleteInvitation: [\n "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}",\n ],\n deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"],\n deletePullRequestReviewProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews",\n ],\n deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"],\n deleteReleaseAsset: [\n "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}",\n ],\n deleteTagProtection: [\n "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}",\n ],\n deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],\n disableAutomatedSecurityFixes: [\n "DELETE /repos/{owner}/{repo}/automated-security-fixes",\n ],\n disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"],\n disableVulnerabilityAlerts: [\n "DELETE /repos/{owner}/{repo}/vulnerability-alerts",\n ],\n downloadArchive: [\n "GET /repos/{owner}/{repo}/zipball/{ref}",\n {},\n { renamed: ["repos", "downloadZipballArchive"] },\n ],\n downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"],\n downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"],\n enableAutomatedSecurityFixes: [\n "PUT /repos/{owner}/{repo}/automated-security-fixes",\n ],\n enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"],\n enableVulnerabilityAlerts: [\n "PUT /repos/{owner}/{repo}/vulnerability-alerts",\n ],\n generateReleaseNotes: [\n "POST /repos/{owner}/{repo}/releases/generate-notes",\n ],\n get: ["GET /repos/{owner}/{repo}"],\n getAccessRestrictions: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions",\n ],\n getAdminBranchProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins",\n ],\n getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"],\n getAllStatusCheckContexts: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n ],\n getAllTopics: ["GET /repos/{owner}/{repo}/topics"],\n getAppsWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n ],\n getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],\n getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"],\n getBranchProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection",\n ],\n getClones: ["GET /repos/{owner}/{repo}/traffic/clones"],\n getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"],\n getCollaboratorPermissionLevel: [\n "GET /repos/{owner}/{repo}/collaborators/{username}/permission",\n ],\n getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"],\n getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"],\n getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"],\n getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"],\n getCommitSignatureProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures",\n ],\n getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"],\n getContent: ["GET /repos/{owner}/{repo}/contents/{path}"],\n getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"],\n getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"],\n getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],\n getDeploymentStatus: [\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}",\n ],\n getEnvironment: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}",\n ],\n getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"],\n getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"],\n getPages: ["GET /repos/{owner}/{repo}/pages"],\n getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],\n getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"],\n getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"],\n getPullRequestReviewProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews",\n ],\n getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"],\n getReadme: ["GET /repos/{owner}/{repo}/readme"],\n getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"],\n getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"],\n getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],\n getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"],\n getStatusChecksProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n ],\n getTeamsWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n ],\n getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"],\n getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"],\n getUsersWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n ],\n getViews: ["GET /repos/{owner}/{repo}/traffic/views"],\n getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"],\n getWebhookConfigForRepo: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/config",\n ],\n getWebhookDelivery: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}",\n ],\n listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],\n listBranches: ["GET /repos/{owner}/{repo}/branches"],\n listBranchesForHeadCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head",\n ],\n listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"],\n listCommentsForCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments",\n ],\n listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"],\n listCommitStatusesForRef: [\n "GET /repos/{owner}/{repo}/commits/{ref}/statuses",\n ],\n listCommits: ["GET /repos/{owner}/{repo}/commits"],\n listContributors: ["GET /repos/{owner}/{repo}/contributors"],\n listDeployKeys: ["GET /repos/{owner}/{repo}/keys"],\n listDeploymentStatuses: [\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",\n ],\n listDeployments: ["GET /repos/{owner}/{repo}/deployments"],\n listForAuthenticatedUser: ["GET /user/repos"],\n listForOrg: ["GET /orgs/{org}/repos"],\n listForUser: ["GET /users/{username}/repos"],\n listForks: ["GET /repos/{owner}/{repo}/forks"],\n listInvitations: ["GET /repos/{owner}/{repo}/invitations"],\n listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"],\n listLanguages: ["GET /repos/{owner}/{repo}/languages"],\n listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"],\n listPublic: ["GET /repositories"],\n listPullRequestsAssociatedWithCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",\n ],\n listReleaseAssets: [\n "GET /repos/{owner}/{repo}/releases/{release_id}/assets",\n ],\n listReleases: ["GET /repos/{owner}/{repo}/releases"],\n listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],\n listTags: ["GET /repos/{owner}/{repo}/tags"],\n listTeams: ["GET /repos/{owner}/{repo}/teams"],\n listWebhookDeliveries: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries",\n ],\n listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],\n merge: ["POST /repos/{owner}/{repo}/merges"],\n mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],\n pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],\n redeliverWebhookDelivery: [\n "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts",\n ],\n removeAppAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" },\n ],\n removeCollaborator: [\n "DELETE /repos/{owner}/{repo}/collaborators/{username}",\n ],\n removeStatusCheckContexts: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" },\n ],\n removeStatusCheckProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n ],\n removeTeamAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" },\n ],\n removeUserAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" },\n ],\n renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"],\n replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"],\n requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"],\n setAdminBranchProtection: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins",\n ],\n setAppAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" },\n ],\n setStatusCheckContexts: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" },\n ],\n setTeamAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" },\n ],\n setUserAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" },\n ],\n testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],\n transfer: ["POST /repos/{owner}/{repo}/transfer"],\n update: ["PATCH /repos/{owner}/{repo}"],\n updateBranchProtection: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection",\n ],\n updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],\n updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"],\n updateInvitation: [\n "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}",\n ],\n updatePullRequestReviewProtection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews",\n ],\n updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"],\n updateReleaseAsset: [\n "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}",\n ],\n updateStatusCheckPotection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n {},\n { renamed: ["repos", "updateStatusCheckProtection"] },\n ],\n updateStatusCheckProtection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n ],\n updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],\n updateWebhookConfigForRepo: [\n "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config",\n ],\n uploadReleaseAsset: [\n "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",\n { baseUrl: "https://uploads.github.com" },\n ],\n },\n search: {\n code: ["GET /search/code"],\n commits: ["GET /search/commits"],\n issuesAndPullRequests: ["GET /search/issues"],\n labels: ["GET /search/labels"],\n repos: ["GET /search/repositories"],\n topics: ["GET /search/topics"],\n users: ["GET /search/users"],\n },\n secretScanning: {\n getAlert: [\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}",\n ],\n listAlertsForEnterprise: [\n "GET /enterprises/{enterprise}/secret-scanning/alerts",\n ],\n listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],\n listLocationsForAlert: [\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations",\n ],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}",\n ],\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}",\n ],\n addOrUpdateProjectPermissionsInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}",\n ],\n addOrUpdateRepoPermissionsInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}",\n ],\n checkPermissionsForProjectInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/projects/{project_id}",\n ],\n checkPermissionsForRepoInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}",\n ],\n create: ["POST /orgs/{org}/teams"],\n createDiscussionCommentInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",\n ],\n createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"],\n deleteDiscussionCommentInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}",\n ],\n deleteDiscussionInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}",\n ],\n deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"],\n getByName: ["GET /orgs/{org}/teams/{team_slug}"],\n getDiscussionCommentInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}",\n ],\n getDiscussionInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}",\n ],\n getMembershipForUserInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/memberships/{username}",\n ],\n list: ["GET /orgs/{org}/teams"],\n listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"],\n listDiscussionCommentsInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",\n ],\n listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"],\n listForAuthenticatedUser: ["GET /user/teams"],\n listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"],\n listPendingInvitationsInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/invitations",\n ],\n listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"],\n listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"],\n removeMembershipForUserInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}",\n ],\n removeProjectInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}",\n ],\n removeRepoInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}",\n ],\n updateDiscussionCommentInOrg: [\n "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}",\n ],\n updateDiscussionInOrg: [\n "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}",\n ],\n updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"],\n },\n users: {\n addEmailForAuthenticated: [\n "POST /user/emails",\n {},\n { renamed: ["users", "addEmailForAuthenticatedUser"] },\n ],\n addEmailForAuthenticatedUser: ["POST /user/emails"],\n block: ["PUT /user/blocks/{username}"],\n checkBlocked: ["GET /user/blocks/{username}"],\n checkFollowingForUser: ["GET /users/{username}/following/{target_user}"],\n checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"],\n createGpgKeyForAuthenticated: [\n "POST /user/gpg_keys",\n {},\n { renamed: ["users", "createGpgKeyForAuthenticatedUser"] },\n ],\n createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],\n createPublicSshKeyForAuthenticated: [\n "POST /user/keys",\n {},\n { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] },\n ],\n createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],\n deleteEmailForAuthenticated: [\n "DELETE /user/emails",\n {},\n { renamed: ["users", "deleteEmailForAuthenticatedUser"] },\n ],\n deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],\n deleteGpgKeyForAuthenticated: [\n "DELETE /user/gpg_keys/{gpg_key_id}",\n {},\n { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] },\n ],\n deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],\n deletePublicSshKeyForAuthenticated: [\n "DELETE /user/keys/{key_id}",\n {},\n { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] },\n ],\n deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"],\n follow: ["PUT /user/following/{username}"],\n getAuthenticated: ["GET /user"],\n getByUsername: ["GET /users/{username}"],\n getContextForUser: ["GET /users/{username}/hovercard"],\n getGpgKeyForAuthenticated: [\n "GET /user/gpg_keys/{gpg_key_id}",\n {},\n { renamed: ["users", "getGpgKeyForAuthenticatedUser"] },\n ],\n getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],\n getPublicSshKeyForAuthenticated: [\n "GET /user/keys/{key_id}",\n {},\n { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] },\n ],\n getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],\n list: ["GET /users"],\n listBlockedByAuthenticated: [\n "GET /user/blocks",\n {},\n { renamed: ["users", "listBlockedByAuthenticatedUser"] },\n ],\n listBlockedByAuthenticatedUser: ["GET /user/blocks"],\n listEmailsForAuthenticated: [\n "GET /user/emails",\n {},\n { renamed: ["users", "listEmailsForAuthenticatedUser"] },\n ],\n listEmailsForAuthenticatedUser: ["GET /user/emails"],\n listFollowedByAuthenticated: [\n "GET /user/following",\n {},\n { renamed: ["users", "listFollowedByAuthenticatedUser"] },\n ],\n listFollowedByAuthenticatedUser: ["GET /user/following"],\n listFollowersForAuthenticatedUser: ["GET /user/followers"],\n listFollowersForUser: ["GET /users/{username}/followers"],\n listFollowingForUser: ["GET /users/{username}/following"],\n listGpgKeysForAuthenticated: [\n "GET /user/gpg_keys",\n {},\n { renamed: ["users", "listGpgKeysForAuthenticatedUser"] },\n ],\n listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],\n listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],\n listPublicEmailsForAuthenticated: [\n "GET /user/public_emails",\n {},\n { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] },\n ],\n listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],\n listPublicKeysForUser: ["GET /users/{username}/keys"],\n listPublicSshKeysForAuthenticated: [\n "GET /user/keys",\n {},\n { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] },\n ],\n listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],\n setPrimaryEmailVisibilityForAuthenticated: [\n "PATCH /user/email/visibility",\n {},\n { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] },\n ],\n setPrimaryEmailVisibilityForAuthenticatedUser: [\n "PATCH /user/email/visibility",\n ],\n unblock: ["DELETE /user/blocks/{username}"],\n unfollow: ["DELETE /user/following/{username}"],\n updateAuthenticated: ["PATCH /user"],\n },\n};\n\nconst VERSION = "5.16.2";\n\nfunction endpointsToMethods(octokit, endpointsMap) {\n const newMethods = {};\n for (const [scope, endpoints] of Object.entries(endpointsMap)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign({ method, url }, defaults);\n if (!newMethods[scope]) {\n newMethods[scope] = {};\n }\n const scopeMethods = newMethods[scope];\n if (decorations) {\n scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations);\n continue;\n }\n scopeMethods[methodName] = octokit.request.defaults(endpointDefaults);\n }\n }\n return newMethods;\n}\nfunction decorate(octokit, scope, methodName, defaults, decorations) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n /* istanbul ignore next */\n function withDecorations(...args) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n let options = requestWithDefaults.endpoint.merge(...args);\n // There are currently no other decorations than `.mapToData`\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: undefined,\n });\n return requestWithDefaults(options);\n }\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`);\n }\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n if (decorations.renamedParameters) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n const options = requestWithDefaults.endpoint.merge(...args);\n for (const [name, alias] of Object.entries(decorations.renamedParameters)) {\n if (name in options) {\n octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`);\n if (!(alias in options)) {\n options[alias] = options[name];\n }\n delete options[name];\n }\n }\n return requestWithDefaults(options);\n }\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n return requestWithDefaults(...args);\n }\n return Object.assign(withDecorations, requestWithDefaults);\n}\n\nfunction restEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit, Endpoints);\n return {\n rest: api,\n };\n}\nrestEndpointMethods.VERSION = VERSION;\nfunction legacyRestEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit, Endpoints);\n return {\n ...api,\n rest: api,\n };\n}\nlegacyRestEndpointMethods.VERSION = VERSION;\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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dUQ7QUFDckU7QUFDQTtBQUNBLDBDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsY0FBYyw0REFBNEQ7QUFDMUU7QUFDQTtBQUNBLDZDQUE2QyxTQUFTO0FBQ3REO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsY0FBYyw2REFBNkQ7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsY0FBYyxxRUFBcUU7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsU0FBUztBQUNqRCw0Q0FBNEMsU0FBUztBQUNyRDtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsYUFBYTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxNQUFNLEdBQUcsV0FBVyxpQ0FBaUMsU0FBUyxHQUFHLGNBQWM7QUFDdkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLEtBQUsseUNBQXlDLE1BQU0sR0FBRyxXQUFXLFlBQVksTUFBTTtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTBEO0FBQzFEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXdlYi9pbmRleC5qcz8xYTgzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEVuZHBvaW50cyA9IHtcbiAgICBhY3Rpb25zOiB7XG4gICAgICAgIGFkZEN1c3RvbUxhYmVsc1RvU2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgYWRkQ3VzdG9tTGFiZWxzVG9TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGFkZFNlbGVjdGVkUmVwb1RvT3JnU2VjcmV0OiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGFwcHJvdmVXb3JrZmxvd1J1bjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXBwcm92ZVwiLFxuICAgICAgICBdLFxuICAgICAgICBjYW5jZWxXb3JrZmxvd1J1bjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vY2FuY2VsXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZU9yVXBkYXRlT3JnU2VjcmV0OiBbXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgICAgIGNyZWF0ZU9yVXBkYXRlUmVwb1NlY3JldDogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZVJlZ2lzdHJhdGlvblRva2VuRm9yT3JnOiBbXG4gICAgICAgICAgICBcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3JlZ2lzdHJhdGlvbi10b2tlblwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVSZWdpc3RyYXRpb25Ub2tlbkZvclJlcG86IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3JlZ2lzdHJhdGlvbi10b2tlblwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVSZW1vdmVUb2tlbkZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMvcmVtb3ZlLXRva2VuXCJdLFxuICAgICAgICBjcmVhdGVSZW1vdmVUb2tlbkZvclJlcG86IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVXb3JrZmxvd0Rpc3BhdGNoOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZGlzcGF0Y2hlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVBY3Rpb25zQ2FjaGVCeUlkOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXMve2NhY2hlX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVBY3Rpb25zQ2FjaGVCeUtleTogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzez9rZXkscmVmfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVBcnRpZmFjdDogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzL3thcnRpZmFjdF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgICAgICBkZWxldGVSZXBvU2VjcmV0OiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21Pcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVTZWxmSG9zdGVkUnVubmVyRnJvbVJlcG86IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlV29ya2Zsb3dSdW46IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgICAgICBkZWxldGVXb3JrZmxvd1J1bkxvZ3M6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vbG9nc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkaXNhYmxlU2VsZWN0ZWRSZXBvc2l0b3J5R2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRpc2FibGVXb3JrZmxvdzogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZGlzYWJsZVwiLFxuICAgICAgICBdLFxuICAgICAgICBkb3dubG9hZEFydGlmYWN0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfS97YXJjaGl2ZV9mb3JtYXR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRvd25sb2FkSm9iTG9nc0ZvcldvcmtmbG93UnVuOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9L2xvZ3NcIixcbiAgICAgICAgXSxcbiAgICAgICAgZG93bmxvYWRXb3JrZmxvd1J1bkF0dGVtcHRMb2dzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vbG9nc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkb3dubG9hZFdvcmtmbG93UnVuTG9nczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9sb2dzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGVuYWJsZVNlbGVjdGVkUmVwb3NpdG9yeUdpdGh1YkFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBlbmFibGVXb3JrZmxvdzogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vZW5hYmxlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFjdGlvbnNDYWNoZUxpc3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXNcIl0sXG4gICAgICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlQnlSZXBvRm9yT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL2NhY2hlL3VzYWdlLWJ5LXJlcG9zaXRvcnlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VGb3JFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL2NhY2hlL3VzYWdlXCJdLFxuICAgICAgICBnZXRBbGxvd2VkQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFsbG93ZWRBY3Rpb25zUmVwb3NpdG9yeTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRBcnRpZmFjdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0cy97YXJ0aWZhY3RfaWR9XCJdLFxuICAgICAgICBnZXRFbnZpcm9ubWVudFB1YmxpY0tleTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3B1YmxpYy1rZXlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0RW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEpvYkZvcldvcmtmbG93UnVuOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvam9icy97am9iX2lkfVwiXSxcbiAgICAgICAgZ2V0T3JnUHVibGljS2V5OiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXlcIl0sXG4gICAgICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgICAgICBnZXRQZW5kaW5nRGVwbG95bWVudHNGb3JSdW46IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRSZXBvUGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wiYWN0aW9uc1wiLCBcImdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnlcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UmVwb1B1YmxpY0tleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICAgICAgZ2V0UmVwb1NlY3JldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICAgICAgZ2V0UmV2aWV3c0ZvclJ1bjogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcHByb3ZhbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0U2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXSxcbiAgICAgICAgZ2V0U2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0V29ya2Zsb3c6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfVwiXSxcbiAgICAgICAgZ2V0V29ya2Zsb3dBY2Nlc3NUb1JlcG9zaXRvcnk6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL2FjY2Vzc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRXb3JrZmxvd1J1bjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH1cIl0sXG4gICAgICAgIGdldFdvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFdvcmtmbG93UnVuVXNhZ2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vdGltaW5nXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFdvcmtmbG93VXNhZ2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3RpbWluZ1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0QXJ0aWZhY3RzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiXSxcbiAgICAgICAgbGlzdEVudmlyb25tZW50U2VjcmV0czogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RKb2JzRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vam9ic1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Sm9ic0ZvcldvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9L2pvYnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0T3JnU2VjcmV0czogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICAgICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICAgICAgbGlzdFJlcG9Xb3JrZmxvd3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3NcIl0sXG4gICAgICAgIGxpc3RSdW5uZXJBcHBsaWNhdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMvZG93bmxvYWRzXCJdLFxuICAgICAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yUmVwbzogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9kb3dubG9hZHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0U2VsZWN0ZWRSZXBvc2l0b3JpZXNFbmFibGVkR2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFNlbGZIb3N0ZWRSdW5uZXJzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzXCJdLFxuICAgICAgICBsaXN0U2VsZkhvc3RlZFJ1bm5lcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVyc1wiXSxcbiAgICAgICAgbGlzdFdvcmtmbG93UnVuQXJ0aWZhY3RzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0V29ya2Zsb3dSdW5zOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RXb3JrZmxvd1J1bnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiXSxcbiAgICAgICAgcmVSdW5Kb2JGb3JXb3JrZmxvd1J1bjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2pvYnMve2pvYl9pZH0vcmVydW5cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVSdW5Xb3JrZmxvdzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L3JlcnVuXCJdLFxuICAgICAgICByZVJ1bldvcmtmbG93RmFpbGVkSm9iczogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcmVydW4tZmFpbGVkLWpvYnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHMve25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmV2aWV3UGVuZGluZ0RlcGxveW1lbnRzRm9yUnVuOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9wZW5kaW5nX2RlcGxveW1lbnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEFsbG93ZWRBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0QWxsb3dlZEFjdGlvbnNSZXBvc2l0b3J5OiBbXG4gICAgICAgICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0Q3VzdG9tTGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiUFVUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiLFxuICAgICAgICBdLFxuICAgICAgICBzZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICAgICAgICBdLFxuICAgICAgICBzZXRTZWxlY3RlZFJlcG9zaXRvcmllc0VuYWJsZWRHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiLFxuICAgICAgICBdLFxuICAgICAgICBzZXRXb3JrZmxvd0FjY2Vzc1RvUmVwb3NpdG9yeTogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvYWNjZXNzXCIsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBhY3Rpdml0eToge1xuICAgICAgICBjaGVja1JlcG9Jc1N0YXJyZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICAgICAgZGVsZXRlUmVwb1N1YnNjcmlwdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgICAgIGRlbGV0ZVRocmVhZFN1YnNjcmlwdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0RmVlZHM6IFtcIkdFVCAvZmVlZHNcIl0sXG4gICAgICAgIGdldFJlcG9TdWJzY3JpcHRpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaXB0aW9uXCJdLFxuICAgICAgICBnZXRUaHJlYWQ6IFtcIkdFVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgICAgICBnZXRUaHJlYWRTdWJzY3JpcHRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEV2ZW50c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzXCJdLFxuICAgICAgICBsaXN0Tm90aWZpY2F0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL25vdGlmaWNhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RPcmdFdmVudHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL29yZ3Mve29yZ31cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFB1YmxpY0V2ZW50czogW1wiR0VUIC9ldmVudHNcIl0sXG4gICAgICAgIGxpc3RQdWJsaWNFdmVudHNGb3JSZXBvTmV0d29yazogW1wiR0VUIC9uZXR3b3Jrcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIl0sXG4gICAgICAgIGxpc3RQdWJsaWNFdmVudHNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL3B1YmxpY1wiXSxcbiAgICAgICAgbGlzdFB1YmxpY09yZ0V2ZW50czogW1wiR0VUIC9vcmdzL3tvcmd9L2V2ZW50c1wiXSxcbiAgICAgICAgbGlzdFJlY2VpdmVkRXZlbnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50c1wiXSxcbiAgICAgICAgbGlzdFJlY2VpdmVkUHVibGljRXZlbnRzRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzL3B1YmxpY1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0UmVwb0V2ZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIl0sXG4gICAgICAgIGxpc3RSZXBvTm90aWZpY2F0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0UmVwb3NTdGFycmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N0YXJyZWRcIl0sXG4gICAgICAgIGxpc3RSZXBvc1N0YXJyZWRCeVVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdGFycmVkXCJdLFxuICAgICAgICBsaXN0UmVwb3NXYXRjaGVkQnlVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3Vic2NyaXB0aW9uc1wiXSxcbiAgICAgICAgbGlzdFN0YXJnYXplcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIl0sXG4gICAgICAgIGxpc3RXYXRjaGVkUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N1YnNjcmlwdGlvbnNcIl0sXG4gICAgICAgIGxpc3RXYXRjaGVyc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaWJlcnNcIl0sXG4gICAgICAgIG1hcmtOb3RpZmljYXRpb25zQXNSZWFkOiBbXCJQVVQgL25vdGlmaWNhdGlvbnNcIl0sXG4gICAgICAgIG1hcmtSZXBvTm90aWZpY2F0aW9uc0FzUmVhZDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ub3RpZmljYXRpb25zXCJdLFxuICAgICAgICBtYXJrVGhyZWFkQXNSZWFkOiBbXCJQQVRDSCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgICAgICBzZXRSZXBvU3Vic2NyaXB0aW9uOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmlwdGlvblwiXSxcbiAgICAgICAgc2V0VGhyZWFkU3Vic2NyaXB0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9L3N1YnNjcmlwdGlvblwiLFxuICAgICAgICBdLFxuICAgICAgICBzdGFyUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICAgICAgdW5zdGFyUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICB9LFxuICAgIGFwcHM6IHtcbiAgICAgICAgYWRkUmVwb1RvSW5zdGFsbGF0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJhcHBzXCIsIFwiYWRkUmVwb1RvSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkUmVwb1RvSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUFVUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBjaGVja1Rva2VuOiBbXCJQT1NUIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vdG9rZW5cIl0sXG4gICAgICAgIGNyZWF0ZUZyb21NYW5pZmVzdDogW1wiUE9TVCAvYXBwLW1hbmlmZXN0cy97Y29kZX0vY29udmVyc2lvbnNcIl0sXG4gICAgICAgIGNyZWF0ZUluc3RhbGxhdGlvbkFjY2Vzc1Rva2VuOiBbXG4gICAgICAgICAgICBcIlBPU1QgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L2FjY2Vzc190b2tlbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlQXV0aG9yaXphdGlvbjogW1wiREVMRVRFIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vZ3JhbnRcIl0sXG4gICAgICAgIGRlbGV0ZUluc3RhbGxhdGlvbjogW1wiREVMRVRFIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfVwiXSxcbiAgICAgICAgZGVsZXRlVG9rZW46IFtcIkRFTEVURSAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgICAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL2FwcFwiXSxcbiAgICAgICAgZ2V0QnlTbHVnOiBbXCJHRVQgL2FwcHMve2FwcF9zbHVnfVwiXSxcbiAgICAgICAgZ2V0SW5zdGFsbGF0aW9uOiBbXCJHRVQgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9XCJdLFxuICAgICAgICBnZXRPcmdJbnN0YWxsYXRpb246IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgICAgIGdldFJlcG9JbnN0YWxsYXRpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW5zdGFsbGF0aW9uXCJdLFxuICAgICAgICBnZXRTdWJzY3JpcHRpb25QbGFuRm9yQWNjb3VudDogW1xuICAgICAgICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvYWNjb3VudHMve2FjY291bnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFN1YnNjcmlwdGlvblBsYW5Gb3JBY2NvdW50U3R1YmJlZDogW1xuICAgICAgICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9hY2NvdW50cy97YWNjb3VudF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0VXNlckluc3RhbGxhdGlvbjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2luc3RhbGxhdGlvblwiXSxcbiAgICAgICAgZ2V0V2ViaG9va0NvbmZpZ0ZvckFwcDogW1wiR0VUIC9hcHAvaG9vay9jb25maWdcIl0sXG4gICAgICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1wiR0VUIC9hcHAvaG9vay9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH1cIl0sXG4gICAgICAgIGxpc3RBY2NvdW50c0ZvclBsYW46IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIl0sXG4gICAgICAgIGxpc3RBY2NvdW50c0ZvclBsYW5TdHViYmVkOiBbXG4gICAgICAgICAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0SW5zdGFsbGF0aW9uUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvYXBwL2luc3RhbGxhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RJbnN0YWxsYXRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zXCJdLFxuICAgICAgICBsaXN0UGxhbnM6IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiXSxcbiAgICAgICAgbGlzdFBsYW5zU3R1YmJlZDogW1wiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnNcIl0sXG4gICAgICAgIGxpc3RSZXBvc0FjY2Vzc2libGVUb0luc3RhbGxhdGlvbjogW1wiR0VUIC9pbnN0YWxsYXRpb24vcmVwb3NpdG9yaWVzXCJdLFxuICAgICAgICBsaXN0U3Vic2NyaXB0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzXCJdLFxuICAgICAgICBsaXN0U3Vic2NyaXB0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyU3R1YmJlZDogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzL3N0dWJiZWRcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFdlYmhvb2tEZWxpdmVyaWVzOiBbXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXNcIl0sXG4gICAgICAgIHJlZGVsaXZlcldlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgICAgICAgXCJQT1NUIC9hcHAvaG9vay9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH0vYXR0ZW1wdHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlUmVwb0Zyb21JbnN0YWxsYXRpb246IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcImFwcHNcIiwgXCJyZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVJlcG9Gcm9tSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZXNldFRva2VuOiBbXCJQQVRDSCAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgICAgICByZXZva2VJbnN0YWxsYXRpb25BY2Nlc3NUb2tlbjogW1wiREVMRVRFIC9pbnN0YWxsYXRpb24vdG9rZW5cIl0sXG4gICAgICAgIHNjb3BlVG9rZW46IFtcIlBPU1QgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlbi9zY29wZWRcIl0sXG4gICAgICAgIHN1c3BlbmRJbnN0YWxsYXRpb246IFtcIlBVVCAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vc3VzcGVuZGVkXCJdLFxuICAgICAgICB1bnN1c3BlbmRJbnN0YWxsYXRpb246IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9zdXNwZW5kZWRcIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlV2ViaG9va0NvbmZpZ0ZvckFwcDogW1wiUEFUQ0ggL2FwcC9ob29rL2NvbmZpZ1wiXSxcbiAgICB9LFxuICAgIGJpbGxpbmc6IHtcbiAgICAgICAgZ2V0R2l0aHViQWN0aW9uc0JpbGxpbmdPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL2FjdGlvbnNcIl0sXG4gICAgICAgIGdldEdpdGh1YkFjdGlvbnNCaWxsaW5nVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEdpdGh1YkFkdmFuY2VkU2VjdXJpdHlCaWxsaW5nR2hlOiBbXG4gICAgICAgICAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R2l0aHViQWR2YW5jZWRTZWN1cml0eUJpbGxpbmdPcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9wYWNrYWdlc1wiXSxcbiAgICAgICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9wYWNrYWdlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTaGFyZWRTdG9yYWdlQmlsbGluZ09yZzogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9zaGFyZWQtc3RvcmFnZVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTaGFyZWRTdG9yYWdlQmlsbGluZ1VzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NldHRpbmdzL2JpbGxpbmcvc2hhcmVkLXN0b3JhZ2VcIixcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIGNoZWNrczoge1xuICAgICAgICBjcmVhdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnNcIl0sXG4gICAgICAgIGNyZWF0ZVN1aXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXNcIl0sXG4gICAgICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9XCJdLFxuICAgICAgICBnZXRTdWl0ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfVwiXSxcbiAgICAgICAgbGlzdEFubm90YXRpb25zOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9hbm5vdGF0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stcnVuc1wiXSxcbiAgICAgICAgbGlzdEZvclN1aXRlOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vY2hlY2stcnVuc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0U3VpdGVzRm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stc3VpdGVzXCJdLFxuICAgICAgICByZXJlcXVlc3RSdW46IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9yZXJlcXVlc3RcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVyZXF1ZXN0U3VpdGU6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vcmVyZXF1ZXN0XCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldFN1aXRlc1ByZWZlcmVuY2VzOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMvcHJlZmVyZW5jZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfVwiXSxcbiAgICB9LFxuICAgIGNvZGVTY2FubmluZzoge1xuICAgICAgICBkZWxldGVBbmFseXNpczogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXMve2FuYWx5c2lzX2lkfXs/Y29uZmlybV9kZWxldGV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFsZXJ0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkUGFyYW1ldGVyczogeyBhbGVydF9pZDogXCJhbGVydF9udW1iZXJcIiB9IH0sXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFuYWx5c2lzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlcy97YW5hbHlzaXNfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFNhcmlmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvc2FyaWZzL3tzYXJpZl9pZH1cIl0sXG4gICAgICAgIGxpc3RBbGVydEluc3RhbmNlczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vY29kZS1zY2FubmluZy9hbGVydHNcIl0sXG4gICAgICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgICAgICBsaXN0QWxlcnRzSW5zdGFuY2VzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wiY29kZVNjYW5uaW5nXCIsIFwibGlzdEFsZXJ0SW5zdGFuY2VzXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RSZWNlbnRBbmFseXNlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzXCJdLFxuICAgICAgICB1cGRhdGVBbGVydDogW1xuICAgICAgICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBsb2FkU2FyaWY6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvc2FyaWZzXCJdLFxuICAgIH0sXG4gICAgY29kZXNPZkNvbmR1Y3Q6IHtcbiAgICAgICAgZ2V0QWxsQ29kZXNPZkNvbmR1Y3Q6IFtcIkdFVCAvY29kZXNfb2ZfY29uZHVjdFwiXSxcbiAgICAgICAgZ2V0Q29uZHVjdENvZGU6IFtcIkdFVCAvY29kZXNfb2ZfY29uZHVjdC97a2V5fVwiXSxcbiAgICB9LFxuICAgIGNvZGVzcGFjZXM6IHtcbiAgICAgICAgYWRkUmVwb3NpdG9yeUZvclNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNvZGVzcGFjZU1hY2hpbmVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9tYWNoaW5lc1wiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzXCJdLFxuICAgICAgICBjcmVhdGVPclVwZGF0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVPclVwZGF0ZVNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVXaXRoUHJGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvZGVzcGFjZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlV2l0aFJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgICAgICBkZWxldGVGcm9tT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZXhwb3J0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vZXhwb3J0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRFeHBvcnREZXRhaWxzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9leHBvcnRzL3tleHBvcnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgICAgICBnZXRQdWJsaWNLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3B1YmxpYy1rZXlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UmVwb1B1YmxpY0tleTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy9wdWJsaWMta2V5XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFJlcG9TZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdERldmNvbnRhaW5lcnNJblJlcG9zaXRvcnlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvZGV2Y29udGFpbmVyc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzXCJdLFxuICAgICAgICBsaXN0SW5Pcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkUGFyYW1ldGVyczogeyBvcmdfaWQ6IFwib3JnXCIgfSB9LFxuICAgICAgICBdLFxuICAgICAgICBsaXN0SW5SZXBvc2l0b3J5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RSZXBvU2VjcmV0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgICAgIGxpc3RSZXBvc2l0b3JpZXNGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RTZWNyZXRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgICAgIHJlbW92ZVJlcG9zaXRvcnlGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZXBvTWFjaGluZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvbWFjaGluZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0UmVwb3NpdG9yaWVzRm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUFVUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICAgICAgICBdLFxuICAgICAgICBzdGFydEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdGFydFwiXSxcbiAgICAgICAgc3RvcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdG9wXCJdLFxuICAgICAgICBzdG9wSW5Pcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0b3BcIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBBVENIIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXSxcbiAgICB9LFxuICAgIGRlcGVuZGFib3Q6IHtcbiAgICAgICAgYWRkU2VsZWN0ZWRSZXBvVG9PcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZU9yVXBkYXRlUmVwb1NlY3JldDogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgICAgICBkZWxldGVSZXBvU2VjcmV0OiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0T3JnUHVibGljS2V5OiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3B1YmxpYy1rZXlcIl0sXG4gICAgICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgICAgICBnZXRSZXBvUHVibGljS2V5OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3B1YmxpYy1rZXlcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UmVwb1NlY3JldDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RPcmdTZWNyZXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgICAgICBsaXN0UmVwb1NlY3JldHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgICAgICBsaXN0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdTZWNyZXQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBkZXBlbmRlbmN5R3JhcGg6IHtcbiAgICAgICAgY3JlYXRlUmVwb3NpdG9yeVNuYXBzaG90OiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvc25hcHNob3RzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRpZmZSYW5nZTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvY29tcGFyZS97YmFzZWhlYWR9XCIsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBlbW9qaXM6IHsgZ2V0OiBbXCJHRVQgL2Vtb2ppc1wiXSB9LFxuICAgIGVudGVycHJpc2VBZG1pbjoge1xuICAgICAgICBhZGRDdXN0b21MYWJlbHNUb1NlbGZIb3N0ZWRSdW5uZXJGb3JFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIlBPU1QgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRpc2FibGVTZWxlY3RlZE9yZ2FuaXphdGlvbkdpdGh1YkFjdGlvbnNFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnMvb3JnYW5pemF0aW9ucy97b3JnX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBlbmFibGVTZWxlY3RlZE9yZ2FuaXphdGlvbkdpdGh1YkFjdGlvbnNFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIlBVVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnMvb3JnYW5pemF0aW9ucy97b3JnX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRBbGxvd2VkQWN0aW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTZXJ2ZXJTdGF0aXN0aWNzOiBbXG4gICAgICAgICAgICBcIkdFVCAvZW50ZXJwcmlzZS1pbnN0YWxsYXRpb24ve2VudGVycHJpc2Vfb3Jfb3JnfS9zZXJ2ZXItc3RhdGlzdGljc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0TGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvckVudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0U2VsZWN0ZWRPcmdhbml6YXRpb25zRW5hYmxlZEdpdGh1YkFjdGlvbnNFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnMvb3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVBbGxDdXN0b21MYWJlbHNGcm9tU2VsZkhvc3RlZFJ1bm5lckZvckVudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yRW50ZXJwcmlzZTogW1xuICAgICAgICAgICAgXCJERUxFVEUgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBzZXRBbGxvd2VkQWN0aW9uc0VudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiUFVUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JFbnRlcnByaXNlOiBbXG4gICAgICAgICAgICBcIlBVVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zRW50ZXJwcmlzZTogW1xuICAgICAgICAgICAgXCJQVVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldFNlbGVjdGVkT3JnYW5pemF0aW9uc0VuYWJsZWRHaXRodWJBY3Rpb25zRW50ZXJwcmlzZTogW1xuICAgICAgICAgICAgXCJQVVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zL29yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIGdpc3RzOiB7XG4gICAgICAgIGNoZWNrSXNTdGFycmVkOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9zdGFyXCJdLFxuICAgICAgICBjcmVhdGU6IFtcIlBPU1QgL2dpc3RzXCJdLFxuICAgICAgICBjcmVhdGVDb21tZW50OiBbXCJQT1NUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgICAgIGRlbGV0ZTogW1wiREVMRVRFIC9naXN0cy97Z2lzdF9pZH1cIl0sXG4gICAgICAgIGRlbGV0ZUNvbW1lbnQ6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICAgICAgZm9yazogW1wiUE9TVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgICAgICBnZXQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9XCJdLFxuICAgICAgICBnZXRDb21tZW50OiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgICAgIGdldFJldmlzaW9uOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS97c2hhfVwiXSxcbiAgICAgICAgbGlzdDogW1wiR0VUIC9naXN0c1wiXSxcbiAgICAgICAgbGlzdENvbW1lbnRzOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50c1wiXSxcbiAgICAgICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIl0sXG4gICAgICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZ2lzdHNcIl0sXG4gICAgICAgIGxpc3RGb3JrczogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vZm9ya3NcIl0sXG4gICAgICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvZ2lzdHMvcHVibGljXCJdLFxuICAgICAgICBsaXN0U3RhcnJlZDogW1wiR0VUIC9naXN0cy9zdGFycmVkXCJdLFxuICAgICAgICBzdGFyOiBbXCJQVVQgL2dpc3RzL3tnaXN0X2lkfS9zdGFyXCJdLFxuICAgICAgICB1bnN0YXI6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgICAgIHVwZGF0ZTogW1wiUEFUQ0ggL2dpc3RzL3tnaXN0X2lkfVwiXSxcbiAgICAgICAgdXBkYXRlQ29tbWVudDogW1wiUEFUQ0ggL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgfSxcbiAgICBnaXQ6IHtcbiAgICAgICAgY3JlYXRlQmxvYjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L2Jsb2JzXCJdLFxuICAgICAgICBjcmVhdGVDb21taXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzXCJdLFxuICAgICAgICBjcmVhdGVSZWY6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzXCJdLFxuICAgICAgICBjcmVhdGVUYWc6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC90YWdzXCJdLFxuICAgICAgICBjcmVhdGVUcmVlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdHJlZXNcIl0sXG4gICAgICAgIGRlbGV0ZVJlZjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvcmVmcy97cmVmfVwiXSxcbiAgICAgICAgZ2V0QmxvYjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvYmxvYnMve2ZpbGVfc2hhfVwiXSxcbiAgICAgICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzL3tjb21taXRfc2hhfVwiXSxcbiAgICAgICAgZ2V0UmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWYve3JlZn1cIl0sXG4gICAgICAgIGdldFRhZzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdGFncy97dGFnX3NoYX1cIl0sXG4gICAgICAgIGdldFRyZWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RyZWVzL3t0cmVlX3NoYX1cIl0sXG4gICAgICAgIGxpc3RNYXRjaGluZ1JlZnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L21hdGNoaW5nLXJlZnMve3JlZn1cIl0sXG4gICAgICAgIHVwZGF0ZVJlZjogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzL3tyZWZ9XCJdLFxuICAgIH0sXG4gICAgZ2l0aWdub3JlOiB7XG4gICAgICAgIGdldEFsbFRlbXBsYXRlczogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzXCJdLFxuICAgICAgICBnZXRUZW1wbGF0ZTogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzL3tuYW1lfVwiXSxcbiAgICB9LFxuICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICAgICAgZ2V0UmVzdHJpY3Rpb25zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgICAgICBnZXRSZXN0cmljdGlvbnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICAgICAgZ2V0UmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXG4gICAgICAgICAgICBcIkdFVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICAgICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgICAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JSZXBvOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW50ZXJhY3Rpb24tbGltaXRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVJlc3RyaWN0aW9uc0ZvcllvdXJQdWJsaWNSZXBvczogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wiaW50ZXJhY3Rpb25zXCIsIFwicmVtb3ZlUmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgc2V0UmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBVVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgICAgIHNldFJlc3RyaWN0aW9uc0Zvck9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICAgICAgc2V0UmVzdHJpY3Rpb25zRm9yUmVwbzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgICAgIHNldFJlc3RyaWN0aW9uc0ZvcllvdXJQdWJsaWNSZXBvczogW1xuICAgICAgICAgICAgXCJQVVQgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wiaW50ZXJhY3Rpb25zXCIsIFwic2V0UmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIGlzc3Vlczoge1xuICAgICAgICBhZGRBc3NpZ25lZXM6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBhZGRMYWJlbHM6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIl0sXG4gICAgICAgIGNoZWNrVXNlckNhbkJlQXNzaWduZWQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzL3thc3NpZ25lZX1cIl0sXG4gICAgICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCJdLFxuICAgICAgICBjcmVhdGVDb21tZW50OiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVMYWJlbDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzXCJdLFxuICAgICAgICBjcmVhdGVNaWxlc3RvbmU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXNcIl0sXG4gICAgICAgIGRlbGV0ZUNvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUxhYmVsOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgICAgIGRlbGV0ZU1pbGVzdG9uZTogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn1cIl0sXG4gICAgICAgIGdldENvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICAgICAgZ2V0RXZlbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50cy97ZXZlbnRfaWR9XCJdLFxuICAgICAgICBnZXRMYWJlbDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgICAgICBnZXRNaWxlc3RvbmU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIl0sXG4gICAgICAgIGxpc3Q6IFtcIkdFVCAvaXNzdWVzXCJdLFxuICAgICAgICBsaXN0QXNzaWduZWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlc1wiXSxcbiAgICAgICAgbGlzdENvbW1lbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiXSxcbiAgICAgICAgbGlzdENvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHNcIl0sXG4gICAgICAgIGxpc3RFdmVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2V2ZW50c1wiXSxcbiAgICAgICAgbGlzdEV2ZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50c1wiXSxcbiAgICAgICAgbGlzdEV2ZW50c0ZvclRpbWVsaW5lOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2lzc3Vlc1wiXSxcbiAgICAgICAgbGlzdEZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2lzc3Vlc1wiXSxcbiAgICAgICAgbGlzdEZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCJdLFxuICAgICAgICBsaXN0TGFiZWxzRm9yTWlsZXN0b25lOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RMYWJlbHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVsc1wiXSxcbiAgICAgICAgbGlzdExhYmVsc09uSXNzdWU6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RNaWxlc3RvbmVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXNcIl0sXG4gICAgICAgIGxvY2s6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xvY2tcIl0sXG4gICAgICAgIHJlbW92ZUFsbExhYmVsczogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlQXNzaWduZWVzOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVMYWJlbDogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHMve25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIHNldExhYmVsczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJdLFxuICAgICAgICB1bmxvY2s6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xvY2tcIl0sXG4gICAgICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfVwiXSxcbiAgICAgICAgdXBkYXRlQ29tbWVudDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgICAgIHVwZGF0ZUxhYmVsOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfVwiXSxcbiAgICAgICAgdXBkYXRlTWlsZXN0b25lOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzL3ttaWxlc3RvbmVfbnVtYmVyfVwiLFxuICAgICAgICBdLFxuICAgIH0sXG4gICAgbGljZW5zZXM6IHtcbiAgICAgICAgZ2V0OiBbXCJHRVQgL2xpY2Vuc2VzL3tsaWNlbnNlfVwiXSxcbiAgICAgICAgZ2V0QWxsQ29tbW9ubHlVc2VkOiBbXCJHRVQgL2xpY2Vuc2VzXCJdLFxuICAgICAgICBnZXRGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xpY2Vuc2VcIl0sXG4gICAgfSxcbiAgICBtYXJrZG93bjoge1xuICAgICAgICByZW5kZXI6IFtcIlBPU1QgL21hcmtkb3duXCJdLFxuICAgICAgICByZW5kZXJSYXc6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvbWFya2Rvd24vcmF3XCIsXG4gICAgICAgICAgICB7IGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIgfSB9LFxuICAgICAgICBdLFxuICAgIH0sXG4gICAgbWV0YToge1xuICAgICAgICBnZXQ6IFtcIkdFVCAvbWV0YVwiXSxcbiAgICAgICAgZ2V0T2N0b2NhdDogW1wiR0VUIC9vY3RvY2F0XCJdLFxuICAgICAgICBnZXRaZW46IFtcIkdFVCAvemVuXCJdLFxuICAgICAgICByb290OiBbXCJHRVQgL1wiXSxcbiAgICB9LFxuICAgIG1pZ3JhdGlvbnM6IHtcbiAgICAgICAgY2FuY2VsSW1wb3J0OiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiXSxcbiAgICAgICAgZGVsZXRlQXJjaGl2ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L2FyY2hpdmVcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlQXJjaGl2ZUZvck9yZzogW1xuICAgICAgICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRvd25sb2FkQXJjaGl2ZUZvck9yZzogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFyY2hpdmVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldENvbW1pdEF1dGhvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2F1dGhvcnNcIl0sXG4gICAgICAgIGdldEltcG9ydFN0YXR1czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIl0sXG4gICAgICAgIGdldExhcmdlRmlsZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2xhcmdlX2ZpbGVzXCJdLFxuICAgICAgICBnZXRTdGF0dXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgICAgIGdldFN0YXR1c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21pZ3JhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCJdLFxuICAgICAgICBsaXN0UmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFJlcG9zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgICAgIGxpc3RSZXBvc0ZvclVzZXI6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wibWlncmF0aW9uc1wiLCBcImxpc3RSZXBvc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG1hcENvbW1pdEF1dGhvcjogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9hdXRob3JzL3thdXRob3JfaWR9XCJdLFxuICAgICAgICBzZXRMZnNQcmVmZXJlbmNlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2xmc1wiXSxcbiAgICAgICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9taWdyYXRpb25zXCJdLFxuICAgICAgICBzdGFydEZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCJdLFxuICAgICAgICBzdGFydEltcG9ydDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIl0sXG4gICAgICAgIHVubG9ja1JlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvcy97cmVwb19uYW1lfS9sb2NrXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVubG9ja1JlcG9Gb3JPcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3Mve3JlcG9fbmFtZX0vbG9ja1wiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVJbXBvcnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIl0sXG4gICAgfSxcbiAgICBvcmdzOiB7XG4gICAgICAgIGJsb2NrVXNlcjogW1wiUFVUIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBjYW5jZWxJbnZpdGF0aW9uOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJdLFxuICAgICAgICBjaGVja0Jsb2NrZWRVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIGNoZWNrTWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIGNoZWNrUHVibGljTWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVycy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBjb252ZXJ0TWVtYmVyVG9PdXRzaWRlQ29sbGFib3JhdG9yOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVJbnZpdGF0aW9uOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zXCJdLFxuICAgICAgICBjcmVhdGVXZWJob29rOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2hvb2tzXCJdLFxuICAgICAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgICAgICBnZXQ6IFtcIkdFVCAvb3Jncy97b3JnfVwiXSxcbiAgICAgICAgZ2V0TWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jncy97b3JnfVwiXSxcbiAgICAgICAgZ2V0TWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBnZXRXZWJob29rOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgICAgICBnZXRXZWJob29rQ29uZmlnRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXSxcbiAgICAgICAgZ2V0V2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3Q6IFtcIkdFVCAvb3JnYW5pemF0aW9uc1wiXSxcbiAgICAgICAgbGlzdEFwcEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCJdLFxuICAgICAgICBsaXN0QmxvY2tlZFVzZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vYmxvY2tzXCJdLFxuICAgICAgICBsaXN0Q3VzdG9tUm9sZXM6IFtcIkdFVCAvb3JnYW5pemF0aW9ucy97b3JnYW5pemF0aW9uX2lkfS9jdXN0b21fcm9sZXNcIl0sXG4gICAgICAgIGxpc3RGYWlsZWRJbnZpdGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiXSxcbiAgICAgICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvb3Jnc1wiXSxcbiAgICAgICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9vcmdzXCJdLFxuICAgICAgICBsaXN0SW52aXRhdGlvblRlYW1zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9L3RlYW1zXCJdLFxuICAgICAgICBsaXN0TWVtYmVyczogW1wiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNcIl0sXG4gICAgICAgIGxpc3RNZW1iZXJzaGlwc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiXSxcbiAgICAgICAgbGlzdE91dHNpZGVDb2xsYWJvcmF0b3JzOiBbXCJHRVQgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzXCJdLFxuICAgICAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RQdWJsaWNNZW1iZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnNcIl0sXG4gICAgICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1wiR0VUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJdLFxuICAgICAgICBsaXN0V2ViaG9va3M6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rc1wiXSxcbiAgICAgICAgcGluZ1dlYmhvb2s6IFtcIlBPU1QgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L3BpbmdzXCJdLFxuICAgICAgICByZWRlbGl2ZXJXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZU1lbWJlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgcmVtb3ZlTWVtYmVyc2hpcEZvclVzZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICByZW1vdmVPdXRzaWRlQ29sbGFib3JhdG9yOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVQdWJsaWNNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0TWVtYmVyc2hpcEZvclVzZXI6IFtcIlBVVCAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBzZXRQdWJsaWNNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdW5ibG9ja1VzZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgdXBkYXRlOiBbXCJQQVRDSCAvb3Jncy97b3JnfVwiXSxcbiAgICAgICAgdXBkYXRlTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIlBBVENIIC91c2VyL21lbWJlcnNoaXBzL29yZ3Mve29yZ31cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlV2ViaG9vazogW1wiUEFUQ0ggL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgICAgICB1cGRhdGVXZWJob29rQ29uZmlnRm9yT3JnOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJdLFxuICAgIH0sXG4gICAgcGFja2FnZXM6IHtcbiAgICAgICAgZGVsZXRlUGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVQYWNrYWdlRm9yT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlUGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlUGFja2FnZVZlcnNpb25Gb3JPcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yQVBhY2thZ2VPd25lZEJ5QW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1wicGFja2FnZXNcIiwgXCJnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeU9yZ1wiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JBUGFja2FnZU93bmVkQnlUaGVBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbmFtZWQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCJwYWNrYWdlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5QXV0aGVudGljYXRlZFVzZXJcIixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlPcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5VXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICAgICAgICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRQYWNrYWdlRm9yT3JnYW5pemF0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0UGFja2FnZVZlcnNpb25Gb3JPcmdhbml6YXRpb246IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFBhY2thZ2VzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9wYWNrYWdlc1wiXSxcbiAgICAgICAgbGlzdFBhY2thZ2VzRm9yT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXNcIl0sXG4gICAgICAgIGxpc3RQYWNrYWdlc0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiXSxcbiAgICAgICAgcmVzdG9yZVBhY2thZ2VGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJQT1NUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiLFxuICAgICAgICBdLFxuICAgICAgICByZXN0b3JlUGFja2FnZUZvck9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiLFxuICAgICAgICBdLFxuICAgICAgICByZXN0b3JlUGFja2FnZUZvclVzZXI6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS9yZXN0b3Jlez90b2tlbn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzdG9yZVBhY2thZ2VWZXJzaW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfS9yZXN0b3JlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc3RvcmVQYWNrYWdlVmVyc2lvbkZvck9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9L3Jlc3RvcmVcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzdG9yZVBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJQT1NUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9L3Jlc3RvcmVcIixcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIHByb2plY3RzOiB7XG4gICAgICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBjcmVhdGVDYXJkOiBbXCJQT1NUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L2NhcmRzXCJdLFxuICAgICAgICBjcmVhdGVDb2x1bW46IFtcIlBPU1QgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCJdLFxuICAgICAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9wcm9qZWN0c1wiXSxcbiAgICAgICAgY3JlYXRlRm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3Byb2plY3RzXCJdLFxuICAgICAgICBjcmVhdGVGb3JSZXBvOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiXSxcbiAgICAgICAgZGVsZXRlOiBbXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICAgICAgZGVsZXRlQ2FyZDogW1wiREVMRVRFIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICAgICAgZGVsZXRlQ29sdW1uOiBbXCJERUxFVEUgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH1cIl0sXG4gICAgICAgIGdldDogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH1cIl0sXG4gICAgICAgIGdldENhcmQ6IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgICAgIGdldENvbHVtbjogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdLFxuICAgICAgICBnZXRQZXJtaXNzaW9uRm9yVXNlcjogW1xuICAgICAgICAgICAgXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX0vcGVybWlzc2lvblwiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Q2FyZHM6IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiXSxcbiAgICAgICAgbGlzdENvbGxhYm9yYXRvcnM6IFtcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbGxhYm9yYXRvcnNcIl0sXG4gICAgICAgIGxpc3RDb2x1bW5zOiBbXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCJdLFxuICAgICAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgICAgIGxpc3RGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Byb2plY3RzXCJdLFxuICAgICAgICBsaXN0Rm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3Byb2plY3RzXCJdLFxuICAgICAgICBtb3ZlQ2FyZDogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH0vbW92ZXNcIl0sXG4gICAgICAgIG1vdmVDb2x1bW46IFtcIlBPU1QgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vbW92ZXNcIl0sXG4gICAgICAgIHJlbW92ZUNvbGxhYm9yYXRvcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlOiBbXCJQQVRDSCAvcHJvamVjdHMve3Byb2plY3RfaWR9XCJdLFxuICAgICAgICB1cGRhdGVDYXJkOiBbXCJQQVRDSCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgICAgIHVwZGF0ZUNvbHVtbjogW1wiUEFUQ0ggL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH1cIl0sXG4gICAgfSxcbiAgICBwdWxsczoge1xuICAgICAgICBjaGVja0lmTWVyZ2VkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vbWVyZ2VcIl0sXG4gICAgICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIl0sXG4gICAgICAgIGNyZWF0ZVJlcGx5Rm9yUmV2aWV3Q29tbWVudDogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZXBsaWVzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZVJldmlldzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgICAgICBjcmVhdGVSZXZpZXdDb21tZW50OiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlUGVuZGluZ1JldmlldzogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVSZXZpZXdDb21tZW50OiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRpc21pc3NSZXZpZXc6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vZGlzbWlzc2Fsc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfVwiXSxcbiAgICAgICAgZ2V0UmV2aWV3OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFJldmlld0NvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgICAgICBsaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCJdLFxuICAgICAgICBsaXN0Q29tbWVudHNGb3JSZXZpZXc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21taXRzXCJdLFxuICAgICAgICBsaXN0RmlsZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9maWxlc1wiXSxcbiAgICAgICAgbGlzdFJlcXVlc3RlZFJldmlld2VyczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmVxdWVzdGVkX3Jldmlld2Vyc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0UmV2aWV3Q29tbWVudHM6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RSZXZpZXdDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHNcIl0sXG4gICAgICAgIGxpc3RSZXZpZXdzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3c1wiXSxcbiAgICAgICAgbWVyZ2U6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9tZXJnZVwiXSxcbiAgICAgICAgcmVtb3ZlUmVxdWVzdGVkUmV2aWV3ZXJzOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlcXVlc3RSZXZpZXdlcnM6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHN1Ym1pdFJldmlldzogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vZXZlbnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn1cIl0sXG4gICAgICAgIHVwZGF0ZUJyYW5jaDogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vdXBkYXRlLWJyYW5jaFwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVSZXZpZXc6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlUmV2aWV3Q29tbWVudDogW1xuICAgICAgICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICByYXRlTGltaXQ6IHsgZ2V0OiBbXCJHRVQgL3JhdGVfbGltaXRcIl0gfSxcbiAgICByZWFjdGlvbnM6IHtcbiAgICAgICAgY3JlYXRlRm9yQ29tbWl0Q29tbWVudDogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZUZvcklzc3VlOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlRm9ySXNzdWVDb21tZW50OiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZUZvclB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZUZvclJlbGVhc2U6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlRm9yVGVhbURpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRm9ySXNzdWU6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRm9ySXNzdWVDb21tZW50OiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVGb3JQdWxsUmVxdWVzdENvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRm9yUmVsZWFzZTogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yQ29tbWl0Q29tbWVudDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEZvcklzc3VlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIl0sXG4gICAgICAgIGxpc3RGb3JJc3N1ZUNvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yUHVsbFJlcXVlc3RSZXZpZXdDb21tZW50OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Rm9yUmVsZWFzZTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEZvclRlYW1EaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RGb3JUZWFtRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgIH0sXG4gICAgcmVwb3M6IHtcbiAgICAgICAgYWNjZXB0SW52aXRhdGlvbjogW1xuICAgICAgICAgICAgXCJQQVRDSCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiYWNjZXB0SW52aXRhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJQQVRDSCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBhZGRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkQ29sbGFib3JhdG9yOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgYWRkU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9LFxuICAgICAgICBdLFxuICAgICAgICBhZGRUZWFtQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNoZWNrQ29sbGFib3JhdG9yOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgY2hlY2tWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY29kZW93bmVyc0Vycm9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlb3duZXJzL2Vycm9yc1wiXSxcbiAgICAgICAgY29tcGFyZUNvbW1pdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tcGFyZS97YmFzZX0uLi57aGVhZH1cIl0sXG4gICAgICAgIGNvbXBhcmVDb21taXRzV2l0aEJhc2VoZWFkOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tcGFyZS97YmFzZWhlYWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZUF1dG9saW5rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3NcIl0sXG4gICAgICAgIGNyZWF0ZUNvbW1pdENvbW1lbnQ6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlQ29tbWl0U3RhdHVzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0dXNlcy97c2hhfVwiXSxcbiAgICAgICAgY3JlYXRlRGVwbG95S2V5OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzXCJdLFxuICAgICAgICBjcmVhdGVEZXBsb3ltZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICAgICAgY3JlYXRlRGVwbG95bWVudFN0YXR1czogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH0vc3RhdHVzZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlRGlzcGF0Y2hFdmVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGlzcGF0Y2hlc1wiXSxcbiAgICAgICAgY3JlYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvcmVwb3NcIl0sXG4gICAgICAgIGNyZWF0ZUZvcms6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCJdLFxuICAgICAgICBjcmVhdGVJbk9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9yZXBvc1wiXSxcbiAgICAgICAgY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudDogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlT3JVcGRhdGVGaWxlQ29udGVudHM6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udGVudHMve3BhdGh9XCJdLFxuICAgICAgICBjcmVhdGVQYWdlc1NpdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgICAgICBjcmVhdGVSZWxlYXNlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiXSxcbiAgICAgICAgY3JlYXRlVGFnUHJvdGVjdGlvbjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgICAgICBjcmVhdGVVc2luZ1RlbXBsYXRlOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3t0ZW1wbGF0ZV9vd25lcn0ve3RlbXBsYXRlX3JlcG99L2dlbmVyYXRlXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZVdlYmhvb2s6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzXCJdLFxuICAgICAgICBkZWNsaW5lSW52aXRhdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRlY2xpbmVJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVjbGluZUludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgICAgICBkZWxldGVBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVBZG1pbkJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL2VuZm9yY2VfYWRtaW5zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUFuRW52aXJvbm1lbnQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUF1dG9saW5rOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9saW5rcy97YXV0b2xpbmtfaWR9XCJdLFxuICAgICAgICBkZWxldGVCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVDb21taXRDb21tZW50OiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICAgICAgZGVsZXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVEZXBsb3lLZXk6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30va2V5cy97a2V5X2lkfVwiXSxcbiAgICAgICAgZGVsZXRlRGVwbG95bWVudDogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVGaWxlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICAgICAgZGVsZXRlSW52aXRhdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVQYWdlc1NpdGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgICAgIGRlbGV0ZVB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlUmVsZWFzZTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgICAgIGRlbGV0ZVJlbGVhc2VBc3NldDogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2Fzc2V0cy97YXNzZXRfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZVRhZ1Byb3RlY3Rpb246IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb24ve3RhZ19wcm90ZWN0aW9uX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICAgICAgZGlzYWJsZUF1dG9tYXRlZFNlY3VyaXR5Rml4ZXM6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbWF0ZWQtc2VjdXJpdHktZml4ZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZGlzYWJsZUxmc0ZvclJlcG86IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGZzXCJdLFxuICAgICAgICBkaXNhYmxlVnVsbmVyYWJpbGl0eUFsZXJ0czogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Z1bG5lcmFiaWxpdHktYWxlcnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRvd25sb2FkQXJjaGl2ZTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRvd25sb2FkWmlwYmFsbEFyY2hpdmVcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZG93bmxvYWRUYXJiYWxsQXJjaGl2ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YXJiYWxsL3tyZWZ9XCJdLFxuICAgICAgICBkb3dubG9hZFppcGJhbGxBcmNoaXZlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIl0sXG4gICAgICAgIGVuYWJsZUF1dG9tYXRlZFNlY3VyaXR5Rml4ZXM6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbWF0ZWQtc2VjdXJpdHktZml4ZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZW5hYmxlTGZzRm9yUmVwbzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sZnNcIl0sXG4gICAgICAgIGVuYWJsZVZ1bG5lcmFiaWxpdHlBbGVydHM6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS92dWxuZXJhYmlsaXR5LWFsZXJ0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZW5lcmF0ZVJlbGVhc2VOb3RlczogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9nZW5lcmF0ZS1ub3Rlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgICAgIGdldEFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldEFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0QWxsRW52aXJvbm1lbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50c1wiXSxcbiAgICAgICAgZ2V0QWxsU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRBbGxUb3BpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCJdLFxuICAgICAgICBnZXRBcHBzV2l0aEFjY2Vzc1RvUHJvdGVjdGVkQnJhbmNoOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRBdXRvbGluazogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3Mve2F1dG9saW5rX2lkfVwiXSxcbiAgICAgICAgZ2V0QnJhbmNoOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9XCJdLFxuICAgICAgICBnZXRCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRDbG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9jbG9uZXNcIl0sXG4gICAgICAgIGdldENvZGVGcmVxdWVuY3lTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb2RlX2ZyZXF1ZW5jeVwiXSxcbiAgICAgICAgZ2V0Q29sbGFib3JhdG9yUGVybWlzc2lvbkxldmVsOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9L3Blcm1pc3Npb25cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0Q29tYmluZWRTdGF0dXNGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNcIl0sXG4gICAgICAgIGdldENvbW1pdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9XCJdLFxuICAgICAgICBnZXRDb21taXRBY3Rpdml0eVN0YXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXRzL2NvbW1pdF9hY3Rpdml0eVwiXSxcbiAgICAgICAgZ2V0Q29tbWl0Q29tbWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgICAgIGdldENvbW1pdFNpZ25hdHVyZVByb3RlY3Rpb246IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0Q29tbXVuaXR5UHJvZmlsZU1ldHJpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbXVuaXR5L3Byb2ZpbGVcIl0sXG4gICAgICAgIGdldENvbnRlbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udGVudHMve3BhdGh9XCJdLFxuICAgICAgICBnZXRDb250cmlidXRvcnNTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb250cmlidXRvcnNcIl0sXG4gICAgICAgIGdldERlcGxveUtleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzL3trZXlfaWR9XCJdLFxuICAgICAgICBnZXREZXBsb3ltZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfVwiXSxcbiAgICAgICAgZ2V0RGVwbG95bWVudFN0YXR1czogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlcy97c3RhdHVzX2lkfVwiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRFbnZpcm9ubWVudDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0TGF0ZXN0UGFnZXNCdWlsZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHMvbGF0ZXN0XCJdLFxuICAgICAgICBnZXRMYXRlc3RSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdFwiXSxcbiAgICAgICAgZ2V0UGFnZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgICAgIGdldFBhZ2VzQnVpbGQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzL3tidWlsZF9pZH1cIl0sXG4gICAgICAgIGdldFBhZ2VzSGVhbHRoQ2hlY2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvaGVhbHRoXCJdLFxuICAgICAgICBnZXRQYXJ0aWNpcGF0aW9uU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvcGFydGljaXBhdGlvblwiXSxcbiAgICAgICAgZ2V0UHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9wdWxsX3JlcXVlc3RfcmV2aWV3c1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRQdW5jaENhcmRTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9wdW5jaF9jYXJkXCJdLFxuICAgICAgICBnZXRSZWFkbWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVhZG1lXCJdLFxuICAgICAgICBnZXRSZWFkbWVJbkRpcmVjdG9yeTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWFkbWUve2Rpcn1cIl0sXG4gICAgICAgIGdldFJlbGVhc2U6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9XCJdLFxuICAgICAgICBnZXRSZWxlYXNlQXNzZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIl0sXG4gICAgICAgIGdldFJlbGVhc2VCeVRhZzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy90YWdzL3t0YWd9XCJdLFxuICAgICAgICBnZXRTdGF0dXNDaGVja3NQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFRlYW1zV2l0aEFjY2Vzc1RvUHJvdGVjdGVkQnJhbmNoOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0VG9wUGF0aHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9wb3B1bGFyL3BhdGhzXCJdLFxuICAgICAgICBnZXRUb3BSZWZlcnJlcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9wb3B1bGFyL3JlZmVycmVyc1wiXSxcbiAgICAgICAgZ2V0VXNlcnNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAgICBdLFxuICAgICAgICBnZXRWaWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3ZpZXdzXCJdLFxuICAgICAgICBnZXRXZWJob29rOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICAgICAgZ2V0V2ViaG9va0NvbmZpZ0ZvclJlcG86IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vY29uZmlnXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEF1dG9saW5rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3NcIl0sXG4gICAgICAgIGxpc3RCcmFuY2hlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiXSxcbiAgICAgICAgbGlzdEJyYW5jaGVzRm9ySGVhZENvbW1pdDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2JyYW5jaGVzLXdoZXJlLWhlYWRcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdENvbGxhYm9yYXRvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9yc1wiXSxcbiAgICAgICAgbGlzdENvbW1lbnRzRm9yQ29tbWl0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdENvbW1pdENvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50c1wiXSxcbiAgICAgICAgbGlzdENvbW1pdFN0YXR1c2VzRm9yUmVmOiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCJdLFxuICAgICAgICBsaXN0Q29udHJpYnV0b3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiXSxcbiAgICAgICAgbGlzdERlcGxveUtleXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICAgICAgbGlzdERlcGxveW1lbnRTdGF0dXNlczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0RGVwbG95bWVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIl0sXG4gICAgICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3JlcG9zXCJdLFxuICAgICAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVwb3NcIl0sXG4gICAgICAgIGxpc3RGb3JrczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9mb3Jrc1wiXSxcbiAgICAgICAgbGlzdEludml0YXRpb25zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCJdLFxuICAgICAgICBsaXN0SW52aXRhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3JlcG9zaXRvcnlfaW52aXRhdGlvbnNcIl0sXG4gICAgICAgIGxpc3RMYW5ndWFnZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFuZ3VhZ2VzXCJdLFxuICAgICAgICBsaXN0UGFnZXNCdWlsZHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCJdLFxuICAgICAgICBsaXN0UHVibGljOiBbXCJHRVQgL3JlcG9zaXRvcmllc1wiXSxcbiAgICAgICAgbGlzdFB1bGxSZXF1ZXN0c0Fzc29jaWF0ZWRXaXRoQ29tbWl0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vcHVsbHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFJlbGVhc2VBc3NldHM6IFtcbiAgICAgICAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vYXNzZXRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RSZWxlYXNlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiXSxcbiAgICAgICAgbGlzdFRhZ1Byb3RlY3Rpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgICAgICBsaXN0VGFnczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzXCJdLFxuICAgICAgICBsaXN0VGVhbXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGVhbXNcIl0sXG4gICAgICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICAgICAgbWVyZ2U6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21lcmdlc1wiXSxcbiAgICAgICAgbWVyZ2VVcHN0cmVhbTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWVyZ2UtdXBzdHJlYW1cIl0sXG4gICAgICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgICAgIHJlZGVsaXZlcldlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZUFwcEFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL2FwcHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyBtYXBUb0RhdGE6IFwiYXBwc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZUNvbGxhYm9yYXRvcjogW1xuICAgICAgICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICByZW1vdmVTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgbWFwVG9EYXRhOiBcImNvbnRleHRzXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ0ZWFtc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJlbW92ZVVzZXJBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHJlbmFtZUJyYW5jaDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcmVuYW1lXCJdLFxuICAgICAgICByZXBsYWNlQWxsVG9waWNzOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RvcGljc1wiXSxcbiAgICAgICAgcmVxdWVzdFBhZ2VzQnVpbGQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiXSxcbiAgICAgICAgc2V0QWRtaW5CcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2V0QXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICAgICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc2V0U3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJjb250ZXh0c1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHNldFRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ0ZWFtc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHNldFVzZXJBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgICAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHRlc3RQdXNoV2ViaG9vazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L3Rlc3RzXCJdLFxuICAgICAgICB0cmFuc2ZlcjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhbnNmZXJcIl0sXG4gICAgICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgICAgICB1cGRhdGVCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVDb21taXRDb21tZW50OiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgICAgICB1cGRhdGVJbmZvcm1hdGlvbkFib3V0UGFnZXNTaXRlOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgICAgICB1cGRhdGVJbnZpdGF0aW9uOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlUHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3B1bGxfcmVxdWVzdF9yZXZpZXdzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVwZGF0ZVJlbGVhc2U6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgICAgIHVwZGF0ZVJlbGVhc2VBc3NldDogW1xuICAgICAgICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlU3RhdHVzQ2hlY2tQb3RlY3Rpb246IFtcbiAgICAgICAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwidXBkYXRlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHVwZGF0ZVN0YXR1c0NoZWNrUHJvdGVjdGlvbjogW1xuICAgICAgICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVwZGF0ZVdlYmhvb2s6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgICAgIHVwZGF0ZVdlYmhvb2tDb25maWdGb3JSZXBvOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vY29uZmlnXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHVwbG9hZFJlbGVhc2VBc3NldDogW1xuICAgICAgICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vYXNzZXRzez9uYW1lLGxhYmVsfVwiLFxuICAgICAgICAgICAgeyBiYXNlVXJsOiBcImh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tXCIgfSxcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIHNlYXJjaDoge1xuICAgICAgICBjb2RlOiBbXCJHRVQgL3NlYXJjaC9jb2RlXCJdLFxuICAgICAgICBjb21taXRzOiBbXCJHRVQgL3NlYXJjaC9jb21taXRzXCJdLFxuICAgICAgICBpc3N1ZXNBbmRQdWxsUmVxdWVzdHM6IFtcIkdFVCAvc2VhcmNoL2lzc3Vlc1wiXSxcbiAgICAgICAgbGFiZWxzOiBbXCJHRVQgL3NlYXJjaC9sYWJlbHNcIl0sXG4gICAgICAgIHJlcG9zOiBbXCJHRVQgL3NlYXJjaC9yZXBvc2l0b3JpZXNcIl0sXG4gICAgICAgIHRvcGljczogW1wiR0VUIC9zZWFyY2gvdG9waWNzXCJdLFxuICAgICAgICB1c2VyczogW1wiR0VUIC9zZWFyY2gvdXNlcnNcIl0sXG4gICAgfSxcbiAgICBzZWNyZXRTY2FubmluZzoge1xuICAgICAgICBnZXRBbGVydDogW1xuICAgICAgICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgICAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICAgICAgICBdLFxuICAgICAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICAgICAgbGlzdEFsZXJ0c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICAgICAgbGlzdExvY2F0aW9uc0ZvckFsZXJ0OiBbXG4gICAgICAgICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9sb2NhdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgdXBkYXRlQWxlcnQ6IFtcbiAgICAgICAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIHRlYW1zOiB7XG4gICAgICAgIGFkZE9yVXBkYXRlTWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1xuICAgICAgICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiLFxuICAgICAgICBdLFxuICAgICAgICBhZGRPclVwZGF0ZVByb2plY3RQZXJtaXNzaW9uc0luT3JnOiBbXG4gICAgICAgICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgYWRkT3JVcGRhdGVSZXBvUGVybWlzc2lvbnNJbk9yZzogW1xuICAgICAgICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIixcbiAgICAgICAgXSxcbiAgICAgICAgY2hlY2tQZXJtaXNzaW9uc0ZvclByb2plY3RJbk9yZzogW1xuICAgICAgICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNoZWNrUGVybWlzc2lvbnNGb3JSZXBvSW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zL3tvd25lcn0ve3JlcG99XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNyZWF0ZTogW1wiUE9TVCAvb3Jncy97b3JnfS90ZWFtc1wiXSxcbiAgICAgICAgY3JlYXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlRGlzY3Vzc2lvbkluT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zXCJdLFxuICAgICAgICBkZWxldGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUluT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgICAgIGdldEJ5TmFtZTogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdLFxuICAgICAgICBnZXREaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0RGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICAgICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9XCIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldE1lbWJlcnNoaXBGb3JVc2VySW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdDogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zXCJdLFxuICAgICAgICBsaXN0Q2hpbGRJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3RlYW1zXCJdLFxuICAgICAgICBsaXN0RGlzY3Vzc2lvbkNvbW1lbnRzSW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdERpc2N1c3Npb25zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiXSxcbiAgICAgICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvdGVhbXNcIl0sXG4gICAgICAgIGxpc3RNZW1iZXJzSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzXCJdLFxuICAgICAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zSW5Pcmc6IFtcbiAgICAgICAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2ludml0YXRpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RQcm9qZWN0c0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHNcIl0sXG4gICAgICAgIGxpc3RSZXBvc0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3NcIl0sXG4gICAgICAgIHJlbW92ZU1lbWJlcnNoaXBGb3JVc2VySW5Pcmc6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlUHJvamVjdEluT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVtb3ZlUmVwb0luT3JnOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvcy97b3duZXJ9L3tyZXBvfVwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICAgICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgICAgICAgIFwiUEFUQ0ggL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiLFxuICAgICAgICBdLFxuICAgICAgICB1cGRhdGVJbk9yZzogW1wiUEFUQ0ggL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgfSxcbiAgICB1c2Vyczoge1xuICAgICAgICBhZGRFbWFpbEZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9lbWFpbHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImFkZEVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9lbWFpbHNcIl0sXG4gICAgICAgIGJsb2NrOiBbXCJQVVQgL3VzZXIvYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIGNoZWNrQmxvY2tlZDogW1wiR0VUIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBjaGVja0ZvbGxvd2luZ0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmcve3RhcmdldF91c2VyfVwiXSxcbiAgICAgICAgY2hlY2tQZXJzb25Jc0ZvbGxvd2VkQnlBdXRoZW50aWNhdGVkOiBbXCJHRVQgL3VzZXIvZm9sbG93aW5nL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIGNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9ncGdfa2V5c1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvZ3BnX2tleXNcIl0sXG4gICAgICAgIGNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiUE9TVCAvdXNlci9rZXlzXCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9rZXlzXCJdLFxuICAgICAgICBkZWxldGVFbWFpbEZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiREVMRVRFIC91c2VyL2VtYWlsc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZGVsZXRlRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvZW1haWxzXCJdLFxuICAgICAgICBkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCJdLFxuICAgICAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICAgICAgICBcIkRFTEVURSAvdXNlci9rZXlzL3trZXlfaWR9XCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2tleXMve2tleV9pZH1cIl0sXG4gICAgICAgIGZvbGxvdzogW1wiUFVUIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgICAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL3VzZXJcIl0sXG4gICAgICAgIGdldEJ5VXNlcm5hbWU6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfVwiXSxcbiAgICAgICAgZ2V0Q29udGV4dEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ob3ZlcmNhcmRcIl0sXG4gICAgICAgIGdldEdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIl0sXG4gICAgICAgIGdldFB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2tleXMve2tleV9pZH1cIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImdldFB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGdldFB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIva2V5cy97a2V5X2lkfVwiXSxcbiAgICAgICAgbGlzdDogW1wiR0VUIC91c2Vyc1wiXSxcbiAgICAgICAgbGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2Jsb2Nrc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2Jsb2Nrc1wiXSxcbiAgICAgICAgbGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2VtYWlsc1wiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxpc3RFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2VtYWlsc1wiXSxcbiAgICAgICAgbGlzdEZvbGxvd2VkQnlBdXRoZW50aWNhdGVkOiBbXG4gICAgICAgICAgICBcIkdFVCAvdXNlci9mb2xsb3dpbmdcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RGb2xsb3dlZEJ5QXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEZvbGxvd2VkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ZvbGxvd2luZ1wiXSxcbiAgICAgICAgbGlzdEZvbGxvd2Vyc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZm9sbG93ZXJzXCJdLFxuICAgICAgICBsaXN0Rm9sbG93ZXJzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2Vyc1wiXSxcbiAgICAgICAgbGlzdEZvbGxvd2luZ0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmdcIl0sXG4gICAgICAgIGxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgICAgICAgXCJHRVQgL3VzZXIvZ3BnX2tleXNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdEdwZ0tleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2dwZ19rZXlzXCJdLFxuICAgICAgICBsaXN0R3BnS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiXSxcbiAgICAgICAgbGlzdFB1YmxpY0VtYWlsc0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL3B1YmxpY19lbWFpbHNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBsaXN0UHVibGljRW1haWxzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9wdWJsaWNfZW1haWxzXCJdLFxuICAgICAgICBsaXN0UHVibGljS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9rZXlzXCJdLFxuICAgICAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgICAgICAgIFwiR0VUIC91c2VyL2tleXNcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNTc2hLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGlzdFB1YmxpY1NzaEtleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2tleXNcIl0sXG4gICAgICAgIHNldFByaW1hcnlFbWFpbFZpc2liaWxpdHlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICAgICAgICBcIlBBVENIIC91c2VyL2VtYWlsL3Zpc2liaWxpdHlcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcInNldFByaW1hcnlFbWFpbFZpc2liaWxpdHlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9LFxuICAgICAgICBdLFxuICAgICAgICBzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgICAgICAgIFwiUEFUQ0ggL3VzZXIvZW1haWwvdmlzaWJpbGl0eVwiLFxuICAgICAgICBdLFxuICAgICAgICB1bmJsb2NrOiBbXCJERUxFVEUgL3VzZXIvYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIHVuZm9sbG93OiBbXCJERUxFVEUgL3VzZXIvZm9sbG93aW5nL3t1c2VybmFtZX1cIl0sXG4gICAgICAgIHVwZGF0ZUF1dGhlbnRpY2F0ZWQ6IFtcIlBBVENIIC91c2VyXCJdLFxuICAgIH0sXG59O1xuXG5jb25zdCBWRVJTSU9OID0gXCI1LjE2LjJcIjtcblxuZnVuY3Rpb24gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQsIGVuZHBvaW50c01hcCkge1xuICAgIGNvbnN0IG5ld01ldGhvZHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtzY29wZSwgZW5kcG9pbnRzXSBvZiBPYmplY3QuZW50cmllcyhlbmRwb2ludHNNYXApKSB7XG4gICAgICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIGVuZHBvaW50XSBvZiBPYmplY3QuZW50cmllcyhlbmRwb2ludHMpKSB7XG4gICAgICAgICAgICBjb25zdCBbcm91dGUsIGRlZmF1bHRzLCBkZWNvcmF0aW9uc10gPSBlbmRwb2ludDtcbiAgICAgICAgICAgIGNvbnN0IFttZXRob2QsIHVybF0gPSByb3V0ZS5zcGxpdCgvIC8pO1xuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnREZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oeyBtZXRob2QsIHVybCB9LCBkZWZhdWx0cyk7XG4gICAgICAgICAgICBpZiAoIW5ld01ldGhvZHNbc2NvcGVdKSB7XG4gICAgICAgICAgICAgICAgbmV3TWV0aG9kc1tzY29wZV0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNjb3BlTWV0aG9kcyA9IG5ld01ldGhvZHNbc2NvcGVdO1xuICAgICAgICAgICAgaWYgKGRlY29yYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgc2NvcGVNZXRob2RzW21ldGhvZE5hbWVdID0gZGVjb3JhdGUob2N0b2tpdCwgc2NvcGUsIG1ldGhvZE5hbWUsIGVuZHBvaW50RGVmYXVsdHMsIGRlY29yYXRpb25zKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlTWV0aG9kc1ttZXRob2ROYW1lXSA9IG9jdG9raXQucmVxdWVzdC5kZWZhdWx0cyhlbmRwb2ludERlZmF1bHRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3TWV0aG9kcztcbn1cbmZ1bmN0aW9uIGRlY29yYXRlKG9jdG9raXQsIHNjb3BlLCBtZXRob2ROYW1lLCBkZWZhdWx0cywgZGVjb3JhdGlvbnMpIHtcbiAgICBjb25zdCByZXF1ZXN0V2l0aERlZmF1bHRzID0gb2N0b2tpdC5yZXF1ZXN0LmRlZmF1bHRzKGRlZmF1bHRzKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uIHdpdGhEZWNvcmF0aW9ucyguLi5hcmdzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yNTQ4OFxuICAgICAgICBsZXQgb3B0aW9ucyA9IHJlcXVlc3RXaXRoRGVmYXVsdHMuZW5kcG9pbnQubWVyZ2UoLi4uYXJncyk7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gb3RoZXIgZGVjb3JhdGlvbnMgdGhhbiBgLm1hcFRvRGF0YWBcbiAgICAgICAgaWYgKGRlY29yYXRpb25zLm1hcFRvRGF0YSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb25zW2RlY29yYXRpb25zLm1hcFRvRGF0YV0sXG4gICAgICAgICAgICAgICAgW2RlY29yYXRpb25zLm1hcFRvRGF0YV06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IFtuZXdTY29wZSwgbmV3TWV0aG9kTmFtZV0gPSBkZWNvcmF0aW9ucy5yZW5hbWVkO1xuICAgICAgICAgICAgb2N0b2tpdC5sb2cud2Fybihgb2N0b2tpdC4ke3Njb3BlfS4ke21ldGhvZE5hbWV9KCkgaGFzIGJlZW4gcmVuYW1lZCB0byBvY3Rva2l0LiR7bmV3U2NvcGV9LiR7bmV3TWV0aG9kTmFtZX0oKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNvcmF0aW9ucy5kZXByZWNhdGVkKSB7XG4gICAgICAgICAgICBvY3Rva2l0LmxvZy53YXJuKGRlY29yYXRpb25zLmRlcHJlY2F0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNvcmF0aW9ucy5yZW5hbWVkUGFyYW1ldGVycykge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzI1NDg4XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gcmVxdWVzdFdpdGhEZWZhdWx0cy5lbmRwb2ludC5tZXJnZSguLi5hcmdzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIGFsaWFzXSBvZiBPYmplY3QuZW50cmllcyhkZWNvcmF0aW9ucy5yZW5hbWVkUGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9jdG9raXQubG9nLndhcm4oYFwiJHtuYW1lfVwiIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGZvciBcIm9jdG9raXQuJHtzY29wZX0uJHttZXRob2ROYW1lfSgpXCIuIFVzZSBcIiR7YWxpYXN9XCIgaW5zdGVhZGApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGlhcyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1thbGlhc10gPSBvcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0V2l0aERlZmF1bHRzKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yNTQ4OFxuICAgICAgICByZXR1cm4gcmVxdWVzdFdpdGhEZWZhdWx0cyguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24od2l0aERlY29yYXRpb25zLCByZXF1ZXN0V2l0aERlZmF1bHRzKTtcbn1cblxuZnVuY3Rpb24gcmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gICAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQsIEVuZHBvaW50cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdDogYXBpLFxuICAgIH07XG59XG5yZXN0RW5kcG9pbnRNZXRob2RzLlZFUlNJT04gPSBWRVJTSU9OO1xuZnVuY3Rpb24gbGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gICAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQsIEVuZHBvaW50cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYXBpLFxuICAgICAgICByZXN0OiBhcGksXG4gICAgfTtcbn1cbmxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5cbmV4cG9ydCB7IGxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMsIHJlc3RFbmRwb2ludE1ldGhvZHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///66802\n')},4861:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.issue = exports.issueCommand = void 0;\nconst os = __importStar(__webpack_require__(70857));\nconst utils_1 = __webpack_require__(7089);\n/**\n * Commands\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * Examples:\n * ::warning::This is the message\n * ::set-env name=MY_VAR::some value\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nexports.issueCommand = issueCommand;\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nexports.issue = issue;\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg2MS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQSxtQ0FBbUMsb0NBQW9DLGdCQUFnQjtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGFBQWEsR0FBRyxvQkFBb0I7QUFDcEMsd0JBQXdCLG1CQUFPLENBQUMsS0FBSTtBQUNwQyxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsSUFBSSxHQUFHLG9CQUFvQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixXQUFXLEVBQUUseUJBQXlCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvY29tbWFuZC5qcz8zZjI4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNzdWUgPSBleHBvcnRzLmlzc3VlQ29tbWFuZCA9IHZvaWQgMDtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vKipcbiAqIENvbW1hbmRzXG4gKlxuICogQ29tbWFuZCBGb3JtYXQ6XG4gKiAgIDo6bmFtZSBrZXk9dmFsdWUsa2V5PXZhbHVlOjptZXNzYWdlXG4gKlxuICogRXhhbXBsZXM6XG4gKiAgIDo6d2FybmluZzo6VGhpcyBpcyB0aGUgbWVzc2FnZVxuICogICA6OnNldC1lbnYgbmFtZT1NWV9WQVI6OnNvbWUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNzdWVDb21tYW5kKGNvbW1hbmQsIHByb3BlcnRpZXMsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZChjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjbWQudG9TdHJpbmcoKSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmlzc3VlQ29tbWFuZCA9IGlzc3VlQ29tbWFuZDtcbmZ1bmN0aW9uIGlzc3VlKG5hbWUsIG1lc3NhZ2UgPSAnJykge1xuICAgIGlzc3VlQ29tbWFuZChuYW1lLCB7fSwgbWVzc2FnZSk7XG59XG5leHBvcnRzLmlzc3VlID0gaXNzdWU7XG5jb25zdCBDTURfU1RSSU5HID0gJzo6JztcbmNsYXNzIENvbW1hbmQge1xuICAgIGNvbnN0cnVjdG9yKGNvbW1hbmQsIHByb3BlcnRpZXMsIG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gJ21pc3NpbmcuY29tbWFuZCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBjbWRTdHIgPSBDTURfU1RSSU5HICsgdGhpcy5jb21tYW5kO1xuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydGllcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY21kU3RyICs9ICcgJztcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTdHIgKz0gJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY21kU3RyICs9IGAke2tleX09JHtlc2NhcGVQcm9wZXJ0eSh2YWwpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY21kU3RyICs9IGAke0NNRF9TVFJJTkd9JHtlc2NhcGVEYXRhKHRoaXMubWVzc2FnZSl9YDtcbiAgICAgICAgcmV0dXJuIGNtZFN0cjtcbiAgICB9XG59XG5mdW5jdGlvbiBlc2NhcGVEYXRhKHMpIHtcbiAgICByZXR1cm4gdXRpbHNfMS50b0NvbW1hbmRWYWx1ZShzKVxuICAgICAgICAucmVwbGFjZSgvJS9nLCAnJTI1JylcbiAgICAgICAgLnJlcGxhY2UoL1xcci9nLCAnJTBEJylcbiAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnJTBBJyk7XG59XG5mdW5jdGlvbiBlc2NhcGVQcm9wZXJ0eShzKSB7XG4gICAgcmV0dXJuIHV0aWxzXzEudG9Db21tYW5kVmFsdWUocylcbiAgICAgICAgLnJlcGxhY2UoLyUvZywgJyUyNScpXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZywgJyUwRCcpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJyUwQScpXG4gICAgICAgIC5yZXBsYWNlKC86L2csICclM0EnKVxuICAgICAgICAucmVwbGFjZSgvLC9nLCAnJTJDJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tYW5kLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4861\n")},66977:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;\nconst command_1 = __webpack_require__(4861);\nconst file_command_1 = __webpack_require__(46224);\nconst utils_1 = __webpack_require__(7089);\nconst os = __importStar(__webpack_require__(70857));\nconst path = __importStar(__webpack_require__(16928));\nconst oidc_utils_1 = __webpack_require__(25015);\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = utils_1.toCommandValue(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));\n }\n command_1.issueCommand('set-env', { name }, convertedVal);\n}\nexports.exportVariable = exportVariable;\n/**\n * Registers a secret which will get masked from logs\n * @param secret value of the secret\n */\nfunction setSecret(secret) {\n command_1.issueCommand('add-mask', {}, secret);\n}\nexports.setSecret = setSecret;\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n file_command_1.issueFileCommand('PATH', inputPath);\n }\n else {\n command_1.issueCommand('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\nexports.addPath = addPath;\n/**\n * Gets the value of an input.\n * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.\n * Returns an empty string if the value is not defined.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n if (options && options.trimWhitespace === false) {\n return val;\n }\n return val.trim();\n}\nexports.getInput = getInput;\n/**\n * Gets the values of an multiline input. Each value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string[]\n *\n */\nfunction getMultilineInput(name, options) {\n const inputs = getInput(name, options)\n .split('\\n')\n .filter(x => x !== '');\n if (options && options.trimWhitespace === false) {\n return inputs;\n }\n return inputs.map(input => input.trim());\n}\nexports.getMultilineInput = getMultilineInput;\n/**\n * Gets the input value of the boolean type in the YAML 1.2 \"core schema\" specification.\n * Support boolean input list: `true | True | TRUE | false | False | FALSE` .\n * The return value is also in boolean type.\n * ref: https://yaml.org/spec/1.2/spec.html#id2804923\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns boolean\n */\nfunction getBooleanInput(name, options) {\n const trueValue = ['true', 'True', 'TRUE'];\n const falseValue = ['false', 'False', 'FALSE'];\n const val = getInput(name, options);\n if (trueValue.includes(val))\n return true;\n if (falseValue.includes(val))\n return false;\n throw new TypeError(`Input does not meet YAML 1.2 \"Core Schema\" specification: ${name}\\n` +\n `Support boolean input list: \\`true | True | TRUE | false | False | FALSE\\``);\n}\nexports.getBooleanInput = getBooleanInput;\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n const filePath = process.env['GITHUB_OUTPUT'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));\n }\n process.stdout.write(os.EOL);\n command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));\n}\nexports.setOutput = setOutput;\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n command_1.issue('echo', enabled ? 'on' : 'off');\n}\nexports.setCommandEcho = setCommandEcho;\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\nexports.setFailed = setFailed;\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\nexports.isDebug = isDebug;\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n command_1.issueCommand('debug', {}, message);\n}\nexports.debug = debug;\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction error(message, properties = {}) {\n command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.error = error;\n/**\n * Adds a warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction warning(message, properties = {}) {\n command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.warning = warning;\n/**\n * Adds a notice issue\n * @param message notice issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction notice(message, properties = {}) {\n command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.notice = notice;\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\nexports.info = info;\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n command_1.issue('group', name);\n}\nexports.startGroup = startGroup;\n/**\n * End an output group.\n */\nfunction endGroup() {\n command_1.issue('endgroup');\n}\nexports.endGroup = endGroup;\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\nexports.group = group;\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n const filePath = process.env['GITHUB_STATE'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));\n }\n command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));\n}\nexports.saveState = saveState;\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nexports.getState = getState;\nfunction getIDToken(aud) {\n return __awaiter(this, void 0, void 0, function* () {\n return yield oidc_utils_1.OidcClient.getIDToken(aud);\n });\n}\nexports.getIDToken = getIDToken;\n/**\n * Summary exports\n */\nvar summary_1 = __webpack_require__(21040);\nObject.defineProperty(exports, \"summary\", ({ enumerable: true, get: function () { return summary_1.summary; } }));\n/**\n * @deprecated use core.summary\n */\nvar summary_2 = __webpack_require__(21040);\nObject.defineProperty(exports, \"markdownSummary\", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } }));\n/**\n * Path exports\n */\nvar path_utils_1 = __webpack_require__(317);\nObject.defineProperty(exports, \"toPosixPath\", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } }));\nObject.defineProperty(exports, \"toWin32Path\", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } }));\nObject.defineProperty(exports, \"toPlatformPath\", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } }));\n//# sourceMappingURL=core.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUM7QUFDL0g7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFPLENBQUMsR0FBYztBQUN6QywrQ0FBOEMsRUFBRSxxQ0FBcUMsb0NBQW9DLEVBQUM7QUFDMUgsK0NBQThDLEVBQUUscUNBQXFDLG9DQUFvQyxFQUFDO0FBQzFILGtEQUFpRCxFQUFFLHFDQUFxQyx1Q0FBdUMsRUFBQztBQUNoSSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvY29yZS5qcz84ZmZkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRJRFRva2VuID0gZXhwb3J0cy5nZXRTdGF0ZSA9IGV4cG9ydHMuc2F2ZVN0YXRlID0gZXhwb3J0cy5ncm91cCA9IGV4cG9ydHMuZW5kR3JvdXAgPSBleHBvcnRzLnN0YXJ0R3JvdXAgPSBleHBvcnRzLmluZm8gPSBleHBvcnRzLm5vdGljZSA9IGV4cG9ydHMud2FybmluZyA9IGV4cG9ydHMuZXJyb3IgPSBleHBvcnRzLmRlYnVnID0gZXhwb3J0cy5pc0RlYnVnID0gZXhwb3J0cy5zZXRGYWlsZWQgPSBleHBvcnRzLnNldENvbW1hbmRFY2hvID0gZXhwb3J0cy5zZXRPdXRwdXQgPSBleHBvcnRzLmdldEJvb2xlYW5JbnB1dCA9IGV4cG9ydHMuZ2V0TXVsdGlsaW5lSW5wdXQgPSBleHBvcnRzLmdldElucHV0ID0gZXhwb3J0cy5hZGRQYXRoID0gZXhwb3J0cy5zZXRTZWNyZXQgPSBleHBvcnRzLmV4cG9ydFZhcmlhYmxlID0gZXhwb3J0cy5FeGl0Q29kZSA9IHZvaWQgMDtcbmNvbnN0IGNvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2NvbW1hbmRcIik7XG5jb25zdCBmaWxlX2NvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2ZpbGUtY29tbWFuZFwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IG9pZGNfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL29pZGMtdXRpbHNcIik7XG4vKipcbiAqIFRoZSBjb2RlIHRvIGV4aXQgYW4gYWN0aW9uXG4gKi9cbnZhciBFeGl0Q29kZTtcbihmdW5jdGlvbiAoRXhpdENvZGUpIHtcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBFeGl0Q29kZVtFeGl0Q29kZVtcIlN1Y2Nlc3NcIl0gPSAwXSA9IFwiU3VjY2Vzc1wiO1xuICAgIC8qKlxuICAgICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdGlvbiB3YXMgYSBmYWlsdXJlXG4gICAgICovXG4gICAgRXhpdENvZGVbRXhpdENvZGVbXCJGYWlsdXJlXCJdID0gMV0gPSBcIkZhaWx1cmVcIjtcbn0pKEV4aXRDb2RlID0gZXhwb3J0cy5FeGl0Q29kZSB8fCAoZXhwb3J0cy5FeGl0Q29kZSA9IHt9KSk7XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBWYXJpYWJsZXNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogU2V0cyBlbnYgdmFyaWFibGUgZm9yIHRoaXMgYWN0aW9uIGFuZCBmdXR1cmUgYWN0aW9ucyBpbiB0aGUgam9iXG4gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gc2V0XG4gKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuIE5vbi1zdHJpbmcgdmFsdWVzIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RyaW5nIHZpYSBKU09OLnN0cmluZ2lmeVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gZXhwb3J0VmFyaWFibGUobmFtZSwgdmFsKSB7XG4gICAgY29uc3QgY29udmVydGVkVmFsID0gdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSh2YWwpO1xuICAgIHByb2Nlc3MuZW52W25hbWVdID0gY29udmVydGVkVmFsO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9FTlYnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVfY29tbWFuZF8xLmlzc3VlRmlsZUNvbW1hbmQoJ0VOVicsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UobmFtZSwgdmFsKSk7XG4gICAgfVxuICAgIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQoJ3NldC1lbnYnLCB7IG5hbWUgfSwgY29udmVydGVkVmFsKTtcbn1cbmV4cG9ydHMuZXhwb3J0VmFyaWFibGUgPSBleHBvcnRWYXJpYWJsZTtcbi8qKlxuICogUmVnaXN0ZXJzIGEgc2VjcmV0IHdoaWNoIHdpbGwgZ2V0IG1hc2tlZCBmcm9tIGxvZ3NcbiAqIEBwYXJhbSBzZWNyZXQgdmFsdWUgb2YgdGhlIHNlY3JldFxuICovXG5mdW5jdGlvbiBzZXRTZWNyZXQoc2VjcmV0KSB7XG4gICAgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCgnYWRkLW1hc2snLCB7fSwgc2VjcmV0KTtcbn1cbmV4cG9ydHMuc2V0U2VjcmV0ID0gc2V0U2VjcmV0O1xuLyoqXG4gKiBQcmVwZW5kcyBpbnB1dFBhdGggdG8gdGhlIFBBVEggKGZvciB0aGlzIGFjdGlvbiBhbmQgZnV0dXJlIGFjdGlvbnMpXG4gKiBAcGFyYW0gaW5wdXRQYXRoXG4gKi9cbmZ1bmN0aW9uIGFkZFBhdGgoaW5wdXRQYXRoKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudlsnR0lUSFVCX1BBVEgnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCgnUEFUSCcsIGlucHV0UGF0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb21tYW5kXzEuaXNzdWVDb21tYW5kKCdhZGQtcGF0aCcsIHt9LCBpbnB1dFBhdGgpO1xuICAgIH1cbiAgICBwcm9jZXNzLmVudlsnUEFUSCddID0gYCR7aW5wdXRQYXRofSR7cGF0aC5kZWxpbWl0ZXJ9JHtwcm9jZXNzLmVudlsnUEFUSCddfWA7XG59XG5leHBvcnRzLmFkZFBhdGggPSBhZGRQYXRoO1xuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dC5cbiAqIFVubGVzcyB0cmltV2hpdGVzcGFjZSBpcyBzZXQgdG8gZmFsc2UgaW4gSW5wdXRPcHRpb25zLCB0aGUgdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0SW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbCA9IHByb2Nlc3MuZW52W2BJTlBVVF8ke25hbWUucmVwbGFjZSgvIC9nLCAnXycpLnRvVXBwZXJDYXNlKCl9YF0gfHwgJyc7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXF1aXJlZCAmJiAhdmFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgcmVxdWlyZWQgYW5kIG5vdCBzdXBwbGllZDogJHtuYW1lfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLnRyaW0oKTtcbn1cbmV4cG9ydHMuZ2V0SW5wdXQgPSBnZXRJbnB1dDtcbi8qKlxuICogR2V0cyB0aGUgdmFsdWVzIG9mIGFuIG11bHRpbGluZSBpbnB1dC4gIEVhY2ggdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdbXVxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0TXVsdGlsaW5lSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLmZpbHRlcih4ID0+IHggIT09ICcnKTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiBpbnB1dC50cmltKCkpO1xufVxuZXhwb3J0cy5nZXRNdWx0aWxpbmVJbnB1dCA9IGdldE11bHRpbGluZUlucHV0O1xuLyoqXG4gKiBHZXRzIHRoZSBpbnB1dCB2YWx1ZSBvZiB0aGUgYm9vbGVhbiB0eXBlIGluIHRoZSBZQU1MIDEuMiBcImNvcmUgc2NoZW1hXCIgc3BlY2lmaWNhdGlvbi5cbiAqIFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBgdHJ1ZSB8IFRydWUgfCBUUlVFIHwgZmFsc2UgfCBGYWxzZSB8IEZBTFNFYCAuXG4gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gaW4gYm9vbGVhbiB0eXBlLlxuICogcmVmOiBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgYm9vbGVhblxuICovXG5mdW5jdGlvbiBnZXRCb29sZWFuSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRydWVWYWx1ZSA9IFsndHJ1ZScsICdUcnVlJywgJ1RSVUUnXTtcbiAgICBjb25zdCBmYWxzZVZhbHVlID0gWydmYWxzZScsICdGYWxzZScsICdGQUxTRSddO1xuICAgIGNvbnN0IHZhbCA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmICh0cnVlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGZhbHNlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYElucHV0IGRvZXMgbm90IG1lZXQgWUFNTCAxLjIgXCJDb3JlIFNjaGVtYVwiIHNwZWNpZmljYXRpb246ICR7bmFtZX1cXG5gICtcbiAgICAgICAgYFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBcXGB0cnVlIHwgVHJ1ZSB8IFRSVUUgfCBmYWxzZSB8IEZhbHNlIHwgRkFMU0VcXGBgKTtcbn1cbmV4cG9ydHMuZ2V0Qm9vbGVhbklucHV0ID0gZ2V0Qm9vbGVhbklucHV0O1xuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRwdXQuXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBvdXRwdXQgdG8gc2V0XG4gKiBAcGFyYW0gICAgIHZhbHVlICAgIHZhbHVlIHRvIHN0b3JlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHNldE91dHB1dChuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9PVVRQVVQnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVfY29tbWFuZF8xLmlzc3VlRmlsZUNvbW1hbmQoJ09VVFBVVCcsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UobmFtZSwgdmFsdWUpKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3MuRU9MKTtcbiAgICBjb21tYW5kXzEuaXNzdWVDb21tYW5kKCdzZXQtb3V0cHV0JywgeyBuYW1lIH0sIHV0aWxzXzEudG9Db21tYW5kVmFsdWUodmFsdWUpKTtcbn1cbmV4cG9ydHMuc2V0T3V0cHV0ID0gc2V0T3V0cHV0O1xuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBlY2hvaW5nIG9mIGNvbW1hbmRzIGludG8gc3Rkb3V0IGZvciB0aGUgcmVzdCBvZiB0aGUgc3RlcC5cbiAqIEVjaG9pbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpZiBBQ1RJT05TX1NURVBfREVCVUcgaXMgbm90IHNldC5cbiAqXG4gKi9cbmZ1bmN0aW9uIHNldENvbW1hbmRFY2hvKGVuYWJsZWQpIHtcbiAgICBjb21tYW5kXzEuaXNzdWUoJ2VjaG8nLCBlbmFibGVkID8gJ29uJyA6ICdvZmYnKTtcbn1cbmV4cG9ydHMuc2V0Q29tbWFuZEVjaG8gPSBzZXRDb21tYW5kRWNobztcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc3VsdHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogU2V0cyB0aGUgYWN0aW9uIHN0YXR1cyB0byBmYWlsZWQuXG4gKiBXaGVuIHRoZSBhY3Rpb24gZXhpdHMgaXQgd2lsbCBiZSB3aXRoIGFuIGV4aXQgY29kZSBvZiAxXG4gKiBAcGFyYW0gbWVzc2FnZSBhZGQgZXJyb3IgaXNzdWUgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBzZXRGYWlsZWQobWVzc2FnZSkge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSBFeGl0Q29kZS5GYWlsdXJlO1xuICAgIGVycm9yKG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5zZXRGYWlsZWQgPSBzZXRGYWlsZWQ7XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2dnaW5nIENvbW1hbmRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIEdldHMgd2hldGhlciBBY3Rpb25zIFN0ZXAgRGVidWcgaXMgb24gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGlzRGVidWcoKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52WydSVU5ORVJfREVCVUcnXSA9PT0gJzEnO1xufVxuZXhwb3J0cy5pc0RlYnVnID0gaXNEZWJ1Zztcbi8qKlxuICogV3JpdGVzIGRlYnVnIG1lc3NhZ2UgdG8gdXNlciBsb2dcbiAqIEBwYXJhbSBtZXNzYWdlIGRlYnVnIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZGVidWcobWVzc2FnZSkge1xuICAgIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQoJ2RlYnVnJywge30sIG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5kZWJ1ZyA9IGRlYnVnO1xuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGlzc3VlXG4gKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCgnZXJyb3InLCB1dGlsc18xLnRvQ29tbWFuZFByb3BlcnRpZXMocHJvcGVydGllcyksIG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvciA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5lcnJvciA9IGVycm9yO1xuLyoqXG4gKiBBZGRzIGEgd2FybmluZyBpc3N1ZVxuICogQHBhcmFtIG1lc3NhZ2Ugd2FybmluZyBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlLCBwcm9wZXJ0aWVzID0ge30pIHtcbiAgICBjb21tYW5kXzEuaXNzdWVDb21tYW5kKCd3YXJuaW5nJywgdXRpbHNfMS50b0NvbW1hbmRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpLCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLnRvU3RyaW5nKCkgOiBtZXNzYWdlKTtcbn1cbmV4cG9ydHMud2FybmluZyA9IHdhcm5pbmc7XG4vKipcbiAqIEFkZHMgYSBub3RpY2UgaXNzdWVcbiAqIEBwYXJhbSBtZXNzYWdlIG5vdGljZSBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm90aWNlKG1lc3NhZ2UsIHByb3BlcnRpZXMgPSB7fSkge1xuICAgIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQoJ25vdGljZScsIHV0aWxzXzEudG9Db21tYW5kUHJvcGVydGllcyhwcm9wZXJ0aWVzKSwgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yID8gbWVzc2FnZS50b1N0cmluZygpIDogbWVzc2FnZSk7XG59XG5leHBvcnRzLm5vdGljZSA9IG5vdGljZTtcbi8qKlxuICogV3JpdGVzIGluZm8gdG8gbG9nIHdpdGggY29uc29sZS5sb2cuXG4gKiBAcGFyYW0gbWVzc2FnZSBpbmZvIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gaW5mbyhtZXNzYWdlKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobWVzc2FnZSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmluZm8gPSBpbmZvO1xuLyoqXG4gKiBCZWdpbiBhbiBvdXRwdXQgZ3JvdXAuXG4gKlxuICogT3V0cHV0IHVudGlsIHRoZSBuZXh0IGBncm91cEVuZGAgd2lsbCBiZSBmb2xkYWJsZSBpbiB0aGlzIGdyb3VwXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBncm91cFxuICovXG5mdW5jdGlvbiBzdGFydEdyb3VwKG5hbWUpIHtcbiAgICBjb21tYW5kXzEuaXNzdWUoJ2dyb3VwJywgbmFtZSk7XG59XG5leHBvcnRzLnN0YXJ0R3JvdXAgPSBzdGFydEdyb3VwO1xuLyoqXG4gKiBFbmQgYW4gb3V0cHV0IGdyb3VwLlxuICovXG5mdW5jdGlvbiBlbmRHcm91cCgpIHtcbiAgICBjb21tYW5kXzEuaXNzdWUoJ2VuZGdyb3VwJyk7XG59XG5leHBvcnRzLmVuZEdyb3VwID0gZW5kR3JvdXA7XG4vKipcbiAqIFdyYXAgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNhbGwgaW4gYSBncm91cC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGZ1bmN0aW9uIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZ3JvdXBcbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gd3JhcCBpbiB0aGUgZ3JvdXBcbiAqL1xuZnVuY3Rpb24gZ3JvdXAobmFtZSwgZm4pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBzdGFydEdyb3VwKG5hbWUpO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0geWllbGQgZm4oKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGVuZEdyb3VwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ3JvdXAgPSBncm91cDtcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdyYXBwZXIgYWN0aW9uIHN0YXRlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNhdmVzIHN0YXRlIGZvciBjdXJyZW50IGFjdGlvbiwgdGhlIHN0YXRlIGNhbiBvbmx5IGJlIHJldHJpZXZlZCBieSB0aGlzIGFjdGlvbidzIHBvc3Qgam9iIGV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIHN0YXRlIHRvIHN0b3JlXG4gKiBAcGFyYW0gICAgIHZhbHVlICAgIHZhbHVlIHRvIHN0b3JlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHNhdmVTdGF0ZShuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9TVEFURSddIHx8ICcnO1xuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICByZXR1cm4gZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCgnU1RBVEUnLCBmaWxlX2NvbW1hbmRfMS5wcmVwYXJlS2V5VmFsdWVNZXNzYWdlKG5hbWUsIHZhbHVlKSk7XG4gICAgfVxuICAgIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQoJ3NhdmUtc3RhdGUnLCB7IG5hbWUgfSwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5zYXZlU3RhdGUgPSBzYXZlU3RhdGU7XG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIHN0YXRlIHNldCBieSB0aGlzIGFjdGlvbidzIG1haW4gZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgc3RhdGUgdG8gZ2V0XG4gKiBAcmV0dXJucyAgIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRTdGF0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W2BTVEFURV8ke25hbWV9YF0gfHwgJyc7XG59XG5leHBvcnRzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG5mdW5jdGlvbiBnZXRJRFRva2VuKGF1ZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCBvaWRjX3V0aWxzXzEuT2lkY0NsaWVudC5nZXRJRFRva2VuKGF1ZCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldElEVG9rZW4gPSBnZXRJRFRva2VuO1xuLyoqXG4gKiBTdW1tYXJ5IGV4cG9ydHNcbiAqL1xudmFyIHN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuL3N1bW1hcnlcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdW1tYXJ5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdW1tYXJ5XzEuc3VtbWFyeTsgfSB9KTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGNvcmUuc3VtbWFyeVxuICovXG52YXIgc3VtbWFyeV8yID0gcmVxdWlyZShcIi4vc3VtbWFyeVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1hcmtkb3duU3VtbWFyeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3VtbWFyeV8yLm1hcmtkb3duU3VtbWFyeTsgfSB9KTtcbi8qKlxuICogUGF0aCBleHBvcnRzXG4gKi9cbnZhciBwYXRoX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9wYXRoLXV0aWxzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidG9Qb3NpeFBhdGhcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhdGhfdXRpbHNfMS50b1Bvc2l4UGF0aDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRvV2luMzJQYXRoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXRoX3V0aWxzXzEudG9XaW4zMlBhdGg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0b1BsYXRmb3JtUGF0aFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGF0aF91dGlsc18xLnRvUGxhdGZvcm1QYXRoOyB9IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29yZS5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///66977\n")},46224:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\n// For internal use, subject to change.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.prepareKeyValueMessage = exports.issueFileCommand = void 0;\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst fs = __importStar(__webpack_require__(79896));\nconst os = __importStar(__webpack_require__(70857));\nconst uuid_1 = __webpack_require__(50881);\nconst utils_1 = __webpack_require__(7089);\nfunction issueFileCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {\n encoding: \'utf8\'\n });\n}\nexports.issueFileCommand = issueFileCommand;\nfunction prepareKeyValueMessage(key, value) {\n const delimiter = `ghadelimiter_${uuid_1.v4()}`;\n const convertedValue = utils_1.toCommandValue(value);\n // These should realistically never happen, but just in case someone finds a\n // way to exploit uuid generation let\'s not allow keys or values that contain\n // the delimiter.\n if (key.includes(delimiter)) {\n throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);\n }\n if (convertedValue.includes(delimiter)) {\n throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);\n }\n return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;\n}\nexports.prepareKeyValueMessage = prepareKeyValueMessage;\n//# sourceMappingURL=file-command.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYyMjQuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsb0NBQW9DLGdCQUFnQjtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDhCQUE4QixHQUFHLHdCQUF3QjtBQUN6RDtBQUNBO0FBQ0Esd0JBQXdCLG1CQUFPLENBQUMsS0FBSTtBQUNwQyx3QkFBd0IsbUJBQU8sQ0FBQyxLQUFJO0FBQ3BDLGVBQWUsbUJBQU8sQ0FBQyxLQUFNO0FBQzdCLGdCQUFnQixtQkFBTyxDQUFDLElBQVM7QUFDakM7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBLGdGQUFnRixRQUFRO0FBQ3hGO0FBQ0E7QUFDQSxpREFBaUQsU0FBUztBQUMxRDtBQUNBLG1DQUFtQyxnQ0FBZ0MsRUFBRSxPQUFPO0FBQzVFO0FBQ0EsS0FBSztBQUNMO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0Esc0NBQXNDLFlBQVk7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRixVQUFVO0FBQzlGO0FBQ0E7QUFDQSxxRkFBcUYsVUFBVTtBQUMvRjtBQUNBLGNBQWMsSUFBSSxJQUFJLFVBQVUsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxVQUFVO0FBQy9FO0FBQ0EsOEJBQThCO0FBQzlCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9maWxlLWNvbW1hbmQuanM/YTY3MiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIEZvciBpbnRlcm5hbCB1c2UsIHN1YmplY3QgdG8gY2hhbmdlLlxudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlcGFyZUtleVZhbHVlTWVzc2FnZSA9IGV4cG9ydHMuaXNzdWVGaWxlQ29tbWFuZCA9IHZvaWQgMDtcbi8vIFdlIHVzZSBhbnkgYXMgYSB2YWxpZCBpbnB1dCB0eXBlXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5jb25zdCBmcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZnNcIikpO1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IHV1aWRfMSA9IHJlcXVpcmUoXCJ1dWlkXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuZnVuY3Rpb24gaXNzdWVGaWxlQ29tbWFuZChjb21tYW5kLCBtZXNzYWdlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudltgR0lUSFVCXyR7Y29tbWFuZH1gXTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGZpbGUgY29tbWFuZCAke2NvbW1hbmR9YCk7XG4gICAgfVxuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGZpbGUgYXQgcGF0aDogJHtmaWxlUGF0aH1gKTtcbiAgICB9XG4gICAgZnMuYXBwZW5kRmlsZVN5bmMoZmlsZVBhdGgsIGAke3V0aWxzXzEudG9Db21tYW5kVmFsdWUobWVzc2FnZSl9JHtvcy5FT0x9YCwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnXG4gICAgfSk7XG59XG5leHBvcnRzLmlzc3VlRmlsZUNvbW1hbmQgPSBpc3N1ZUZpbGVDb21tYW5kO1xuZnVuY3Rpb24gcHJlcGFyZUtleVZhbHVlTWVzc2FnZShrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZGVsaW1pdGVyID0gYGdoYWRlbGltaXRlcl8ke3V1aWRfMS52NCgpfWA7XG4gICAgY29uc3QgY29udmVydGVkVmFsdWUgPSB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKHZhbHVlKTtcbiAgICAvLyBUaGVzZSBzaG91bGQgcmVhbGlzdGljYWxseSBuZXZlciBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2Ugc29tZW9uZSBmaW5kcyBhXG4gICAgLy8gd2F5IHRvIGV4cGxvaXQgdXVpZCBnZW5lcmF0aW9uIGxldCdzIG5vdCBhbGxvdyBrZXlzIG9yIHZhbHVlcyB0aGF0IGNvbnRhaW5cbiAgICAvLyB0aGUgZGVsaW1pdGVyLlxuICAgIGlmIChrZXkuaW5jbHVkZXMoZGVsaW1pdGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaW5wdXQ6IG5hbWUgc2hvdWxkIG5vdCBjb250YWluIHRoZSBkZWxpbWl0ZXIgXCIke2RlbGltaXRlcn1cImApO1xuICAgIH1cbiAgICBpZiAoY29udmVydGVkVmFsdWUuaW5jbHVkZXMoZGVsaW1pdGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaW5wdXQ6IHZhbHVlIHNob3VsZCBub3QgY29udGFpbiB0aGUgZGVsaW1pdGVyIFwiJHtkZWxpbWl0ZXJ9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2tleX08PCR7ZGVsaW1pdGVyfSR7b3MuRU9MfSR7Y29udmVydGVkVmFsdWV9JHtvcy5FT0x9JHtkZWxpbWl0ZXJ9YDtcbn1cbmV4cG9ydHMucHJlcGFyZUtleVZhbHVlTWVzc2FnZSA9IHByZXBhcmVLZXlWYWx1ZU1lc3NhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLWNvbW1hbmQuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///46224\n')},25015:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.OidcClient = void 0;\nconst http_client_1 = __webpack_require__(40677);\nconst auth_1 = __webpack_require__(69259);\nconst core_1 = __webpack_require__(66977);\nclass OidcClient {\n static createHttpClient(allowRetry = true, maxRetry = 10) {\n const requestOptions = {\n allowRetries: allowRetry,\n maxRetries: maxRetry\n };\n return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);\n }\n static getRequestToken() {\n const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];\n if (!token) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');\n }\n return token;\n }\n static getIDTokenUrl() {\n const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];\n if (!runtimeUrl) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');\n }\n return runtimeUrl;\n }\n static getCall(id_token_url) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const httpclient = OidcClient.createHttpClient();\n const res = yield httpclient\n .getJson(id_token_url)\n .catch(error => {\n throw new Error(`Failed to get ID Token. \\n \n Error Code : ${error.statusCode}\\n \n Error Message: ${error.message}`);\n });\n const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;\n if (!id_token) {\n throw new Error('Response json body do not have ID Token field');\n }\n return id_token;\n });\n }\n static getIDToken(audience) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n // New ID Token is requested from action service\n let id_token_url = OidcClient.getIDTokenUrl();\n if (audience) {\n const encodedAudience = encodeURIComponent(audience);\n id_token_url = `${id_token_url}&audience=${encodedAudience}`;\n }\n core_1.debug(`ID token url is ${id_token_url}`);\n const id_token = yield OidcClient.getCall(id_token_url);\n core_1.setSecret(id_token);\n return id_token;\n }\n catch (error) {\n throw new Error(`Error message: ${error.message}`);\n }\n });\n }\n}\nexports.OidcClient = OidcClient;\n//# sourceMappingURL=oidc-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUwMTUuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGtCQUFrQjtBQUNsQixzQkFBc0IsbUJBQU8sQ0FBQyxLQUFzQjtBQUNwRCxlQUFlLG1CQUFPLENBQUMsS0FBK0I7QUFDdEQsZUFBZSxtQkFBTyxDQUFDLEtBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGlCQUFpQjtBQUN4Qyx5QkFBeUIsY0FBYztBQUN2QyxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGFBQWEsWUFBWSxnQkFBZ0I7QUFDL0U7QUFDQSxnREFBZ0QsYUFBYTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGNBQWM7QUFDaEU7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvb2lkYy11dGlscy5qcz8zYmQ4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk9pZGNDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBodHRwX2NsaWVudF8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2h0dHAtY2xpZW50XCIpO1xuY29uc3QgYXV0aF8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9hdXRoXCIpO1xuY29uc3QgY29yZV8xID0gcmVxdWlyZShcIi4vY29yZVwiKTtcbmNsYXNzIE9pZGNDbGllbnQge1xuICAgIHN0YXRpYyBjcmVhdGVIdHRwQ2xpZW50KGFsbG93UmV0cnkgPSB0cnVlLCBtYXhSZXRyeSA9IDEwKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICAgICAgYWxsb3dSZXRyaWVzOiBhbGxvd1JldHJ5LFxuICAgICAgICAgICAgbWF4UmV0cmllczogbWF4UmV0cnlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwX2NsaWVudF8xLkh0dHBDbGllbnQoJ2FjdGlvbnMvb2lkYy1jbGllbnQnLCBbbmV3IGF1dGhfMS5CZWFyZXJDcmVkZW50aWFsSGFuZGxlcihPaWRjQ2xpZW50LmdldFJlcXVlc3RUb2tlbigpKV0sIHJlcXVlc3RPcHRpb25zKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFJlcXVlc3RUb2tlbigpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1RPS0VOJ107XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVE9LRU4gZW52IHZhcmlhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SURUb2tlblVybCgpIHtcbiAgICAgICAgY29uc3QgcnVudGltZVVybCA9IHByb2Nlc3MuZW52WydBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVVJMJ107XG4gICAgICAgIGlmICghcnVudGltZVVybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IEFDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9VUkwgZW52IHZhcmlhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVVcmw7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDYWxsKGlkX3Rva2VuX3VybCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBodHRwY2xpZW50ID0gT2lkY0NsaWVudC5jcmVhdGVIdHRwQ2xpZW50KCk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCBodHRwY2xpZW50XG4gICAgICAgICAgICAgICAgLmdldEpzb24oaWRfdG9rZW5fdXJsKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IElEIFRva2VuLiBcXG4gXG4gICAgICAgIEVycm9yIENvZGUgOiAke2Vycm9yLnN0YXR1c0NvZGV9XFxuIFxuICAgICAgICBFcnJvciBNZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGlkX3Rva2VuID0gKF9hID0gcmVzLnJlc3VsdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlO1xuICAgICAgICAgICAgaWYgKCFpZF90b2tlbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UganNvbiBib2R5IGRvIG5vdCBoYXZlIElEIFRva2VuIGZpZWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaWRfdG9rZW47XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SURUb2tlbihhdWRpZW5jZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBOZXcgSUQgVG9rZW4gaXMgcmVxdWVzdGVkIGZyb20gYWN0aW9uIHNlcnZpY2VcbiAgICAgICAgICAgICAgICBsZXQgaWRfdG9rZW5fdXJsID0gT2lkY0NsaWVudC5nZXRJRFRva2VuVXJsKCk7XG4gICAgICAgICAgICAgICAgaWYgKGF1ZGllbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kZWRBdWRpZW5jZSA9IGVuY29kZVVSSUNvbXBvbmVudChhdWRpZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIGlkX3Rva2VuX3VybCA9IGAke2lkX3Rva2VuX3VybH0mYXVkaWVuY2U9JHtlbmNvZGVkQXVkaWVuY2V9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29yZV8xLmRlYnVnKGBJRCB0b2tlbiB1cmwgaXMgJHtpZF90b2tlbl91cmx9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRfdG9rZW4gPSB5aWVsZCBPaWRjQ2xpZW50LmdldENhbGwoaWRfdG9rZW5fdXJsKTtcbiAgICAgICAgICAgICAgICBjb3JlXzEuc2V0U2VjcmV0KGlkX3Rva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWRfdG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5PaWRjQ2xpZW50ID0gT2lkY0NsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9pZGMtdXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///25015\n")},317:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0;\nconst path = __importStar(__webpack_require__(16928));\n/**\n * toPosixPath converts the given path to the posix form. On Windows, \\\\ will be\n * replaced with /.\n *\n * @param pth. Path to transform.\n * @return string Posix path.\n */\nfunction toPosixPath(pth) {\n return pth.replace(/[\\\\]/g, \'/\');\n}\nexports.toPosixPath = toPosixPath;\n/**\n * toWin32Path converts the given path to the win32 form. On Linux, / will be\n * replaced with \\\\.\n *\n * @param pth. Path to transform.\n * @return string Win32 path.\n */\nfunction toWin32Path(pth) {\n return pth.replace(/[/]/g, \'\\\\\');\n}\nexports.toWin32Path = toWin32Path;\n/**\n * toPlatformPath converts the given path to a platform-specific path. It does\n * this by replacing instances of / and \\ with the platform-specific path\n * separator.\n *\n * @param pth The path to platformize.\n * @return string The platform-specific path.\n */\nfunction toPlatformPath(pth) {\n return pth.replace(/[/\\\\]/g, path.sep);\n}\nexports.toPlatformPath = toPlatformPath;\n//# sourceMappingURL=path-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE3LmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQTtBQUNBLG1DQUFtQyxvQ0FBb0MsZ0JBQWdCO0FBQ3ZGLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsc0JBQXNCLEdBQUcsbUJBQW1CLEdBQUcsbUJBQW1CO0FBQ2xFLDBCQUEwQixtQkFBTyxDQUFDLEtBQU07QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvcGF0aC11dGlscy5qcz9jZjk2Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9QbGF0Zm9ybVBhdGggPSBleHBvcnRzLnRvV2luMzJQYXRoID0gZXhwb3J0cy50b1Bvc2l4UGF0aCA9IHZvaWQgMDtcbmNvbnN0IHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xuLyoqXG4gKiB0b1Bvc2l4UGF0aCBjb252ZXJ0cyB0aGUgZ2l2ZW4gcGF0aCB0byB0aGUgcG9zaXggZm9ybS4gT24gV2luZG93cywgXFxcXCB3aWxsIGJlXG4gKiByZXBsYWNlZCB3aXRoIC8uXG4gKlxuICogQHBhcmFtIHB0aC4gUGF0aCB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHN0cmluZyBQb3NpeCBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1Bvc2l4UGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1tcXFxcXS9nLCAnLycpO1xufVxuZXhwb3J0cy50b1Bvc2l4UGF0aCA9IHRvUG9zaXhQYXRoO1xuLyoqXG4gKiB0b1dpbjMyUGF0aCBjb252ZXJ0cyB0aGUgZ2l2ZW4gcGF0aCB0byB0aGUgd2luMzIgZm9ybS4gT24gTGludXgsIC8gd2lsbCBiZVxuICogcmVwbGFjZWQgd2l0aCBcXFxcLlxuICpcbiAqIEBwYXJhbSBwdGguIFBhdGggdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiBzdHJpbmcgV2luMzIgcGF0aC5cbiAqL1xuZnVuY3Rpb24gdG9XaW4zMlBhdGgocHRoKSB7XG4gICAgcmV0dXJuIHB0aC5yZXBsYWNlKC9bL10vZywgJ1xcXFwnKTtcbn1cbmV4cG9ydHMudG9XaW4zMlBhdGggPSB0b1dpbjMyUGF0aDtcbi8qKlxuICogdG9QbGF0Zm9ybVBhdGggY29udmVydHMgdGhlIGdpdmVuIHBhdGggdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLiBJdCBkb2VzXG4gKiB0aGlzIGJ5IHJlcGxhY2luZyBpbnN0YW5jZXMgb2YgLyBhbmQgXFwgd2l0aCB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aFxuICogc2VwYXJhdG9yLlxuICpcbiAqIEBwYXJhbSBwdGggVGhlIHBhdGggdG8gcGxhdGZvcm1pemUuXG4gKiBAcmV0dXJuIHN0cmluZyBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aC5cbiAqL1xuZnVuY3Rpb24gdG9QbGF0Zm9ybVBhdGgocHRoKSB7XG4gICAgcmV0dXJuIHB0aC5yZXBsYWNlKC9bL1xcXFxdL2csIHBhdGguc2VwKTtcbn1cbmV4cG9ydHMudG9QbGF0Zm9ybVBhdGggPSB0b1BsYXRmb3JtUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGgtdXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///317\n')},21040:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0;\nconst os_1 = __webpack_require__(70857);\nconst fs_1 = __webpack_require__(79896);\nconst { access, appendFile, writeFile } = fs_1.promises;\nexports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';\nexports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';\nclass Summary {\n constructor() {\n this._buffer = '';\n }\n /**\n * Finds the summary file path from the environment, rejects if env var is not found or file does not exist\n * Also checks r/w permissions.\n *\n * @returns step summary file path\n */\n filePath() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._filePath) {\n return this._filePath;\n }\n const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR];\n if (!pathFromEnv) {\n throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);\n }\n try {\n yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK);\n }\n catch (_a) {\n throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`);\n }\n this._filePath = pathFromEnv;\n return this._filePath;\n });\n }\n /**\n * Wraps content in an HTML tag, adding any HTML attributes\n *\n * @param {string} tag HTML tag to wrap\n * @param {string | null} content content within the tag\n * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add\n *\n * @returns {string} content wrapped in HTML element\n */\n wrap(tag, content, attrs = {}) {\n const htmlAttrs = Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${value}\"`)\n .join('');\n if (!content) {\n return `<${tag}${htmlAttrs}>`;\n }\n return `<${tag}${htmlAttrs}>${content}`;\n }\n /**\n * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.\n *\n * @param {SummaryWriteOptions} [options] (optional) options for write operation\n *\n * @returns {Promise} summary instance\n */\n write(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite);\n const filePath = yield this.filePath();\n const writeFunc = overwrite ? writeFile : appendFile;\n yield writeFunc(filePath, this._buffer, { encoding: 'utf8' });\n return this.emptyBuffer();\n });\n }\n /**\n * Clears the summary buffer and wipes the summary file\n *\n * @returns {Summary} summary instance\n */\n clear() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.emptyBuffer().write({ overwrite: true });\n });\n }\n /**\n * Returns the current summary buffer as a string\n *\n * @returns {string} string of summary buffer\n */\n stringify() {\n return this._buffer;\n }\n /**\n * If the summary buffer is empty\n *\n * @returns {boolen} true if the buffer is empty\n */\n isEmptyBuffer() {\n return this._buffer.length === 0;\n }\n /**\n * Resets the summary buffer without writing to summary file\n *\n * @returns {Summary} summary instance\n */\n emptyBuffer() {\n this._buffer = '';\n return this;\n }\n /**\n * Adds raw text to the summary buffer\n *\n * @param {string} text content to add\n * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)\n *\n * @returns {Summary} summary instance\n */\n addRaw(text, addEOL = false) {\n this._buffer += text;\n return addEOL ? this.addEOL() : this;\n }\n /**\n * Adds the operating system-specific end-of-line marker to the buffer\n *\n * @returns {Summary} summary instance\n */\n addEOL() {\n return this.addRaw(os_1.EOL);\n }\n /**\n * Adds an HTML codeblock to the summary buffer\n *\n * @param {string} code content to render within fenced code block\n * @param {string} lang (optional) language to syntax highlight code\n *\n * @returns {Summary} summary instance\n */\n addCodeBlock(code, lang) {\n const attrs = Object.assign({}, (lang && { lang }));\n const element = this.wrap('pre', this.wrap('code', code), attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML list to the summary buffer\n *\n * @param {string[]} items list of items to render\n * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)\n *\n * @returns {Summary} summary instance\n */\n addList(items, ordered = false) {\n const tag = ordered ? 'ol' : 'ul';\n const listItems = items.map(item => this.wrap('li', item)).join('');\n const element = this.wrap(tag, listItems);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML table to the summary buffer\n *\n * @param {SummaryTableCell[]} rows table rows\n *\n * @returns {Summary} summary instance\n */\n addTable(rows) {\n const tableBody = rows\n .map(row => {\n const cells = row\n .map(cell => {\n if (typeof cell === 'string') {\n return this.wrap('td', cell);\n }\n const { header, data, colspan, rowspan } = cell;\n const tag = header ? 'th' : 'td';\n const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan }));\n return this.wrap(tag, data, attrs);\n })\n .join('');\n return this.wrap('tr', cells);\n })\n .join('');\n const element = this.wrap('table', tableBody);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds a collapsable HTML details element to the summary buffer\n *\n * @param {string} label text for the closed state\n * @param {string} content collapsable content\n *\n * @returns {Summary} summary instance\n */\n addDetails(label, content) {\n const element = this.wrap('details', this.wrap('summary', label) + content);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML image tag to the summary buffer\n *\n * @param {string} src path to the image you to embed\n * @param {string} alt text description of the image\n * @param {SummaryImageOptions} options (optional) addition image attributes\n *\n * @returns {Summary} summary instance\n */\n addImage(src, alt, options) {\n const { width, height } = options || {};\n const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height }));\n const element = this.wrap('img', null, Object.assign({ src, alt }, attrs));\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML section heading element\n *\n * @param {string} text heading text\n * @param {number | string} [level=1] (optional) the heading level, default: 1\n *\n * @returns {Summary} summary instance\n */\n addHeading(text, level) {\n const tag = `h${level}`;\n const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)\n ? tag\n : 'h1';\n const element = this.wrap(allowedTag, text);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML thematic break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addSeparator() {\n const element = this.wrap('hr', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML line break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addBreak() {\n const element = this.wrap('br', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML blockquote to the summary buffer\n *\n * @param {string} text quote text\n * @param {string} cite (optional) citation url\n *\n * @returns {Summary} summary instance\n */\n addQuote(text, cite) {\n const attrs = Object.assign({}, (cite && { cite }));\n const element = this.wrap('blockquote', text, attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML anchor tag to the summary buffer\n *\n * @param {string} text link text/content\n * @param {string} href hyperlink\n *\n * @returns {Summary} summary instance\n */\n addLink(text, href) {\n const element = this.wrap('a', text, { href });\n return this.addRaw(element).addEOL();\n }\n}\nconst _summary = new Summary();\n/**\n * @deprecated use `core.summary`\n */\nexports.markdownSummary = _summary;\nexports.summary = _summary;\n//# sourceMappingURL=summary.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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MUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxxQkFBcUI7QUFDcEM7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQyxvREFBb0QsY0FBYyxPQUFPLGlCQUFpQixRQUFRO0FBQ2xHLCtEQUErRCxVQUFVO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0Esd0JBQXdCLE1BQU07QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBLHNDQUFzQyxhQUFhLE1BQU07QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QjtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQSwrQ0FBK0MsTUFBTTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QixlQUFlO0FBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3N1bW1hcnkuanM/MzNlZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdW1tYXJ5ID0gZXhwb3J0cy5tYXJrZG93blN1bW1hcnkgPSBleHBvcnRzLlNVTU1BUllfRE9DU19VUkwgPSBleHBvcnRzLlNVTU1BUllfRU5WX1ZBUiA9IHZvaWQgMDtcbmNvbnN0IG9zXzEgPSByZXF1aXJlKFwib3NcIik7XG5jb25zdCBmc18xID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3QgeyBhY2Nlc3MsIGFwcGVuZEZpbGUsIHdyaXRlRmlsZSB9ID0gZnNfMS5wcm9taXNlcztcbmV4cG9ydHMuU1VNTUFSWV9FTlZfVkFSID0gJ0dJVEhVQl9TVEVQX1NVTU1BUlknO1xuZXhwb3J0cy5TVU1NQVJZX0RPQ1NfVVJMID0gJ2h0dHBzOi8vZG9jcy5naXRodWIuY29tL2FjdGlvbnMvdXNpbmctd29ya2Zsb3dzL3dvcmtmbG93LWNvbW1hbmRzLWZvci1naXRodWItYWN0aW9ucyNhZGRpbmctYS1qb2Itc3VtbWFyeSc7XG5jbGFzcyBTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyID0gJyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBzdW1tYXJ5IGZpbGUgcGF0aCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgcmVqZWN0cyBpZiBlbnYgdmFyIGlzIG5vdCBmb3VuZCBvciBmaWxlIGRvZXMgbm90IGV4aXN0XG4gICAgICogQWxzbyBjaGVja3Mgci93IHBlcm1pc3Npb25zLlxuICAgICAqXG4gICAgICogQHJldHVybnMgc3RlcCBzdW1tYXJ5IGZpbGUgcGF0aFxuICAgICAqL1xuICAgIGZpbGVQYXRoKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGF0aEZyb21FbnYgPSBwcm9jZXNzLmVudltleHBvcnRzLlNVTU1BUllfRU5WX1ZBUl07XG4gICAgICAgICAgICBpZiAoIXBhdGhGcm9tRW52KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgJCR7ZXhwb3J0cy5TVU1NQVJZX0VOVl9WQVJ9LiBDaGVjayBpZiB5b3VyIHJ1bnRpbWUgZW52aXJvbm1lbnQgc3VwcG9ydHMgam9iIHN1bW1hcmllcy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeWllbGQgYWNjZXNzKHBhdGhGcm9tRW52LCBmc18xLmNvbnN0YW50cy5SX09LIHwgZnNfMS5jb25zdGFudHMuV19PSyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBhY2Nlc3Mgc3VtbWFyeSBmaWxlOiAnJHtwYXRoRnJvbUVudn0nLiBDaGVjayBpZiB0aGUgZmlsZSBoYXMgY29ycmVjdCByZWFkL3dyaXRlIHBlcm1pc3Npb25zLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZmlsZVBhdGggPSBwYXRoRnJvbUVudjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWxlUGF0aDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyYXBzIGNvbnRlbnQgaW4gYW4gSFRNTCB0YWcsIGFkZGluZyBhbnkgSFRNTCBhdHRyaWJ1dGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgdGFnIHRvIHdyYXBcbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgY29udGVudCB3aXRoaW4gdGhlIHRhZ1xuICAgICAqIEBwYXJhbSB7W2F0dHJpYnV0ZTogc3RyaW5nXTogc3RyaW5nfSBhdHRycyBrZXktdmFsdWUgbGlzdCBvZiBIVE1MIGF0dHJpYnV0ZXMgdG8gYWRkXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBjb250ZW50IHdyYXBwZWQgaW4gSFRNTCBlbGVtZW50XG4gICAgICovXG4gICAgd3JhcCh0YWcsIGNvbnRlbnQsIGF0dHJzID0ge30pIHtcbiAgICAgICAgY29uc3QgaHRtbEF0dHJzID0gT2JqZWN0LmVudHJpZXMoYXR0cnMpXG4gICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImApXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGA8JHt0YWd9JHtodG1sQXR0cnN9PmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8JHt0YWd9JHtodG1sQXR0cnN9PiR7Y29udGVudH08LyR7dGFnfT5gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgdGV4dCBpbiB0aGUgYnVmZmVyIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlciBmaWxlIGFuZCBlbXB0aWVzIGJ1ZmZlci4gV2lsbCBhcHBlbmQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3VtbWFyeVdyaXRlT3B0aW9uc30gW29wdGlvbnNdIChvcHRpb25hbCkgb3B0aW9ucyBmb3Igd3JpdGUgb3BlcmF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdW1tYXJ5Pn0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHdyaXRlKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJ3cml0ZSA9ICEhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vdmVyd3JpdGUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSB5aWVsZCB0aGlzLmZpbGVQYXRoKCk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZUZ1bmMgPSBvdmVyd3JpdGUgPyB3cml0ZUZpbGUgOiBhcHBlbmRGaWxlO1xuICAgICAgICAgICAgeWllbGQgd3JpdGVGdW5jKGZpbGVQYXRoLCB0aGlzLl9idWZmZXIsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5QnVmZmVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIHN1bW1hcnkgYnVmZmVyIGFuZCB3aXBlcyB0aGUgc3VtbWFyeSBmaWxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlCdWZmZXIoKS53cml0ZSh7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VtbWFyeSBidWZmZXIgYXMgYSBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHN0cmluZyBvZiBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqL1xuICAgIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHN1bW1hcnkgYnVmZmVyIGlzIGVtcHR5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVufSB0cnVlIGlmIHRoZSBidWZmZXIgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBpc0VtcHR5QnVmZmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdW1tYXJ5IGJ1ZmZlciB3aXRob3V0IHdyaXRpbmcgdG8gc3VtbWFyeSBmaWxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGVtcHR5QnVmZmVyKCkge1xuICAgICAgICB0aGlzLl9idWZmZXIgPSAnJztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgcmF3IHRleHQgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBjb250ZW50IHRvIGFkZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZEVPTD1mYWxzZV0gKG9wdGlvbmFsKSBhcHBlbmQgYW4gRU9MIHRvIHRoZSByYXcgdGV4dCAoZGVmYXVsdDogZmFsc2UpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFJhdyh0ZXh0LCBhZGRFT0wgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9idWZmZXIgKz0gdGV4dDtcbiAgICAgICAgcmV0dXJuIGFkZEVPTCA/IHRoaXMuYWRkRU9MKCkgOiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIGVuZC1vZi1saW5lIG1hcmtlciB0byB0aGUgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZEVPTCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KG9zXzEuRU9MKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGNvZGVibG9jayB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGNvbnRlbnQgdG8gcmVuZGVyIHdpdGhpbiBmZW5jZWQgY29kZSBibG9ja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nIChvcHRpb25hbCkgbGFuZ3VhZ2UgdG8gc3ludGF4IGhpZ2hsaWdodCBjb2RlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZENvZGVCbG9jayhjb2RlLCBsYW5nKSB7XG4gICAgICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbih7fSwgKGxhbmcgJiYgeyBsYW5nIH0pKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgncHJlJywgdGhpcy53cmFwKCdjb2RlJywgY29kZSksIGF0dHJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgbGlzdCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGl0ZW1zIGxpc3Qgb2YgaXRlbXMgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3JkZXJlZD1mYWxzZV0gKG9wdGlvbmFsKSBpZiB0aGUgcmVuZGVyZWQgbGlzdCBzaG91bGQgYmUgb3JkZXJlZCBvciBub3QgKGRlZmF1bHQ6IGZhbHNlKVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRMaXN0KGl0ZW1zLCBvcmRlcmVkID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgdGFnID0gb3JkZXJlZCA/ICdvbCcgOiAndWwnO1xuICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSBpdGVtcy5tYXAoaXRlbSA9PiB0aGlzLndyYXAoJ2xpJywgaXRlbSkpLmpvaW4oJycpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKHRhZywgbGlzdEl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgdGFibGUgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N1bW1hcnlUYWJsZUNlbGxbXX0gcm93cyB0YWJsZSByb3dzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFRhYmxlKHJvd3MpIHtcbiAgICAgICAgY29uc3QgdGFibGVCb2R5ID0gcm93c1xuICAgICAgICAgICAgLm1hcChyb3cgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSByb3dcbiAgICAgICAgICAgICAgICAubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2VsbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCgndGQnLCBjZWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBoZWFkZXIsIGRhdGEsIGNvbHNwYW4sIHJvd3NwYW4gfSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnID0gaGVhZGVyID8gJ3RoJyA6ICd0ZCc7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChjb2xzcGFuICYmIHsgY29sc3BhbiB9KSksIChyb3dzcGFuICYmIHsgcm93c3BhbiB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCh0YWcsIGRhdGEsIGF0dHJzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcCgndHInLCBjZWxscyk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ3RhYmxlJywgdGFibGVCb2R5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sbGFwc2FibGUgSFRNTCBkZXRhaWxzIGVsZW1lbnQgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgdGV4dCBmb3IgdGhlIGNsb3NlZCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IGNvbGxhcHNhYmxlIGNvbnRlbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkRGV0YWlscyhsYWJlbCwgY29udGVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdkZXRhaWxzJywgdGhpcy53cmFwKCdzdW1tYXJ5JywgbGFiZWwpICsgY29udGVudCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGltYWdlIHRhZyB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgcGF0aCB0byB0aGUgaW1hZ2UgeW91IHRvIGVtYmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFsdCB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqIEBwYXJhbSB7U3VtbWFyeUltYWdlT3B0aW9uc30gb3B0aW9ucyAob3B0aW9uYWwpIGFkZGl0aW9uIGltYWdlIGF0dHJpYnV0ZXNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkSW1hZ2Uoc3JjLCBhbHQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHdpZHRoICYmIHsgd2lkdGggfSkpLCAoaGVpZ2h0ICYmIHsgaGVpZ2h0IH0pKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnaW1nJywgbnVsbCwgT2JqZWN0LmFzc2lnbih7IHNyYywgYWx0IH0sIGF0dHJzKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIHNlY3Rpb24gaGVhZGluZyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBoZWFkaW5nIHRleHRcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gW2xldmVsPTFdIChvcHRpb25hbCkgdGhlIGhlYWRpbmcgbGV2ZWwsIGRlZmF1bHQ6IDFcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkSGVhZGluZyh0ZXh0LCBsZXZlbCkge1xuICAgICAgICBjb25zdCB0YWcgPSBgaCR7bGV2ZWx9YDtcbiAgICAgICAgY29uc3QgYWxsb3dlZFRhZyA9IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXS5pbmNsdWRlcyh0YWcpXG4gICAgICAgICAgICA/IHRhZ1xuICAgICAgICAgICAgOiAnaDEnO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKGFsbG93ZWRUYWcsIHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCB0aGVtYXRpYyBicmVhayAoPGhyPikgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFNlcGFyYXRvcigpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnaHInLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgbGluZSBicmVhayAoPGJyPikgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZEJyZWFrKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdicicsIG51bGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBibG9ja3F1b3RlIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgcXVvdGUgdGV4dFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaXRlIChvcHRpb25hbCkgY2l0YXRpb24gdXJsXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFF1b3RlKHRleHQsIGNpdGUpIHtcbiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKHt9LCAoY2l0ZSAmJiB7IGNpdGUgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdibG9ja3F1b3RlJywgdGV4dCwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBhbmNob3IgdGFnIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgbGluayB0ZXh0L2NvbnRlbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBoeXBlcmxpbmtcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkTGluayh0ZXh0LCBocmVmKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2EnLCB0ZXh0LCB7IGhyZWYgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG59XG5jb25zdCBfc3VtbWFyeSA9IG5ldyBTdW1tYXJ5KCk7XG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgY29yZS5zdW1tYXJ5YFxuICovXG5leHBvcnRzLm1hcmtkb3duU3VtbWFyeSA9IF9zdW1tYXJ5O1xuZXhwb3J0cy5zdW1tYXJ5ID0gX3N1bW1hcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdW1tYXJ5LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///21040\n")},7089:(__unused_webpack_module,exports)=>{"use strict";eval("\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.toCommandProperties = exports.toCommandValue = void 0;\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\nexports.toCommandValue = toCommandValue;\n/**\n *\n * @param annotationProperties\n * @returns The command properties to send with the actual annotation command\n * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646\n */\nfunction toCommandProperties(annotationProperties) {\n if (!Object.keys(annotationProperties).length) {\n return {};\n }\n return {\n title: annotationProperties.title,\n file: annotationProperties.file,\n line: annotationProperties.startLine,\n endLine: annotationProperties.endLine,\n col: annotationProperties.startColumn,\n endColumn: annotationProperties.endColumn\n };\n}\nexports.toCommandProperties = toCommandProperties;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA4OS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsMkJBQTJCLEdBQUcsc0JBQXNCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi91dGlscy5qcz82ZmJlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLy8gV2UgdXNlIGFueSBhcyBhIHZhbGlkIGlucHV0IHR5cGVcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9Db21tYW5kUHJvcGVydGllcyA9IGV4cG9ydHMudG9Db21tYW5kVmFsdWUgPSB2b2lkIDA7XG4vKipcbiAqIFNhbml0aXplcyBhbiBpbnB1dCBpbnRvIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSBwYXNzZWQgaW50byBpc3N1ZUNvbW1hbmQgc2FmZWx5XG4gKiBAcGFyYW0gaW5wdXQgaW5wdXQgdG8gc2FuaXRpemUgaW50byBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b0NvbW1hbmRWYWx1ZShpbnB1dCkge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShpbnB1dCk7XG59XG5leHBvcnRzLnRvQ29tbWFuZFZhbHVlID0gdG9Db21tYW5kVmFsdWU7XG4vKipcbiAqXG4gKiBAcGFyYW0gYW5ub3RhdGlvblByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHByb3BlcnRpZXMgdG8gc2VuZCB3aXRoIHRoZSBhY3R1YWwgYW5ub3RhdGlvbiBjb21tYW5kXG4gKiBTZWUgSXNzdWVDb21tYW5kUHJvcGVydGllczogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL2Jsb2IvbWFpbi9zcmMvUnVubmVyLldvcmtlci9BY3Rpb25Db21tYW5kTWFuYWdlci5jcyNMNjQ2XG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZFByb3BlcnRpZXMoYW5ub3RhdGlvblByb3BlcnRpZXMpIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGFubm90YXRpb25Qcm9wZXJ0aWVzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogYW5ub3RhdGlvblByb3BlcnRpZXMudGl0bGUsXG4gICAgICAgIGZpbGU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLmZpbGUsXG4gICAgICAgIGxpbmU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLnN0YXJ0TGluZSxcbiAgICAgICAgZW5kTGluZTogYW5ub3RhdGlvblByb3BlcnRpZXMuZW5kTGluZSxcbiAgICAgICAgY29sOiBhbm5vdGF0aW9uUHJvcGVydGllcy5zdGFydENvbHVtbixcbiAgICAgICAgZW5kQ29sdW1uOiBhbm5vdGF0aW9uUHJvcGVydGllcy5lbmRDb2x1bW5cbiAgICB9O1xufVxuZXhwb3J0cy50b0NvbW1hbmRQcm9wZXJ0aWVzID0gdG9Db21tYW5kUHJvcGVydGllcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7089\n")},47579:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Context = void 0;\nconst fs_1 = __webpack_require__(79896);\nconst os_1 = __webpack_require__(70857);\nclass Context {\n /**\n * Hydrate the context from the environment\n */\n constructor() {\n var _a, _b, _c;\n this.payload = {};\n if (process.env.GITHUB_EVENT_PATH) {\n if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) {\n this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));\n }\n else {\n const path = process.env.GITHUB_EVENT_PATH;\n process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);\n }\n }\n this.eventName = process.env.GITHUB_EVENT_NAME;\n this.sha = process.env.GITHUB_SHA;\n this.ref = process.env.GITHUB_REF;\n this.workflow = process.env.GITHUB_WORKFLOW;\n this.action = process.env.GITHUB_ACTION;\n this.actor = process.env.GITHUB_ACTOR;\n this.job = process.env.GITHUB_JOB;\n this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);\n this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);\n this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;\n this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`;\n this.graphqlUrl =\n (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`;\n }\n get issue() {\n const payload = this.payload;\n return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });\n }\n get repo() {\n if (process.env.GITHUB_REPOSITORY) {\n const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');\n return { owner, repo };\n }\n if (this.payload.repository) {\n return {\n owner: this.payload.repository.owner.login,\n repo: this.payload.repository.name\n };\n }\n throw new Error(\"context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'\");\n }\n}\nexports.Context = Context;\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc1NzkuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZUFBZTtBQUNmLGFBQWEsbUJBQU8sQ0FBQyxLQUFJO0FBQ3pCLGFBQWEsbUJBQU8sQ0FBQyxLQUFJO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFrRyxrQkFBa0I7QUFDcEg7QUFDQTtBQUNBO0FBQ0EsMERBQTBELE1BQU0sZ0JBQWdCLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGdCQUFnQixtRUFBbUU7QUFDaEk7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvY29udGV4dC5qcz85YjZhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db250ZXh0ID0gdm9pZCAwO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IG9zXzEgPSByZXF1aXJlKFwib3NcIik7XG5jbGFzcyBDb250ZXh0IHtcbiAgICAvKipcbiAgICAgKiBIeWRyYXRlIHRoZSBjb250ZXh0IGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIKSB7XG4gICAgICAgICAgICBpZiAoKDAsIGZzXzEuZXhpc3RzU3luYykocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gSlNPTi5wYXJzZSgoMCwgZnNfMS5yZWFkRmlsZVN5bmMpKHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRILCB7IGVuY29kaW5nOiAndXRmOCcgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIO1xuICAgICAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBHSVRIVUJfRVZFTlRfUEFUSCAke3BhdGh9IGRvZXMgbm90IGV4aXN0JHtvc18xLkVPTH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9OQU1FO1xuICAgICAgICB0aGlzLnNoYSA9IHByb2Nlc3MuZW52LkdJVEhVQl9TSEE7XG4gICAgICAgIHRoaXMucmVmID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1JFRjtcbiAgICAgICAgdGhpcy53b3JrZmxvdyA9IHByb2Nlc3MuZW52LkdJVEhVQl9XT1JLRkxPVztcbiAgICAgICAgdGhpcy5hY3Rpb24gPSBwcm9jZXNzLmVudi5HSVRIVUJfQUNUSU9OO1xuICAgICAgICB0aGlzLmFjdG9yID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FDVE9SO1xuICAgICAgICB0aGlzLmpvYiA9IHByb2Nlc3MuZW52LkdJVEhVQl9KT0I7XG4gICAgICAgIHRoaXMucnVuTnVtYmVyID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuR0lUSFVCX1JVTl9OVU1CRVIsIDEwKTtcbiAgICAgICAgdGhpcy5ydW5JZCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9SVU5fSUQsIDEwKTtcbiAgICAgICAgdGhpcy5hcGlVcmwgPSAoX2EgPSBwcm9jZXNzLmVudi5HSVRIVUJfQVBJX1VSTCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21gO1xuICAgICAgICB0aGlzLnNlcnZlclVybCA9IChfYiA9IHByb2Nlc3MuZW52LkdJVEhVQl9TRVJWRVJfVVJMKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBgaHR0cHM6Ly9naXRodWIuY29tYDtcbiAgICAgICAgdGhpcy5ncmFwaHFsVXJsID1cbiAgICAgICAgICAgIChfYyA9IHByb2Nlc3MuZW52LkdJVEhVQl9HUkFQSFFMX1VSTCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vZ3JhcGhxbGA7XG4gICAgfVxuICAgIGdldCBpc3N1ZSgpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yZXBvKSwgeyBudW1iZXI6IChwYXlsb2FkLmlzc3VlIHx8IHBheWxvYWQucHVsbF9yZXF1ZXN0IHx8IHBheWxvYWQpLm51bWJlciB9KTtcbiAgICB9XG4gICAgZ2V0IHJlcG8oKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWSkge1xuICAgICAgICAgICAgY29uc3QgW293bmVyLCByZXBvXSA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRVBPU0lUT1JZLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICByZXR1cm4geyBvd25lciwgcmVwbyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBheWxvYWQucmVwb3NpdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvd25lcjogdGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkub3duZXIubG9naW4sXG4gICAgICAgICAgICAgICAgcmVwbzogdGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkubmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb250ZXh0LnJlcG8gcmVxdWlyZXMgYSBHSVRIVUJfUkVQT1NJVE9SWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBsaWtlICdvd25lci9yZXBvJ1wiKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbnRleHQgPSBDb250ZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///47579\n")},12453:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getOctokit = exports.context = void 0;\nconst Context = __importStar(__webpack_require__(47579));\nconst utils_1 = __webpack_require__(23329);\nexports.context = new Context.Context();\n/**\n * Returns a hydrated octokit ready to use for GitHub Actions\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokit(token, options, ...additionalPlugins) {\n const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);\n return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options));\n}\nexports.getOctokit = getOctokit;\n//# sourceMappingURL=github.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI0NTMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGtCQUFrQixHQUFHLGVBQWU7QUFDcEMsNkJBQTZCLG1CQUFPLENBQUMsS0FBVztBQUNoRCxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUFTO0FBQ2pDLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi9naXRodWIuanM/YzYwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRPY3Rva2l0ID0gZXhwb3J0cy5jb250ZXh0ID0gdm9pZCAwO1xuY29uc3QgQ29udGV4dCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmV4cG9ydHMuY29udGV4dCA9IG5ldyBDb250ZXh0LkNvbnRleHQoKTtcbi8qKlxuICogUmV0dXJucyBhIGh5ZHJhdGVkIG9jdG9raXQgcmVhZHkgdG8gdXNlIGZvciBHaXRIdWIgQWN0aW9uc1xuICpcbiAqIEBwYXJhbSAgICAgdG9rZW4gICAgdGhlIHJlcG8gUEFUIG9yIEdJVEhVQl9UT0tFTlxuICogQHBhcmFtICAgICBvcHRpb25zICBvdGhlciBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBnZXRPY3Rva2l0KHRva2VuLCBvcHRpb25zLCAuLi5hZGRpdGlvbmFsUGx1Z2lucykge1xuICAgIGNvbnN0IEdpdEh1YldpdGhQbHVnaW5zID0gdXRpbHNfMS5HaXRIdWIucGx1Z2luKC4uLmFkZGl0aW9uYWxQbHVnaW5zKTtcbiAgICByZXR1cm4gbmV3IEdpdEh1YldpdGhQbHVnaW5zKCgwLCB1dGlsc18xLmdldE9jdG9raXRPcHRpb25zKSh0b2tlbiwgb3B0aW9ucykpO1xufVxuZXhwb3J0cy5nZXRPY3Rva2l0ID0gZ2V0T2N0b2tpdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdpdGh1Yi5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///12453\n')},16529:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getApiBaseUrl = exports.getProxyFetch = exports.getProxyAgentDispatcher = exports.getProxyAgent = exports.getAuthString = void 0;\nconst httpClient = __importStar(__webpack_require__(40677));\nconst undici_1 = __webpack_require__(13477);\nfunction getAuthString(token, options) {\n if (!token && !options.auth) {\n throw new Error(\'Parameter token or opts.auth is required\');\n }\n else if (token && options.auth) {\n throw new Error(\'Parameters token and opts.auth may not both be specified\');\n }\n return typeof options.auth === \'string\' ? options.auth : `token ${token}`;\n}\nexports.getAuthString = getAuthString;\nfunction getProxyAgent(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgent(destinationUrl);\n}\nexports.getProxyAgent = getProxyAgent;\nfunction getProxyAgentDispatcher(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgentDispatcher(destinationUrl);\n}\nexports.getProxyAgentDispatcher = getProxyAgentDispatcher;\nfunction getProxyFetch(destinationUrl) {\n const httpDispatcher = getProxyAgentDispatcher(destinationUrl);\n const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () {\n return (0, undici_1.fetch)(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher }));\n });\n return proxyFetch;\n}\nexports.getProxyFetch = getProxyFetch;\nfunction getApiBaseUrl() {\n return process.env[\'GITHUB_API_URL\'] || \'https://api.github.com\';\n}\nexports.getApiBaseUrl = getApiBaseUrl;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY1MjkuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxxQkFBcUIsR0FBRyxxQkFBcUIsR0FBRywrQkFBK0IsR0FBRyxxQkFBcUIsR0FBRyxxQkFBcUI7QUFDL0gsZ0NBQWdDLG1CQUFPLENBQUMsS0FBc0I7QUFDOUQsaUJBQWlCLG1CQUFPLENBQUMsS0FBUTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxNQUFNO0FBQzVFO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxXQUFXLDRCQUE0QjtBQUM3RyxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvaW50ZXJuYWwvdXRpbHMuanM/Y2IyOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFwaUJhc2VVcmwgPSBleHBvcnRzLmdldFByb3h5RmV0Y2ggPSBleHBvcnRzLmdldFByb3h5QWdlbnREaXNwYXRjaGVyID0gZXhwb3J0cy5nZXRQcm94eUFnZW50ID0gZXhwb3J0cy5nZXRBdXRoU3RyaW5nID0gdm9pZCAwO1xuY29uc3QgaHR0cENsaWVudCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIikpO1xuY29uc3QgdW5kaWNpXzEgPSByZXF1aXJlKFwidW5kaWNpXCIpO1xuZnVuY3Rpb24gZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGlmICghdG9rZW4gJiYgIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB0b2tlbiBvciBvcHRzLmF1dGggaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4gJiYgb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVycyB0b2tlbiBhbmQgb3B0cy5hdXRoIG1heSBub3QgYm90aCBiZSBzcGVjaWZpZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zLmF1dGggPT09ICdzdHJpbmcnID8gb3B0aW9ucy5hdXRoIDogYHRva2VuICR7dG9rZW59YDtcbn1cbmV4cG9ydHMuZ2V0QXV0aFN0cmluZyA9IGdldEF1dGhTdHJpbmc7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50KGRlc3RpbmF0aW9uVXJsKSB7XG4gICAgY29uc3QgaGMgPSBuZXcgaHR0cENsaWVudC5IdHRwQ2xpZW50KCk7XG4gICAgcmV0dXJuIGhjLmdldEFnZW50KGRlc3RpbmF0aW9uVXJsKTtcbn1cbmV4cG9ydHMuZ2V0UHJveHlBZ2VudCA9IGdldFByb3h5QWdlbnQ7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50RGlzcGF0Y2hlcihkZXN0aW5hdGlvblVybCkge1xuICAgIGNvbnN0IGhjID0gbmV3IGh0dHBDbGllbnQuSHR0cENsaWVudCgpO1xuICAgIHJldHVybiBoYy5nZXRBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpO1xufVxuZXhwb3J0cy5nZXRQcm94eUFnZW50RGlzcGF0Y2hlciA9IGdldFByb3h5QWdlbnREaXNwYXRjaGVyO1xuZnVuY3Rpb24gZ2V0UHJveHlGZXRjaChkZXN0aW5hdGlvblVybCkge1xuICAgIGNvbnN0IGh0dHBEaXNwYXRjaGVyID0gZ2V0UHJveHlBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpO1xuICAgIGNvbnN0IHByb3h5RmV0Y2ggPSAodXJsLCBvcHRzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiAoMCwgdW5kaWNpXzEuZmV0Y2gpKHVybCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRzKSwgeyBkaXNwYXRjaGVyOiBodHRwRGlzcGF0Y2hlciB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3h5RmV0Y2g7XG59XG5leHBvcnRzLmdldFByb3h5RmV0Y2ggPSBnZXRQcm94eUZldGNoO1xuZnVuY3Rpb24gZ2V0QXBpQmFzZVVybCgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9BUElfVVJMJ10gfHwgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nO1xufVxuZXhwb3J0cy5nZXRBcGlCYXNlVXJsID0gZ2V0QXBpQmFzZVVybDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///16529\n')},23329:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;\nconst Context = __importStar(__webpack_require__(47579));\nconst Utils = __importStar(__webpack_require__(16529));\n// octokit + plugins\nconst core_1 = __webpack_require__(81539);\nconst plugin_rest_endpoint_methods_1 = __webpack_require__(30667);\nconst plugin_paginate_rest_1 = __webpack_require__(70909);\nexports.context = new Context.Context();\nconst baseUrl = Utils.getApiBaseUrl();\nexports.defaults = {\n baseUrl,\n request: {\n agent: Utils.getProxyAgent(baseUrl),\n fetch: Utils.getProxyFetch(baseUrl)\n }\n};\nexports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);\n/**\n * Convience function to correctly format Octokit Options to pass into the constructor.\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokitOptions(token, options) {\n const opts = Object.assign({}, options || {}); // Shallow clone - don\'t mutate the object provided by the caller\n // Auth\n const auth = Utils.getAuthString(token, opts);\n if (auth) {\n opts.auth = auth;\n }\n return opts;\n}\nexports.getOctokitOptions = getOctokitOptions;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMzMjkuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHlCQUF5QixHQUFHLGNBQWMsR0FBRyxnQkFBZ0IsR0FBRyxlQUFlO0FBQy9FLDZCQUE2QixtQkFBTyxDQUFDLEtBQVc7QUFDaEQsMkJBQTJCLG1CQUFPLENBQUMsS0FBa0I7QUFDckQ7QUFDQSxlQUFlLG1CQUFPLENBQUMsS0FBZTtBQUN0Qyx1Q0FBdUMsbUJBQU8sQ0FBQyxLQUF1QztBQUN0RiwrQkFBK0IsbUJBQU8sQ0FBQyxLQUErQjtBQUN0RSxlQUFlO0FBQ2Y7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGVBQWUsR0FBRztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi91dGlscy5qcz9jZTEwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldE9jdG9raXRPcHRpb25zID0gZXhwb3J0cy5HaXRIdWIgPSBleHBvcnRzLmRlZmF1bHRzID0gZXhwb3J0cy5jb250ZXh0ID0gdm9pZCAwO1xuY29uc3QgQ29udGV4dCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcbmNvbnN0IFV0aWxzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2ludGVybmFsL3V0aWxzXCIpKTtcbi8vIG9jdG9raXQgKyBwbHVnaW5zXG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQG9jdG9raXQvY29yZVwiKTtcbmNvbnN0IHBsdWdpbl9yZXN0X2VuZHBvaW50X21ldGhvZHNfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzXCIpO1xuY29uc3QgcGx1Z2luX3BhZ2luYXRlX3Jlc3RfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcGFnaW5hdGUtcmVzdFwiKTtcbmV4cG9ydHMuY29udGV4dCA9IG5ldyBDb250ZXh0LkNvbnRleHQoKTtcbmNvbnN0IGJhc2VVcmwgPSBVdGlscy5nZXRBcGlCYXNlVXJsKCk7XG5leHBvcnRzLmRlZmF1bHRzID0ge1xuICAgIGJhc2VVcmwsXG4gICAgcmVxdWVzdDoge1xuICAgICAgICBhZ2VudDogVXRpbHMuZ2V0UHJveHlBZ2VudChiYXNlVXJsKSxcbiAgICAgICAgZmV0Y2g6IFV0aWxzLmdldFByb3h5RmV0Y2goYmFzZVVybClcbiAgICB9XG59O1xuZXhwb3J0cy5HaXRIdWIgPSBjb3JlXzEuT2N0b2tpdC5wbHVnaW4ocGx1Z2luX3Jlc3RfZW5kcG9pbnRfbWV0aG9kc18xLnJlc3RFbmRwb2ludE1ldGhvZHMsIHBsdWdpbl9wYWdpbmF0ZV9yZXN0XzEucGFnaW5hdGVSZXN0KS5kZWZhdWx0cyhleHBvcnRzLmRlZmF1bHRzKTtcbi8qKlxuICogQ29udmllbmNlIGZ1bmN0aW9uIHRvIGNvcnJlY3RseSBmb3JtYXQgT2N0b2tpdCBPcHRpb25zIHRvIHBhc3MgaW50byB0aGUgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtICAgICB0b2tlbiAgICB0aGUgcmVwbyBQQVQgb3IgR0lUSFVCX1RPS0VOXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG90aGVyIG9wdGlvbnMgdG8gc2V0XG4gKi9cbmZ1bmN0aW9uIGdldE9jdG9raXRPcHRpb25zKHRva2VuLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMgfHwge30pOyAvLyBTaGFsbG93IGNsb25lIC0gZG9uJ3QgbXV0YXRlIHRoZSBvYmplY3QgcHJvdmlkZWQgYnkgdGhlIGNhbGxlclxuICAgIC8vIEF1dGhcbiAgICBjb25zdCBhdXRoID0gVXRpbHMuZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0cyk7XG4gICAgaWYgKGF1dGgpIHtcbiAgICAgICAgb3B0cy5hdXRoID0gYXV0aDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdHM7XG59XG5leHBvcnRzLmdldE9jdG9raXRPcHRpb25zID0gZ2V0T2N0b2tpdE9wdGlvbnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///23329\n')},69259:function(__unused_webpack_module,exports){"use strict";eval("\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0;\nclass BasicCredentialHandler {\n constructor(username, password) {\n this.username = username;\n this.password = password;\n }\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BasicCredentialHandler = BasicCredentialHandler;\nclass BearerCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Bearer ${this.token}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BearerCredentialHandler = BearerCredentialHandler;\nclass PersonalAccessTokenCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;\n//# sourceMappingURL=auth.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkyNTkuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDRDQUE0QyxHQUFHLCtCQUErQixHQUFHLDhCQUE4QjtBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsZUFBZSxjQUFjLEdBQUcsY0FBYyxzQkFBc0I7QUFDeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFdBQVc7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELG1CQUFtQixXQUFXLHNCQUFzQjtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9hdXRoLmpzPzIxMGQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGVyc29uYWxBY2Nlc3NUb2tlbkNyZWRlbnRpYWxIYW5kbGVyID0gZXhwb3J0cy5CZWFyZXJDcmVkZW50aWFsSGFuZGxlciA9IGV4cG9ydHMuQmFzaWNDcmVkZW50aWFsSGFuZGxlciA9IHZvaWQgMDtcbmNsYXNzIEJhc2ljQ3JlZGVudGlhbEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJuYW1lLCBwYXNzd29yZCkge1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICB9XG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5CYXNpY0NyZWRlbnRpYWxIYW5kbGVyID0gQmFzaWNDcmVkZW50aWFsSGFuZGxlcjtcbmNsYXNzIEJlYXJlckNyZWRlbnRpYWxIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgfVxuICAgIC8vIGN1cnJlbnRseSBpbXBsZW1lbnRzIHByZS1hdXRob3JpemF0aW9uXG4gICAgLy8gVE9ETzogc3VwcG9ydCBwcmVBdXRoID0gZmFsc2Ugd2hlcmUgaXQgaG9va3Mgb24gNDAxXG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy50b2tlbn1gO1xuICAgIH1cbiAgICAvLyBUaGlzIGhhbmRsZXIgY2Fubm90IGhhbmRsZSA0MDFcbiAgICBjYW5IYW5kbGVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYW5kbGVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIgPSBCZWFyZXJDcmVkZW50aWFsSGFuZGxlcjtcbmNsYXNzIFBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IodG9rZW4pIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICAvLyBjdXJyZW50bHkgaW1wbGVtZW50cyBwcmUtYXV0aG9yaXphdGlvblxuICAgIC8vIFRPRE86IHN1cHBvcnQgcHJlQXV0aCA9IGZhbHNlIHdoZXJlIGl0IGhvb2tzIG9uIDQwMVxuICAgIHByZXBhcmVSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdUaGUgcmVxdWVzdCBoYXMgbm8gaGVhZGVycycpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYFBBVDoke3RoaXMudG9rZW59YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5QZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXIgPSBQZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdXRoLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///69259\n")},40677:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\n/* eslint-disable @typescript-eslint/no-explicit-any */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0;\nconst http = __importStar(__webpack_require__(58611));\nconst https = __importStar(__webpack_require__(65692));\nconst pm = __importStar(__webpack_require__(78669));\nconst tunnel = __importStar(__webpack_require__(10803));\nconst undici_1 = __webpack_require__(13477);\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes["OK"] = 200] = "OK";\n HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices";\n HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently";\n HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved";\n HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther";\n HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified";\n HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy";\n HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy";\n HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect";\n HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect";\n HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest";\n HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized";\n HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired";\n HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden";\n HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound";\n HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed";\n HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable";\n HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";\n HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";\n HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";\n HttpCodes[HttpCodes["Gone"] = 410] = "Gone";\n HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests";\n HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";\n HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";\n HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";\n HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable";\n HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout";\n})(HttpCodes || (exports.HttpCodes = HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers["Accept"] = "accept";\n Headers["ContentType"] = "content-type";\n})(Headers || (exports.Headers = Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes["ApplicationJson"] = "application/json";\n})(MediaTypes || (exports.MediaTypes = MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n const proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : \'\';\n}\nexports.getProxyUrl = getProxyUrl;\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = [\'OPTIONS\', \'GET\', \'DELETE\', \'HEAD\'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = \'HttpClientError\';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n let output = Buffer.alloc(0);\n this.message.on(\'data\', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on(\'end\', () => {\n resolve(output.toString());\n });\n }));\n });\n }\n readBodyBuffer() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n const chunks = [];\n this.message.on(\'data\', (chunk) => {\n chunks.push(chunk);\n });\n this.message.on(\'end\', () => {\n resolve(Buffer.concat(chunks));\n });\n }));\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n const parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === \'https:\';\n}\nexports.isHttps = isHttps;\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = userAgent;\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'OPTIONS\', requestUrl, null, additionalHeaders || {});\n });\n }\n get(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'GET\', requestUrl, null, additionalHeaders || {});\n });\n }\n del(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'DELETE\', requestUrl, null, additionalHeaders || {});\n });\n }\n post(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'POST\', requestUrl, data, additionalHeaders || {});\n });\n }\n patch(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'PATCH\', requestUrl, data, additionalHeaders || {});\n });\n }\n put(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'PUT\', requestUrl, data, additionalHeaders || {});\n });\n }\n head(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(\'HEAD\', requestUrl, null, additionalHeaders || {});\n });\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n });\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n getJson(requestUrl, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n const res = yield this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n postJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n putJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n patchJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n request(verb, requestUrl, data, headers) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._disposed) {\n throw new Error(\'Client has already been disposed.\');\n }\n const parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n do {\n response = yield this.requestRaw(info, data);\n // Check if it\'s an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (const handler of this.handlers) {\n if (handler.canHandleAuthentication(response)) {\n authenticationHandler = handler;\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (response.message.statusCode &&\n HttpRedirectCodes.includes(response.message.statusCode) &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers[\'location\'];\n if (!redirectUrl) {\n // if there\'s no location to redirect to, we won\'t\n break;\n }\n const parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol === \'https:\' &&\n parsedUrl.protocol !== parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error(\'Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.\');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n yield response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (const header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === \'authorization\') {\n delete headers[header];\n }\n }\n }\n // let\'s make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = yield this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (!response.message.statusCode ||\n !HttpResponseRetryCodes.includes(response.message.statusCode)) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n yield response.readBody();\n yield this._performExponentialBackoff(numTries);\n }\n } while (numTries < maxTries);\n return response;\n });\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n function callbackForResult(err, res) {\n if (err) {\n reject(err);\n }\n else if (!res) {\n // If `err` is not passed, then `res` must be passed.\n reject(new Error(\'Unknown error\'));\n }\n else {\n resolve(res);\n }\n }\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n if (typeof data === \'string\') {\n if (!info.options.headers) {\n info.options.headers = {};\n }\n info.options.headers[\'Content-Length\'] = Buffer.byteLength(data, \'utf8\');\n }\n let callbackCalled = false;\n function handleResult(err, res) {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n }\n const req = info.httpModule.request(info.options, (msg) => {\n const res = new HttpClientResponse(msg);\n handleResult(undefined, res);\n });\n let socket;\n req.on(\'socket\', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error(`Request timeout: ${info.options.path}`));\n });\n req.on(\'error\', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err);\n });\n if (data && typeof data === \'string\') {\n req.write(data, \'utf8\');\n }\n if (data && typeof data !== \'string\') {\n data.on(\'close\', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n getAgentDispatcher(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (!useProxy) {\n return;\n }\n return this._getProxyAgentDispatcher(parsedUrl, proxyUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === \'https:\';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || \'\') + (info.parsedUrl.search || \'\');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers[\'user-agent\'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n for (const handler of this.handlers) {\n handler.prepareRequest(info.options);\n }\n }\n return info;\n }\n _mergeHeaders(headers) {\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));\n }\n return lowercaseKeys(headers || {});\n }\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n clientHeader = lowercaseKeys(this.requestOptions.headers)[header];\n }\n return additionalHeaders[header] || clientHeader || _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (this._keepAlive && !useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === \'https:\';\n let maxSockets = 100;\n if (this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts\'s flow analysis.\n if (proxyUrl && proxyUrl.hostname) {\n const agentOptions = {\n maxSockets,\n keepAlive: this._keepAlive,\n proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`\n })), { host: proxyUrl.hostname, port: proxyUrl.port })\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === \'https:\';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if reusing agent across request and tunneling agent isn\'t assigned create a new agent\n if (this._keepAlive && !agent) {\n const options = { keepAlive: this._keepAlive, maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n // if not using private agent and tunnel agent isn\'t setup then use global agent\n if (!agent) {\n agent = usingSsl ? https.globalAgent : http.globalAgent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don\'t want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn\'t expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _getProxyAgentDispatcher(parsedUrl, proxyUrl) {\n let proxyAgent;\n if (this._keepAlive) {\n proxyAgent = this._proxyAgentDispatcher;\n }\n // if agent is already assigned use that agent.\n if (proxyAgent) {\n return proxyAgent;\n }\n const usingSsl = parsedUrl.protocol === \'https:\';\n proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && {\n token: `${proxyUrl.username}:${proxyUrl.password}`\n })));\n this._proxyAgentDispatcher = proxyAgent;\n if (usingSsl && this._ignoreSslError) {\n // we don\'t want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn\'t expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, {\n rejectUnauthorized: false\n });\n }\n return proxyAgent;\n }\n _performExponentialBackoff(retryNumber) {\n return __awaiter(this, void 0, void 0, function* () {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n });\n }\n _processResponse(res, options) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n const statusCode = res.message.statusCode || 0;\n const response = {\n statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode === HttpCodes.NotFound) {\n resolve(response);\n }\n // get the result from the body\n function dateTimeDeserializer(key, value) {\n if (typeof value === \'string\') {\n const a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n let obj;\n let contents;\n try {\n contents = yield res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = `Failed request: (${statusCode})`;\n }\n const err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n }));\n });\n }\n}\nexports.HttpClient = HttpClient;\nconst lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGtCQUFrQjtBQUN6RSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMseUVBQXlFO0FBQzVHO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsa0NBQWtDLGtCQUFrQixHQUFHLGtCQUFrQjtBQUN6RSxpQkFBaUIsTUFBTSw4Q0FBOEM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdEO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELDBEQUEwRDtBQUN2SCxzQkFBc0Isa0JBQWtCLEdBQUcsa0JBQWtCO0FBQzdELFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGO0FBQ2xGO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsV0FBVztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLHVHQUF1RztBQUN2RyIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL2luZGV4LmpzPzlkOWEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwQ2xpZW50ID0gZXhwb3J0cy5pc0h0dHBzID0gZXhwb3J0cy5IdHRwQ2xpZW50UmVzcG9uc2UgPSBleHBvcnRzLkh0dHBDbGllbnRFcnJvciA9IGV4cG9ydHMuZ2V0UHJveHlVcmwgPSBleHBvcnRzLk1lZGlhVHlwZXMgPSBleHBvcnRzLkhlYWRlcnMgPSBleHBvcnRzLkh0dHBDb2RlcyA9IHZvaWQgMDtcbmNvbnN0IGh0dHAgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBcIikpO1xuY29uc3QgaHR0cHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBzXCIpKTtcbmNvbnN0IHBtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Byb3h5XCIpKTtcbmNvbnN0IHR1bm5lbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidHVubmVsXCIpKTtcbmNvbnN0IHVuZGljaV8xID0gcmVxdWlyZShcInVuZGljaVwiKTtcbnZhciBIdHRwQ29kZXM7XG4oZnVuY3Rpb24gKEh0dHBDb2Rlcykge1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJPS1wiXSA9IDIwMF0gPSBcIk9LXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk11bHRpcGxlQ2hvaWNlc1wiXSA9IDMwMF0gPSBcIk11bHRpcGxlQ2hvaWNlc1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNb3ZlZFBlcm1hbmVudGx5XCJdID0gMzAxXSA9IFwiTW92ZWRQZXJtYW5lbnRseVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJSZXNvdXJjZU1vdmVkXCJdID0gMzAyXSA9IFwiUmVzb3VyY2VNb3ZlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJTZWVPdGhlclwiXSA9IDMwM10gPSBcIlNlZU90aGVyXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdE1vZGlmaWVkXCJdID0gMzA0XSA9IFwiTm90TW9kaWZpZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVXNlUHJveHlcIl0gPSAzMDVdID0gXCJVc2VQcm94eVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJTd2l0Y2hQcm94eVwiXSA9IDMwNl0gPSBcIlN3aXRjaFByb3h5XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlRlbXBvcmFyeVJlZGlyZWN0XCJdID0gMzA3XSA9IFwiVGVtcG9yYXJ5UmVkaXJlY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUGVybWFuZW50UmVkaXJlY3RcIl0gPSAzMDhdID0gXCJQZXJtYW5lbnRSZWRpcmVjdFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJCYWRSZXF1ZXN0XCJdID0gNDAwXSA9IFwiQmFkUmVxdWVzdFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJVbmF1dGhvcml6ZWRcIl0gPSA0MDFdID0gXCJVbmF1dGhvcml6ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUGF5bWVudFJlcXVpcmVkXCJdID0gNDAyXSA9IFwiUGF5bWVudFJlcXVpcmVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkZvcmJpZGRlblwiXSA9IDQwM10gPSBcIkZvcmJpZGRlblwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RGb3VuZFwiXSA9IDQwNF0gPSBcIk5vdEZvdW5kXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk1ldGhvZE5vdEFsbG93ZWRcIl0gPSA0MDVdID0gXCJNZXRob2ROb3RBbGxvd2VkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdEFjY2VwdGFibGVcIl0gPSA0MDZdID0gXCJOb3RBY2NlcHRhYmxlXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZFwiXSA9IDQwN10gPSBcIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJSZXF1ZXN0VGltZW91dFwiXSA9IDQwOF0gPSBcIlJlcXVlc3RUaW1lb3V0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkNvbmZsaWN0XCJdID0gNDA5XSA9IFwiQ29uZmxpY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiR29uZVwiXSA9IDQxMF0gPSBcIkdvbmVcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVG9vTWFueVJlcXVlc3RzXCJdID0gNDI5XSA9IFwiVG9vTWFueVJlcXVlc3RzXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkludGVybmFsU2VydmVyRXJyb3JcIl0gPSA1MDBdID0gXCJJbnRlcm5hbFNlcnZlckVycm9yXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIk5vdEltcGxlbWVudGVkXCJdID0gNTAxXSA9IFwiTm90SW1wbGVtZW50ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiQmFkR2F0ZXdheVwiXSA9IDUwMl0gPSBcIkJhZEdhdGV3YXlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU2VydmljZVVuYXZhaWxhYmxlXCJdID0gNTAzXSA9IFwiU2VydmljZVVuYXZhaWxhYmxlXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkdhdGV3YXlUaW1lb3V0XCJdID0gNTA0XSA9IFwiR2F0ZXdheVRpbWVvdXRcIjtcbn0pKEh0dHBDb2RlcyB8fCAoZXhwb3J0cy5IdHRwQ29kZXMgPSBIdHRwQ29kZXMgPSB7fSkpO1xudmFyIEhlYWRlcnM7XG4oZnVuY3Rpb24gKEhlYWRlcnMpIHtcbiAgICBIZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhY2NlcHRcIjtcbiAgICBIZWFkZXJzW1wiQ29udGVudFR5cGVcIl0gPSBcImNvbnRlbnQtdHlwZVwiO1xufSkoSGVhZGVycyB8fCAoZXhwb3J0cy5IZWFkZXJzID0gSGVhZGVycyA9IHt9KSk7XG52YXIgTWVkaWFUeXBlcztcbihmdW5jdGlvbiAoTWVkaWFUeXBlcykge1xuICAgIE1lZGlhVHlwZXNbXCJBcHBsaWNhdGlvbkpzb25cIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbn0pKE1lZGlhVHlwZXMgfHwgKGV4cG9ydHMuTWVkaWFUeXBlcyA9IE1lZGlhVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm94eSBVUkwsIGRlcGVuZGluZyB1cG9uIHRoZSBzdXBwbGllZCB1cmwgYW5kIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqIEBwYXJhbSBzZXJ2ZXJVcmwgIFRoZSBzZXJ2ZXIgVVJMIHdoZXJlIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2VudC4gRm9yIGV4YW1wbGUsIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cbiAqL1xuZnVuY3Rpb24gZ2V0UHJveHlVcmwoc2VydmVyVXJsKSB7XG4gICAgY29uc3QgcHJveHlVcmwgPSBwbS5nZXRQcm94eVVybChuZXcgVVJMKHNlcnZlclVybCkpO1xuICAgIHJldHVybiBwcm94eVVybCA/IHByb3h5VXJsLmhyZWYgOiAnJztcbn1cbmV4cG9ydHMuZ2V0UHJveHlVcmwgPSBnZXRQcm94eVVybDtcbmNvbnN0IEh0dHBSZWRpcmVjdENvZGVzID0gW1xuICAgIEh0dHBDb2Rlcy5Nb3ZlZFBlcm1hbmVudGx5LFxuICAgIEh0dHBDb2Rlcy5SZXNvdXJjZU1vdmVkLFxuICAgIEh0dHBDb2Rlcy5TZWVPdGhlcixcbiAgICBIdHRwQ29kZXMuVGVtcG9yYXJ5UmVkaXJlY3QsXG4gICAgSHR0cENvZGVzLlBlcm1hbmVudFJlZGlyZWN0XG5dO1xuY29uc3QgSHR0cFJlc3BvbnNlUmV0cnlDb2RlcyA9IFtcbiAgICBIdHRwQ29kZXMuQmFkR2F0ZXdheSxcbiAgICBIdHRwQ29kZXMuU2VydmljZVVuYXZhaWxhYmxlLFxuICAgIEh0dHBDb2Rlcy5HYXRld2F5VGltZW91dFxuXTtcbmNvbnN0IFJldHJ5YWJsZUh0dHBWZXJicyA9IFsnT1BUSU9OUycsICdHRVQnLCAnREVMRVRFJywgJ0hFQUQnXTtcbmNvbnN0IEV4cG9uZW50aWFsQmFja29mZkNlaWxpbmcgPSAxMDtcbmNvbnN0IEV4cG9uZW50aWFsQmFja29mZlRpbWVTbGljZSA9IDU7XG5jbGFzcyBIdHRwQ2xpZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzQ29kZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0h0dHBDbGllbnRFcnJvcic7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBIdHRwQ2xpZW50RXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBDbGllbnRFcnJvciA9IEh0dHBDbGllbnRFcnJvcjtcbmNsYXNzIEh0dHBDbGllbnRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICByZWFkQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGxldCBvdXRwdXQgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEJ1ZmZlci5jb25jYXQoW291dHB1dCwgY2h1bmtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRwdXQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkQm9keUJ1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50UmVzcG9uc2UgPSBIdHRwQ2xpZW50UmVzcG9uc2U7XG5mdW5jdGlvbiBpc0h0dHBzKHJlcXVlc3RVcmwpIHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3RVcmwpO1xuICAgIHJldHVybiBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xufVxuZXhwb3J0cy5pc0h0dHBzID0gaXNIdHRwcztcbmNsYXNzIEh0dHBDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJBZ2VudCwgaGFuZGxlcnMsIHJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZVNzbEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3RzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdERvd25ncmFkZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXhSZWRpcmVjdHMgPSA1MDtcbiAgICAgICAgdGhpcy5fYWxsb3dSZXRyaWVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21heFJldHJpZXMgPSAxO1xuICAgICAgICB0aGlzLl9rZWVwQWxpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VyQWdlbnQgPSB1c2VyQWdlbnQ7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0T3B0aW9ucyA9IHJlcXVlc3RPcHRpb25zO1xuICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5pZ25vcmVTc2xFcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faWdub3JlU3NsRXJyb3IgPSByZXF1ZXN0T3B0aW9ucy5pZ25vcmVTc2xFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NvY2tldFRpbWVvdXQgPSByZXF1ZXN0T3B0aW9ucy5zb2NrZXRUaW1lb3V0O1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3RzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyA9IHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3RzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLmFsbG93UmVkaXJlY3REb3duZ3JhZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3REb3duZ3JhZGUgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0RG93bmdyYWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLm1heFJlZGlyZWN0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4UmVkaXJlY3RzID0gTWF0aC5tYXgocmVxdWVzdE9wdGlvbnMubWF4UmVkaXJlY3RzLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5rZWVwQWxpdmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tlZXBBbGl2ZSA9IHJlcXVlc3RPcHRpb25zLmtlZXBBbGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JldHJpZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93UmV0cmllcyA9IHJlcXVlc3RPcHRpb25zLmFsbG93UmV0cmllcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tYXhSZXRyaWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhSZXRyaWVzID0gcmVxdWVzdE9wdGlvbnMubWF4UmV0cmllcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvcHRpb25zKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdPUFRJT05TJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0KHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWwocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIHJlcXVlc3RVcmwsIG51bGwsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc3QocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BPU1QnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXRjaChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUEFUQ0gnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdXQocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BVVCcsIHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhlYWQocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0hFQUQnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZW5kU3RyZWFtKHZlcmIsIHJlcXVlc3RVcmwsIHN0cmVhbSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodmVyYiwgcmVxdWVzdFVybCwgc3RyZWFtLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgdHlwZWQgb2JqZWN0IGZyb20gYW4gZW5kcG9pbnRcbiAgICAgKiBCZSBhd2FyZSB0aGF0IG5vdCBmb3VuZCByZXR1cm5zIGEgbnVsbC4gIE90aGVyIGVycm9ycyAoNHh4LCA1eHgpIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAqL1xuICAgIGdldEpzb24ocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLmdldChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3N0SnNvbihyZXF1ZXN0VXJsLCBvYmosIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkNvbnRlbnRUeXBlXSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkNvbnRlbnRUeXBlLCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLnBvc3QocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHV0SnNvbihyZXF1ZXN0VXJsLCBvYmosIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5BY2NlcHRdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQWNjZXB0LCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkNvbnRlbnRUeXBlXSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkNvbnRlbnRUeXBlLCBNZWRpYVR5cGVzLkFwcGxpY2F0aW9uSnNvbik7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCB0aGlzLnB1dChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXRjaEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wYXRjaChyZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlcywgdGhpcy5yZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIHJhdyBodHRwIHJlcXVlc3QuXG4gICAgICogQWxsIG90aGVyIG1ldGhvZHMgc3VjaCBhcyBnZXQsIHBvc3QsIHBhdGNoLCBhbmQgcmVxdWVzdCB1bHRpbWF0ZWx5IGNhbGwgdGhpcy5cbiAgICAgKiBQcmVmZXIgZ2V0LCBkZWwsIHBvc3QgYW5kIHBhdGNoXG4gICAgICovXG4gICAgcmVxdWVzdCh2ZXJiLCByZXF1ZXN0VXJsLCBkYXRhLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWVudCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0VXJsKTtcbiAgICAgICAgICAgIGxldCBpbmZvID0gdGhpcy5fcHJlcGFyZVJlcXVlc3QodmVyYiwgcGFyc2VkVXJsLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIC8vIE9ubHkgcGVyZm9ybSByZXRyaWVzIG9uIHJlYWRzIHNpbmNlIHdyaXRlcyBtYXkgbm90IGJlIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICBjb25zdCBtYXhUcmllcyA9IHRoaXMuX2FsbG93UmV0cmllcyAmJiBSZXRyeWFibGVIdHRwVmVyYnMuaW5jbHVkZXModmVyYilcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAgICAgOiAxO1xuICAgICAgICAgICAgbGV0IG51bVRyaWVzID0gMDtcbiAgICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHRoaXMucmVxdWVzdFJhdyhpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlICYmXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSA9PT0gSHR0cENvZGVzLlVuYXV0aG9yaXplZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aGVudGljYXRpb25IYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIuY2FuSGFuZGxlQXV0aGVudGljYXRpb24ocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25IYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXV0aGVudGljYXRpb25IYW5kbGVyLmhhbmRsZUF1dGhlbnRpY2F0aW9uKHRoaXMsIGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhbiB1bmF1dGhvcml6ZWQgcmVzcG9uc2UgYnV0IGhhdmUgbm8gaGFuZGxlcnMgdG8gaGFuZGxlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSByZXNwb25zZSByZXR1cm4gdG8gdGhlIGNhbGxlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVkaXJlY3RzUmVtYWluaW5nID0gdGhpcy5fbWF4UmVkaXJlY3RzO1xuICAgICAgICAgICAgICAgIHdoaWxlIChyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgSHR0cFJlZGlyZWN0Q29kZXMuaW5jbHVkZXMocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyAmJlxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdHNSZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gcmVzcG9uc2UubWVzc2FnZS5oZWFkZXJzWydsb2NhdGlvbiddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0VXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIGxvY2F0aW9uIHRvIHJlZGlyZWN0IHRvLCB3ZSB3b24ndFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmVkaXJlY3RVcmwgPSBuZXcgVVJMKHJlZGlyZWN0VXJsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFVybC5wcm90b2NvbCAhPT0gcGFyc2VkUmVkaXJlY3RVcmwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl9hbGxvd1JlZGlyZWN0RG93bmdyYWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZGlyZWN0IGZyb20gSFRUUFMgdG8gSFRUUCBwcm90b2NvbC4gVGhpcyBkb3duZ3JhZGUgaXMgbm90IGFsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuIElmIHlvdSB3YW50IHRvIGFsbG93IHRoaXMgYmVoYXZpb3IsIHNldCB0aGUgYWxsb3dSZWRpcmVjdERvd25ncmFkZSBvcHRpb24gdG8gdHJ1ZS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGZpbmlzaCByZWFkaW5nIHRoZSByZXNwb25zZSBiZWZvcmUgcmVhc3NpZ25pbmcgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggd2lsbCBsZWFrIHRoZSBvcGVuIHNvY2tldC5cbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzcG9uc2UucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RyaXAgYXV0aG9yaXphdGlvbiBoZWFkZXIgaWYgcmVkaXJlY3RlZCB0byBhIGRpZmZlcmVudCBob3N0bmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkUmVkaXJlY3RVcmwuaG9zdG5hbWUgIT09IHBhcnNlZFVybC5ob3N0bmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWRlciBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIG1ha2UgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgbmV3IHJlZGlyZWN0VXJsXG4gICAgICAgICAgICAgICAgICAgIGluZm8gPSB0aGlzLl9wcmVwYXJlUmVxdWVzdCh2ZXJiLCBwYXJzZWRSZWRpcmVjdFVybCwgaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgdGhpcy5yZXF1ZXN0UmF3KGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdHNSZW1haW5pbmctLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgIUh0dHBSZXNwb25zZVJldHJ5Q29kZXMuaW5jbHVkZXMocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgYSByZXRyeSBjb2RlLCByZXR1cm4gaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiByZXRyeWluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG51bVRyaWVzICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG51bVRyaWVzIDwgbWF4VHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzcG9uc2UucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5fcGVyZm9ybUV4cG9uZW50aWFsQmFja29mZihudW1Ucmllcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAobnVtVHJpZXMgPCBtYXhUcmllcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOZWVkcyB0byBiZSBjYWxsZWQgaWYga2VlcEFsaXZlIGlzIHNldCB0byB0cnVlIGluIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5fYWdlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FnZW50LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJhdyByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBpbmZvXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICByZXF1ZXN0UmF3KGluZm8sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbGJhY2tGb3JSZXN1bHQoZXJyLCByZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYGVycmAgaXMgbm90IHBhc3NlZCwgdGhlbiBgcmVzYCBtdXN0IGJlIHBhc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Vua25vd24gZXJyb3InKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmF3V2l0aENhbGxiYWNrKGluZm8sIGRhdGEsIGNhbGxiYWNrRm9yUmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmF3IHJlcXVlc3Qgd2l0aCBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0gaW5mb1xuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICogQHBhcmFtIG9uUmVzdWx0XG4gICAgICovXG4gICAgcmVxdWVzdFJhd1dpdGhDYWxsYmFjayhpbmZvLCBkYXRhLCBvblJlc3VsdCkge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoIWluZm8ub3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaW5mby5vcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSwgJ3V0ZjgnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FsbGJhY2tDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVzdWx0KGVyciwgcmVzKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxiYWNrQ2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG9uUmVzdWx0KGVyciwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXEgPSBpbmZvLmh0dHBNb2R1bGUucmVxdWVzdChpbmZvLm9wdGlvbnMsIChtc2cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyBIdHRwQ2xpZW50UmVzcG9uc2UobXNnKTtcbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdCh1bmRlZmluZWQsIHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgc29ja2V0O1xuICAgICAgICByZXEub24oJ3NvY2tldCcsIHNvY2sgPT4ge1xuICAgICAgICAgICAgc29ja2V0ID0gc29jaztcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIElmIHdlIGV2ZXIgZ2V0IGRpc2Nvbm5lY3RlZCwgd2Ugd2FudCB0aGUgc29ja2V0IHRvIHRpbWVvdXQgZXZlbnR1YWxseVxuICAgICAgICByZXEuc2V0VGltZW91dCh0aGlzLl9zb2NrZXRUaW1lb3V0IHx8IDMgKiA2MDAwMCwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgICAgIHNvY2tldC5lbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdChuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dDogJHtpbmZvLm9wdGlvbnMucGF0aH1gKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgLy8gZXJyIGhhcyBzdGF0dXNDb2RlIHByb3BlcnR5XG4gICAgICAgICAgICAvLyByZXMgc2hvdWxkIGhhdmUgaGVhZGVyc1xuICAgICAgICAgICAgaGFuZGxlUmVzdWx0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlcS53cml0ZShkYXRhLCAndXRmOCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0YS5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVxLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXRhLnBpcGUocmVxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcS5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGh0dHAgYWdlbnQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgYW4gaHR0cCBhZ2VudCB0aGF0IGhhbmRsZXNcbiAgICAgKiByb3V0aW5nIHRocm91Z2ggYSBwcm94eSBzZXJ2ZXIgLSBkZXBlbmRpbmcgdXBvbiB0aGUgdXJsIGFuZCBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHNlcnZlclVybCAgVGhlIHNlcnZlciBVUkwgd2hlcmUgdGhlIHJlcXVlc3Qgd2lsbCBiZSBzZW50LiBGb3IgZXhhbXBsZSwgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbVxuICAgICAqL1xuICAgIGdldEFnZW50KHNlcnZlclVybCkge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHNlcnZlclVybCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBZ2VudChwYXJzZWRVcmwpO1xuICAgIH1cbiAgICBnZXRBZ2VudERpc3BhdGNoZXIoc2VydmVyVXJsKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwoc2VydmVyVXJsKTtcbiAgICAgICAgY29uc3QgcHJveHlVcmwgPSBwbS5nZXRQcm94eVVybChwYXJzZWRVcmwpO1xuICAgICAgICBjb25zdCB1c2VQcm94eSA9IHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lO1xuICAgICAgICBpZiAoIXVzZVByb3h5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpO1xuICAgIH1cbiAgICBfcHJlcGFyZVJlcXVlc3QobWV0aG9kLCByZXF1ZXN0VXJsLCBoZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB7fTtcbiAgICAgICAgaW5mby5wYXJzZWRVcmwgPSByZXF1ZXN0VXJsO1xuICAgICAgICBjb25zdCB1c2luZ1NzbCA9IGluZm8ucGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgaW5mby5odHRwTW9kdWxlID0gdXNpbmdTc2wgPyBodHRwcyA6IGh0dHA7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gdXNpbmdTc2wgPyA0NDMgOiA4MDtcbiAgICAgICAgaW5mby5vcHRpb25zID0ge307XG4gICAgICAgIGluZm8ub3B0aW9ucy5ob3N0ID0gaW5mby5wYXJzZWRVcmwuaG9zdG5hbWU7XG4gICAgICAgIGluZm8ub3B0aW9ucy5wb3J0ID0gaW5mby5wYXJzZWRVcmwucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludChpbmZvLnBhcnNlZFVybC5wb3J0KVxuICAgICAgICAgICAgOiBkZWZhdWx0UG9ydDtcbiAgICAgICAgaW5mby5vcHRpb25zLnBhdGggPVxuICAgICAgICAgICAgKGluZm8ucGFyc2VkVXJsLnBhdGhuYW1lIHx8ICcnKSArIChpbmZvLnBhcnNlZFVybC5zZWFyY2ggfHwgJycpO1xuICAgICAgICBpbmZvLm9wdGlvbnMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVycyA9IHRoaXMuX21lcmdlSGVhZGVycyhoZWFkZXJzKTtcbiAgICAgICAgaWYgKHRoaXMudXNlckFnZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzWyd1c2VyLWFnZW50J10gPSB0aGlzLnVzZXJBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLm9wdGlvbnMuYWdlbnQgPSB0aGlzLl9nZXRBZ2VudChpbmZvLnBhcnNlZFVybCk7XG4gICAgICAgIC8vIGdpdmVzIGhhbmRsZXJzIGFuIG9wcG9ydHVuaXR5IHRvIHBhcnRpY2lwYXRlXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIucHJlcGFyZVJlcXVlc3QoaW5mby5vcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgX21lcmdlSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zICYmIHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGxvd2VyY2FzZUtleXModGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKSwgbG93ZXJjYXNlS2V5cyhoZWFkZXJzIHx8IHt9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvd2VyY2FzZUtleXMoaGVhZGVycyB8fCB7fSk7XG4gICAgfVxuICAgIF9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgaGVhZGVyLCBfZGVmYXVsdCkge1xuICAgICAgICBsZXQgY2xpZW50SGVhZGVyO1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0T3B0aW9ucyAmJiB0aGlzLnJlcXVlc3RPcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNsaWVudEhlYWRlciA9IGxvd2VyY2FzZUtleXModGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKVtoZWFkZXJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRpdGlvbmFsSGVhZGVyc1toZWFkZXJdIHx8IGNsaWVudEhlYWRlciB8fCBfZGVmYXVsdDtcbiAgICB9XG4gICAgX2dldEFnZW50KHBhcnNlZFVybCkge1xuICAgICAgICBsZXQgYWdlbnQ7XG4gICAgICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwocGFyc2VkVXJsKTtcbiAgICAgICAgY29uc3QgdXNlUHJveHkgPSBwcm94eVVybCAmJiBwcm94eVVybC5ob3N0bmFtZTtcbiAgICAgICAgaWYgKHRoaXMuX2tlZXBBbGl2ZSAmJiB1c2VQcm94eSkge1xuICAgICAgICAgICAgYWdlbnQgPSB0aGlzLl9wcm94eUFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUgJiYgIXVzZVByb3h5KSB7XG4gICAgICAgICAgICBhZ2VudCA9IHRoaXMuX2FnZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFnZW50IGlzIGFscmVhZHkgYXNzaWduZWQgdXNlIHRoYXQgYWdlbnQuXG4gICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzaW5nU3NsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgbGV0IG1heFNvY2tldHMgPSAxMDA7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBtYXhTb2NrZXRzID0gdGhpcy5yZXF1ZXN0T3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuZ2xvYmFsQWdlbnQubWF4U29ja2V0cztcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIGB1c2VQcm94eWAgYWdhaW4sIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGBwcm94eVVSbGAgZGlyZWN0bHkgZm9yIFR5cGVTY3JpcHRzJ3MgZmxvdyBhbmFseXNpcy5cbiAgICAgICAgaWYgKHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBhZ2VudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWF4U29ja2V0cyxcbiAgICAgICAgICAgICAgICBrZWVwQWxpdmU6IHRoaXMuX2tlZXBBbGl2ZSxcbiAgICAgICAgICAgICAgICBwcm94eTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoKHByb3h5VXJsLnVzZXJuYW1lIHx8IHByb3h5VXJsLnBhc3N3b3JkKSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5QXV0aDogYCR7cHJveHlVcmwudXNlcm5hbWV9OiR7cHJveHlVcmwucGFzc3dvcmR9YFxuICAgICAgICAgICAgICAgIH0pKSwgeyBob3N0OiBwcm94eVVybC5ob3N0bmFtZSwgcG9ydDogcHJveHlVcmwucG9ydCB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB0dW5uZWxBZ2VudDtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJIdHRwcyA9IHByb3h5VXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgICAgIHR1bm5lbEFnZW50ID0gb3Zlckh0dHBzID8gdHVubmVsLmh0dHBzT3Zlckh0dHBzIDogdHVubmVsLmh0dHBzT3Zlckh0dHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0dW5uZWxBZ2VudCA9IG92ZXJIdHRwcyA/IHR1bm5lbC5odHRwT3Zlckh0dHBzIDogdHVubmVsLmh0dHBPdmVySHR0cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFnZW50ID0gdHVubmVsQWdlbnQoYWdlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3h5QWdlbnQgPSBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiByZXVzaW5nIGFnZW50IGFjcm9zcyByZXF1ZXN0IGFuZCB0dW5uZWxpbmcgYWdlbnQgaXNuJ3QgYXNzaWduZWQgY3JlYXRlIGEgbmV3IGFnZW50XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUgJiYgIWFnZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0geyBrZWVwQWxpdmU6IHRoaXMuX2tlZXBBbGl2ZSwgbWF4U29ja2V0cyB9O1xuICAgICAgICAgICAgYWdlbnQgPSB1c2luZ1NzbCA/IG5ldyBodHRwcy5BZ2VudChvcHRpb25zKSA6IG5ldyBodHRwLkFnZW50KG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fYWdlbnQgPSBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBub3QgdXNpbmcgcHJpdmF0ZSBhZ2VudCBhbmQgdHVubmVsIGFnZW50IGlzbid0IHNldHVwIHRoZW4gdXNlIGdsb2JhbCBhZ2VudFxuICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgICBhZ2VudCA9IHVzaW5nU3NsID8gaHR0cHMuZ2xvYmFsQWdlbnQgOiBodHRwLmdsb2JhbEFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgYWdlbnQub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oYWdlbnQub3B0aW9ucyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpIHtcbiAgICAgICAgbGV0IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUpIHtcbiAgICAgICAgICAgIHByb3h5QWdlbnQgPSB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhZ2VudCBpcyBhbHJlYWR5IGFzc2lnbmVkIHVzZSB0aGF0IGFnZW50LlxuICAgICAgICBpZiAocHJveHlBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICBwcm94eUFnZW50ID0gbmV3IHVuZGljaV8xLlByb3h5QWdlbnQoT2JqZWN0LmFzc2lnbih7IHVyaTogcHJveHlVcmwuaHJlZiwgcGlwZWxpbmluZzogIXRoaXMuX2tlZXBBbGl2ZSA/IDAgOiAxIH0sICgocHJveHlVcmwudXNlcm5hbWUgfHwgcHJveHlVcmwucGFzc3dvcmQpICYmIHtcbiAgICAgICAgICAgIHRva2VuOiBgJHtwcm94eVVybC51c2VybmFtZX06JHtwcm94eVVybC5wYXNzd29yZH1gXG4gICAgICAgIH0pKSk7XG4gICAgICAgIHRoaXMuX3Byb3h5QWdlbnREaXNwYXRjaGVyID0gcHJveHlBZ2VudDtcbiAgICAgICAgaWYgKHVzaW5nU3NsICYmIHRoaXMuX2lnbm9yZVNzbEVycm9yKSB7XG4gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHNldCBOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTAgc2luY2UgdGhhdCB3aWxsIGFmZmVjdCByZXF1ZXN0IGZvciBlbnRpcmUgcHJvY2Vzc1xuICAgICAgICAgICAgLy8gaHR0cC5SZXF1ZXN0T3B0aW9ucyBkb2Vzbid0IGV4cG9zZSBhIHdheSB0byBtb2RpZnkgUmVxdWVzdE9wdGlvbnMuYWdlbnQub3B0aW9uc1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjYXN0IGl0IHRvIGFueSBhbmQgY2hhbmdlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgICBwcm94eUFnZW50Lm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHByb3h5QWdlbnQub3B0aW9ucy5yZXF1ZXN0VGxzIHx8IHt9LCB7XG4gICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgfVxuICAgIF9wZXJmb3JtRXhwb25lbnRpYWxCYWNrb2ZmKHJldHJ5TnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXRyeU51bWJlciA9IE1hdGgubWluKEV4cG9uZW50aWFsQmFja29mZkNlaWxpbmcsIHJldHJ5TnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IG1zID0gRXhwb25lbnRpYWxCYWNrb2ZmVGltZVNsaWNlICogTWF0aC5wb3coMiwgcmV0cnlOdW1iZXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcHJvY2Vzc1Jlc3BvbnNlKHJlcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmVzLm1lc3NhZ2Uuc3RhdHVzQ29kZSB8fCAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBub3QgZm91bmQgbGVhZHMgdG8gbnVsbCBvYmogcmV0dXJuZWRcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gSHR0cENvZGVzLk5vdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHJlc3VsdCBmcm9tIHRoZSBib2R5XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZGF0ZVRpbWVEZXNlcmlhbGl6ZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oYS52YWx1ZU9mKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgb2JqO1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50cztcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50cyA9IHlpZWxkIHJlcy5yZWFkQm9keSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudHMgJiYgY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZXNlcmlhbGl6ZURhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShjb250ZW50cywgZGF0ZVRpbWVEZXNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShjb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bHQgPSBvYmo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHJlcy5tZXNzYWdlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCByZXNvdXJjZSAoY29udGVudHMgbm90IGpzb24pOyAgbGVhdmluZyByZXN1bHQgb2JqIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IDN4eCByZWRpcmVjdHMgYXJlIGhhbmRsZWQgYnkgdGhlIGh0dHAgbGF5ZXIuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPiAyOTkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZztcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgZXhjZXB0aW9uL2Vycm9yIGluIGJvZHksIGF0dGVtcHQgdG8gZ2V0IGJldHRlciBlcnJvclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqICYmIG9iai5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBvYmoubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250ZW50cyAmJiBjb250ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBtYXkgYmUgdGhlIGNhc2UgdGhhdCB0aGUgZXhjZXB0aW9uIGlzIGluIHRoZSBib2R5IG1lc3NhZ2UgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBjb250ZW50cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGBGYWlsZWQgcmVxdWVzdDogKCR7c3RhdHVzQ29kZX0pYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgSHR0cENsaWVudEVycm9yKG1zZywgc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGVyci5yZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBDbGllbnQgPSBIdHRwQ2xpZW50O1xuY29uc3QgbG93ZXJjYXNlS2V5cyA9IChvYmopID0+IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChjLCBrKSA9PiAoKGNbay50b0xvd2VyQ2FzZSgpXSA9IG9ialtrXSksIGMpLCB7fSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///40677\n')},78669:(__unused_webpack_module,exports)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.checkBypass = exports.getProxyUrl = void 0;\nfunction getProxyUrl(reqUrl) {\n const usingSsl = reqUrl.protocol === 'https:';\n if (checkBypass(reqUrl)) {\n return undefined;\n }\n const proxyVar = (() => {\n if (usingSsl) {\n return process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n return process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n })();\n if (proxyVar) {\n try {\n return new URL(proxyVar);\n }\n catch (_a) {\n if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))\n return new URL(`http://${proxyVar}`);\n }\n }\n else {\n return undefined;\n }\n}\nexports.getProxyUrl = getProxyUrl;\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n const reqHost = reqUrl.hostname;\n if (isLoopbackAddress(reqHost)) {\n return true;\n }\n const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n const upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (const upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperNoProxyItem === '*' ||\n upperReqHosts.some(x => x === upperNoProxyItem ||\n x.endsWith(`.${upperNoProxyItem}`) ||\n (upperNoProxyItem.startsWith('.') &&\n x.endsWith(`${upperNoProxyItem}`)))) {\n return true;\n }\n }\n return false;\n}\nexports.checkBypass = checkBypass;\nfunction isLoopbackAddress(host) {\n const hostLower = host.toLowerCase();\n return (hostLower === 'localhost' ||\n hostLower.startsWith('127.') ||\n hostLower.startsWith('[::1]') ||\n hostLower.startsWith('[0:0:0:0:0:0:0:1]'));\n}\n//# sourceMappingURL=proxy.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzg2NjkuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsbUJBQW1CLEdBQUcsbUJBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixpQkFBaUIsR0FBRyxRQUFRO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsaUJBQWlCO0FBQ2hEO0FBQ0Esa0NBQWtDLGlCQUFpQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9wcm94eS5qcz9kOWM4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jaGVja0J5cGFzcyA9IGV4cG9ydHMuZ2V0UHJveHlVcmwgPSB2b2lkIDA7XG5mdW5jdGlvbiBnZXRQcm94eVVybChyZXFVcmwpIHtcbiAgICBjb25zdCB1c2luZ1NzbCA9IHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgaWYgKGNoZWNrQnlwYXNzKHJlcVVybCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJveHlWYXIgPSAoKCkgPT4ge1xuICAgICAgICBpZiAodXNpbmdTc2wpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnaHR0cHNfcHJveHknXSB8fCBwcm9jZXNzLmVudlsnSFRUUFNfUFJPWFknXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnaHR0cF9wcm94eSddIHx8IHByb2Nlc3MuZW52WydIVFRQX1BST1hZJ107XG4gICAgICAgIH1cbiAgICB9KSgpO1xuICAgIGlmIChwcm94eVZhcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwocHJveHlWYXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgaWYgKCFwcm94eVZhci5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXByb3h5VmFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoYGh0dHA6Ly8ke3Byb3h5VmFyfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbmV4cG9ydHMuZ2V0UHJveHlVcmwgPSBnZXRQcm94eVVybDtcbmZ1bmN0aW9uIGNoZWNrQnlwYXNzKHJlcVVybCkge1xuICAgIGlmICghcmVxVXJsLmhvc3RuYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVxSG9zdCA9IHJlcVVybC5ob3N0bmFtZTtcbiAgICBpZiAoaXNMb29wYmFja0FkZHJlc3MocmVxSG9zdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG5vUHJveHkgPSBwcm9jZXNzLmVudlsnbm9fcHJveHknXSB8fCBwcm9jZXNzLmVudlsnTk9fUFJPWFknXSB8fCAnJztcbiAgICBpZiAoIW5vUHJveHkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHJlcXVlc3QgcG9ydFxuICAgIGxldCByZXFQb3J0O1xuICAgIGlmIChyZXFVcmwucG9ydCkge1xuICAgICAgICByZXFQb3J0ID0gTnVtYmVyKHJlcVVybC5wb3J0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVxVXJsLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgICAgIHJlcVBvcnQgPSA4MDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVxVXJsLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICByZXFQb3J0ID0gNDQzO1xuICAgIH1cbiAgICAvLyBGb3JtYXQgdGhlIHJlcXVlc3QgaG9zdG5hbWUgYW5kIGhvc3RuYW1lIHdpdGggcG9ydFxuICAgIGNvbnN0IHVwcGVyUmVxSG9zdHMgPSBbcmVxVXJsLmhvc3RuYW1lLnRvVXBwZXJDYXNlKCldO1xuICAgIGlmICh0eXBlb2YgcmVxUG9ydCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdXBwZXJSZXFIb3N0cy5wdXNoKGAke3VwcGVyUmVxSG9zdHNbMF19OiR7cmVxUG9ydH1gKTtcbiAgICB9XG4gICAgLy8gQ29tcGFyZSByZXF1ZXN0IGhvc3QgYWdhaW5zdCBub3Byb3h5XG4gICAgZm9yIChjb25zdCB1cHBlck5vUHJveHlJdGVtIG9mIG5vUHJveHlcbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcCh4ID0+IHgudHJpbSgpLnRvVXBwZXJDYXNlKCkpXG4gICAgICAgIC5maWx0ZXIoeCA9PiB4KSkge1xuICAgICAgICBpZiAodXBwZXJOb1Byb3h5SXRlbSA9PT0gJyonIHx8XG4gICAgICAgICAgICB1cHBlclJlcUhvc3RzLnNvbWUoeCA9PiB4ID09PSB1cHBlck5vUHJveHlJdGVtIHx8XG4gICAgICAgICAgICAgICAgeC5lbmRzV2l0aChgLiR7dXBwZXJOb1Byb3h5SXRlbX1gKSB8fFxuICAgICAgICAgICAgICAgICh1cHBlck5vUHJveHlJdGVtLnN0YXJ0c1dpdGgoJy4nKSAmJlxuICAgICAgICAgICAgICAgICAgICB4LmVuZHNXaXRoKGAke3VwcGVyTm9Qcm94eUl0ZW19YCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5jaGVja0J5cGFzcyA9IGNoZWNrQnlwYXNzO1xuZnVuY3Rpb24gaXNMb29wYmFja0FkZHJlc3MoaG9zdCkge1xuICAgIGNvbnN0IGhvc3RMb3dlciA9IGhvc3QudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKGhvc3RMb3dlciA9PT0gJ2xvY2FsaG9zdCcgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJzEyNy4nKSB8fFxuICAgICAgICBob3N0TG93ZXIuc3RhcnRzV2l0aCgnWzo6MV0nKSB8fFxuICAgICAgICBob3N0TG93ZXIuc3RhcnRzV2l0aCgnWzA6MDowOjA6MDowOjA6MV0nKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm94eS5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///78669\n")},58551:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n AccountSASPermissions: () => (/* reexport */ AccountSASPermissions),\n AccountSASResourceTypes: () => (/* reexport */ AccountSASResourceTypes),\n AccountSASServices: () => (/* reexport */ AccountSASServices),\n AnonymousCredential: () => (/* reexport */ AnonymousCredential),\n AnonymousCredentialPolicy: () => (/* reexport */ AnonymousCredentialPolicy),\n AppendBlobClient: () => (/* reexport */ AppendBlobClient),\n BaseRequestPolicy: () => (/* reexport */ BaseRequestPolicy),\n BlobBatch: () => (/* reexport */ BlobBatch),\n BlobBatchClient: () => (/* reexport */ BlobBatchClient),\n BlobClient: () => (/* reexport */ BlobClient),\n BlobLeaseClient: () => (/* reexport */ BlobLeaseClient),\n BlobSASPermissions: () => (/* reexport */ BlobSASPermissions),\n BlobServiceClient: () => (/* reexport */ BlobServiceClient),\n BlockBlobClient: () => (/* reexport */ BlockBlobClient),\n BlockBlobTier: () => (/* reexport */ BlockBlobTier),\n ContainerClient: () => (/* reexport */ ContainerClient),\n ContainerSASPermissions: () => (/* reexport */ ContainerSASPermissions),\n Credential: () => (/* reexport */ Credential),\n CredentialPolicy: () => (/* reexport */ CredentialPolicy),\n HttpHeaders: () => (/* reexport */ httpHeaders_HttpHeaders),\n KnownEncryptionAlgorithmType: () => (/* reexport */ KnownEncryptionAlgorithmType),\n PageBlobClient: () => (/* reexport */ PageBlobClient),\n Pipeline: () => (/* reexport */ Pipeline),\n PremiumPageBlobTier: () => (/* reexport */ PremiumPageBlobTier),\n RequestPolicyOptions: () => (/* reexport */ RequestPolicyOptions),\n RestError: () => (/* reexport */ RestError),\n SASProtocol: () => (/* reexport */ SASProtocol),\n SASQueryParameters: () => (/* reexport */ SASQueryParameters),\n StorageBlobAudience: () => (/* reexport */ StorageBlobAudience),\n StorageBrowserPolicy: () => (/* reexport */ StorageBrowserPolicy),\n StorageBrowserPolicyFactory: () => (/* reexport */ StorageBrowserPolicyFactory),\n StorageOAuthScopes: () => (/* reexport */ StorageOAuthScopes),\n StorageRetryPolicy: () => (/* reexport */ StorageRetryPolicy),\n StorageRetryPolicyFactory: () => (/* reexport */ StorageRetryPolicyFactory),\n StorageRetryPolicyType: () => (/* reexport */ StorageRetryPolicyType),\n StorageSharedKeyCredential: () => (/* reexport */ StorageSharedKeyCredential),\n StorageSharedKeyCredentialPolicy: () => (/* reexport */ StorageSharedKeyCredentialPolicy),\n WebResource: () => (/* reexport */ WebResource),\n deserializationPolicy: () => (/* reexport */ deserializationPolicy_deserializationPolicy),\n generateAccountSASQueryParameters: () => (/* reexport */ generateAccountSASQueryParameters),\n generateBlobSASQueryParameters: () => (/* reexport */ generateBlobSASQueryParameters),\n getBlobServiceAccountAudience: () => (/* reexport */ getBlobServiceAccountAudience),\n isPipelineLike: () => (/* reexport */ isPipelineLike),\n logger: () => (/* reexport */ logger),\n newPipeline: () => (/* reexport */ newPipeline)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/models/mappers.js\nvar mappers_namespaceObject = {};\n__webpack_require__.r(mappers_namespaceObject);\n__webpack_require__.d(mappers_namespaceObject, {\n AccessPolicy: () => (AccessPolicy),\n AppendBlobAppendBlockExceptionHeaders: () => (AppendBlobAppendBlockExceptionHeaders),\n AppendBlobAppendBlockFromUrlExceptionHeaders: () => (AppendBlobAppendBlockFromUrlExceptionHeaders),\n AppendBlobAppendBlockFromUrlHeaders: () => (AppendBlobAppendBlockFromUrlHeaders),\n AppendBlobAppendBlockHeaders: () => (AppendBlobAppendBlockHeaders),\n AppendBlobCreateExceptionHeaders: () => (AppendBlobCreateExceptionHeaders),\n AppendBlobCreateHeaders: () => (AppendBlobCreateHeaders),\n AppendBlobSealExceptionHeaders: () => (AppendBlobSealExceptionHeaders),\n AppendBlobSealHeaders: () => (AppendBlobSealHeaders),\n ArrowConfiguration: () => (ArrowConfiguration),\n ArrowField: () => (ArrowField),\n BlobAbortCopyFromURLExceptionHeaders: () => (BlobAbortCopyFromURLExceptionHeaders),\n BlobAbortCopyFromURLHeaders: () => (BlobAbortCopyFromURLHeaders),\n BlobAcquireLeaseExceptionHeaders: () => (BlobAcquireLeaseExceptionHeaders),\n BlobAcquireLeaseHeaders: () => (BlobAcquireLeaseHeaders),\n BlobBreakLeaseExceptionHeaders: () => (BlobBreakLeaseExceptionHeaders),\n BlobBreakLeaseHeaders: () => (BlobBreakLeaseHeaders),\n BlobChangeLeaseExceptionHeaders: () => (BlobChangeLeaseExceptionHeaders),\n BlobChangeLeaseHeaders: () => (BlobChangeLeaseHeaders),\n BlobCopyFromURLExceptionHeaders: () => (BlobCopyFromURLExceptionHeaders),\n BlobCopyFromURLHeaders: () => (BlobCopyFromURLHeaders),\n BlobCreateSnapshotExceptionHeaders: () => (BlobCreateSnapshotExceptionHeaders),\n BlobCreateSnapshotHeaders: () => (BlobCreateSnapshotHeaders),\n BlobDeleteExceptionHeaders: () => (BlobDeleteExceptionHeaders),\n BlobDeleteHeaders: () => (BlobDeleteHeaders),\n BlobDeleteImmutabilityPolicyExceptionHeaders: () => (BlobDeleteImmutabilityPolicyExceptionHeaders),\n BlobDeleteImmutabilityPolicyHeaders: () => (BlobDeleteImmutabilityPolicyHeaders),\n BlobDownloadExceptionHeaders: () => (BlobDownloadExceptionHeaders),\n BlobDownloadHeaders: () => (BlobDownloadHeaders),\n BlobFlatListSegment: () => (BlobFlatListSegment),\n BlobGetAccountInfoExceptionHeaders: () => (BlobGetAccountInfoExceptionHeaders),\n BlobGetAccountInfoHeaders: () => (BlobGetAccountInfoHeaders),\n BlobGetPropertiesExceptionHeaders: () => (BlobGetPropertiesExceptionHeaders),\n BlobGetPropertiesHeaders: () => (BlobGetPropertiesHeaders),\n BlobGetTagsExceptionHeaders: () => (BlobGetTagsExceptionHeaders),\n BlobGetTagsHeaders: () => (BlobGetTagsHeaders),\n BlobHierarchyListSegment: () => (BlobHierarchyListSegment),\n BlobItemInternal: () => (BlobItemInternal),\n BlobName: () => (BlobName),\n BlobPrefix: () => (BlobPrefix),\n BlobPropertiesInternal: () => (BlobPropertiesInternal),\n BlobQueryExceptionHeaders: () => (BlobQueryExceptionHeaders),\n BlobQueryHeaders: () => (BlobQueryHeaders),\n BlobReleaseLeaseExceptionHeaders: () => (BlobReleaseLeaseExceptionHeaders),\n BlobReleaseLeaseHeaders: () => (BlobReleaseLeaseHeaders),\n BlobRenewLeaseExceptionHeaders: () => (BlobRenewLeaseExceptionHeaders),\n BlobRenewLeaseHeaders: () => (BlobRenewLeaseHeaders),\n BlobServiceProperties: () => (BlobServiceProperties),\n BlobServiceStatistics: () => (BlobServiceStatistics),\n BlobSetExpiryExceptionHeaders: () => (BlobSetExpiryExceptionHeaders),\n BlobSetExpiryHeaders: () => (BlobSetExpiryHeaders),\n BlobSetHttpHeadersExceptionHeaders: () => (BlobSetHttpHeadersExceptionHeaders),\n BlobSetHttpHeadersHeaders: () => (BlobSetHttpHeadersHeaders),\n BlobSetImmutabilityPolicyExceptionHeaders: () => (BlobSetImmutabilityPolicyExceptionHeaders),\n BlobSetImmutabilityPolicyHeaders: () => (BlobSetImmutabilityPolicyHeaders),\n BlobSetLegalHoldExceptionHeaders: () => (BlobSetLegalHoldExceptionHeaders),\n BlobSetLegalHoldHeaders: () => (BlobSetLegalHoldHeaders),\n BlobSetMetadataExceptionHeaders: () => (BlobSetMetadataExceptionHeaders),\n BlobSetMetadataHeaders: () => (BlobSetMetadataHeaders),\n BlobSetTagsExceptionHeaders: () => (BlobSetTagsExceptionHeaders),\n BlobSetTagsHeaders: () => (BlobSetTagsHeaders),\n BlobSetTierExceptionHeaders: () => (BlobSetTierExceptionHeaders),\n BlobSetTierHeaders: () => (BlobSetTierHeaders),\n BlobStartCopyFromURLExceptionHeaders: () => (BlobStartCopyFromURLExceptionHeaders),\n BlobStartCopyFromURLHeaders: () => (BlobStartCopyFromURLHeaders),\n BlobTag: () => (BlobTag),\n BlobTags: () => (BlobTags),\n BlobUndeleteExceptionHeaders: () => (BlobUndeleteExceptionHeaders),\n BlobUndeleteHeaders: () => (BlobUndeleteHeaders),\n Block: () => (Block),\n BlockBlobCommitBlockListExceptionHeaders: () => (BlockBlobCommitBlockListExceptionHeaders),\n BlockBlobCommitBlockListHeaders: () => (BlockBlobCommitBlockListHeaders),\n BlockBlobGetBlockListExceptionHeaders: () => (BlockBlobGetBlockListExceptionHeaders),\n BlockBlobGetBlockListHeaders: () => (BlockBlobGetBlockListHeaders),\n BlockBlobPutBlobFromUrlExceptionHeaders: () => (BlockBlobPutBlobFromUrlExceptionHeaders),\n BlockBlobPutBlobFromUrlHeaders: () => (BlockBlobPutBlobFromUrlHeaders),\n BlockBlobStageBlockExceptionHeaders: () => (BlockBlobStageBlockExceptionHeaders),\n BlockBlobStageBlockFromURLExceptionHeaders: () => (BlockBlobStageBlockFromURLExceptionHeaders),\n BlockBlobStageBlockFromURLHeaders: () => (BlockBlobStageBlockFromURLHeaders),\n BlockBlobStageBlockHeaders: () => (BlockBlobStageBlockHeaders),\n BlockBlobUploadExceptionHeaders: () => (BlockBlobUploadExceptionHeaders),\n BlockBlobUploadHeaders: () => (BlockBlobUploadHeaders),\n BlockList: () => (BlockList),\n BlockLookupList: () => (BlockLookupList),\n ClearRange: () => (ClearRange),\n ContainerAcquireLeaseExceptionHeaders: () => (ContainerAcquireLeaseExceptionHeaders),\n ContainerAcquireLeaseHeaders: () => (ContainerAcquireLeaseHeaders),\n ContainerBreakLeaseExceptionHeaders: () => (ContainerBreakLeaseExceptionHeaders),\n ContainerBreakLeaseHeaders: () => (ContainerBreakLeaseHeaders),\n ContainerChangeLeaseExceptionHeaders: () => (ContainerChangeLeaseExceptionHeaders),\n ContainerChangeLeaseHeaders: () => (ContainerChangeLeaseHeaders),\n ContainerCreateExceptionHeaders: () => (ContainerCreateExceptionHeaders),\n ContainerCreateHeaders: () => (ContainerCreateHeaders),\n ContainerDeleteExceptionHeaders: () => (ContainerDeleteExceptionHeaders),\n ContainerDeleteHeaders: () => (ContainerDeleteHeaders),\n ContainerFilterBlobsExceptionHeaders: () => (ContainerFilterBlobsExceptionHeaders),\n ContainerFilterBlobsHeaders: () => (ContainerFilterBlobsHeaders),\n ContainerGetAccessPolicyExceptionHeaders: () => (ContainerGetAccessPolicyExceptionHeaders),\n ContainerGetAccessPolicyHeaders: () => (ContainerGetAccessPolicyHeaders),\n ContainerGetAccountInfoExceptionHeaders: () => (ContainerGetAccountInfoExceptionHeaders),\n ContainerGetAccountInfoHeaders: () => (ContainerGetAccountInfoHeaders),\n ContainerGetPropertiesExceptionHeaders: () => (ContainerGetPropertiesExceptionHeaders),\n ContainerGetPropertiesHeaders: () => (ContainerGetPropertiesHeaders),\n ContainerItem: () => (ContainerItem),\n ContainerListBlobFlatSegmentExceptionHeaders: () => (ContainerListBlobFlatSegmentExceptionHeaders),\n ContainerListBlobFlatSegmentHeaders: () => (ContainerListBlobFlatSegmentHeaders),\n ContainerListBlobHierarchySegmentExceptionHeaders: () => (ContainerListBlobHierarchySegmentExceptionHeaders),\n ContainerListBlobHierarchySegmentHeaders: () => (ContainerListBlobHierarchySegmentHeaders),\n ContainerProperties: () => (ContainerProperties),\n ContainerReleaseLeaseExceptionHeaders: () => (ContainerReleaseLeaseExceptionHeaders),\n ContainerReleaseLeaseHeaders: () => (ContainerReleaseLeaseHeaders),\n ContainerRenameExceptionHeaders: () => (ContainerRenameExceptionHeaders),\n ContainerRenameHeaders: () => (ContainerRenameHeaders),\n ContainerRenewLeaseExceptionHeaders: () => (ContainerRenewLeaseExceptionHeaders),\n ContainerRenewLeaseHeaders: () => (ContainerRenewLeaseHeaders),\n ContainerRestoreExceptionHeaders: () => (ContainerRestoreExceptionHeaders),\n ContainerRestoreHeaders: () => (ContainerRestoreHeaders),\n ContainerSetAccessPolicyExceptionHeaders: () => (ContainerSetAccessPolicyExceptionHeaders),\n ContainerSetAccessPolicyHeaders: () => (ContainerSetAccessPolicyHeaders),\n ContainerSetMetadataExceptionHeaders: () => (ContainerSetMetadataExceptionHeaders),\n ContainerSetMetadataHeaders: () => (ContainerSetMetadataHeaders),\n ContainerSubmitBatchExceptionHeaders: () => (ContainerSubmitBatchExceptionHeaders),\n ContainerSubmitBatchHeaders: () => (ContainerSubmitBatchHeaders),\n CorsRule: () => (CorsRule),\n DelimitedTextConfiguration: () => (DelimitedTextConfiguration),\n FilterBlobItem: () => (FilterBlobItem),\n FilterBlobSegment: () => (FilterBlobSegment),\n GeoReplication: () => (GeoReplication),\n JsonTextConfiguration: () => (JsonTextConfiguration),\n KeyInfo: () => (KeyInfo),\n ListBlobsFlatSegmentResponse: () => (ListBlobsFlatSegmentResponse),\n ListBlobsHierarchySegmentResponse: () => (ListBlobsHierarchySegmentResponse),\n ListContainersSegmentResponse: () => (ListContainersSegmentResponse),\n Logging: () => (Logging),\n Metrics: () => (Metrics),\n PageBlobClearPagesExceptionHeaders: () => (PageBlobClearPagesExceptionHeaders),\n PageBlobClearPagesHeaders: () => (PageBlobClearPagesHeaders),\n PageBlobCopyIncrementalExceptionHeaders: () => (PageBlobCopyIncrementalExceptionHeaders),\n PageBlobCopyIncrementalHeaders: () => (PageBlobCopyIncrementalHeaders),\n PageBlobCreateExceptionHeaders: () => (PageBlobCreateExceptionHeaders),\n PageBlobCreateHeaders: () => (PageBlobCreateHeaders),\n PageBlobGetPageRangesDiffExceptionHeaders: () => (PageBlobGetPageRangesDiffExceptionHeaders),\n PageBlobGetPageRangesDiffHeaders: () => (PageBlobGetPageRangesDiffHeaders),\n PageBlobGetPageRangesExceptionHeaders: () => (PageBlobGetPageRangesExceptionHeaders),\n PageBlobGetPageRangesHeaders: () => (PageBlobGetPageRangesHeaders),\n PageBlobResizeExceptionHeaders: () => (PageBlobResizeExceptionHeaders),\n PageBlobResizeHeaders: () => (PageBlobResizeHeaders),\n PageBlobUpdateSequenceNumberExceptionHeaders: () => (PageBlobUpdateSequenceNumberExceptionHeaders),\n PageBlobUpdateSequenceNumberHeaders: () => (PageBlobUpdateSequenceNumberHeaders),\n PageBlobUploadPagesExceptionHeaders: () => (PageBlobUploadPagesExceptionHeaders),\n PageBlobUploadPagesFromURLExceptionHeaders: () => (PageBlobUploadPagesFromURLExceptionHeaders),\n PageBlobUploadPagesFromURLHeaders: () => (PageBlobUploadPagesFromURLHeaders),\n PageBlobUploadPagesHeaders: () => (PageBlobUploadPagesHeaders),\n PageList: () => (PageList),\n PageRange: () => (PageRange),\n QueryFormat: () => (QueryFormat),\n QueryRequest: () => (QueryRequest),\n QuerySerialization: () => (QuerySerialization),\n RetentionPolicy: () => (RetentionPolicy),\n ServiceFilterBlobsExceptionHeaders: () => (ServiceFilterBlobsExceptionHeaders),\n ServiceFilterBlobsHeaders: () => (ServiceFilterBlobsHeaders),\n ServiceGetAccountInfoExceptionHeaders: () => (ServiceGetAccountInfoExceptionHeaders),\n ServiceGetAccountInfoHeaders: () => (ServiceGetAccountInfoHeaders),\n ServiceGetPropertiesExceptionHeaders: () => (ServiceGetPropertiesExceptionHeaders),\n ServiceGetPropertiesHeaders: () => (ServiceGetPropertiesHeaders),\n ServiceGetStatisticsExceptionHeaders: () => (ServiceGetStatisticsExceptionHeaders),\n ServiceGetStatisticsHeaders: () => (ServiceGetStatisticsHeaders),\n ServiceGetUserDelegationKeyExceptionHeaders: () => (ServiceGetUserDelegationKeyExceptionHeaders),\n ServiceGetUserDelegationKeyHeaders: () => (ServiceGetUserDelegationKeyHeaders),\n ServiceListContainersSegmentExceptionHeaders: () => (ServiceListContainersSegmentExceptionHeaders),\n ServiceListContainersSegmentHeaders: () => (ServiceListContainersSegmentHeaders),\n ServiceSetPropertiesExceptionHeaders: () => (ServiceSetPropertiesExceptionHeaders),\n ServiceSetPropertiesHeaders: () => (ServiceSetPropertiesHeaders),\n ServiceSubmitBatchExceptionHeaders: () => (ServiceSubmitBatchExceptionHeaders),\n ServiceSubmitBatchHeaders: () => (ServiceSubmitBatchHeaders),\n SignedIdentifier: () => (SignedIdentifier),\n StaticWebsite: () => (StaticWebsite),\n StorageError: () => (StorageError),\n UserDelegationKey: () => (UserDelegationKey)\n});\n\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/serializer.common.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Default key used to access the XML attributes.\n */\nconst XML_ATTRKEY = "$";\n/**\n * Default key used to access the XML value content.\n */\nconst XML_CHARKEY = "_";\n//# sourceMappingURL=serializer.common.js.map\n// EXTERNAL MODULE: ./node_modules/uuid/dist/esm-node/v4.js\nvar v4 = __webpack_require__(66394);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/utils.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nconst validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;\n/**\n * Checks if a parsed URL is HTTPS\n *\n * @param urlToCheck - The url to check\n * @returns True if the URL is HTTPS; false otherwise.\n */\nfunction urlIsHTTPS(urlToCheck) {\n return urlToCheck.protocol.toLowerCase() === Constants.HTTPS;\n}\n/**\n * Encodes an URI.\n *\n * @param uri - The URI to be encoded.\n * @returns The encoded URI.\n */\nfunction encodeUri(uri) {\n return encodeURIComponent(uri)\n .replace(/!/g, "%21")\n .replace(/"/g, "%27")\n .replace(/\\(/g, "%28")\n .replace(/\\)/g, "%29")\n .replace(/\\*/g, "%2A");\n}\n/**\n * Returns a stripped version of the Http Response which only contains body,\n * headers and the status.\n *\n * @param response - The Http Response\n * @returns The stripped version of Http Response.\n */\nfunction stripResponse(response) {\n const strippedResponse = {};\n strippedResponse.body = response.bodyAsText;\n strippedResponse.headers = response.headers;\n strippedResponse.status = response.status;\n return strippedResponse;\n}\n/**\n * Returns a stripped version of the Http Request that does not contain the\n * Authorization header.\n *\n * @param request - The Http Request object\n * @returns The stripped version of Http Request.\n */\nfunction stripRequest(request) {\n const strippedRequest = request.clone();\n if (strippedRequest.headers) {\n strippedRequest.headers.remove("authorization");\n }\n return strippedRequest;\n}\n/**\n * Validates the given uuid as a string\n *\n * @param uuid - The uuid as a string that needs to be validated\n * @returns True if the uuid is valid; false otherwise.\n */\nfunction isValidUuid(uuid) {\n return validUuidRegex.test(uuid);\n}\n/**\n * Generated UUID\n *\n * @returns RFC4122 v4 UUID.\n */\nfunction generateUuid() {\n return (0,v4/* default */.A)();\n}\n/**\n * Executes an array of promises sequentially. Inspiration of this method is here:\n * https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html. An awesome blog on promises!\n *\n * @param promiseFactories - An array of promise factories(A function that return a promise)\n * @param kickstart - Input to the first promise that is used to kickstart the promise chain.\n * If not provided then the promise chain starts with undefined.\n * @returns A chain of resolved or rejected promises\n */\nfunction executePromisesSequentially(promiseFactories, kickstart) {\n let result = Promise.resolve(kickstart);\n promiseFactories.forEach((promiseFactory) => {\n result = result.then(promiseFactory);\n });\n return result;\n}\n/**\n * Converts a Promise to a callback.\n * @param promise - The Promise to be converted to a callback\n * @returns A function that takes the callback `(cb: Function) => void`\n * @deprecated generated code should instead depend on responseToBody\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction promiseToCallback(promise) {\n if (typeof promise.then !== "function") {\n throw new Error("The provided input is not a Promise.");\n }\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (cb) => {\n promise\n .then((data) => {\n // eslint-disable-next-line promise/no-callback-in-promise\n return cb(undefined, data);\n })\n .catch((err) => {\n // eslint-disable-next-line promise/no-callback-in-promise\n cb(err);\n });\n };\n}\n/**\n * Converts a Promise to a service callback.\n * @param promise - The Promise of HttpOperationResponse to be converted to a service callback\n * @returns A function that takes the service callback (cb: ServiceCallback): void\n */\nfunction promiseToServiceCallback(promise) {\n if (typeof promise.then !== "function") {\n throw new Error("The provided input is not a Promise.");\n }\n return (cb) => {\n promise\n .then((data) => {\n return process.nextTick(cb, undefined, data.parsedBody, data.request, data);\n })\n .catch((err) => {\n process.nextTick(cb, err);\n });\n };\n}\nfunction prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {\n if (!Array.isArray(obj)) {\n obj = [obj];\n }\n if (!xmlNamespaceKey || !xmlNamespace) {\n return { [elementName]: obj };\n }\n const result = { [elementName]: obj };\n result[XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };\n return result;\n}\n/**\n * Applies the properties on the prototype of sourceCtors to the prototype of targetCtor\n * @param targetCtor - The target object on which the properties need to be applied.\n * @param sourceCtors - An array of source objects from which the properties need to be taken.\n */\nfunction applyMixins(targetCtorParam, sourceCtors) {\n const castTargetCtorParam = targetCtorParam;\n sourceCtors.forEach((sourceCtor) => {\n Object.getOwnPropertyNames(sourceCtor.prototype).forEach((name) => {\n castTargetCtorParam.prototype[name] = sourceCtor.prototype[name];\n });\n });\n}\nconst validateISODuration = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n/**\n * Indicates whether the given string is in ISO 8601 format.\n * @param value - The value to be validated for ISO 8601 duration format.\n * @returns `true` if valid, `false` otherwise.\n */\nfunction isDuration(value) {\n return validateISODuration.test(value);\n}\n/**\n * Replace all of the instances of searchValue in value with the provided replaceValue.\n * @param value - The value to search and replace in.\n * @param searchValue - The value to search for in the value argument.\n * @param replaceValue - The value to replace searchValue with in the value argument.\n * @returns The value where each instance of searchValue was replaced with replacedValue.\n */\nfunction replaceAll(value, searchValue, replaceValue) {\n return !value || !searchValue ? value : value.split(searchValue).join(replaceValue || "");\n}\n/**\n * Determines whether the given entity is a basic/primitive type\n * (string, number, boolean, null, undefined).\n * @param value - Any entity\n * @returns true is it is primitive type, false otherwise.\n */\nfunction isPrimitiveType(value) {\n return (typeof value !== "object" && typeof value !== "function") || value === null;\n}\nfunction getEnvironmentValue(name) {\n if (process.env[name]) {\n return process.env[name];\n }\n else if (process.env[name.toLowerCase()]) {\n return process.env[name.toLowerCase()];\n }\n return undefined;\n}\n/**\n * @internal\n * @returns true when input is an object type that is not null, Array, RegExp, or Date.\n */\nfunction isObject(input) {\n return (typeof input === "object" &&\n input !== null &&\n !Array.isArray(input) &&\n !(input instanceof RegExp) &&\n !(input instanceof Date));\n}\n//# sourceMappingURL=utils.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/url.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * A class that handles the query portion of a URLBuilder.\n */\nclass URLQuery {\n constructor() {\n this._rawQuery = {};\n }\n /**\n * Get whether or not there any query parameters in this URLQuery.\n */\n any() {\n return Object.keys(this._rawQuery).length > 0;\n }\n /**\n * Get the keys of the query string.\n */\n keys() {\n return Object.keys(this._rawQuery);\n }\n /**\n * Set a query parameter with the provided name and value. If the parameterValue is undefined or\n * empty, then this will attempt to remove an existing query parameter with the provided\n * parameterName.\n */\n set(parameterName, parameterValue) {\n const caseParameterValue = parameterValue;\n if (parameterName) {\n if (caseParameterValue !== undefined && caseParameterValue !== null) {\n const newValue = Array.isArray(caseParameterValue)\n ? caseParameterValue\n : caseParameterValue.toString();\n this._rawQuery[parameterName] = newValue;\n }\n else {\n delete this._rawQuery[parameterName];\n }\n }\n }\n /**\n * Get the value of the query parameter with the provided name. If no parameter exists with the\n * provided parameter name, then undefined will be returned.\n */\n get(parameterName) {\n return parameterName ? this._rawQuery[parameterName] : undefined;\n }\n /**\n * Get the string representation of this query. The return value will not start with a "?".\n */\n toString() {\n let result = "";\n for (const parameterName in this._rawQuery) {\n if (result) {\n result += "&";\n }\n const parameterValue = this._rawQuery[parameterName];\n if (Array.isArray(parameterValue)) {\n const parameterStrings = [];\n for (const parameterValueElement of parameterValue) {\n parameterStrings.push(`${parameterName}=${parameterValueElement}`);\n }\n result += parameterStrings.join("&");\n }\n else {\n result += `${parameterName}=${parameterValue}`;\n }\n }\n return result;\n }\n /**\n * Parse a URLQuery from the provided text.\n */\n static parse(text) {\n const result = new URLQuery();\n if (text) {\n if (text.startsWith("?")) {\n text = text.substring(1);\n }\n let currentState = "ParameterName";\n let parameterName = "";\n let parameterValue = "";\n for (let i = 0; i < text.length; ++i) {\n const currentCharacter = text[i];\n switch (currentState) {\n case "ParameterName":\n switch (currentCharacter) {\n case "=":\n currentState = "ParameterValue";\n break;\n case "&":\n parameterName = "";\n parameterValue = "";\n break;\n default:\n parameterName += currentCharacter;\n break;\n }\n break;\n case "ParameterValue":\n switch (currentCharacter) {\n case "&":\n result.set(parameterName, parameterValue);\n parameterName = "";\n parameterValue = "";\n currentState = "ParameterName";\n break;\n default:\n parameterValue += currentCharacter;\n break;\n }\n break;\n default:\n throw new Error("Unrecognized URLQuery parse state: " + currentState);\n }\n }\n if (currentState === "ParameterValue") {\n result.set(parameterName, parameterValue);\n }\n }\n return result;\n }\n}\n/**\n * A class that handles creating, modifying, and parsing URLs.\n */\nclass URLBuilder {\n /**\n * Set the scheme/protocol for this URL. If the provided scheme contains other parts of a URL\n * (such as a host, port, path, or query), those parts will be added to this URL as well.\n */\n setScheme(scheme) {\n if (!scheme) {\n this._scheme = undefined;\n }\n else {\n this.set(scheme, "SCHEME");\n }\n }\n /**\n * Get the scheme that has been set in this URL.\n */\n getScheme() {\n return this._scheme;\n }\n /**\n * Set the host for this URL. If the provided host contains other parts of a URL (such as a\n * port, path, or query), those parts will be added to this URL as well.\n */\n setHost(host) {\n if (!host) {\n this._host = undefined;\n }\n else {\n this.set(host, "SCHEME_OR_HOST");\n }\n }\n /**\n * Get the host that has been set in this URL.\n */\n getHost() {\n return this._host;\n }\n /**\n * Set the port for this URL. If the provided port contains other parts of a URL (such as a\n * path or query), those parts will be added to this URL as well.\n */\n setPort(port) {\n if (port === undefined || port === null || port === "") {\n this._port = undefined;\n }\n else {\n this.set(port.toString(), "PORT");\n }\n }\n /**\n * Get the port that has been set in this URL.\n */\n getPort() {\n return this._port;\n }\n /**\n * Set the path for this URL. If the provided path contains a query, then it will be added to\n * this URL as well.\n */\n setPath(path) {\n if (!path) {\n this._path = undefined;\n }\n else {\n const schemeIndex = path.indexOf("://");\n if (schemeIndex !== -1) {\n const schemeStart = path.lastIndexOf("/", schemeIndex);\n // Make sure to only grab the URL part of the path before setting the state back to SCHEME\n // this will handle cases such as "/a/b/c/https://microsoft.com" => "https://microsoft.com"\n this.set(schemeStart === -1 ? path : path.substr(schemeStart + 1), "SCHEME");\n }\n else {\n this.set(path, "PATH");\n }\n }\n }\n /**\n * Append the provided path to this URL\'s existing path. If the provided path contains a query,\n * then it will be added to this URL as well.\n */\n appendPath(path) {\n if (path) {\n let currentPath = this.getPath();\n if (currentPath) {\n if (!currentPath.endsWith("/")) {\n currentPath += "/";\n }\n if (path.startsWith("/")) {\n path = path.substring(1);\n }\n path = currentPath + path;\n }\n this.set(path, "PATH");\n }\n }\n /**\n * Get the path that has been set in this URL.\n */\n getPath() {\n return this._path;\n }\n /**\n * Set the query in this URL.\n */\n setQuery(query) {\n if (!query) {\n this._query = undefined;\n }\n else {\n this._query = URLQuery.parse(query);\n }\n }\n /**\n * Set a query parameter with the provided name and value in this URL\'s query. If the provided\n * query parameter value is undefined or empty, then the query parameter will be removed if it\n * existed.\n */\n setQueryParameter(queryParameterName, queryParameterValue) {\n if (queryParameterName) {\n if (!this._query) {\n this._query = new URLQuery();\n }\n this._query.set(queryParameterName, queryParameterValue);\n }\n }\n /**\n * Get the value of the query parameter with the provided query parameter name. If no query\n * parameter exists with the provided name, then undefined will be returned.\n */\n getQueryParameterValue(queryParameterName) {\n return this._query ? this._query.get(queryParameterName) : undefined;\n }\n /**\n * Get the query in this URL.\n */\n getQuery() {\n return this._query ? this._query.toString() : undefined;\n }\n /**\n * Set the parts of this URL by parsing the provided text using the provided startState.\n */\n set(text, startState) {\n const tokenizer = new URLTokenizer(text, startState);\n while (tokenizer.next()) {\n const token = tokenizer.current();\n let tokenPath;\n if (token) {\n switch (token.type) {\n case "SCHEME":\n this._scheme = token.text || undefined;\n break;\n case "HOST":\n this._host = token.text || undefined;\n break;\n case "PORT":\n this._port = token.text || undefined;\n break;\n case "PATH":\n tokenPath = token.text || undefined;\n if (!this._path || this._path === "/" || tokenPath !== "/") {\n this._path = tokenPath;\n }\n break;\n case "QUERY":\n this._query = URLQuery.parse(token.text);\n break;\n default:\n throw new Error(`Unrecognized URLTokenType: ${token.type}`);\n }\n }\n }\n }\n /**\n * Serializes the URL as a string.\n * @returns the URL as a string.\n */\n toString() {\n let result = "";\n if (this._scheme) {\n result += `${this._scheme}://`;\n }\n if (this._host) {\n result += this._host;\n }\n if (this._port) {\n result += `:${this._port}`;\n }\n if (this._path) {\n if (!this._path.startsWith("/")) {\n result += "/";\n }\n result += this._path;\n }\n if (this._query && this._query.any()) {\n result += `?${this._query.toString()}`;\n }\n return result;\n }\n /**\n * If the provided searchValue is found in this URLBuilder, then replace it with the provided\n * replaceValue.\n */\n replaceAll(searchValue, replaceValue) {\n if (searchValue) {\n this.setScheme(replaceAll(this.getScheme(), searchValue, replaceValue));\n this.setHost(replaceAll(this.getHost(), searchValue, replaceValue));\n this.setPort(replaceAll(this.getPort(), searchValue, replaceValue));\n this.setPath(replaceAll(this.getPath(), searchValue, replaceValue));\n this.setQuery(replaceAll(this.getQuery(), searchValue, replaceValue));\n }\n }\n /**\n * Parses a given string URL into a new {@link URLBuilder}.\n */\n static parse(text) {\n const result = new URLBuilder();\n result.set(text, "SCHEME_OR_HOST");\n return result;\n }\n}\nclass URLToken {\n constructor(text, type) {\n this.text = text;\n this.type = type;\n }\n static scheme(text) {\n return new URLToken(text, "SCHEME");\n }\n static host(text) {\n return new URLToken(text, "HOST");\n }\n static port(text) {\n return new URLToken(text, "PORT");\n }\n static path(text) {\n return new URLToken(text, "PATH");\n }\n static query(text) {\n return new URLToken(text, "QUERY");\n }\n}\n/**\n * Get whether or not the provided character (single character string) is an alphanumeric (letter or\n * digit) character.\n */\nfunction isAlphaNumericCharacter(character) {\n const characterCode = character.charCodeAt(0);\n return ((48 /* \'0\' */ <= characterCode && characterCode <= 57) /* \'9\' */ ||\n (65 /* \'A\' */ <= characterCode && characterCode <= 90) /* \'Z\' */ ||\n (97 /* \'a\' */ <= characterCode && characterCode <= 122) /* \'z\' */);\n}\n/**\n * A class that tokenizes URL strings.\n */\nclass URLTokenizer {\n constructor(_text, state) {\n this._text = _text;\n this._textLength = _text ? _text.length : 0;\n this._currentState = state !== undefined && state !== null ? state : "SCHEME_OR_HOST";\n this._currentIndex = 0;\n }\n /**\n * Get the current URLToken this URLTokenizer is pointing at, or undefined if the URLTokenizer\n * hasn\'t started or has finished tokenizing.\n */\n current() {\n return this._currentToken;\n }\n /**\n * Advance to the next URLToken and return whether or not a URLToken was found.\n */\n next() {\n if (!hasCurrentCharacter(this)) {\n this._currentToken = undefined;\n }\n else {\n switch (this._currentState) {\n case "SCHEME":\n nextScheme(this);\n break;\n case "SCHEME_OR_HOST":\n nextSchemeOrHost(this);\n break;\n case "HOST":\n nextHost(this);\n break;\n case "PORT":\n nextPort(this);\n break;\n case "PATH":\n nextPath(this);\n break;\n case "QUERY":\n nextQuery(this);\n break;\n default:\n throw new Error(`Unrecognized URLTokenizerState: ${this._currentState}`);\n }\n }\n return !!this._currentToken;\n }\n}\n/**\n * Read the remaining characters from this Tokenizer\'s character stream.\n */\nfunction readRemaining(tokenizer) {\n let result = "";\n if (tokenizer._currentIndex < tokenizer._textLength) {\n result = tokenizer._text.substring(tokenizer._currentIndex);\n tokenizer._currentIndex = tokenizer._textLength;\n }\n return result;\n}\n/**\n * Whether or not this URLTokenizer has a current character.\n */\nfunction hasCurrentCharacter(tokenizer) {\n return tokenizer._currentIndex < tokenizer._textLength;\n}\n/**\n * Get the character in the text string at the current index.\n */\nfunction getCurrentCharacter(tokenizer) {\n return tokenizer._text[tokenizer._currentIndex];\n}\n/**\n * Advance to the character in text that is "step" characters ahead. If no step value is provided,\n * then step will default to 1.\n */\nfunction nextCharacter(tokenizer, step) {\n if (hasCurrentCharacter(tokenizer)) {\n if (!step) {\n step = 1;\n }\n tokenizer._currentIndex += step;\n }\n}\n/**\n * Starting with the current character, peek "charactersToPeek" number of characters ahead in this\n * Tokenizer\'s stream of characters.\n */\nfunction peekCharacters(tokenizer, charactersToPeek) {\n let endIndex = tokenizer._currentIndex + charactersToPeek;\n if (tokenizer._textLength < endIndex) {\n endIndex = tokenizer._textLength;\n }\n return tokenizer._text.substring(tokenizer._currentIndex, endIndex);\n}\n/**\n * Read characters from this Tokenizer until the end of the stream or until the provided condition\n * is false when provided the current character.\n */\nfunction readWhile(tokenizer, condition) {\n let result = "";\n while (hasCurrentCharacter(tokenizer)) {\n const currentCharacter = getCurrentCharacter(tokenizer);\n if (!condition(currentCharacter)) {\n break;\n }\n else {\n result += currentCharacter;\n nextCharacter(tokenizer);\n }\n }\n return result;\n}\n/**\n * Read characters from this Tokenizer until a non-alphanumeric character or the end of the\n * character stream is reached.\n */\nfunction readWhileLetterOrDigit(tokenizer) {\n return readWhile(tokenizer, (character) => isAlphaNumericCharacter(character));\n}\n/**\n * Read characters from this Tokenizer until one of the provided terminating characters is read or\n * the end of the character stream is reached.\n */\nfunction readUntilCharacter(tokenizer, ...terminatingCharacters) {\n return readWhile(tokenizer, (character) => terminatingCharacters.indexOf(character) === -1);\n}\nfunction nextScheme(tokenizer) {\n const scheme = readWhileLetterOrDigit(tokenizer);\n tokenizer._currentToken = URLToken.scheme(scheme);\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentState = "DONE";\n }\n else {\n tokenizer._currentState = "HOST";\n }\n}\nfunction nextSchemeOrHost(tokenizer) {\n const schemeOrHost = readUntilCharacter(tokenizer, ":", "/", "?");\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentToken = URLToken.host(schemeOrHost);\n tokenizer._currentState = "DONE";\n }\n else if (getCurrentCharacter(tokenizer) === ":") {\n if (peekCharacters(tokenizer, 3) === "://") {\n tokenizer._currentToken = URLToken.scheme(schemeOrHost);\n tokenizer._currentState = "HOST";\n }\n else {\n tokenizer._currentToken = URLToken.host(schemeOrHost);\n tokenizer._currentState = "PORT";\n }\n }\n else {\n tokenizer._currentToken = URLToken.host(schemeOrHost);\n if (getCurrentCharacter(tokenizer) === "/") {\n tokenizer._currentState = "PATH";\n }\n else {\n tokenizer._currentState = "QUERY";\n }\n }\n}\nfunction nextHost(tokenizer) {\n if (peekCharacters(tokenizer, 3) === "://") {\n nextCharacter(tokenizer, 3);\n }\n const host = readUntilCharacter(tokenizer, ":", "/", "?");\n tokenizer._currentToken = URLToken.host(host);\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentState = "DONE";\n }\n else if (getCurrentCharacter(tokenizer) === ":") {\n tokenizer._currentState = "PORT";\n }\n else if (getCurrentCharacter(tokenizer) === "/") {\n tokenizer._currentState = "PATH";\n }\n else {\n tokenizer._currentState = "QUERY";\n }\n}\nfunction nextPort(tokenizer) {\n if (getCurrentCharacter(tokenizer) === ":") {\n nextCharacter(tokenizer);\n }\n const port = readUntilCharacter(tokenizer, "/", "?");\n tokenizer._currentToken = URLToken.port(port);\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentState = "DONE";\n }\n else if (getCurrentCharacter(tokenizer) === "/") {\n tokenizer._currentState = "PATH";\n }\n else {\n tokenizer._currentState = "QUERY";\n }\n}\nfunction nextPath(tokenizer) {\n const path = readUntilCharacter(tokenizer, "?");\n tokenizer._currentToken = URLToken.path(path);\n if (!hasCurrentCharacter(tokenizer)) {\n tokenizer._currentState = "DONE";\n }\n else {\n tokenizer._currentState = "QUERY";\n }\n}\nfunction nextQuery(tokenizer) {\n if (getCurrentCharacter(tokenizer) === "?") {\n nextCharacter(tokenizer);\n }\n const query = readRemaining(tokenizer);\n tokenizer._currentToken = URLToken.query(query);\n tokenizer._currentState = "DONE";\n}\n//# sourceMappingURL=url.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/sanitizer.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nconst RedactedString = "REDACTED";\nconst defaultAllowedHeaderNames = [\n "x-ms-client-request-id",\n "x-ms-return-client-request-id",\n "x-ms-useragent",\n "x-ms-correlation-request-id",\n "x-ms-request-id",\n "client-request-id",\n "ms-cv",\n "return-client-request-id",\n "traceparent",\n "Access-Control-Allow-Credentials",\n "Access-Control-Allow-Headers",\n "Access-Control-Allow-Methods",\n "Access-Control-Allow-Origin",\n "Access-Control-Expose-Headers",\n "Access-Control-Max-Age",\n "Access-Control-Request-Headers",\n "Access-Control-Request-Method",\n "Origin",\n "Accept",\n "Accept-Encoding",\n "Cache-Control",\n "Connection",\n "Content-Length",\n "Content-Type",\n "Date",\n "ETag",\n "Expires",\n "If-Match",\n "If-Modified-Since",\n "If-None-Match",\n "If-Unmodified-Since",\n "Last-Modified",\n "Pragma",\n "Request-Id",\n "Retry-After",\n "Server",\n "Transfer-Encoding",\n "User-Agent",\n "WWW-Authenticate",\n];\nconst defaultAllowedQueryParameters = ["api-version"];\nclass Sanitizer {\n constructor({ allowedHeaderNames = [], allowedQueryParameters = [] } = {}) {\n allowedHeaderNames = Array.isArray(allowedHeaderNames)\n ? defaultAllowedHeaderNames.concat(allowedHeaderNames)\n : defaultAllowedHeaderNames;\n allowedQueryParameters = Array.isArray(allowedQueryParameters)\n ? defaultAllowedQueryParameters.concat(allowedQueryParameters)\n : defaultAllowedQueryParameters;\n this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));\n this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));\n }\n sanitize(obj) {\n const seen = new Set();\n return JSON.stringify(obj, (key, value) => {\n // Ensure Errors include their interesting non-enumerable members\n if (value instanceof Error) {\n return Object.assign(Object.assign({}, value), { name: value.name, message: value.message });\n }\n if (key === "_headersMap") {\n return this.sanitizeHeaders(value);\n }\n else if (key === "url") {\n return this.sanitizeUrl(value);\n }\n else if (key === "query") {\n return this.sanitizeQuery(value);\n }\n else if (key === "body") {\n // Don\'t log the request body\n return undefined;\n }\n else if (key === "response") {\n // Don\'t log response again\n return undefined;\n }\n else if (key === "operationSpec") {\n // When using sendOperationRequest, the request carries a massive\n // field with the autorest spec. No need to log it.\n return undefined;\n }\n else if (Array.isArray(value) || isObject(value)) {\n if (seen.has(value)) {\n return "[Circular]";\n }\n seen.add(value);\n }\n return value;\n }, 2);\n }\n sanitizeHeaders(value) {\n return this.sanitizeObject(value, this.allowedHeaderNames, (v, k) => v[k].value);\n }\n sanitizeQuery(value) {\n return this.sanitizeObject(value, this.allowedQueryParameters, (v, k) => v[k]);\n }\n sanitizeObject(value, allowedKeys, accessor) {\n if (typeof value !== "object" || value === null) {\n return value;\n }\n const sanitized = {};\n for (const k of Object.keys(value)) {\n if (allowedKeys.has(k.toLowerCase())) {\n sanitized[k] = accessor(value, k);\n }\n else {\n sanitized[k] = RedactedString;\n }\n }\n return sanitized;\n }\n sanitizeUrl(value) {\n if (typeof value !== "string" || value === null) {\n return value;\n }\n const urlBuilder = URLBuilder.parse(value);\n const queryString = urlBuilder.getQuery();\n if (!queryString) {\n return value;\n }\n const query = URLQuery.parse(queryString);\n for (const k of query.keys()) {\n if (!this.allowedQueryParameters.has(k.toLowerCase())) {\n query.set(k, RedactedString);\n }\n }\n urlBuilder.setQuery(query.toString());\n return urlBuilder.toString();\n }\n}\n//# sourceMappingURL=sanitizer.js.map\n// EXTERNAL MODULE: external "util"\nvar external_util_ = __webpack_require__(39023);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/inspect.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst custom = external_util_.inspect.custom;\n//# sourceMappingURL=inspect.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/restError.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nconst errorSanitizer = new Sanitizer();\n/**\n * An error resulting from an HTTP request to a service endpoint.\n */\nclass RestError extends Error {\n constructor(message, code, statusCode, request, response) {\n super(message);\n this.name = "RestError";\n this.code = code;\n this.statusCode = statusCode;\n this.request = request;\n this.response = response;\n Object.setPrototypeOf(this, RestError.prototype);\n }\n /**\n * Logging method for util.inspect in Node\n */\n [custom]() {\n return `RestError: ${this.message} \\n ${errorSanitizer.sanitize(this)}`;\n }\n}\n/**\n * A constant string to identify errors that may arise when making an HTTP request that indicates an issue with the transport layer (e.g. the hostname of the URL cannot be resolved via DNS.)\n */\nRestError.REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";\n/**\n * A constant string to identify errors that may arise from parsing an incoming HTTP response. Usually indicates a malformed HTTP body, such as an encoded JSON payload that is incomplete.\n */\nRestError.PARSE_ERROR = "PARSE_ERROR";\n//# sourceMappingURL=restError.js.map\n;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.mjs\n/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nfunction __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nfunction __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nfunction __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }\n var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";\n var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === "accessor") {\n if (result === void 0) continue;\n if (result === null || typeof result !== "object") throw new TypeError("Object expected");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === "field") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nfunction __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nfunction __propKey(x) {\n return typeof x === "symbol" ? x : "".concat(x);\n};\n\nfunction __setFunctionName(f, name, prefix) {\n if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";\n return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });\n};\n\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nfunction __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nvar __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nfunction __exportStar(m, o) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nfunction __values(o) {\n var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === "number") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\n}\n\nfunction __read(o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume("next", value); }\n function reject(value) { resume("throw", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n};\n\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nfunction __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\n return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === "m") throw new TypeError("Private method is not writable");\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\n return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nfunction __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use \'in\' operator on non-object");\n return typeof state === "function" ? receiver === state : state.has(receiver);\n}\n\nfunction __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");\n var dispose;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");\n dispose = value[Symbol.dispose];\n }\n if (typeof dispose !== "function") throw new TypeError("Object not disposable.");\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;\n};\n\nfunction __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;\n env.hasError = true;\n }\n function next() {\n while (env.stack.length) {\n var rec = env.stack.pop();\n try {\n var result = rec.dispose && rec.dispose.call(rec.value);\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n catch (e) {\n fail(e);\n }\n }\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\n/* harmony default export */ const tslib_es6 = ({\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n});\n\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/node_modules/@azure/abort-controller/dist/esm/AbortError.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * This error is thrown when an asynchronous operation has been aborted.\n * Check for this error by testing the `name` that the name property of the\n * error matches `"AbortError"`.\n *\n * @example\n * ```ts\n * const controller = new AbortController();\n * controller.abort();\n * try {\n * doAsyncWork(controller.signal)\n * } catch (e) {\n * if (e.name === \'AbortError\') {\n * // handle abort error here.\n * }\n * }\n * ```\n */\nclass AbortError extends Error {\n constructor(message) {\n super(message);\n this.name = "AbortError";\n }\n}\n//# sourceMappingURL=AbortError.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/node_modules/@azure/abort-controller/dist/esm/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/createAbortablePromise.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Creates an abortable promise.\n * @param buildPromise - A function that takes the resolve and reject functions as parameters.\n * @param options - The options for the abortable promise.\n * @returns A promise that can be aborted.\n */\nfunction createAbortablePromise(buildPromise, options) {\n const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options !== null && options !== void 0 ? options : {};\n return new Promise((resolve, reject) => {\n function rejectOnAbort() {\n reject(new AbortError(abortErrorMsg !== null && abortErrorMsg !== void 0 ? abortErrorMsg : "The operation was aborted."));\n }\n function removeListeners() {\n abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.removeEventListener("abort", onAbort);\n }\n function onAbort() {\n cleanupBeforeAbort === null || cleanupBeforeAbort === void 0 ? void 0 : cleanupBeforeAbort();\n removeListeners();\n rejectOnAbort();\n }\n if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {\n return rejectOnAbort();\n }\n try {\n buildPromise((x) => {\n removeListeners();\n resolve(x);\n }, (x) => {\n removeListeners();\n reject(x);\n });\n }\n catch (err) {\n reject(err);\n }\n abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.addEventListener("abort", onAbort);\n });\n}\n//# sourceMappingURL=createAbortablePromise.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/delay.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst StandardAbortMessage = "The delay was aborted.";\n/**\n * A wrapper for setTimeout that resolves a promise after timeInMs milliseconds.\n * @param timeInMs - The number of milliseconds to be delayed.\n * @param options - The options for delay - currently abort options\n * @returns Promise that is resolved after timeInMs\n */\nfunction delay_delay(timeInMs, options) {\n let token;\n const { abortSignal, abortErrorMsg } = options !== null && options !== void 0 ? options : {};\n return createAbortablePromise((resolve) => {\n token = setTimeout(resolve, timeInMs);\n }, {\n cleanupBeforeAbort: () => clearTimeout(token),\n abortSignal,\n abortErrorMsg: abortErrorMsg !== null && abortErrorMsg !== void 0 ? abortErrorMsg : StandardAbortMessage,\n });\n}\n//# sourceMappingURL=delay.js.map\n// EXTERNAL MODULE: external "crypto"\nvar external_crypto_ = __webpack_require__(76982);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/sha256.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Generates a SHA-256 HMAC signature.\n * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.\n * @param stringToSign - The data to be signed.\n * @param encoding - The textual encoding to use for the returned HMAC digest.\n */\nasync function computeSha256Hmac(key, stringToSign, encoding) {\n const decodedKey = Buffer.from(key, "base64");\n return createHmac("sha256", decodedKey).update(stringToSign).digest(encoding);\n}\n/**\n * Generates a SHA-256 hash.\n * @param content - The data to be included in the hash.\n * @param encoding - The textual encoding to use for the returned hash.\n */\nasync function computeSha256Hash(content, encoding) {\n return createHash("sha256").update(content).digest(encoding);\n}\n//# sourceMappingURL=sha256.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/uuidUtils.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nvar _a;\n\n// NOTE: This is a workaround until we can use `globalThis.crypto.randomUUID` in Node.js 19+.\nconst uuidFunction = typeof ((_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.crypto) === null || _a === void 0 ? void 0 : _a.randomUUID) === "function"\n ? globalThis.crypto.randomUUID.bind(globalThis.crypto)\n : external_crypto_.randomUUID;\n/**\n * Generated Universally Unique Identifier\n *\n * @returns RFC4122 v4 UUID.\n */\nfunction randomUUID() {\n return uuidFunction();\n}\n//# sourceMappingURL=uuidUtils.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/checkEnvironment.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nvar checkEnvironment_a, _b, _c, _d;\n/**\n * A constant that indicates whether the environment the code is running is a Web Browser.\n */\n// eslint-disable-next-line @azure/azure-sdk/ts-no-window\nconst isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";\n/**\n * A constant that indicates whether the environment the code is running is a Web Worker.\n */\nconst isWebWorker = typeof self === "object" &&\n typeof (self === null || self === void 0 ? void 0 : self.importScripts) === "function" &&\n (((checkEnvironment_a = self.constructor) === null || checkEnvironment_a === void 0 ? void 0 : checkEnvironment_a.name) === "DedicatedWorkerGlobalScope" ||\n ((_b = self.constructor) === null || _b === void 0 ? void 0 : _b.name) === "ServiceWorkerGlobalScope" ||\n ((_c = self.constructor) === null || _c === void 0 ? void 0 : _c.name) === "SharedWorkerGlobalScope");\n/**\n * A constant that indicates whether the environment the code is running is Deno.\n */\nconst isDeno = typeof Deno !== "undefined" &&\n typeof Deno.version !== "undefined" &&\n typeof Deno.version.deno !== "undefined";\n/**\n * A constant that indicates whether the environment the code is running is Bun.sh.\n */\nconst isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined";\n/**\n * A constant that indicates whether the environment the code is running is a Node.js compatible environment.\n */\nconst isNodeLike = typeof globalThis.process !== "undefined" &&\n Boolean(globalThis.process.version) &&\n Boolean((_d = globalThis.process.versions) === null || _d === void 0 ? void 0 : _d.node);\n/**\n * A constant that indicates whether the environment the code is running is a Node.js compatible environment.\n * @deprecated Use `isNodeLike` instead.\n */\nconst checkEnvironment_isNode = isNodeLike;\n/**\n * A constant that indicates whether the environment the code is running is Node.JS.\n */\nconst isNodeRuntime = isNodeLike && !isBun && !isDeno;\n/**\n * A constant that indicates whether the environment the code is running is in React-Native.\n */\n// https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js\nconst isReactNative = typeof navigator !== "undefined" && (navigator === null || navigator === void 0 ? void 0 : navigator.product) === "ReactNative";\n//# sourceMappingURL=checkEnvironment.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/keyCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Tests an object to determine whether it implements KeyCredential.\n *\n * @param credential - The assumed KeyCredential to be tested.\n */\nfunction isKeyCredential(credential) {\n return isObjectWithProperties(credential, ["key"]) && typeof credential.key === "string";\n}\n//# sourceMappingURL=keyCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/azureNamedKeyCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * A static name/key-based credential that supports updating\n * the underlying name and key values.\n */\nclass AzureNamedKeyCredential {\n /**\n * The value of the key to be used in authentication.\n */\n get key() {\n return this._key;\n }\n /**\n * The value of the name to be used in authentication.\n */\n get name() {\n return this._name;\n }\n /**\n * Create an instance of an AzureNamedKeyCredential for use\n * with a service client.\n *\n * @param name - The initial value of the name to use in authentication.\n * @param key - The initial value of the key to use in authentication.\n */\n constructor(name, key) {\n if (!name || !key) {\n throw new TypeError("name and key must be non-empty strings");\n }\n this._name = name;\n this._key = key;\n }\n /**\n * Change the value of the key.\n *\n * Updates will take effect upon the next request after\n * updating the key value.\n *\n * @param newName - The new name value to be used.\n * @param newKey - The new key value to be used.\n */\n update(newName, newKey) {\n if (!newName || !newKey) {\n throw new TypeError("newName and newKey must be non-empty strings");\n }\n this._name = newName;\n this._key = newKey;\n }\n}\n/**\n * Tests an object to determine whether it implements NamedKeyCredential.\n *\n * @param credential - The assumed NamedKeyCredential to be tested.\n */\nfunction isNamedKeyCredential(credential) {\n return (isObjectWithProperties(credential, ["name", "key"]) &&\n typeof credential.key === "string" &&\n typeof credential.name === "string");\n}\n//# sourceMappingURL=azureNamedKeyCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/azureSASCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * A static-signature-based credential that supports updating\n * the underlying signature value.\n */\nclass AzureSASCredential {\n /**\n * The value of the shared access signature to be used in authentication\n */\n get signature() {\n return this._signature;\n }\n /**\n * Create an instance of an AzureSASCredential for use\n * with a service client.\n *\n * @param signature - The initial value of the shared access signature to use in authentication\n */\n constructor(signature) {\n if (!signature) {\n throw new Error("shared access signature must be a non-empty string");\n }\n this._signature = signature;\n }\n /**\n * Change the value of the signature.\n *\n * Updates will take effect upon the next request after\n * updating the signature value.\n *\n * @param newSignature - The new shared access signature value to be used\n */\n update(newSignature) {\n if (!newSignature) {\n throw new Error("shared access signature must be a non-empty string");\n }\n this._signature = newSignature;\n }\n}\n/**\n * Tests an object to determine whether it implements SASCredential.\n *\n * @param credential - The assumed SASCredential to be tested.\n */\nfunction isSASCredential(credential) {\n return (isObjectWithProperties(credential, ["signature"]) && typeof credential.signature === "string");\n}\n//# sourceMappingURL=azureSASCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/tokenCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Tests an object to determine whether it implements TokenCredential.\n *\n * @param credential - The assumed TokenCredential to be tested.\n */\nfunction isTokenCredential(credential) {\n // Check for an object with a \'getToken\' function and possibly with\n // a \'signRequest\' function. We do this check to make sure that\n // a ServiceClientCredentials implementor (like TokenClientCredentials\n // in ms-rest-nodeauth) doesn\'t get mistaken for a TokenCredential if\n // it doesn\'t actually implement TokenCredential also.\n const castCredential = credential;\n return (castCredential &&\n typeof castCredential.getToken === "function" &&\n (castCredential.signRequest === undefined || castCredential.getToken.length > 0));\n}\n//# sourceMappingURL=tokenCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/httpPipelineLogLevel.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * The different levels of logs that can be used with the HttpPipelineLogger.\n */\nvar HttpPipelineLogLevel;\n(function (HttpPipelineLogLevel) {\n /**\n * A log level that indicates that no logs will be logged.\n */\n HttpPipelineLogLevel[HttpPipelineLogLevel["OFF"] = 0] = "OFF";\n /**\n * An error log.\n */\n HttpPipelineLogLevel[HttpPipelineLogLevel["ERROR"] = 1] = "ERROR";\n /**\n * A warning log.\n */\n HttpPipelineLogLevel[HttpPipelineLogLevel["WARNING"] = 2] = "WARNING";\n /**\n * An information log.\n */\n HttpPipelineLogLevel[HttpPipelineLogLevel["INFO"] = 3] = "INFO";\n})(HttpPipelineLogLevel || (HttpPipelineLogLevel = {}));\n//# sourceMappingURL=httpPipelineLogLevel.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/requestPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * The base class from which all request policies derive.\n */\nclass BaseRequestPolicy {\n /**\n * The main method to implement that manipulates a request/response.\n */\n constructor(\n /**\n * The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.\n */\n _nextPolicy, \n /**\n * The options that can be passed to a given request policy.\n */\n _options) {\n this._nextPolicy = _nextPolicy;\n this._options = _options;\n }\n /**\n * Get whether or not a log with the provided log level should be logged.\n * @param logLevel - The log level of the log that will be logged.\n * @returns Whether or not a log with the provided log level should be logged.\n */\n shouldLog(logLevel) {\n return this._options.shouldLog(logLevel);\n }\n /**\n * Attempt to log the provided message to the provided logger. If no logger was provided or if\n * the log level does not meat the logger\'s threshold, then nothing will be logged.\n * @param logLevel - The log level of this log.\n * @param message - The message of this log.\n */\n log(logLevel, message) {\n this._options.log(logLevel, message);\n }\n}\n/**\n * Optional properties that can be used when creating a RequestPolicy.\n */\nclass RequestPolicyOptions {\n constructor(_logger) {\n this._logger = _logger;\n }\n /**\n * Get whether or not a log with the provided log level should be logged.\n * @param logLevel - The log level of the log that will be logged.\n * @returns Whether or not a log with the provided log level should be logged.\n */\n shouldLog(logLevel) {\n return (!!this._logger &&\n logLevel !== HttpPipelineLogLevel.OFF &&\n logLevel <= this._logger.minimumLogLevel);\n }\n /**\n * Attempt to log the provided message to the provided logger. If no logger was provided or if\n * the log level does not meet the logger\'s threshold, then nothing will be logged.\n * @param logLevel - The log level of this log.\n * @param message - The message of this log.\n */\n log(logLevel, message) {\n if (this._logger && this.shouldLog(logLevel)) {\n this._logger.log(logLevel, message);\n }\n }\n}\n//# sourceMappingURL=requestPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/constants.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * A set of constants used internally when processing requests.\n */\nconst constants_Constants = {\n /**\n * The core-http version\n */\n coreHttpVersion: "3.0.4",\n /**\n * Specifies HTTP.\n */\n HTTP: "http:",\n /**\n * Specifies HTTPS.\n */\n HTTPS: "https:",\n /**\n * Specifies HTTP Proxy.\n */\n HTTP_PROXY: "HTTP_PROXY",\n /**\n * Specifies HTTPS Proxy.\n */\n HTTPS_PROXY: "HTTPS_PROXY",\n /**\n * Specifies NO Proxy.\n */\n NO_PROXY: "NO_PROXY",\n /**\n * Specifies ALL Proxy.\n */\n ALL_PROXY: "ALL_PROXY",\n HttpConstants: {\n /**\n * Http Verbs\n */\n HttpVerbs: {\n PUT: "PUT",\n GET: "GET",\n DELETE: "DELETE",\n POST: "POST",\n MERGE: "MERGE",\n HEAD: "HEAD",\n PATCH: "PATCH",\n },\n StatusCodes: {\n TooManyRequests: 429,\n ServiceUnavailable: 503,\n },\n },\n /**\n * Defines constants for use with HTTP headers.\n */\n HeaderConstants: {\n /**\n * The Authorization header.\n */\n AUTHORIZATION: "authorization",\n AUTHORIZATION_SCHEME: "Bearer",\n /**\n * The Retry-After response-header field can be used with a 503 (Service\n * Unavailable) or 349 (Too Many Requests) responses to indicate how long\n * the service is expected to be unavailable to the requesting client.\n */\n RETRY_AFTER: "Retry-After",\n /**\n * The UserAgent header.\n */\n USER_AGENT: "User-Agent",\n },\n};\n//# sourceMappingURL=constants.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/proxyPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n/**\n * Stores the patterns specified in NO_PROXY environment variable.\n * @internal\n */\nconst globalNoProxyList = [];\nlet noProxyListLoaded = false;\n/** A cache of whether a host should bypass the proxy. */\nconst globalBypassedMap = new Map();\nfunction loadEnvironmentProxyValue() {\n if (!process) {\n return undefined;\n }\n const httpsProxy = getEnvironmentValue(constants_Constants.HTTPS_PROXY);\n const allProxy = getEnvironmentValue(constants_Constants.ALL_PROXY);\n const httpProxy = getEnvironmentValue(constants_Constants.HTTP_PROXY);\n return httpsProxy || allProxy || httpProxy;\n}\n/**\n * Check whether the host of a given `uri` matches any pattern in the no proxy list.\n * If there\'s a match, any request sent to the same host shouldn\'t have the proxy settings set.\n * This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210\n */\nfunction isBypassed(uri, noProxyList, bypassedMap) {\n if (noProxyList.length === 0) {\n return false;\n }\n const host = URLBuilder.parse(uri).getHost();\n if (bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.has(host)) {\n return bypassedMap.get(host);\n }\n let isBypassedFlag = false;\n for (const pattern of noProxyList) {\n if (pattern[0] === ".") {\n // This should match either domain it self or any subdomain or host\n // .foo.com will match foo.com it self or *.foo.com\n if (host.endsWith(pattern)) {\n isBypassedFlag = true;\n }\n else {\n if (host.length === pattern.length - 1 && host === pattern.slice(1)) {\n isBypassedFlag = true;\n }\n }\n }\n else {\n if (host === pattern) {\n isBypassedFlag = true;\n }\n }\n }\n bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.set(host, isBypassedFlag);\n return isBypassedFlag;\n}\n/**\n * @internal\n */\nfunction loadNoProxy() {\n const noProxy = getEnvironmentValue(constants_Constants.NO_PROXY);\n noProxyListLoaded = true;\n if (noProxy) {\n return noProxy\n .split(",")\n .map((item) => item.trim())\n .filter((item) => item.length);\n }\n return [];\n}\n/**\n * Converts a given URL of a proxy server into `ProxySettings` or attempts to retrieve `ProxySettings` from the current environment if one is not passed.\n * @param proxyUrl - URL of the proxy\n * @returns The default proxy settings, or undefined.\n */\nfunction getDefaultProxySettings(proxyUrl) {\n if (!proxyUrl) {\n proxyUrl = loadEnvironmentProxyValue();\n if (!proxyUrl) {\n return undefined;\n }\n }\n const { username, password, urlWithoutAuth } = extractAuthFromUrl(proxyUrl);\n const parsedUrl = URLBuilder.parse(urlWithoutAuth);\n const schema = parsedUrl.getScheme() ? parsedUrl.getScheme() + "://" : "";\n return {\n host: schema + parsedUrl.getHost(),\n port: Number.parseInt(parsedUrl.getPort() || "80"),\n username,\n password,\n };\n}\n/**\n * A policy that allows one to apply proxy settings to all requests.\n * If not passed static settings, they will be retrieved from the HTTPS_PROXY\n * or HTTP_PROXY environment variables.\n * @param proxySettings - ProxySettings to use on each request.\n * @param options - additional settings, for example, custom NO_PROXY patterns\n */\nfunction proxyPolicy_proxyPolicy(proxySettings, options) {\n if (!proxySettings) {\n proxySettings = getDefaultProxySettings();\n }\n if (!noProxyListLoaded) {\n globalNoProxyList.push(...loadNoProxy());\n }\n return {\n create: (nextPolicy, requestPolicyOptions) => {\n return new ProxyPolicy(nextPolicy, requestPolicyOptions, proxySettings, options === null || options === void 0 ? void 0 : options.customNoProxyList);\n },\n };\n}\nfunction extractAuthFromUrl(url) {\n const atIndex = url.indexOf("@");\n if (atIndex === -1) {\n return { urlWithoutAuth: url };\n }\n const schemeIndex = url.indexOf("://");\n const authStart = schemeIndex !== -1 ? schemeIndex + 3 : 0;\n const auth = url.substring(authStart, atIndex);\n const colonIndex = auth.indexOf(":");\n const hasPassword = colonIndex !== -1;\n const username = hasPassword ? auth.substring(0, colonIndex) : auth;\n const password = hasPassword ? auth.substring(colonIndex + 1) : undefined;\n const urlWithoutAuth = url.substring(0, authStart) + url.substring(atIndex + 1);\n return {\n username,\n password,\n urlWithoutAuth,\n };\n}\nclass ProxyPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, proxySettings, customNoProxyList) {\n super(nextPolicy, options);\n this.proxySettings = proxySettings;\n this.customNoProxyList = customNoProxyList;\n }\n sendRequest(request) {\n var _a;\n if (!request.proxySettings &&\n !isBypassed(request.url, (_a = this.customNoProxyList) !== null && _a !== void 0 ? _a : globalNoProxyList, this.customNoProxyList ? undefined : globalBypassedMap)) {\n request.proxySettings = this.proxySettings;\n }\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=proxyPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/platform/node/globalThis.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** only globals that common to node and browsers are allowed */\n// eslint-disable-next-line node/no-unsupported-features/es-builtins\nvar _globalThis = typeof globalThis === \'object\' ? globalThis : global;\n//# sourceMappingURL=globalThis.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/version.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// this is autogenerated file, see scripts/version-update.js\nvar VERSION = \'1.8.0\';\n//# sourceMappingURL=version.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/internal/semver.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar re = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(.+))?$/;\n/**\n * Create a function to test an API version to see if it is compatible with the provided ownVersion.\n *\n * The returned function has the following semantics:\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don\'t exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param ownVersion version which should be checked against\n */\nfunction _makeCompatibilityCheck(ownVersion) {\n var acceptedVersions = new Set([ownVersion]);\n var rejectedVersions = new Set();\n var myVersionMatch = ownVersion.match(re);\n if (!myVersionMatch) {\n // we cannot guarantee compatibility so we always return noop\n return function () { return false; };\n }\n var ownVersionParsed = {\n major: +myVersionMatch[1],\n minor: +myVersionMatch[2],\n patch: +myVersionMatch[3],\n prerelease: myVersionMatch[4],\n };\n // if ownVersion has a prerelease tag, versions must match exactly\n if (ownVersionParsed.prerelease != null) {\n return function isExactmatch(globalVersion) {\n return globalVersion === ownVersion;\n };\n }\n function _reject(v) {\n rejectedVersions.add(v);\n return false;\n }\n function _accept(v) {\n acceptedVersions.add(v);\n return true;\n }\n return function isCompatible(globalVersion) {\n if (acceptedVersions.has(globalVersion)) {\n return true;\n }\n if (rejectedVersions.has(globalVersion)) {\n return false;\n }\n var globalVersionMatch = globalVersion.match(re);\n if (!globalVersionMatch) {\n // cannot parse other version\n // we cannot guarantee compatibility so we always noop\n return _reject(globalVersion);\n }\n var globalVersionParsed = {\n major: +globalVersionMatch[1],\n minor: +globalVersionMatch[2],\n patch: +globalVersionMatch[3],\n prerelease: globalVersionMatch[4],\n };\n // if globalVersion has a prerelease tag, versions must match exactly\n if (globalVersionParsed.prerelease != null) {\n return _reject(globalVersion);\n }\n // major versions must match\n if (ownVersionParsed.major !== globalVersionParsed.major) {\n return _reject(globalVersion);\n }\n if (ownVersionParsed.major === 0) {\n if (ownVersionParsed.minor === globalVersionParsed.minor &&\n ownVersionParsed.patch <= globalVersionParsed.patch) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n }\n if (ownVersionParsed.minor <= globalVersionParsed.minor) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n };\n}\n/**\n * Test an API version to see if it is compatible with this API.\n *\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don\'t exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param version version of the API requesting an instance of the global API\n */\nvar isCompatible = _makeCompatibilityCheck(VERSION);\n//# sourceMappingURL=semver.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\nvar major = VERSION.split(\'.\')[0];\nvar GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for("opentelemetry.js.api." + major);\nvar _global = _globalThis;\nfunction registerGlobal(type, instance, diag, allowOverride) {\n var _a;\n if (allowOverride === void 0) { allowOverride = false; }\n var api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) !== null && _a !== void 0 ? _a : {\n version: VERSION,\n });\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n var err = new Error("@opentelemetry/api: Attempted duplicate registration of API: " + type);\n diag.error(err.stack || err.message);\n return false;\n }\n if (api.version !== VERSION) {\n // All registered APIs must be of the same version exactly\n var err = new Error("@opentelemetry/api: Registration of version v" + api.version + " for " + type + " does not match previously registered API v" + VERSION);\n diag.error(err.stack || err.message);\n return false;\n }\n api[type] = instance;\n diag.debug("@opentelemetry/api: Registered a global for " + type + " v" + VERSION + ".");\n return true;\n}\nfunction getGlobal(type) {\n var _a, _b;\n var globalVersion = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _a === void 0 ? void 0 : _a.version;\n if (!globalVersion || !isCompatible(globalVersion)) {\n return;\n }\n return (_b = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _b === void 0 ? void 0 : _b[type];\n}\nfunction unregisterGlobal(type, diag) {\n diag.debug("@opentelemetry/api: Unregistering a global for " + type + " v" + VERSION + ".");\n var api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n if (api) {\n delete api[type];\n }\n}\n//# sourceMappingURL=global-utils.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/context/context.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Get a key to uniquely identify a context value */\nfunction createContextKey(description) {\n // The specification states that for the same input, multiple calls should\n // return different keys. Due to the nature of the JS dependency management\n // system, this creates problems where multiple versions of some package\n // could hold different keys for the same property.\n //\n // Therefore, we use Symbol.for which returns the same key for the same input.\n return Symbol.for(description);\n}\nvar BaseContext = /** @class */ (function () {\n /**\n * Construct a new context which inherits values from an optional parent context.\n *\n * @param parentContext a context from which to inherit values\n */\n function BaseContext(parentContext) {\n // for minification\n var self = this;\n self._currentContext = parentContext ? new Map(parentContext) : new Map();\n self.getValue = function (key) { return self._currentContext.get(key); };\n self.setValue = function (key, value) {\n var context = new BaseContext(self._currentContext);\n context._currentContext.set(key, value);\n return context;\n };\n self.deleteValue = function (key) {\n var context = new BaseContext(self._currentContext);\n context._currentContext.delete(key);\n return context;\n };\n }\n return BaseContext;\n}());\n/** The root context is used as the default parent context when there is no active context */\nvar ROOT_CONTEXT = new BaseContext();\n//# sourceMappingURL=context.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar NoopContextManager_read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar NoopContextManager_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\nvar NoopContextManager = /** @class */ (function () {\n function NoopContextManager() {\n }\n NoopContextManager.prototype.active = function () {\n return ROOT_CONTEXT;\n };\n NoopContextManager.prototype.with = function (_context, fn, thisArg) {\n var args = [];\n for (var _i = 3; _i < arguments.length; _i++) {\n args[_i - 3] = arguments[_i];\n }\n return fn.call.apply(fn, NoopContextManager_spreadArray([thisArg], NoopContextManager_read(args), false));\n };\n NoopContextManager.prototype.bind = function (_context, target) {\n return target;\n };\n NoopContextManager.prototype.enable = function () {\n return this;\n };\n NoopContextManager.prototype.disable = function () {\n return this;\n };\n return NoopContextManager;\n}());\n\n//# sourceMappingURL=NoopContextManager.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar ComponentLogger_read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar ComponentLogger_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n/**\n * Component Logger which is meant to be used as part of any component which\n * will add automatically additional namespace in front of the log message.\n * It will then forward all message to global diag logger\n * @example\n * const cLogger = diag.createComponentLogger({ namespace: \'@opentelemetry/instrumentation-http\' });\n * cLogger.debug(\'test\');\n * // @opentelemetry/instrumentation-http test\n */\nvar DiagComponentLogger = /** @class */ (function () {\n function DiagComponentLogger(props) {\n this._namespace = props.namespace || \'DiagComponentLogger\';\n }\n DiagComponentLogger.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'debug\', this._namespace, args);\n };\n DiagComponentLogger.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'error\', this._namespace, args);\n };\n DiagComponentLogger.prototype.info = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'info\', this._namespace, args);\n };\n DiagComponentLogger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'warn\', this._namespace, args);\n };\n DiagComponentLogger.prototype.verbose = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return logProxy(\'verbose\', this._namespace, args);\n };\n return DiagComponentLogger;\n}());\n\nfunction logProxy(funcName, namespace, args) {\n var logger = getGlobal(\'diag\');\n // shortcut if logger not set\n if (!logger) {\n return;\n }\n args.unshift(namespace);\n return logger[funcName].apply(logger, ComponentLogger_spreadArray([], ComponentLogger_read(args), false));\n}\n//# sourceMappingURL=ComponentLogger.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/diag/types.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Defines the available internal logging levels for the diagnostic logger, the numeric values\n * of the levels are defined to match the original values from the initial LogLevel to avoid\n * compatibility/migration issues for any implementation that assume the numeric ordering.\n */\nvar DiagLogLevel;\n(function (DiagLogLevel) {\n /** Diagnostic Logging level setting to disable all logging (except and forced logs) */\n DiagLogLevel[DiagLogLevel["NONE"] = 0] = "NONE";\n /** Identifies an error scenario */\n DiagLogLevel[DiagLogLevel["ERROR"] = 30] = "ERROR";\n /** Identifies a warning scenario */\n DiagLogLevel[DiagLogLevel["WARN"] = 50] = "WARN";\n /** General informational log message */\n DiagLogLevel[DiagLogLevel["INFO"] = 60] = "INFO";\n /** General debug log message */\n DiagLogLevel[DiagLogLevel["DEBUG"] = 70] = "DEBUG";\n /**\n * Detailed trace level logging should only be used for development, should only be set\n * in a development environment.\n */\n DiagLogLevel[DiagLogLevel["VERBOSE"] = 80] = "VERBOSE";\n /** Used to set the logging level to include all logging */\n DiagLogLevel[DiagLogLevel["ALL"] = 9999] = "ALL";\n})(DiagLogLevel || (DiagLogLevel = {}));\n//# sourceMappingURL=types.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction createLogLevelDiagLogger(maxLevel, logger) {\n if (maxLevel < DiagLogLevel.NONE) {\n maxLevel = DiagLogLevel.NONE;\n }\n else if (maxLevel > DiagLogLevel.ALL) {\n maxLevel = DiagLogLevel.ALL;\n }\n // In case the logger is null or undefined\n logger = logger || {};\n function _filterFunc(funcName, theLevel) {\n var theFunc = logger[funcName];\n if (typeof theFunc === \'function\' && maxLevel >= theLevel) {\n return theFunc.bind(logger);\n }\n return function () { };\n }\n return {\n error: _filterFunc(\'error\', DiagLogLevel.ERROR),\n warn: _filterFunc(\'warn\', DiagLogLevel.WARN),\n info: _filterFunc(\'info\', DiagLogLevel.INFO),\n debug: _filterFunc(\'debug\', DiagLogLevel.DEBUG),\n verbose: _filterFunc(\'verbose\', DiagLogLevel.VERBOSE),\n };\n}\n//# sourceMappingURL=logLevelLogger.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/api/diag.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar diag_read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar diag_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\n\nvar API_NAME = \'diag\';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry internal\n * diagnostic API\n */\nvar DiagAPI = /** @class */ (function () {\n /**\n * Private internal constructor\n * @private\n */\n function DiagAPI() {\n function _logProxy(funcName) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var logger = getGlobal(\'diag\');\n // shortcut if logger not set\n if (!logger)\n return;\n return logger[funcName].apply(logger, diag_spreadArray([], diag_read(args), false));\n };\n }\n // Using self local variable for minification purposes as \'this\' cannot be minified\n var self = this;\n // DiagAPI specific functions\n var setLogger = function (logger, optionsOrLogLevel) {\n var _a, _b, _c;\n if (optionsOrLogLevel === void 0) { optionsOrLogLevel = { logLevel: DiagLogLevel.INFO }; }\n if (logger === self) {\n // There isn\'t much we can do here.\n // Logging to the console might break the user application.\n // Try to log to self. If a logger was previously registered it will receive the log.\n var err = new Error(\'Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation\');\n self.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);\n return false;\n }\n if (typeof optionsOrLogLevel === \'number\') {\n optionsOrLogLevel = {\n logLevel: optionsOrLogLevel,\n };\n }\n var oldLogger = getGlobal(\'diag\');\n var newLogger = createLogLevelDiagLogger((_b = optionsOrLogLevel.logLevel) !== null && _b !== void 0 ? _b : DiagLogLevel.INFO, logger);\n // There already is an logger registered. We\'ll let it know before overwriting it.\n if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {\n var stack = (_c = new Error().stack) !== null && _c !== void 0 ? _c : \'\';\n oldLogger.warn("Current logger will be overwritten from " + stack);\n newLogger.warn("Current logger will overwrite one already registered from " + stack);\n }\n return registerGlobal(\'diag\', newLogger, self, true);\n };\n self.setLogger = setLogger;\n self.disable = function () {\n unregisterGlobal(API_NAME, self);\n };\n self.createComponentLogger = function (options) {\n return new DiagComponentLogger(options);\n };\n self.verbose = _logProxy(\'verbose\');\n self.debug = _logProxy(\'debug\');\n self.info = _logProxy(\'info\');\n self.warn = _logProxy(\'warn\');\n self.error = _logProxy(\'error\');\n }\n /** Get the singleton instance of the DiagAPI API */\n DiagAPI.instance = function () {\n if (!this._instance) {\n this._instance = new DiagAPI();\n }\n return this._instance;\n };\n return DiagAPI;\n}());\n\n//# sourceMappingURL=diag.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/api/context.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar context_read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar context_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\nvar context_API_NAME = \'context\';\nvar NOOP_CONTEXT_MANAGER = new NoopContextManager();\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Context API\n */\nvar ContextAPI = /** @class */ (function () {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n function ContextAPI() {\n }\n /** Get the singleton instance of the Context API */\n ContextAPI.getInstance = function () {\n if (!this._instance) {\n this._instance = new ContextAPI();\n }\n return this._instance;\n };\n /**\n * Set the current context manager.\n *\n * @returns true if the context manager was successfully registered, else false\n */\n ContextAPI.prototype.setGlobalContextManager = function (contextManager) {\n return registerGlobal(context_API_NAME, contextManager, DiagAPI.instance());\n };\n /**\n * Get the currently active context\n */\n ContextAPI.prototype.active = function () {\n return this._getContextManager().active();\n };\n /**\n * Execute a function with an active context\n *\n * @param context context to be active during function execution\n * @param fn function to execute in a context\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n ContextAPI.prototype.with = function (context, fn, thisArg) {\n var _a;\n var args = [];\n for (var _i = 3; _i < arguments.length; _i++) {\n args[_i - 3] = arguments[_i];\n }\n return (_a = this._getContextManager()).with.apply(_a, context_spreadArray([context, fn, thisArg], context_read(args), false));\n };\n /**\n * Bind a context to a target function or event emitter\n *\n * @param context context to bind to the event emitter or function. Defaults to the currently active context\n * @param target function or event emitter to bind\n */\n ContextAPI.prototype.bind = function (context, target) {\n return this._getContextManager().bind(context, target);\n };\n ContextAPI.prototype._getContextManager = function () {\n return getGlobal(context_API_NAME) || NOOP_CONTEXT_MANAGER;\n };\n /** Disable and remove the global context manager */\n ContextAPI.prototype.disable = function () {\n this._getContextManager().disable();\n unregisterGlobal(context_API_NAME, DiagAPI.instance());\n };\n return ContextAPI;\n}());\n\n//# sourceMappingURL=context.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar TraceFlags;\n(function (TraceFlags) {\n /** Represents no flag set. */\n TraceFlags[TraceFlags["NONE"] = 0] = "NONE";\n /** Bit to represent whether trace is sampled in trace flags. */\n TraceFlags[TraceFlags["SAMPLED"] = 1] = "SAMPLED";\n})(TraceFlags || (TraceFlags = {}));\n//# sourceMappingURL=trace_flags.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar INVALID_SPANID = \'0000000000000000\';\nvar INVALID_TRACEID = \'00000000000000000000000000000000\';\nvar INVALID_SPAN_CONTEXT = {\n traceId: INVALID_TRACEID,\n spanId: INVALID_SPANID,\n traceFlags: TraceFlags.NONE,\n};\n//# sourceMappingURL=invalid-span-constants.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The NonRecordingSpan is the default {@link Span} that is used when no Span\n * implementation is available. All operations are no-op including context\n * propagation.\n */\nvar NonRecordingSpan = /** @class */ (function () {\n function NonRecordingSpan(_spanContext) {\n if (_spanContext === void 0) { _spanContext = INVALID_SPAN_CONTEXT; }\n this._spanContext = _spanContext;\n }\n // Returns a SpanContext.\n NonRecordingSpan.prototype.spanContext = function () {\n return this._spanContext;\n };\n // By default does nothing\n NonRecordingSpan.prototype.setAttribute = function (_key, _value) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.setAttributes = function (_attributes) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.addEvent = function (_name, _attributes) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.setStatus = function (_status) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.updateName = function (_name) {\n return this;\n };\n // By default does nothing\n NonRecordingSpan.prototype.end = function (_endTime) { };\n // isRecording always returns false for NonRecordingSpan.\n NonRecordingSpan.prototype.isRecording = function () {\n return false;\n };\n // By default does nothing\n NonRecordingSpan.prototype.recordException = function (_exception, _time) { };\n return NonRecordingSpan;\n}());\n\n//# sourceMappingURL=NonRecordingSpan.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/context-utils.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n/**\n * span key\n */\nvar SPAN_KEY = createContextKey(\'OpenTelemetry Context Key SPAN\');\n/**\n * Return the span if one exists\n *\n * @param context context to get span from\n */\nfunction getSpan(context) {\n return context.getValue(SPAN_KEY) || undefined;\n}\n/**\n * Gets the span from the current context, if one exists.\n */\nfunction getActiveSpan() {\n return getSpan(ContextAPI.getInstance().active());\n}\n/**\n * Set the span on a context\n *\n * @param context context to use as parent\n * @param span span to set active\n */\nfunction setSpan(context, span) {\n return context.setValue(SPAN_KEY, span);\n}\n/**\n * Remove current span stored in the context\n *\n * @param context context to delete span from\n */\nfunction deleteSpan(context) {\n return context.deleteValue(SPAN_KEY);\n}\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context context to set active span on\n * @param spanContext span context to be wrapped\n */\nfunction setSpanContext(context, spanContext) {\n return setSpan(context, new NonRecordingSpan(spanContext));\n}\n/**\n * Get the span context of the span if it exists.\n *\n * @param context context to get values from\n */\nfunction getSpanContext(context) {\n var _a;\n return (_a = getSpan(context)) === null || _a === void 0 ? void 0 : _a.spanContext();\n}\n//# sourceMappingURL=context-utils.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nvar VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i;\nvar VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i;\nfunction isValidTraceId(traceId) {\n return VALID_TRACEID_REGEX.test(traceId) && traceId !== INVALID_TRACEID;\n}\nfunction isValidSpanId(spanId) {\n return VALID_SPANID_REGEX.test(spanId) && spanId !== INVALID_SPANID;\n}\n/**\n * Returns true if this {@link SpanContext} is valid.\n * @return true if this {@link SpanContext} is valid.\n */\nfunction isSpanContextValid(spanContext) {\n return (isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId));\n}\n/**\n * Wrap the given {@link SpanContext} in a new non-recording {@link Span}\n *\n * @param spanContext span context to be wrapped\n * @returns a new non-recording {@link Span} with the provided context\n */\nfunction wrapSpanContext(spanContext) {\n return new NonRecordingSpan(spanContext);\n}\n//# sourceMappingURL=spancontext-utils.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n\nvar contextApi = ContextAPI.getInstance();\n/**\n * No-op implementations of {@link Tracer}.\n */\nvar NoopTracer = /** @class */ (function () {\n function NoopTracer() {\n }\n // startSpan starts a noop span.\n NoopTracer.prototype.startSpan = function (name, options, context) {\n if (context === void 0) { context = contextApi.active(); }\n var root = Boolean(options === null || options === void 0 ? void 0 : options.root);\n if (root) {\n return new NonRecordingSpan();\n }\n var parentFromContext = context && getSpanContext(context);\n if (isSpanContext(parentFromContext) &&\n isSpanContextValid(parentFromContext)) {\n return new NonRecordingSpan(parentFromContext);\n }\n else {\n return new NonRecordingSpan();\n }\n };\n NoopTracer.prototype.startActiveSpan = function (name, arg2, arg3, arg4) {\n var opts;\n var ctx;\n var fn;\n if (arguments.length < 2) {\n return;\n }\n else if (arguments.length === 2) {\n fn = arg2;\n }\n else if (arguments.length === 3) {\n opts = arg2;\n fn = arg3;\n }\n else {\n opts = arg2;\n ctx = arg3;\n fn = arg4;\n }\n var parentContext = ctx !== null && ctx !== void 0 ? ctx : contextApi.active();\n var span = this.startSpan(name, opts, parentContext);\n var contextWithSpanSet = setSpan(parentContext, span);\n return contextApi.with(contextWithSpanSet, fn, undefined, span);\n };\n return NoopTracer;\n}());\n\nfunction isSpanContext(spanContext) {\n return (typeof spanContext === \'object\' &&\n typeof spanContext[\'spanId\'] === \'string\' &&\n typeof spanContext[\'traceId\'] === \'string\' &&\n typeof spanContext[\'traceFlags\'] === \'number\');\n}\n//# sourceMappingURL=NoopTracer.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar NOOP_TRACER = new NoopTracer();\n/**\n * Proxy tracer provided by the proxy tracer provider\n */\nvar ProxyTracer = /** @class */ (function () {\n function ProxyTracer(_provider, name, version, options) {\n this._provider = _provider;\n this.name = name;\n this.version = version;\n this.options = options;\n }\n ProxyTracer.prototype.startSpan = function (name, options, context) {\n return this._getTracer().startSpan(name, options, context);\n };\n ProxyTracer.prototype.startActiveSpan = function (_name, _options, _context, _fn) {\n var tracer = this._getTracer();\n return Reflect.apply(tracer.startActiveSpan, tracer, arguments);\n };\n /**\n * Try to get a tracer from the proxy tracer provider.\n * If the proxy tracer provider has no delegate, return a noop tracer.\n */\n ProxyTracer.prototype._getTracer = function () {\n if (this._delegate) {\n return this._delegate;\n }\n var tracer = this._provider.getDelegateTracer(this.name, this.version, this.options);\n if (!tracer) {\n return NOOP_TRACER;\n }\n this._delegate = tracer;\n return this._delegate;\n };\n return ProxyTracer;\n}());\n\n//# sourceMappingURL=ProxyTracer.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * An implementation of the {@link TracerProvider} which returns an impotent\n * Tracer for all calls to `getTracer`.\n *\n * All operations are no-op.\n */\nvar NoopTracerProvider = /** @class */ (function () {\n function NoopTracerProvider() {\n }\n NoopTracerProvider.prototype.getTracer = function (_name, _version, _options) {\n return new NoopTracer();\n };\n return NoopTracerProvider;\n}());\n\n//# sourceMappingURL=NoopTracerProvider.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nvar NOOP_TRACER_PROVIDER = new NoopTracerProvider();\n/**\n * Tracer provider which provides {@link ProxyTracer}s.\n *\n * Before a delegate is set, tracers provided are NoOp.\n * When a delegate is set, traces are provided from the delegate.\n * When a delegate is set after tracers have already been provided,\n * all tracers already provided will use the provided delegate implementation.\n */\nvar ProxyTracerProvider = /** @class */ (function () {\n function ProxyTracerProvider() {\n }\n /**\n * Get a {@link ProxyTracer}\n */\n ProxyTracerProvider.prototype.getTracer = function (name, version, options) {\n var _a;\n return ((_a = this.getDelegateTracer(name, version, options)) !== null && _a !== void 0 ? _a : new ProxyTracer(this, name, version, options));\n };\n ProxyTracerProvider.prototype.getDelegate = function () {\n var _a;\n return (_a = this._delegate) !== null && _a !== void 0 ? _a : NOOP_TRACER_PROVIDER;\n };\n /**\n * Set the delegate tracer provider\n */\n ProxyTracerProvider.prototype.setDelegate = function (delegate) {\n this._delegate = delegate;\n };\n ProxyTracerProvider.prototype.getDelegateTracer = function (name, version, options) {\n var _a;\n return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getTracer(name, version, options);\n };\n return ProxyTracerProvider;\n}());\n\n//# sourceMappingURL=ProxyTracerProvider.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/api/trace.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n\n\nvar trace_API_NAME = \'trace\';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Tracing API\n */\nvar TraceAPI = /** @class */ (function () {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n function TraceAPI() {\n this._proxyTracerProvider = new ProxyTracerProvider();\n this.wrapSpanContext = wrapSpanContext;\n this.isSpanContextValid = isSpanContextValid;\n this.deleteSpan = deleteSpan;\n this.getSpan = getSpan;\n this.getActiveSpan = getActiveSpan;\n this.getSpanContext = getSpanContext;\n this.setSpan = setSpan;\n this.setSpanContext = setSpanContext;\n }\n /** Get the singleton instance of the Trace API */\n TraceAPI.getInstance = function () {\n if (!this._instance) {\n this._instance = new TraceAPI();\n }\n return this._instance;\n };\n /**\n * Set the current global tracer.\n *\n * @returns true if the tracer provider was successfully registered, else false\n */\n TraceAPI.prototype.setGlobalTracerProvider = function (provider) {\n var success = registerGlobal(trace_API_NAME, this._proxyTracerProvider, DiagAPI.instance());\n if (success) {\n this._proxyTracerProvider.setDelegate(provider);\n }\n return success;\n };\n /**\n * Returns the global tracer provider.\n */\n TraceAPI.prototype.getTracerProvider = function () {\n return getGlobal(trace_API_NAME) || this._proxyTracerProvider;\n };\n /**\n * Returns a tracer from the global tracer provider.\n */\n TraceAPI.prototype.getTracer = function (name, version) {\n return this.getTracerProvider().getTracer(name, version);\n };\n /** Remove the global tracer provider */\n TraceAPI.prototype.disable = function () {\n unregisterGlobal(trace_API_NAME, DiagAPI.instance());\n this._proxyTracerProvider = new ProxyTracerProvider();\n };\n return TraceAPI;\n}());\n\n//# sourceMappingURL=trace.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/trace-api.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/** Entrypoint for trace API */\nvar trace = TraceAPI.getInstance();\n//# sourceMappingURL=trace-api.js.map\n;// CONCATENATED MODULE: ./node_modules/@opentelemetry/api/build/esm/context-api.js\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/** Entrypoint for context API */\nvar context = ContextAPI.getInstance();\n//# sourceMappingURL=context-api.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist-esm/src/interfaces.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * The kind of span.\n */\nvar SpanKind;\n(function (SpanKind) {\n /** Default value. Indicates that the span is used internally. */\n SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";\n /**\n * Indicates that the span covers server-side handling of an RPC or other\n * remote request.\n */\n SpanKind[SpanKind["SERVER"] = 1] = "SERVER";\n /**\n * Indicates that the span covers the client-side wrapper around an RPC or\n * other remote request.\n */\n SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";\n /**\n * Indicates that the span describes producer sending a message to a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";\n /**\n * Indicates that the span describes consumer receiving a message from a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";\n})(SpanKind || (SpanKind = {}));\n/**\n * Return the span if one exists\n *\n * @param context - context to get span from\n */\nfunction interfaces_getSpan(context) {\n return otTrace.getSpan(context);\n}\n/**\n * Set the span on a context\n *\n * @param context - context to use as parent\n * @param span - span to set active\n */\nfunction interfaces_setSpan(context, span) {\n return trace.setSpan(context, span);\n}\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context - context to set active span on\n * @param spanContext - span context to be wrapped\n */\nfunction interfaces_setSpanContext(context, spanContext) {\n return otTrace.setSpanContext(context, spanContext);\n}\n/**\n * Get the span context of the span if it exists.\n *\n * @param context - context to get values from\n */\nfunction interfaces_getSpanContext(context) {\n return otTrace.getSpanContext(context);\n}\n/**\n * Returns true of the given {@link SpanContext} is valid.\n * A valid {@link SpanContext} is one which has a valid trace ID and span ID as per the spec.\n *\n * @param context - the {@link SpanContext} to validate.\n *\n * @returns true if the {@link SpanContext} is valid, false otherwise.\n */\nfunction interfaces_isSpanContextValid(context) {\n return trace.isSpanContextValid(context);\n}\nfunction getTracer(name, version) {\n return trace.getTracer(name || "azure/core-tracing", version);\n}\n/** Entrypoint for context API */\nconst interfaces_context = context;\n/** SpanStatusCode */\nvar SpanStatusCode;\n(function (SpanStatusCode) {\n /**\n * The default status.\n */\n SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";\n /**\n * The operation contains an error.\n */\n SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";\n})(SpanStatusCode || (SpanStatusCode = {}));\n//# sourceMappingURL=interfaces.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/operationOptions.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Converts an OperationOptions to a RequestOptionsBase\n *\n * @param opts - OperationOptions object to convert to RequestOptionsBase\n */\nfunction operationOptionsToRequestOptionsBase(opts) {\n const { requestOptions, tracingOptions } = opts, additionalOptions = __rest(opts, ["requestOptions", "tracingOptions"]);\n let result = additionalOptions;\n if (requestOptions) {\n result = Object.assign(Object.assign({}, result), requestOptions);\n }\n if (tracingOptions) {\n result.tracingContext = tracingOptions.tracingContext;\n // By passing spanOptions if they exist at runtime, we\'re backwards compatible with @azure/core-tracing@preview.13 and earlier.\n result.spanOptions = tracingOptions === null || tracingOptions === void 0 ? void 0 : tracingOptions.spanOptions;\n }\n return result;\n}\n//# sourceMappingURL=operationOptions.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/base64.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Encodes a string in base64 format.\n * @param value - The string to encode\n */\nfunction encodeString(value) {\n return Buffer.from(value).toString("base64");\n}\n/**\n * Encodes a byte array in base64 format.\n * @param value - The Uint8Aray to encode\n */\nfunction encodeByteArray(value) {\n // Buffer.from accepts | -- the TypeScript definition is off here\n // https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length\n const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer);\n return bufferValue.toString("base64");\n}\n/**\n * Decodes a base64 string into a byte array.\n * @param value - The base64 string to decode\n */\nfunction decodeString(value) {\n return Buffer.from(value, "base64");\n}\n//# sourceMappingURL=base64.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/serializer.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/* eslint-disable eqeqeq */\n\n\n\n// This file contains utility code to serialize and deserialize network operations according to `OperationSpec` objects generated by AutoRest.TypeScript from OpenAPI specifications.\n/**\n * Used to map raw response objects to final shapes.\n * Helps packing and unpacking Dates and other encoded types that are not intrinsic to JSON.\n * Also allows pulling values from headers, as well as inserting default values and constants.\n */\nclass Serializer {\n constructor(\n /**\n * The provided model mapper.\n */\n modelMappers = {}, \n /**\n * Whether the contents are XML or not.\n */\n isXML) {\n this.modelMappers = modelMappers;\n this.isXML = isXML;\n }\n /**\n * Validates constraints, if any. This function will throw if the provided value does not respect those constraints.\n * @param mapper - The definition of data models.\n * @param value - The value.\n * @param objectName - Name of the object. Used in the error messages.\n * @deprecated Removing the constraints validation on client side.\n */\n validateConstraints(mapper, value, objectName) {\n const failValidation = (constraintName, constraintValue) => {\n throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);\n };\n if (mapper.constraints && value != undefined) {\n const valueAsNumber = value;\n const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;\n if (ExclusiveMaximum != undefined && valueAsNumber >= ExclusiveMaximum) {\n failValidation("ExclusiveMaximum", ExclusiveMaximum);\n }\n if (ExclusiveMinimum != undefined && valueAsNumber <= ExclusiveMinimum) {\n failValidation("ExclusiveMinimum", ExclusiveMinimum);\n }\n if (InclusiveMaximum != undefined && valueAsNumber > InclusiveMaximum) {\n failValidation("InclusiveMaximum", InclusiveMaximum);\n }\n if (InclusiveMinimum != undefined && valueAsNumber < InclusiveMinimum) {\n failValidation("InclusiveMinimum", InclusiveMinimum);\n }\n const valueAsArray = value;\n if (MaxItems != undefined && valueAsArray.length > MaxItems) {\n failValidation("MaxItems", MaxItems);\n }\n if (MaxLength != undefined && valueAsArray.length > MaxLength) {\n failValidation("MaxLength", MaxLength);\n }\n if (MinItems != undefined && valueAsArray.length < MinItems) {\n failValidation("MinItems", MinItems);\n }\n if (MinLength != undefined && valueAsArray.length < MinLength) {\n failValidation("MinLength", MinLength);\n }\n if (MultipleOf != undefined && valueAsNumber % MultipleOf !== 0) {\n failValidation("MultipleOf", MultipleOf);\n }\n if (Pattern) {\n const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;\n if (typeof value !== "string" || value.match(pattern) === null) {\n failValidation("Pattern", Pattern);\n }\n }\n if (UniqueItems &&\n valueAsArray.some((item, i, ar) => ar.indexOf(item) !== i)) {\n failValidation("UniqueItems", UniqueItems);\n }\n }\n }\n /**\n * Serialize the given object based on its metadata defined in the mapper.\n *\n * @param mapper - The mapper which defines the metadata of the serializable object.\n * @param object - A valid Javascript object to be serialized.\n * @param objectName - Name of the serialized object.\n * @param options - additional options to deserialization.\n * @returns A valid serialized Javascript object.\n */\n serialize(mapper, object, objectName, options = {}) {\n var _a, _b, _c;\n const updatedOptions = {\n rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",\n includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,\n xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,\n };\n let payload = {};\n const mapperType = mapper.type.name;\n if (!objectName) {\n objectName = mapper.serializedName;\n }\n if (mapperType.match(/^Sequence$/i) !== null) {\n payload = [];\n }\n if (mapper.isConstant) {\n object = mapper.defaultValue;\n }\n // This table of allowed values should help explain\n // the mapper.required and mapper.nullable properties.\n // X means "neither undefined or null are allowed".\n // || required\n // || true | false\n // nullable || ==========================\n // true || null | undefined/null\n // false || X | undefined\n // undefined || X | undefined/null\n const { required, nullable } = mapper;\n if (required && nullable && object === undefined) {\n throw new Error(`${objectName} cannot be undefined.`);\n }\n if (required && !nullable && object == undefined) {\n throw new Error(`${objectName} cannot be null or undefined.`);\n }\n if (!required && nullable === false && object === null) {\n throw new Error(`${objectName} cannot be null.`);\n }\n if (object == undefined) {\n payload = object;\n }\n else {\n if (mapperType.match(/^any$/i) !== null) {\n payload = object;\n }\n else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {\n payload = serializeBasicTypes(mapperType, objectName, object);\n }\n else if (mapperType.match(/^Enum$/i) !== null) {\n const enumMapper = mapper;\n payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);\n }\n else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {\n payload = serializeDateTypes(mapperType, object, objectName);\n }\n else if (mapperType.match(/^ByteArray$/i) !== null) {\n payload = serializeByteArrayType(objectName, object);\n }\n else if (mapperType.match(/^Base64Url$/i) !== null) {\n payload = serializeBase64UrlType(objectName, object);\n }\n else if (mapperType.match(/^Sequence$/i) !== null) {\n payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);\n }\n else if (mapperType.match(/^Dictionary$/i) !== null) {\n payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);\n }\n else if (mapperType.match(/^Composite$/i) !== null) {\n payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);\n }\n }\n return payload;\n }\n /**\n * Deserialize the given object based on its metadata defined in the mapper.\n *\n * @param mapper - The mapper which defines the metadata of the serializable object.\n * @param responseBody - A valid Javascript entity to be deserialized.\n * @param objectName - Name of the deserialized object.\n * @param options - Controls behavior of XML parser and builder.\n * @returns A valid deserialized Javascript object.\n */\n deserialize(mapper, responseBody, objectName, options = {}) {\n var _a, _b, _c;\n const updatedOptions = {\n rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",\n includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,\n xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,\n };\n if (responseBody == undefined) {\n if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {\n // Edge case for empty XML non-wrapped lists. xml2js can\'t distinguish\n // between the list being empty versus being missing,\n // so let\'s do the more user-friendly thing and return an empty list.\n responseBody = [];\n }\n // specifically check for undefined as default value can be a falsey value `0, "", false, null`\n if (mapper.defaultValue !== undefined) {\n responseBody = mapper.defaultValue;\n }\n return responseBody;\n }\n let payload;\n const mapperType = mapper.type.name;\n if (!objectName) {\n objectName = mapper.serializedName;\n }\n if (mapperType.match(/^Composite$/i) !== null) {\n payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);\n }\n else {\n if (this.isXML) {\n const xmlCharKey = updatedOptions.xmlCharKey;\n const castResponseBody = responseBody;\n /**\n * If the mapper specifies this as a non-composite type value but the responseBody contains\n * both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,\n * then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.\n */\n if (castResponseBody[XML_ATTRKEY] != undefined &&\n castResponseBody[xmlCharKey] != undefined) {\n responseBody = castResponseBody[xmlCharKey];\n }\n }\n if (mapperType.match(/^Number$/i) !== null) {\n payload = parseFloat(responseBody);\n if (isNaN(payload)) {\n payload = responseBody;\n }\n }\n else if (mapperType.match(/^Boolean$/i) !== null) {\n if (responseBody === "true") {\n payload = true;\n }\n else if (responseBody === "false") {\n payload = false;\n }\n else {\n payload = responseBody;\n }\n }\n else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {\n payload = responseBody;\n }\n else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {\n payload = new Date(responseBody);\n }\n else if (mapperType.match(/^UnixTime$/i) !== null) {\n payload = unixTimeToDate(responseBody);\n }\n else if (mapperType.match(/^ByteArray$/i) !== null) {\n payload = decodeString(responseBody);\n }\n else if (mapperType.match(/^Base64Url$/i) !== null) {\n payload = base64UrlToByteArray(responseBody);\n }\n else if (mapperType.match(/^Sequence$/i) !== null) {\n payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);\n }\n else if (mapperType.match(/^Dictionary$/i) !== null) {\n payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);\n }\n }\n if (mapper.isConstant) {\n payload = mapper.defaultValue;\n }\n return payload;\n }\n}\nfunction trimEnd(str, ch) {\n let len = str.length;\n while (len - 1 >= 0 && str[len - 1] === ch) {\n --len;\n }\n return str.substr(0, len);\n}\nfunction bufferToBase64Url(buffer) {\n if (!buffer) {\n return undefined;\n }\n if (!(buffer instanceof Uint8Array)) {\n throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);\n }\n // Uint8Array to Base64.\n const str = encodeByteArray(buffer);\n // Base64 to Base64Url.\n return trimEnd(str, "=").replace(/\\+/g, "-").replace(/\\//g, "_");\n}\nfunction base64UrlToByteArray(str) {\n if (!str) {\n return undefined;\n }\n if (str && typeof str.valueOf() !== "string") {\n throw new Error("Please provide an input of type string for converting to Uint8Array");\n }\n // Base64Url to Base64.\n str = str.replace(/-/g, "+").replace(/_/g, "/");\n // Base64 to Uint8Array.\n return decodeString(str);\n}\nfunction splitSerializeName(prop) {\n const classes = [];\n let partialclass = "";\n if (prop) {\n const subwords = prop.split(".");\n for (const item of subwords) {\n if (item.charAt(item.length - 1) === "\\\\") {\n partialclass += item.substr(0, item.length - 1) + ".";\n }\n else {\n partialclass += item;\n classes.push(partialclass);\n partialclass = "";\n }\n }\n }\n return classes;\n}\nfunction dateToUnixTime(d) {\n if (!d) {\n return undefined;\n }\n if (typeof d.valueOf() === "string") {\n d = new Date(d);\n }\n return Math.floor(d.getTime() / 1000);\n}\nfunction unixTimeToDate(n) {\n if (!n) {\n return undefined;\n }\n return new Date(n * 1000);\n}\nfunction serializeBasicTypes(typeName, objectName, value) {\n if (value !== null && value !== undefined) {\n if (typeName.match(/^Number$/i) !== null) {\n if (typeof value !== "number") {\n throw new Error(`${objectName} with value ${value} must be of type number.`);\n }\n }\n else if (typeName.match(/^String$/i) !== null) {\n if (typeof value.valueOf() !== "string") {\n throw new Error(`${objectName} with value "${value}" must be of type string.`);\n }\n }\n else if (typeName.match(/^Uuid$/i) !== null) {\n if (!(typeof value.valueOf() === "string" && isValidUuid(value))) {\n throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);\n }\n }\n else if (typeName.match(/^Boolean$/i) !== null) {\n if (typeof value !== "boolean") {\n throw new Error(`${objectName} with value ${value} must be of type boolean.`);\n }\n }\n else if (typeName.match(/^Stream$/i) !== null) {\n const objectType = typeof value;\n if (objectType !== "string" &&\n objectType !== "function" &&\n !(value instanceof ArrayBuffer) &&\n !ArrayBuffer.isView(value) &&\n !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob)) {\n throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, or a function returning NodeJS.ReadableStream.`);\n }\n }\n }\n return value;\n}\nfunction serializeEnumType(objectName, allowedValues, value) {\n if (!allowedValues) {\n throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);\n }\n const isPresent = allowedValues.some((item) => {\n if (typeof item.valueOf() === "string") {\n return item.toLowerCase() === value.toLowerCase();\n }\n return item === value;\n });\n if (!isPresent) {\n throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);\n }\n return value;\n}\nfunction serializeByteArrayType(objectName, value) {\n let returnValue = "";\n if (value != undefined) {\n if (!(value instanceof Uint8Array)) {\n throw new Error(`${objectName} must be of type Uint8Array.`);\n }\n returnValue = encodeByteArray(value);\n }\n return returnValue;\n}\nfunction serializeBase64UrlType(objectName, value) {\n let returnValue = "";\n if (value != undefined) {\n if (!(value instanceof Uint8Array)) {\n throw new Error(`${objectName} must be of type Uint8Array.`);\n }\n returnValue = bufferToBase64Url(value) || "";\n }\n return returnValue;\n}\nfunction serializeDateTypes(typeName, value, objectName) {\n if (value != undefined) {\n if (typeName.match(/^Date$/i) !== null) {\n if (!(value instanceof Date ||\n (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {\n throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);\n }\n value =\n value instanceof Date\n ? value.toISOString().substring(0, 10)\n : new Date(value).toISOString().substring(0, 10);\n }\n else if (typeName.match(/^DateTime$/i) !== null) {\n if (!(value instanceof Date ||\n (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {\n throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);\n }\n value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();\n }\n else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {\n if (!(value instanceof Date ||\n (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {\n throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);\n }\n value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();\n }\n else if (typeName.match(/^UnixTime$/i) !== null) {\n if (!(value instanceof Date ||\n (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {\n throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +\n `for it to be serialized in UnixTime/Epoch format.`);\n }\n value = dateToUnixTime(value);\n }\n else if (typeName.match(/^TimeSpan$/i) !== null) {\n if (!isDuration(value)) {\n throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);\n }\n }\n }\n return value;\n}\nfunction serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {\n if (!Array.isArray(object)) {\n throw new Error(`${objectName} must be of type Array.`);\n }\n const elementType = mapper.type.element;\n if (!elementType || typeof elementType !== "object") {\n throw new Error(`element" metadata for an Array must be defined in the ` +\n `mapper and it must of type "object" in ${objectName}.`);\n }\n const tempArray = [];\n for (let i = 0; i < object.length; i++) {\n const serializedValue = serializer.serialize(elementType, object[i], objectName, options);\n if (isXml && elementType.xmlNamespace) {\n const xmlnsKey = elementType.xmlNamespacePrefix\n ? `xmlns:${elementType.xmlNamespacePrefix}`\n : "xmlns";\n if (elementType.type.name === "Composite") {\n tempArray[i] = Object.assign({}, serializedValue);\n tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };\n }\n else {\n tempArray[i] = {};\n tempArray[i][options.xmlCharKey] = serializedValue;\n tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };\n }\n }\n else {\n tempArray[i] = serializedValue;\n }\n }\n return tempArray;\n}\nfunction serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {\n if (typeof object !== "object") {\n throw new Error(`${objectName} must be of type object.`);\n }\n const valueType = mapper.type.value;\n if (!valueType || typeof valueType !== "object") {\n throw new Error(`"value" metadata for a Dictionary must be defined in the ` +\n `mapper and it must of type "object" in ${objectName}.`);\n }\n const tempDictionary = {};\n for (const key of Object.keys(object)) {\n const serializedValue = serializer.serialize(valueType, object[key], objectName, options);\n // If the element needs an XML namespace we need to add it within the $ property\n tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);\n }\n // Add the namespace to the root element if needed\n if (isXml && mapper.xmlNamespace) {\n const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";\n const result = tempDictionary;\n result[XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };\n return result;\n }\n return tempDictionary;\n}\n/**\n * Resolves the additionalProperties property from a referenced mapper.\n * @param serializer - The serializer containing the entire set of mappers.\n * @param mapper - The composite mapper to resolve.\n * @param objectName - Name of the object being serialized.\n */\nfunction resolveAdditionalProperties(serializer, mapper, objectName) {\n const additionalProperties = mapper.type.additionalProperties;\n if (!additionalProperties && mapper.type.className) {\n const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);\n return modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.additionalProperties;\n }\n return additionalProperties;\n}\n/**\n * Finds the mapper referenced by `className`.\n * @param serializer - The serializer containing the entire set of mappers\n * @param mapper - The composite mapper to resolve\n * @param objectName - Name of the object being serialized\n */\nfunction resolveReferencedMapper(serializer, mapper, objectName) {\n const className = mapper.type.className;\n if (!className) {\n throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);\n }\n return serializer.modelMappers[className];\n}\n/**\n * Resolves a composite mapper\'s modelProperties.\n * @param serializer - The serializer containing the entire set of mappers\n * @param mapper - The composite mapper to resolve\n */\nfunction resolveModelProperties(serializer, mapper, objectName) {\n let modelProps = mapper.type.modelProperties;\n if (!modelProps) {\n const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);\n if (!modelMapper) {\n throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);\n }\n modelProps = modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.modelProperties;\n if (!modelProps) {\n throw new Error(`modelProperties cannot be null or undefined in the ` +\n `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);\n }\n }\n return modelProps;\n}\nfunction serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {\n if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {\n mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");\n }\n if (object != undefined) {\n const payload = {};\n const modelProps = resolveModelProperties(serializer, mapper, objectName);\n for (const key of Object.keys(modelProps)) {\n const propertyMapper = modelProps[key];\n if (propertyMapper.readOnly) {\n continue;\n }\n let propName;\n let parentObject = payload;\n if (serializer.isXML) {\n if (propertyMapper.xmlIsWrapped) {\n propName = propertyMapper.xmlName;\n }\n else {\n propName = propertyMapper.xmlElementName || propertyMapper.xmlName;\n }\n }\n else {\n const paths = splitSerializeName(propertyMapper.serializedName);\n propName = paths.pop();\n for (const pathName of paths) {\n const childObject = parentObject[pathName];\n if (childObject == undefined &&\n (object[key] != undefined || propertyMapper.defaultValue !== undefined)) {\n parentObject[pathName] = {};\n }\n parentObject = parentObject[pathName];\n }\n }\n if (parentObject != undefined) {\n if (isXml && mapper.xmlNamespace) {\n const xmlnsKey = mapper.xmlNamespacePrefix\n ? `xmlns:${mapper.xmlNamespacePrefix}`\n : "xmlns";\n parentObject[XML_ATTRKEY] = Object.assign(Object.assign({}, parentObject[XML_ATTRKEY]), { [xmlnsKey]: mapper.xmlNamespace });\n }\n const propertyObjectName = propertyMapper.serializedName !== ""\n ? objectName + "." + propertyMapper.serializedName\n : objectName;\n let toSerialize = object[key];\n const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);\n if (polymorphicDiscriminator &&\n polymorphicDiscriminator.clientName === key &&\n toSerialize == undefined) {\n toSerialize = mapper.serializedName;\n }\n const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);\n if (serializedValue !== undefined && propName != undefined) {\n const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);\n if (isXml && propertyMapper.xmlIsAttribute) {\n // XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.\n // This keeps things simple while preventing name collision\n // with names in user documents.\n parentObject[XML_ATTRKEY] = parentObject[XML_ATTRKEY] || {};\n parentObject[XML_ATTRKEY][propName] = serializedValue;\n }\n else if (isXml && propertyMapper.xmlIsWrapped) {\n parentObject[propName] = { [propertyMapper.xmlElementName]: value };\n }\n else {\n parentObject[propName] = value;\n }\n }\n }\n }\n const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);\n if (additionalPropertiesMapper) {\n const propNames = Object.keys(modelProps);\n for (const clientPropName in object) {\n const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);\n if (isAdditionalProperty) {\n payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + \'["\' + clientPropName + \'"]\', options);\n }\n }\n }\n return payload;\n }\n return object;\n}\nfunction getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {\n if (!isXml || !propertyMapper.xmlNamespace) {\n return serializedValue;\n }\n const xmlnsKey = propertyMapper.xmlNamespacePrefix\n ? `xmlns:${propertyMapper.xmlNamespacePrefix}`\n : "xmlns";\n const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };\n if (["Composite"].includes(propertyMapper.type.name)) {\n if (serializedValue[XML_ATTRKEY]) {\n return serializedValue;\n }\n else {\n const result = Object.assign({}, serializedValue);\n result[XML_ATTRKEY] = xmlNamespace;\n return result;\n }\n }\n const result = {};\n result[options.xmlCharKey] = serializedValue;\n result[XML_ATTRKEY] = xmlNamespace;\n return result;\n}\nfunction isSpecialXmlProperty(propertyName, options) {\n return [XML_ATTRKEY, options.xmlCharKey].includes(propertyName);\n}\nfunction deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {\n var _a, _b;\n const xmlCharKey = (_a = options.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;\n if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {\n mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");\n }\n const modelProps = resolveModelProperties(serializer, mapper, objectName);\n let instance = {};\n const handledPropertyNames = [];\n for (const key of Object.keys(modelProps)) {\n const propertyMapper = modelProps[key];\n const paths = splitSerializeName(modelProps[key].serializedName);\n handledPropertyNames.push(paths[0]);\n const { serializedName, xmlName, xmlElementName } = propertyMapper;\n let propertyObjectName = objectName;\n if (serializedName !== "" && serializedName !== undefined) {\n propertyObjectName = objectName + "." + serializedName;\n }\n const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;\n if (headerCollectionPrefix) {\n const dictionary = {};\n for (const headerKey of Object.keys(responseBody)) {\n if (headerKey.startsWith(headerCollectionPrefix)) {\n dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);\n }\n handledPropertyNames.push(headerKey);\n }\n instance[key] = dictionary;\n }\n else if (serializer.isXML) {\n if (propertyMapper.xmlIsAttribute && responseBody[XML_ATTRKEY]) {\n instance[key] = serializer.deserialize(propertyMapper, responseBody[XML_ATTRKEY][xmlName], propertyObjectName, options);\n }\n else if (propertyMapper.xmlIsMsText) {\n if (responseBody[xmlCharKey] !== undefined) {\n instance[key] = responseBody[xmlCharKey];\n }\n else if (typeof responseBody === "string") {\n // The special case where xml parser parses "content" into JSON of\n // `{ name: "content"}` instead of `{ name: { "_": "content" }}`\n instance[key] = responseBody;\n }\n }\n else {\n const propertyName = xmlElementName || xmlName || serializedName;\n if (propertyMapper.xmlIsWrapped) {\n /* a list of wrapped by \n For the xml example below\n \n ...\n ...\n \n the responseBody has\n {\n Cors: {\n CorsRule: [{...}, {...}]\n }\n }\n xmlName is "Cors" and xmlElementName is"CorsRule".\n */\n const wrapped = responseBody[xmlName];\n const elementList = (_b = wrapped === null || wrapped === void 0 ? void 0 : wrapped[xmlElementName]) !== null && _b !== void 0 ? _b : [];\n instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options);\n handledPropertyNames.push(xmlName);\n }\n else {\n const property = responseBody[propertyName];\n instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);\n handledPropertyNames.push(propertyName);\n }\n }\n }\n else {\n // deserialize the property if it is present in the provided responseBody instance\n let propertyInstance;\n let res = responseBody;\n // traversing the object step by step.\n for (const item of paths) {\n if (!res)\n break;\n res = res[item];\n }\n propertyInstance = res;\n const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;\n // checking that the model property name (key)(ex: "fishtype") and the\n // clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")\n // instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")\n // is a better approach. The generator is not consistent with escaping \'\\.\' in the\n // serializedName of the property (ex: "fish\\.type") that is marked as polymorphic discriminator\n // and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,\n // the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and\n // the transformation of model property name (ex: "fishtype") is done consistently.\n // Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.\n if (polymorphicDiscriminator &&\n key === polymorphicDiscriminator.clientName &&\n propertyInstance == undefined) {\n propertyInstance = mapper.serializedName;\n }\n let serializedValue;\n // paging\n if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {\n propertyInstance = responseBody[key];\n const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);\n // Copy over any properties that have already been added into the instance, where they do\n // not exist on the newly de-serialized array\n for (const [k, v] of Object.entries(instance)) {\n if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {\n arrayInstance[k] = v;\n }\n }\n instance = arrayInstance;\n }\n else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {\n serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);\n instance[key] = serializedValue;\n }\n }\n }\n const additionalPropertiesMapper = mapper.type.additionalProperties;\n if (additionalPropertiesMapper) {\n const isAdditionalProperty = (responsePropName) => {\n for (const clientPropName in modelProps) {\n const paths = splitSerializeName(modelProps[clientPropName].serializedName);\n if (paths[0] === responsePropName) {\n return false;\n }\n }\n return true;\n };\n for (const responsePropName in responseBody) {\n if (isAdditionalProperty(responsePropName)) {\n instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + \'["\' + responsePropName + \'"]\', options);\n }\n }\n }\n else if (responseBody) {\n for (const key of Object.keys(responseBody)) {\n if (instance[key] === undefined &&\n !handledPropertyNames.includes(key) &&\n !isSpecialXmlProperty(key, options)) {\n instance[key] = responseBody[key];\n }\n }\n }\n return instance;\n}\nfunction deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {\n const value = mapper.type.value;\n if (!value || typeof value !== "object") {\n throw new Error(`"value" metadata for a Dictionary must be defined in the ` +\n `mapper and it must of type "object" in ${objectName}`);\n }\n if (responseBody) {\n const tempDictionary = {};\n for (const key of Object.keys(responseBody)) {\n tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);\n }\n return tempDictionary;\n }\n return responseBody;\n}\nfunction deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {\n const element = mapper.type.element;\n if (!element || typeof element !== "object") {\n throw new Error(`element" metadata for an Array must be defined in the ` +\n `mapper and it must of type "object" in ${objectName}`);\n }\n if (responseBody) {\n if (!Array.isArray(responseBody)) {\n // xml2js will interpret a single element array as just the element, so force it to be an array\n responseBody = [responseBody];\n }\n const tempArray = [];\n for (let i = 0; i < responseBody.length; i++) {\n tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);\n }\n return tempArray;\n }\n return responseBody;\n}\nfunction getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {\n const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);\n if (polymorphicDiscriminator) {\n const discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];\n if (discriminatorName != undefined) {\n const discriminatorValue = object[discriminatorName];\n if (discriminatorValue != undefined) {\n const typeName = mapper.type.uberParent || mapper.type.className;\n const indexDiscriminator = discriminatorValue === typeName\n ? discriminatorValue\n : typeName + "." + discriminatorValue;\n const polymorphicMapper = serializer.modelMappers.discriminators[indexDiscriminator];\n if (polymorphicMapper) {\n mapper = polymorphicMapper;\n }\n }\n }\n }\n return mapper;\n}\nfunction getPolymorphicDiscriminatorRecursively(serializer, mapper) {\n return (mapper.type.polymorphicDiscriminator ||\n getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||\n getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));\n}\nfunction getPolymorphicDiscriminatorSafely(serializer, typeName) {\n return (typeName &&\n serializer.modelMappers[typeName] &&\n serializer.modelMappers[typeName].type.polymorphicDiscriminator);\n}\n/**\n * Utility function that serializes an object that might contain binary information into a plain object, array or a string.\n */\nfunction serializeObject(toSerialize) {\n const castToSerialize = toSerialize;\n if (toSerialize == undefined)\n return undefined;\n if (toSerialize instanceof Uint8Array) {\n toSerialize = base64.encodeByteArray(toSerialize);\n return toSerialize;\n }\n else if (toSerialize instanceof Date) {\n return toSerialize.toISOString();\n }\n else if (Array.isArray(toSerialize)) {\n const array = [];\n for (let i = 0; i < toSerialize.length; i++) {\n array.push(serializeObject(toSerialize[i]));\n }\n return array;\n }\n else if (typeof toSerialize === "object") {\n const dictionary = {};\n for (const property in toSerialize) {\n dictionary[property] = serializeObject(castToSerialize[property]);\n }\n return dictionary;\n }\n return toSerialize;\n}\n/**\n * Utility function to create a K:V from a list of strings\n */\nfunction strEnum(o) {\n const result = {};\n for (const key of o) {\n result[key] = key;\n }\n return result;\n}\n/**\n * String enum containing the string types of property mappers.\n */\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nconst MapperType = strEnum([\n "Base64Url",\n "Boolean",\n "ByteArray",\n "Composite",\n "Date",\n "DateTime",\n "DateTimeRfc1123",\n "Dictionary",\n "Enum",\n "Number",\n "Object",\n "Sequence",\n "String",\n "Stream",\n "TimeSpan",\n "UnixTime",\n]);\n//# sourceMappingURL=serializer.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/models/mappers.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\nconst BlobServiceProperties = {\n serializedName: "BlobServiceProperties",\n xmlName: "StorageServiceProperties",\n type: {\n name: "Composite",\n className: "BlobServiceProperties",\n modelProperties: {\n blobAnalyticsLogging: {\n serializedName: "Logging",\n xmlName: "Logging",\n type: {\n name: "Composite",\n className: "Logging"\n }\n },\n hourMetrics: {\n serializedName: "HourMetrics",\n xmlName: "HourMetrics",\n type: {\n name: "Composite",\n className: "Metrics"\n }\n },\n minuteMetrics: {\n serializedName: "MinuteMetrics",\n xmlName: "MinuteMetrics",\n type: {\n name: "Composite",\n className: "Metrics"\n }\n },\n cors: {\n serializedName: "Cors",\n xmlName: "Cors",\n xmlIsWrapped: true,\n xmlElementName: "CorsRule",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "CorsRule"\n }\n }\n }\n },\n defaultServiceVersion: {\n serializedName: "DefaultServiceVersion",\n xmlName: "DefaultServiceVersion",\n type: {\n name: "String"\n }\n },\n deleteRetentionPolicy: {\n serializedName: "DeleteRetentionPolicy",\n xmlName: "DeleteRetentionPolicy",\n type: {\n name: "Composite",\n className: "RetentionPolicy"\n }\n },\n staticWebsite: {\n serializedName: "StaticWebsite",\n xmlName: "StaticWebsite",\n type: {\n name: "Composite",\n className: "StaticWebsite"\n }\n }\n }\n }\n};\nconst Logging = {\n serializedName: "Logging",\n type: {\n name: "Composite",\n className: "Logging",\n modelProperties: {\n version: {\n serializedName: "Version",\n required: true,\n xmlName: "Version",\n type: {\n name: "String"\n }\n },\n deleteProperty: {\n serializedName: "Delete",\n required: true,\n xmlName: "Delete",\n type: {\n name: "Boolean"\n }\n },\n read: {\n serializedName: "Read",\n required: true,\n xmlName: "Read",\n type: {\n name: "Boolean"\n }\n },\n write: {\n serializedName: "Write",\n required: true,\n xmlName: "Write",\n type: {\n name: "Boolean"\n }\n },\n retentionPolicy: {\n serializedName: "RetentionPolicy",\n xmlName: "RetentionPolicy",\n type: {\n name: "Composite",\n className: "RetentionPolicy"\n }\n }\n }\n }\n};\nconst RetentionPolicy = {\n serializedName: "RetentionPolicy",\n type: {\n name: "Composite",\n className: "RetentionPolicy",\n modelProperties: {\n enabled: {\n serializedName: "Enabled",\n required: true,\n xmlName: "Enabled",\n type: {\n name: "Boolean"\n }\n },\n days: {\n constraints: {\n InclusiveMinimum: 1\n },\n serializedName: "Days",\n xmlName: "Days",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst Metrics = {\n serializedName: "Metrics",\n type: {\n name: "Composite",\n className: "Metrics",\n modelProperties: {\n version: {\n serializedName: "Version",\n xmlName: "Version",\n type: {\n name: "String"\n }\n },\n enabled: {\n serializedName: "Enabled",\n required: true,\n xmlName: "Enabled",\n type: {\n name: "Boolean"\n }\n },\n includeAPIs: {\n serializedName: "IncludeAPIs",\n xmlName: "IncludeAPIs",\n type: {\n name: "Boolean"\n }\n },\n retentionPolicy: {\n serializedName: "RetentionPolicy",\n xmlName: "RetentionPolicy",\n type: {\n name: "Composite",\n className: "RetentionPolicy"\n }\n }\n }\n }\n};\nconst CorsRule = {\n serializedName: "CorsRule",\n type: {\n name: "Composite",\n className: "CorsRule",\n modelProperties: {\n allowedOrigins: {\n serializedName: "AllowedOrigins",\n required: true,\n xmlName: "AllowedOrigins",\n type: {\n name: "String"\n }\n },\n allowedMethods: {\n serializedName: "AllowedMethods",\n required: true,\n xmlName: "AllowedMethods",\n type: {\n name: "String"\n }\n },\n allowedHeaders: {\n serializedName: "AllowedHeaders",\n required: true,\n xmlName: "AllowedHeaders",\n type: {\n name: "String"\n }\n },\n exposedHeaders: {\n serializedName: "ExposedHeaders",\n required: true,\n xmlName: "ExposedHeaders",\n type: {\n name: "String"\n }\n },\n maxAgeInSeconds: {\n constraints: {\n InclusiveMinimum: 0\n },\n serializedName: "MaxAgeInSeconds",\n required: true,\n xmlName: "MaxAgeInSeconds",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst StaticWebsite = {\n serializedName: "StaticWebsite",\n type: {\n name: "Composite",\n className: "StaticWebsite",\n modelProperties: {\n enabled: {\n serializedName: "Enabled",\n required: true,\n xmlName: "Enabled",\n type: {\n name: "Boolean"\n }\n },\n indexDocument: {\n serializedName: "IndexDocument",\n xmlName: "IndexDocument",\n type: {\n name: "String"\n }\n },\n errorDocument404Path: {\n serializedName: "ErrorDocument404Path",\n xmlName: "ErrorDocument404Path",\n type: {\n name: "String"\n }\n },\n defaultIndexDocumentPath: {\n serializedName: "DefaultIndexDocumentPath",\n xmlName: "DefaultIndexDocumentPath",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst StorageError = {\n serializedName: "StorageError",\n type: {\n name: "Composite",\n className: "StorageError",\n modelProperties: {\n message: {\n serializedName: "Message",\n xmlName: "Message",\n type: {\n name: "String"\n }\n },\n code: {\n serializedName: "Code",\n xmlName: "Code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobServiceStatistics = {\n serializedName: "BlobServiceStatistics",\n xmlName: "StorageServiceStats",\n type: {\n name: "Composite",\n className: "BlobServiceStatistics",\n modelProperties: {\n geoReplication: {\n serializedName: "GeoReplication",\n xmlName: "GeoReplication",\n type: {\n name: "Composite",\n className: "GeoReplication"\n }\n }\n }\n }\n};\nconst GeoReplication = {\n serializedName: "GeoReplication",\n type: {\n name: "Composite",\n className: "GeoReplication",\n modelProperties: {\n status: {\n serializedName: "Status",\n required: true,\n xmlName: "Status",\n type: {\n name: "Enum",\n allowedValues: ["live", "bootstrap", "unavailable"]\n }\n },\n lastSyncOn: {\n serializedName: "LastSyncTime",\n required: true,\n xmlName: "LastSyncTime",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ListContainersSegmentResponse = {\n serializedName: "ListContainersSegmentResponse",\n xmlName: "EnumerationResults",\n type: {\n name: "Composite",\n className: "ListContainersSegmentResponse",\n modelProperties: {\n serviceEndpoint: {\n serializedName: "ServiceEndpoint",\n required: true,\n xmlName: "ServiceEndpoint",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n prefix: {\n serializedName: "Prefix",\n xmlName: "Prefix",\n type: {\n name: "String"\n }\n },\n marker: {\n serializedName: "Marker",\n xmlName: "Marker",\n type: {\n name: "String"\n }\n },\n maxPageSize: {\n serializedName: "MaxResults",\n xmlName: "MaxResults",\n type: {\n name: "Number"\n }\n },\n containerItems: {\n serializedName: "ContainerItems",\n required: true,\n xmlName: "Containers",\n xmlIsWrapped: true,\n xmlElementName: "Container",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "ContainerItem"\n }\n }\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerItem = {\n serializedName: "ContainerItem",\n xmlName: "Container",\n type: {\n name: "Composite",\n className: "ContainerItem",\n modelProperties: {\n name: {\n serializedName: "Name",\n required: true,\n xmlName: "Name",\n type: {\n name: "String"\n }\n },\n deleted: {\n serializedName: "Deleted",\n xmlName: "Deleted",\n type: {\n name: "Boolean"\n }\n },\n version: {\n serializedName: "Version",\n xmlName: "Version",\n type: {\n name: "String"\n }\n },\n properties: {\n serializedName: "Properties",\n xmlName: "Properties",\n type: {\n name: "Composite",\n className: "ContainerProperties"\n }\n },\n metadata: {\n serializedName: "Metadata",\n xmlName: "Metadata",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n }\n }\n }\n }\n};\nconst ContainerProperties = {\n serializedName: "ContainerProperties",\n type: {\n name: "Composite",\n className: "ContainerProperties",\n modelProperties: {\n lastModified: {\n serializedName: "Last-Modified",\n required: true,\n xmlName: "Last-Modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "Etag",\n required: true,\n xmlName: "Etag",\n type: {\n name: "String"\n }\n },\n leaseStatus: {\n serializedName: "LeaseStatus",\n xmlName: "LeaseStatus",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n leaseState: {\n serializedName: "LeaseState",\n xmlName: "LeaseState",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseDuration: {\n serializedName: "LeaseDuration",\n xmlName: "LeaseDuration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n publicAccess: {\n serializedName: "PublicAccess",\n xmlName: "PublicAccess",\n type: {\n name: "Enum",\n allowedValues: ["container", "blob"]\n }\n },\n hasImmutabilityPolicy: {\n serializedName: "HasImmutabilityPolicy",\n xmlName: "HasImmutabilityPolicy",\n type: {\n name: "Boolean"\n }\n },\n hasLegalHold: {\n serializedName: "HasLegalHold",\n xmlName: "HasLegalHold",\n type: {\n name: "Boolean"\n }\n },\n defaultEncryptionScope: {\n serializedName: "DefaultEncryptionScope",\n xmlName: "DefaultEncryptionScope",\n type: {\n name: "String"\n }\n },\n preventEncryptionScopeOverride: {\n serializedName: "DenyEncryptionScopeOverride",\n xmlName: "DenyEncryptionScopeOverride",\n type: {\n name: "Boolean"\n }\n },\n deletedOn: {\n serializedName: "DeletedTime",\n xmlName: "DeletedTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n remainingRetentionDays: {\n serializedName: "RemainingRetentionDays",\n xmlName: "RemainingRetentionDays",\n type: {\n name: "Number"\n }\n },\n isImmutableStorageWithVersioningEnabled: {\n serializedName: "ImmutableStorageWithVersioningEnabled",\n xmlName: "ImmutableStorageWithVersioningEnabled",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst KeyInfo = {\n serializedName: "KeyInfo",\n type: {\n name: "Composite",\n className: "KeyInfo",\n modelProperties: {\n startsOn: {\n serializedName: "Start",\n required: true,\n xmlName: "Start",\n type: {\n name: "String"\n }\n },\n expiresOn: {\n serializedName: "Expiry",\n required: true,\n xmlName: "Expiry",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst UserDelegationKey = {\n serializedName: "UserDelegationKey",\n type: {\n name: "Composite",\n className: "UserDelegationKey",\n modelProperties: {\n signedObjectId: {\n serializedName: "SignedOid",\n required: true,\n xmlName: "SignedOid",\n type: {\n name: "String"\n }\n },\n signedTenantId: {\n serializedName: "SignedTid",\n required: true,\n xmlName: "SignedTid",\n type: {\n name: "String"\n }\n },\n signedStartsOn: {\n serializedName: "SignedStart",\n required: true,\n xmlName: "SignedStart",\n type: {\n name: "String"\n }\n },\n signedExpiresOn: {\n serializedName: "SignedExpiry",\n required: true,\n xmlName: "SignedExpiry",\n type: {\n name: "String"\n }\n },\n signedService: {\n serializedName: "SignedService",\n required: true,\n xmlName: "SignedService",\n type: {\n name: "String"\n }\n },\n signedVersion: {\n serializedName: "SignedVersion",\n required: true,\n xmlName: "SignedVersion",\n type: {\n name: "String"\n }\n },\n value: {\n serializedName: "Value",\n required: true,\n xmlName: "Value",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst FilterBlobSegment = {\n serializedName: "FilterBlobSegment",\n xmlName: "EnumerationResults",\n type: {\n name: "Composite",\n className: "FilterBlobSegment",\n modelProperties: {\n serviceEndpoint: {\n serializedName: "ServiceEndpoint",\n required: true,\n xmlName: "ServiceEndpoint",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n where: {\n serializedName: "Where",\n required: true,\n xmlName: "Where",\n type: {\n name: "String"\n }\n },\n blobs: {\n serializedName: "Blobs",\n required: true,\n xmlName: "Blobs",\n xmlIsWrapped: true,\n xmlElementName: "Blob",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "FilterBlobItem"\n }\n }\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst FilterBlobItem = {\n serializedName: "FilterBlobItem",\n xmlName: "Blob",\n type: {\n name: "Composite",\n className: "FilterBlobItem",\n modelProperties: {\n name: {\n serializedName: "Name",\n required: true,\n xmlName: "Name",\n type: {\n name: "String"\n }\n },\n containerName: {\n serializedName: "ContainerName",\n required: true,\n xmlName: "ContainerName",\n type: {\n name: "String"\n }\n },\n tags: {\n serializedName: "Tags",\n xmlName: "Tags",\n type: {\n name: "Composite",\n className: "BlobTags"\n }\n }\n }\n }\n};\nconst BlobTags = {\n serializedName: "BlobTags",\n xmlName: "Tags",\n type: {\n name: "Composite",\n className: "BlobTags",\n modelProperties: {\n blobTagSet: {\n serializedName: "BlobTagSet",\n required: true,\n xmlName: "TagSet",\n xmlIsWrapped: true,\n xmlElementName: "Tag",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "BlobTag"\n }\n }\n }\n }\n }\n }\n};\nconst BlobTag = {\n serializedName: "BlobTag",\n xmlName: "Tag",\n type: {\n name: "Composite",\n className: "BlobTag",\n modelProperties: {\n key: {\n serializedName: "Key",\n required: true,\n xmlName: "Key",\n type: {\n name: "String"\n }\n },\n value: {\n serializedName: "Value",\n required: true,\n xmlName: "Value",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst SignedIdentifier = {\n serializedName: "SignedIdentifier",\n xmlName: "SignedIdentifier",\n type: {\n name: "Composite",\n className: "SignedIdentifier",\n modelProperties: {\n id: {\n serializedName: "Id",\n required: true,\n xmlName: "Id",\n type: {\n name: "String"\n }\n },\n accessPolicy: {\n serializedName: "AccessPolicy",\n xmlName: "AccessPolicy",\n type: {\n name: "Composite",\n className: "AccessPolicy"\n }\n }\n }\n }\n};\nconst AccessPolicy = {\n serializedName: "AccessPolicy",\n type: {\n name: "Composite",\n className: "AccessPolicy",\n modelProperties: {\n startsOn: {\n serializedName: "Start",\n xmlName: "Start",\n type: {\n name: "String"\n }\n },\n expiresOn: {\n serializedName: "Expiry",\n xmlName: "Expiry",\n type: {\n name: "String"\n }\n },\n permissions: {\n serializedName: "Permission",\n xmlName: "Permission",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ListBlobsFlatSegmentResponse = {\n serializedName: "ListBlobsFlatSegmentResponse",\n xmlName: "EnumerationResults",\n type: {\n name: "Composite",\n className: "ListBlobsFlatSegmentResponse",\n modelProperties: {\n serviceEndpoint: {\n serializedName: "ServiceEndpoint",\n required: true,\n xmlName: "ServiceEndpoint",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n containerName: {\n serializedName: "ContainerName",\n required: true,\n xmlName: "ContainerName",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n prefix: {\n serializedName: "Prefix",\n xmlName: "Prefix",\n type: {\n name: "String"\n }\n },\n marker: {\n serializedName: "Marker",\n xmlName: "Marker",\n type: {\n name: "String"\n }\n },\n maxPageSize: {\n serializedName: "MaxResults",\n xmlName: "MaxResults",\n type: {\n name: "Number"\n }\n },\n segment: {\n serializedName: "Segment",\n xmlName: "Blobs",\n type: {\n name: "Composite",\n className: "BlobFlatListSegment"\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobFlatListSegment = {\n serializedName: "BlobFlatListSegment",\n xmlName: "Blobs",\n type: {\n name: "Composite",\n className: "BlobFlatListSegment",\n modelProperties: {\n blobItems: {\n serializedName: "BlobItems",\n required: true,\n xmlName: "BlobItems",\n xmlElementName: "Blob",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "BlobItemInternal"\n }\n }\n }\n }\n }\n }\n};\nconst BlobItemInternal = {\n serializedName: "BlobItemInternal",\n xmlName: "Blob",\n type: {\n name: "Composite",\n className: "BlobItemInternal",\n modelProperties: {\n name: {\n serializedName: "Name",\n xmlName: "Name",\n type: {\n name: "Composite",\n className: "BlobName"\n }\n },\n deleted: {\n serializedName: "Deleted",\n required: true,\n xmlName: "Deleted",\n type: {\n name: "Boolean"\n }\n },\n snapshot: {\n serializedName: "Snapshot",\n required: true,\n xmlName: "Snapshot",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "VersionId",\n xmlName: "VersionId",\n type: {\n name: "String"\n }\n },\n isCurrentVersion: {\n serializedName: "IsCurrentVersion",\n xmlName: "IsCurrentVersion",\n type: {\n name: "Boolean"\n }\n },\n properties: {\n serializedName: "Properties",\n xmlName: "Properties",\n type: {\n name: "Composite",\n className: "BlobPropertiesInternal"\n }\n },\n metadata: {\n serializedName: "Metadata",\n xmlName: "Metadata",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n }\n },\n blobTags: {\n serializedName: "BlobTags",\n xmlName: "Tags",\n type: {\n name: "Composite",\n className: "BlobTags"\n }\n },\n objectReplicationMetadata: {\n serializedName: "ObjectReplicationMetadata",\n xmlName: "OrMetadata",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n }\n },\n hasVersionsOnly: {\n serializedName: "HasVersionsOnly",\n xmlName: "HasVersionsOnly",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst BlobName = {\n serializedName: "BlobName",\n type: {\n name: "Composite",\n className: "BlobName",\n modelProperties: {\n encoded: {\n serializedName: "Encoded",\n xmlName: "Encoded",\n xmlIsAttribute: true,\n type: {\n name: "Boolean"\n }\n },\n content: {\n serializedName: "content",\n xmlName: "content",\n xmlIsMsText: true,\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobPropertiesInternal = {\n serializedName: "BlobPropertiesInternal",\n xmlName: "Properties",\n type: {\n name: "Composite",\n className: "BlobPropertiesInternal",\n modelProperties: {\n createdOn: {\n serializedName: "Creation-Time",\n xmlName: "Creation-Time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n lastModified: {\n serializedName: "Last-Modified",\n required: true,\n xmlName: "Last-Modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "Etag",\n required: true,\n xmlName: "Etag",\n type: {\n name: "String"\n }\n },\n contentLength: {\n serializedName: "Content-Length",\n xmlName: "Content-Length",\n type: {\n name: "Number"\n }\n },\n contentType: {\n serializedName: "Content-Type",\n xmlName: "Content-Type",\n type: {\n name: "String"\n }\n },\n contentEncoding: {\n serializedName: "Content-Encoding",\n xmlName: "Content-Encoding",\n type: {\n name: "String"\n }\n },\n contentLanguage: {\n serializedName: "Content-Language",\n xmlName: "Content-Language",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "Content-MD5",\n xmlName: "Content-MD5",\n type: {\n name: "ByteArray"\n }\n },\n contentDisposition: {\n serializedName: "Content-Disposition",\n xmlName: "Content-Disposition",\n type: {\n name: "String"\n }\n },\n cacheControl: {\n serializedName: "Cache-Control",\n xmlName: "Cache-Control",\n type: {\n name: "String"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n blobType: {\n serializedName: "BlobType",\n xmlName: "BlobType",\n type: {\n name: "Enum",\n allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"]\n }\n },\n leaseStatus: {\n serializedName: "LeaseStatus",\n xmlName: "LeaseStatus",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n leaseState: {\n serializedName: "LeaseState",\n xmlName: "LeaseState",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseDuration: {\n serializedName: "LeaseDuration",\n xmlName: "LeaseDuration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n copyId: {\n serializedName: "CopyId",\n xmlName: "CopyId",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "CopyStatus",\n xmlName: "CopyStatus",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n copySource: {\n serializedName: "CopySource",\n xmlName: "CopySource",\n type: {\n name: "String"\n }\n },\n copyProgress: {\n serializedName: "CopyProgress",\n xmlName: "CopyProgress",\n type: {\n name: "String"\n }\n },\n copyCompletedOn: {\n serializedName: "CopyCompletionTime",\n xmlName: "CopyCompletionTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyStatusDescription: {\n serializedName: "CopyStatusDescription",\n xmlName: "CopyStatusDescription",\n type: {\n name: "String"\n }\n },\n serverEncrypted: {\n serializedName: "ServerEncrypted",\n xmlName: "ServerEncrypted",\n type: {\n name: "Boolean"\n }\n },\n incrementalCopy: {\n serializedName: "IncrementalCopy",\n xmlName: "IncrementalCopy",\n type: {\n name: "Boolean"\n }\n },\n destinationSnapshot: {\n serializedName: "DestinationSnapshot",\n xmlName: "DestinationSnapshot",\n type: {\n name: "String"\n }\n },\n deletedOn: {\n serializedName: "DeletedTime",\n xmlName: "DeletedTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n remainingRetentionDays: {\n serializedName: "RemainingRetentionDays",\n xmlName: "RemainingRetentionDays",\n type: {\n name: "Number"\n }\n },\n accessTier: {\n serializedName: "AccessTier",\n xmlName: "AccessTier",\n type: {\n name: "Enum",\n allowedValues: [\n "P4",\n "P6",\n "P10",\n "P15",\n "P20",\n "P30",\n "P40",\n "P50",\n "P60",\n "P70",\n "P80",\n "Hot",\n "Cool",\n "Archive",\n "Cold"\n ]\n }\n },\n accessTierInferred: {\n serializedName: "AccessTierInferred",\n xmlName: "AccessTierInferred",\n type: {\n name: "Boolean"\n }\n },\n archiveStatus: {\n serializedName: "ArchiveStatus",\n xmlName: "ArchiveStatus",\n type: {\n name: "Enum",\n allowedValues: [\n "rehydrate-pending-to-hot",\n "rehydrate-pending-to-cool",\n "rehydrate-pending-to-cold"\n ]\n }\n },\n customerProvidedKeySha256: {\n serializedName: "CustomerProvidedKeySha256",\n xmlName: "CustomerProvidedKeySha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "EncryptionScope",\n xmlName: "EncryptionScope",\n type: {\n name: "String"\n }\n },\n accessTierChangedOn: {\n serializedName: "AccessTierChangeTime",\n xmlName: "AccessTierChangeTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n tagCount: {\n serializedName: "TagCount",\n xmlName: "TagCount",\n type: {\n name: "Number"\n }\n },\n expiresOn: {\n serializedName: "Expiry-Time",\n xmlName: "Expiry-Time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isSealed: {\n serializedName: "Sealed",\n xmlName: "Sealed",\n type: {\n name: "Boolean"\n }\n },\n rehydratePriority: {\n serializedName: "RehydratePriority",\n xmlName: "RehydratePriority",\n type: {\n name: "Enum",\n allowedValues: ["High", "Standard"]\n }\n },\n lastAccessedOn: {\n serializedName: "LastAccessTime",\n xmlName: "LastAccessTime",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyExpiresOn: {\n serializedName: "ImmutabilityPolicyUntilDate",\n xmlName: "ImmutabilityPolicyUntilDate",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyMode: {\n serializedName: "ImmutabilityPolicyMode",\n xmlName: "ImmutabilityPolicyMode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n },\n legalHold: {\n serializedName: "LegalHold",\n xmlName: "LegalHold",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst ListBlobsHierarchySegmentResponse = {\n serializedName: "ListBlobsHierarchySegmentResponse",\n xmlName: "EnumerationResults",\n type: {\n name: "Composite",\n className: "ListBlobsHierarchySegmentResponse",\n modelProperties: {\n serviceEndpoint: {\n serializedName: "ServiceEndpoint",\n required: true,\n xmlName: "ServiceEndpoint",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n containerName: {\n serializedName: "ContainerName",\n required: true,\n xmlName: "ContainerName",\n xmlIsAttribute: true,\n type: {\n name: "String"\n }\n },\n prefix: {\n serializedName: "Prefix",\n xmlName: "Prefix",\n type: {\n name: "String"\n }\n },\n marker: {\n serializedName: "Marker",\n xmlName: "Marker",\n type: {\n name: "String"\n }\n },\n maxPageSize: {\n serializedName: "MaxResults",\n xmlName: "MaxResults",\n type: {\n name: "Number"\n }\n },\n delimiter: {\n serializedName: "Delimiter",\n xmlName: "Delimiter",\n type: {\n name: "String"\n }\n },\n segment: {\n serializedName: "Segment",\n xmlName: "Blobs",\n type: {\n name: "Composite",\n className: "BlobHierarchyListSegment"\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobHierarchyListSegment = {\n serializedName: "BlobHierarchyListSegment",\n xmlName: "Blobs",\n type: {\n name: "Composite",\n className: "BlobHierarchyListSegment",\n modelProperties: {\n blobPrefixes: {\n serializedName: "BlobPrefixes",\n xmlName: "BlobPrefixes",\n xmlElementName: "BlobPrefix",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "BlobPrefix"\n }\n }\n }\n },\n blobItems: {\n serializedName: "BlobItems",\n required: true,\n xmlName: "BlobItems",\n xmlElementName: "Blob",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "BlobItemInternal"\n }\n }\n }\n }\n }\n }\n};\nconst BlobPrefix = {\n serializedName: "BlobPrefix",\n type: {\n name: "Composite",\n className: "BlobPrefix",\n modelProperties: {\n name: {\n serializedName: "Name",\n xmlName: "Name",\n type: {\n name: "Composite",\n className: "BlobName"\n }\n }\n }\n }\n};\nconst BlockLookupList = {\n serializedName: "BlockLookupList",\n xmlName: "BlockList",\n type: {\n name: "Composite",\n className: "BlockLookupList",\n modelProperties: {\n committed: {\n serializedName: "Committed",\n xmlName: "Committed",\n xmlElementName: "Committed",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "String"\n }\n }\n }\n },\n uncommitted: {\n serializedName: "Uncommitted",\n xmlName: "Uncommitted",\n xmlElementName: "Uncommitted",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "String"\n }\n }\n }\n },\n latest: {\n serializedName: "Latest",\n xmlName: "Latest",\n xmlElementName: "Latest",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "String"\n }\n }\n }\n }\n }\n }\n};\nconst BlockList = {\n serializedName: "BlockList",\n type: {\n name: "Composite",\n className: "BlockList",\n modelProperties: {\n committedBlocks: {\n serializedName: "CommittedBlocks",\n xmlName: "CommittedBlocks",\n xmlIsWrapped: true,\n xmlElementName: "Block",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "Block"\n }\n }\n }\n },\n uncommittedBlocks: {\n serializedName: "UncommittedBlocks",\n xmlName: "UncommittedBlocks",\n xmlIsWrapped: true,\n xmlElementName: "Block",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "Block"\n }\n }\n }\n }\n }\n }\n};\nconst Block = {\n serializedName: "Block",\n type: {\n name: "Composite",\n className: "Block",\n modelProperties: {\n name: {\n serializedName: "Name",\n required: true,\n xmlName: "Name",\n type: {\n name: "String"\n }\n },\n size: {\n serializedName: "Size",\n required: true,\n xmlName: "Size",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst PageList = {\n serializedName: "PageList",\n type: {\n name: "Composite",\n className: "PageList",\n modelProperties: {\n pageRange: {\n serializedName: "PageRange",\n xmlName: "PageRange",\n xmlElementName: "PageRange",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "PageRange"\n }\n }\n }\n },\n clearRange: {\n serializedName: "ClearRange",\n xmlName: "ClearRange",\n xmlElementName: "ClearRange",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "ClearRange"\n }\n }\n }\n },\n continuationToken: {\n serializedName: "NextMarker",\n xmlName: "NextMarker",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageRange = {\n serializedName: "PageRange",\n xmlName: "PageRange",\n type: {\n name: "Composite",\n className: "PageRange",\n modelProperties: {\n start: {\n serializedName: "Start",\n required: true,\n xmlName: "Start",\n type: {\n name: "Number"\n }\n },\n end: {\n serializedName: "End",\n required: true,\n xmlName: "End",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst ClearRange = {\n serializedName: "ClearRange",\n xmlName: "ClearRange",\n type: {\n name: "Composite",\n className: "ClearRange",\n modelProperties: {\n start: {\n serializedName: "Start",\n required: true,\n xmlName: "Start",\n type: {\n name: "Number"\n }\n },\n end: {\n serializedName: "End",\n required: true,\n xmlName: "End",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst QueryRequest = {\n serializedName: "QueryRequest",\n xmlName: "QueryRequest",\n type: {\n name: "Composite",\n className: "QueryRequest",\n modelProperties: {\n queryType: {\n serializedName: "QueryType",\n required: true,\n xmlName: "QueryType",\n type: {\n name: "String"\n }\n },\n expression: {\n serializedName: "Expression",\n required: true,\n xmlName: "Expression",\n type: {\n name: "String"\n }\n },\n inputSerialization: {\n serializedName: "InputSerialization",\n xmlName: "InputSerialization",\n type: {\n name: "Composite",\n className: "QuerySerialization"\n }\n },\n outputSerialization: {\n serializedName: "OutputSerialization",\n xmlName: "OutputSerialization",\n type: {\n name: "Composite",\n className: "QuerySerialization"\n }\n }\n }\n }\n};\nconst QuerySerialization = {\n serializedName: "QuerySerialization",\n type: {\n name: "Composite",\n className: "QuerySerialization",\n modelProperties: {\n format: {\n serializedName: "Format",\n xmlName: "Format",\n type: {\n name: "Composite",\n className: "QueryFormat"\n }\n }\n }\n }\n};\nconst QueryFormat = {\n serializedName: "QueryFormat",\n type: {\n name: "Composite",\n className: "QueryFormat",\n modelProperties: {\n type: {\n serializedName: "Type",\n required: true,\n xmlName: "Type",\n type: {\n name: "Enum",\n allowedValues: ["delimited", "json", "arrow", "parquet"]\n }\n },\n delimitedTextConfiguration: {\n serializedName: "DelimitedTextConfiguration",\n xmlName: "DelimitedTextConfiguration",\n type: {\n name: "Composite",\n className: "DelimitedTextConfiguration"\n }\n },\n jsonTextConfiguration: {\n serializedName: "JsonTextConfiguration",\n xmlName: "JsonTextConfiguration",\n type: {\n name: "Composite",\n className: "JsonTextConfiguration"\n }\n },\n arrowConfiguration: {\n serializedName: "ArrowConfiguration",\n xmlName: "ArrowConfiguration",\n type: {\n name: "Composite",\n className: "ArrowConfiguration"\n }\n },\n parquetTextConfiguration: {\n serializedName: "ParquetTextConfiguration",\n xmlName: "ParquetTextConfiguration",\n type: {\n name: "any"\n }\n }\n }\n }\n};\nconst DelimitedTextConfiguration = {\n serializedName: "DelimitedTextConfiguration",\n xmlName: "DelimitedTextConfiguration",\n type: {\n name: "Composite",\n className: "DelimitedTextConfiguration",\n modelProperties: {\n columnSeparator: {\n serializedName: "ColumnSeparator",\n xmlName: "ColumnSeparator",\n type: {\n name: "String"\n }\n },\n fieldQuote: {\n serializedName: "FieldQuote",\n xmlName: "FieldQuote",\n type: {\n name: "String"\n }\n },\n recordSeparator: {\n serializedName: "RecordSeparator",\n xmlName: "RecordSeparator",\n type: {\n name: "String"\n }\n },\n escapeChar: {\n serializedName: "EscapeChar",\n xmlName: "EscapeChar",\n type: {\n name: "String"\n }\n },\n headersPresent: {\n serializedName: "HeadersPresent",\n xmlName: "HasHeaders",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst JsonTextConfiguration = {\n serializedName: "JsonTextConfiguration",\n xmlName: "JsonTextConfiguration",\n type: {\n name: "Composite",\n className: "JsonTextConfiguration",\n modelProperties: {\n recordSeparator: {\n serializedName: "RecordSeparator",\n xmlName: "RecordSeparator",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ArrowConfiguration = {\n serializedName: "ArrowConfiguration",\n xmlName: "ArrowConfiguration",\n type: {\n name: "Composite",\n className: "ArrowConfiguration",\n modelProperties: {\n schema: {\n serializedName: "Schema",\n required: true,\n xmlName: "Schema",\n xmlIsWrapped: true,\n xmlElementName: "Field",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "ArrowField"\n }\n }\n }\n }\n }\n }\n};\nconst ArrowField = {\n serializedName: "ArrowField",\n xmlName: "Field",\n type: {\n name: "Composite",\n className: "ArrowField",\n modelProperties: {\n type: {\n serializedName: "Type",\n required: true,\n xmlName: "Type",\n type: {\n name: "String"\n }\n },\n name: {\n serializedName: "Name",\n xmlName: "Name",\n type: {\n name: "String"\n }\n },\n precision: {\n serializedName: "Precision",\n xmlName: "Precision",\n type: {\n name: "Number"\n }\n },\n scale: {\n serializedName: "Scale",\n xmlName: "Scale",\n type: {\n name: "Number"\n }\n }\n }\n }\n};\nconst ServiceSetPropertiesHeaders = {\n serializedName: "Service_setPropertiesHeaders",\n type: {\n name: "Composite",\n className: "ServiceSetPropertiesHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceSetPropertiesExceptionHeaders = {\n serializedName: "Service_setPropertiesExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceSetPropertiesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetPropertiesHeaders = {\n serializedName: "Service_getPropertiesHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetPropertiesHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetPropertiesExceptionHeaders = {\n serializedName: "Service_getPropertiesExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetPropertiesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetStatisticsHeaders = {\n serializedName: "Service_getStatisticsHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetStatisticsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetStatisticsExceptionHeaders = {\n serializedName: "Service_getStatisticsExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetStatisticsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceListContainersSegmentHeaders = {\n serializedName: "Service_listContainersSegmentHeaders",\n type: {\n name: "Composite",\n className: "ServiceListContainersSegmentHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceListContainersSegmentExceptionHeaders = {\n serializedName: "Service_listContainersSegmentExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceListContainersSegmentExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetUserDelegationKeyHeaders = {\n serializedName: "Service_getUserDelegationKeyHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetUserDelegationKeyHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetUserDelegationKeyExceptionHeaders = {\n serializedName: "Service_getUserDelegationKeyExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetUserDelegationKeyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetAccountInfoHeaders = {\n serializedName: "Service_getAccountInfoHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetAccountInfoHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n skuName: {\n serializedName: "x-ms-sku-name",\n xmlName: "x-ms-sku-name",\n type: {\n name: "Enum",\n allowedValues: [\n "Standard_LRS",\n "Standard_GRS",\n "Standard_RAGRS",\n "Standard_ZRS",\n "Premium_LRS"\n ]\n }\n },\n accountKind: {\n serializedName: "x-ms-account-kind",\n xmlName: "x-ms-account-kind",\n type: {\n name: "Enum",\n allowedValues: [\n "Storage",\n "BlobStorage",\n "StorageV2",\n "FileStorage",\n "BlockBlobStorage"\n ]\n }\n },\n isHierarchicalNamespaceEnabled: {\n serializedName: "x-ms-is-hns-enabled",\n xmlName: "x-ms-is-hns-enabled",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceGetAccountInfoExceptionHeaders = {\n serializedName: "Service_getAccountInfoExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceGetAccountInfoExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceSubmitBatchHeaders = {\n serializedName: "Service_submitBatchHeaders",\n type: {\n name: "Composite",\n className: "ServiceSubmitBatchHeaders",\n modelProperties: {\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceSubmitBatchExceptionHeaders = {\n serializedName: "Service_submitBatchExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceSubmitBatchExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceFilterBlobsHeaders = {\n serializedName: "Service_filterBlobsHeaders",\n type: {\n name: "Composite",\n className: "ServiceFilterBlobsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ServiceFilterBlobsExceptionHeaders = {\n serializedName: "Service_filterBlobsExceptionHeaders",\n type: {\n name: "Composite",\n className: "ServiceFilterBlobsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerCreateHeaders = {\n serializedName: "Container_createHeaders",\n type: {\n name: "Composite",\n className: "ContainerCreateHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerCreateExceptionHeaders = {\n serializedName: "Container_createExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerCreateExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetPropertiesHeaders = {\n serializedName: "Container_getPropertiesHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetPropertiesHeaders",\n modelProperties: {\n metadata: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-meta-"\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseDuration: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n leaseState: {\n serializedName: "x-ms-lease-state",\n xmlName: "x-ms-lease-state",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseStatus: {\n serializedName: "x-ms-lease-status",\n xmlName: "x-ms-lease-status",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobPublicAccess: {\n serializedName: "x-ms-blob-public-access",\n xmlName: "x-ms-blob-public-access",\n type: {\n name: "Enum",\n allowedValues: ["container", "blob"]\n }\n },\n hasImmutabilityPolicy: {\n serializedName: "x-ms-has-immutability-policy",\n xmlName: "x-ms-has-immutability-policy",\n type: {\n name: "Boolean"\n }\n },\n hasLegalHold: {\n serializedName: "x-ms-has-legal-hold",\n xmlName: "x-ms-has-legal-hold",\n type: {\n name: "Boolean"\n }\n },\n defaultEncryptionScope: {\n serializedName: "x-ms-default-encryption-scope",\n xmlName: "x-ms-default-encryption-scope",\n type: {\n name: "String"\n }\n },\n denyEncryptionScopeOverride: {\n serializedName: "x-ms-deny-encryption-scope-override",\n xmlName: "x-ms-deny-encryption-scope-override",\n type: {\n name: "Boolean"\n }\n },\n isImmutableStorageWithVersioningEnabled: {\n serializedName: "x-ms-immutable-storage-with-versioning-enabled",\n xmlName: "x-ms-immutable-storage-with-versioning-enabled",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetPropertiesExceptionHeaders = {\n serializedName: "Container_getPropertiesExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetPropertiesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerDeleteHeaders = {\n serializedName: "Container_deleteHeaders",\n type: {\n name: "Composite",\n className: "ContainerDeleteHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerDeleteExceptionHeaders = {\n serializedName: "Container_deleteExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerDeleteExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSetMetadataHeaders = {\n serializedName: "Container_setMetadataHeaders",\n type: {\n name: "Composite",\n className: "ContainerSetMetadataHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSetMetadataExceptionHeaders = {\n serializedName: "Container_setMetadataExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerSetMetadataExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetAccessPolicyHeaders = {\n serializedName: "Container_getAccessPolicyHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetAccessPolicyHeaders",\n modelProperties: {\n blobPublicAccess: {\n serializedName: "x-ms-blob-public-access",\n xmlName: "x-ms-blob-public-access",\n type: {\n name: "Enum",\n allowedValues: ["container", "blob"]\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetAccessPolicyExceptionHeaders = {\n serializedName: "Container_getAccessPolicyExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetAccessPolicyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSetAccessPolicyHeaders = {\n serializedName: "Container_setAccessPolicyHeaders",\n type: {\n name: "Composite",\n className: "ContainerSetAccessPolicyHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSetAccessPolicyExceptionHeaders = {\n serializedName: "Container_setAccessPolicyExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerSetAccessPolicyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRestoreHeaders = {\n serializedName: "Container_restoreHeaders",\n type: {\n name: "Composite",\n className: "ContainerRestoreHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRestoreExceptionHeaders = {\n serializedName: "Container_restoreExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerRestoreExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRenameHeaders = {\n serializedName: "Container_renameHeaders",\n type: {\n name: "Composite",\n className: "ContainerRenameHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRenameExceptionHeaders = {\n serializedName: "Container_renameExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerRenameExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSubmitBatchHeaders = {\n serializedName: "Container_submitBatchHeaders",\n type: {\n name: "Composite",\n className: "ContainerSubmitBatchHeaders",\n modelProperties: {\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerSubmitBatchExceptionHeaders = {\n serializedName: "Container_submitBatchExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerSubmitBatchExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerFilterBlobsHeaders = {\n serializedName: "Container_filterBlobsHeaders",\n type: {\n name: "Composite",\n className: "ContainerFilterBlobsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerFilterBlobsExceptionHeaders = {\n serializedName: "Container_filterBlobsExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerFilterBlobsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerAcquireLeaseHeaders = {\n serializedName: "Container_acquireLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerAcquireLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerAcquireLeaseExceptionHeaders = {\n serializedName: "Container_acquireLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerAcquireLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerReleaseLeaseHeaders = {\n serializedName: "Container_releaseLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerReleaseLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerReleaseLeaseExceptionHeaders = {\n serializedName: "Container_releaseLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerReleaseLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerRenewLeaseHeaders = {\n serializedName: "Container_renewLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerRenewLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerRenewLeaseExceptionHeaders = {\n serializedName: "Container_renewLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerRenewLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerBreakLeaseHeaders = {\n serializedName: "Container_breakLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerBreakLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseTime: {\n serializedName: "x-ms-lease-time",\n xmlName: "x-ms-lease-time",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerBreakLeaseExceptionHeaders = {\n serializedName: "Container_breakLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerBreakLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerChangeLeaseHeaders = {\n serializedName: "Container_changeLeaseHeaders",\n type: {\n name: "Composite",\n className: "ContainerChangeLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst ContainerChangeLeaseExceptionHeaders = {\n serializedName: "Container_changeLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerChangeLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerListBlobFlatSegmentHeaders = {\n serializedName: "Container_listBlobFlatSegmentHeaders",\n type: {\n name: "Composite",\n className: "ContainerListBlobFlatSegmentHeaders",\n modelProperties: {\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerListBlobFlatSegmentExceptionHeaders = {\n serializedName: "Container_listBlobFlatSegmentExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerListBlobFlatSegmentExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerListBlobHierarchySegmentHeaders = {\n serializedName: "Container_listBlobHierarchySegmentHeaders",\n type: {\n name: "Composite",\n className: "ContainerListBlobHierarchySegmentHeaders",\n modelProperties: {\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerListBlobHierarchySegmentExceptionHeaders = {\n serializedName: "Container_listBlobHierarchySegmentExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerListBlobHierarchySegmentExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst ContainerGetAccountInfoHeaders = {\n serializedName: "Container_getAccountInfoHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetAccountInfoHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n skuName: {\n serializedName: "x-ms-sku-name",\n xmlName: "x-ms-sku-name",\n type: {\n name: "Enum",\n allowedValues: [\n "Standard_LRS",\n "Standard_GRS",\n "Standard_RAGRS",\n "Standard_ZRS",\n "Premium_LRS"\n ]\n }\n },\n accountKind: {\n serializedName: "x-ms-account-kind",\n xmlName: "x-ms-account-kind",\n type: {\n name: "Enum",\n allowedValues: [\n "Storage",\n "BlobStorage",\n "StorageV2",\n "FileStorage",\n "BlockBlobStorage"\n ]\n }\n }\n }\n }\n};\nconst ContainerGetAccountInfoExceptionHeaders = {\n serializedName: "Container_getAccountInfoExceptionHeaders",\n type: {\n name: "Composite",\n className: "ContainerGetAccountInfoExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobDownloadHeaders = {\n serializedName: "Blob_downloadHeaders",\n type: {\n name: "Composite",\n className: "BlobDownloadHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n createdOn: {\n serializedName: "x-ms-creation-time",\n xmlName: "x-ms-creation-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n metadata: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-meta-"\n },\n objectReplicationPolicyId: {\n serializedName: "x-ms-or-policy-id",\n xmlName: "x-ms-or-policy-id",\n type: {\n name: "String"\n }\n },\n objectReplicationRules: {\n serializedName: "x-ms-or",\n xmlName: "x-ms-or",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-or-"\n },\n contentLength: {\n serializedName: "content-length",\n xmlName: "content-length",\n type: {\n name: "Number"\n }\n },\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n contentRange: {\n serializedName: "content-range",\n xmlName: "content-range",\n type: {\n name: "String"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n contentEncoding: {\n serializedName: "content-encoding",\n xmlName: "content-encoding",\n type: {\n name: "String"\n }\n },\n cacheControl: {\n serializedName: "cache-control",\n xmlName: "cache-control",\n type: {\n name: "String"\n }\n },\n contentDisposition: {\n serializedName: "content-disposition",\n xmlName: "content-disposition",\n type: {\n name: "String"\n }\n },\n contentLanguage: {\n serializedName: "content-language",\n xmlName: "content-language",\n type: {\n name: "String"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n blobType: {\n serializedName: "x-ms-blob-type",\n xmlName: "x-ms-blob-type",\n type: {\n name: "Enum",\n allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"]\n }\n },\n copyCompletedOn: {\n serializedName: "x-ms-copy-completion-time",\n xmlName: "x-ms-copy-completion-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyStatusDescription: {\n serializedName: "x-ms-copy-status-description",\n xmlName: "x-ms-copy-status-description",\n type: {\n name: "String"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyProgress: {\n serializedName: "x-ms-copy-progress",\n xmlName: "x-ms-copy-progress",\n type: {\n name: "String"\n }\n },\n copySource: {\n serializedName: "x-ms-copy-source",\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n leaseDuration: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n leaseState: {\n serializedName: "x-ms-lease-state",\n xmlName: "x-ms-lease-state",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseStatus: {\n serializedName: "x-ms-lease-status",\n xmlName: "x-ms-lease-status",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n isCurrentVersion: {\n serializedName: "x-ms-is-current-version",\n xmlName: "x-ms-is-current-version",\n type: {\n name: "Boolean"\n }\n },\n acceptRanges: {\n serializedName: "accept-ranges",\n xmlName: "accept-ranges",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-server-encrypted",\n xmlName: "x-ms-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n blobContentMD5: {\n serializedName: "x-ms-blob-content-md5",\n xmlName: "x-ms-blob-content-md5",\n type: {\n name: "ByteArray"\n }\n },\n tagCount: {\n serializedName: "x-ms-tag-count",\n xmlName: "x-ms-tag-count",\n type: {\n name: "Number"\n }\n },\n isSealed: {\n serializedName: "x-ms-blob-sealed",\n xmlName: "x-ms-blob-sealed",\n type: {\n name: "Boolean"\n }\n },\n lastAccessed: {\n serializedName: "x-ms-last-access-time",\n xmlName: "x-ms-last-access-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyExpiresOn: {\n serializedName: "x-ms-immutability-policy-until-date",\n xmlName: "x-ms-immutability-policy-until-date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyMode: {\n serializedName: "x-ms-immutability-policy-mode",\n xmlName: "x-ms-immutability-policy-mode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n },\n legalHold: {\n serializedName: "x-ms-legal-hold",\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n },\n contentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n }\n }\n }\n};\nconst BlobDownloadExceptionHeaders = {\n serializedName: "Blob_downloadExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobDownloadExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetPropertiesHeaders = {\n serializedName: "Blob_getPropertiesHeaders",\n type: {\n name: "Composite",\n className: "BlobGetPropertiesHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n createdOn: {\n serializedName: "x-ms-creation-time",\n xmlName: "x-ms-creation-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n metadata: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-meta-"\n },\n objectReplicationPolicyId: {\n serializedName: "x-ms-or-policy-id",\n xmlName: "x-ms-or-policy-id",\n type: {\n name: "String"\n }\n },\n objectReplicationRules: {\n serializedName: "x-ms-or",\n xmlName: "x-ms-or",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-or-"\n },\n blobType: {\n serializedName: "x-ms-blob-type",\n xmlName: "x-ms-blob-type",\n type: {\n name: "Enum",\n allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"]\n }\n },\n copyCompletedOn: {\n serializedName: "x-ms-copy-completion-time",\n xmlName: "x-ms-copy-completion-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyStatusDescription: {\n serializedName: "x-ms-copy-status-description",\n xmlName: "x-ms-copy-status-description",\n type: {\n name: "String"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyProgress: {\n serializedName: "x-ms-copy-progress",\n xmlName: "x-ms-copy-progress",\n type: {\n name: "String"\n }\n },\n copySource: {\n serializedName: "x-ms-copy-source",\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n isIncrementalCopy: {\n serializedName: "x-ms-incremental-copy",\n xmlName: "x-ms-incremental-copy",\n type: {\n name: "Boolean"\n }\n },\n destinationSnapshot: {\n serializedName: "x-ms-copy-destination-snapshot",\n xmlName: "x-ms-copy-destination-snapshot",\n type: {\n name: "String"\n }\n },\n leaseDuration: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n leaseState: {\n serializedName: "x-ms-lease-state",\n xmlName: "x-ms-lease-state",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseStatus: {\n serializedName: "x-ms-lease-status",\n xmlName: "x-ms-lease-status",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n contentLength: {\n serializedName: "content-length",\n xmlName: "content-length",\n type: {\n name: "Number"\n }\n },\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n contentEncoding: {\n serializedName: "content-encoding",\n xmlName: "content-encoding",\n type: {\n name: "String"\n }\n },\n contentDisposition: {\n serializedName: "content-disposition",\n xmlName: "content-disposition",\n type: {\n name: "String"\n }\n },\n contentLanguage: {\n serializedName: "content-language",\n xmlName: "content-language",\n type: {\n name: "String"\n }\n },\n cacheControl: {\n serializedName: "cache-control",\n xmlName: "cache-control",\n type: {\n name: "String"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n acceptRanges: {\n serializedName: "accept-ranges",\n xmlName: "accept-ranges",\n type: {\n name: "String"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-server-encrypted",\n xmlName: "x-ms-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n accessTier: {\n serializedName: "x-ms-access-tier",\n xmlName: "x-ms-access-tier",\n type: {\n name: "String"\n }\n },\n accessTierInferred: {\n serializedName: "x-ms-access-tier-inferred",\n xmlName: "x-ms-access-tier-inferred",\n type: {\n name: "Boolean"\n }\n },\n archiveStatus: {\n serializedName: "x-ms-archive-status",\n xmlName: "x-ms-archive-status",\n type: {\n name: "String"\n }\n },\n accessTierChangedOn: {\n serializedName: "x-ms-access-tier-change-time",\n xmlName: "x-ms-access-tier-change-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n isCurrentVersion: {\n serializedName: "x-ms-is-current-version",\n xmlName: "x-ms-is-current-version",\n type: {\n name: "Boolean"\n }\n },\n tagCount: {\n serializedName: "x-ms-tag-count",\n xmlName: "x-ms-tag-count",\n type: {\n name: "Number"\n }\n },\n expiresOn: {\n serializedName: "x-ms-expiry-time",\n xmlName: "x-ms-expiry-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isSealed: {\n serializedName: "x-ms-blob-sealed",\n xmlName: "x-ms-blob-sealed",\n type: {\n name: "Boolean"\n }\n },\n rehydratePriority: {\n serializedName: "x-ms-rehydrate-priority",\n xmlName: "x-ms-rehydrate-priority",\n type: {\n name: "Enum",\n allowedValues: ["High", "Standard"]\n }\n },\n lastAccessed: {\n serializedName: "x-ms-last-access-time",\n xmlName: "x-ms-last-access-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyExpiresOn: {\n serializedName: "x-ms-immutability-policy-until-date",\n xmlName: "x-ms-immutability-policy-until-date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyMode: {\n serializedName: "x-ms-immutability-policy-mode",\n xmlName: "x-ms-immutability-policy-mode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n },\n legalHold: {\n serializedName: "x-ms-legal-hold",\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetPropertiesExceptionHeaders = {\n serializedName: "Blob_getPropertiesExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobGetPropertiesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobDeleteHeaders = {\n serializedName: "Blob_deleteHeaders",\n type: {\n name: "Composite",\n className: "BlobDeleteHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobDeleteExceptionHeaders = {\n serializedName: "Blob_deleteExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobDeleteExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobUndeleteHeaders = {\n serializedName: "Blob_undeleteHeaders",\n type: {\n name: "Composite",\n className: "BlobUndeleteHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobUndeleteExceptionHeaders = {\n serializedName: "Blob_undeleteExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobUndeleteExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetExpiryHeaders = {\n serializedName: "Blob_setExpiryHeaders",\n type: {\n name: "Composite",\n className: "BlobSetExpiryHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobSetExpiryExceptionHeaders = {\n serializedName: "Blob_setExpiryExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetExpiryExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetHttpHeadersHeaders = {\n serializedName: "Blob_setHttpHeadersHeaders",\n type: {\n name: "Composite",\n className: "BlobSetHttpHeadersHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetHttpHeadersExceptionHeaders = {\n serializedName: "Blob_setHttpHeadersExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetHttpHeadersExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetImmutabilityPolicyHeaders = {\n serializedName: "Blob_setImmutabilityPolicyHeaders",\n type: {\n name: "Composite",\n className: "BlobSetImmutabilityPolicyHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyExpiry: {\n serializedName: "x-ms-immutability-policy-until-date",\n xmlName: "x-ms-immutability-policy-until-date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n immutabilityPolicyMode: {\n serializedName: "x-ms-immutability-policy-mode",\n xmlName: "x-ms-immutability-policy-mode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n }\n }\n }\n};\nconst BlobSetImmutabilityPolicyExceptionHeaders = {\n serializedName: "Blob_setImmutabilityPolicyExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetImmutabilityPolicyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobDeleteImmutabilityPolicyHeaders = {\n serializedName: "Blob_deleteImmutabilityPolicyHeaders",\n type: {\n name: "Composite",\n className: "BlobDeleteImmutabilityPolicyHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobDeleteImmutabilityPolicyExceptionHeaders = {\n serializedName: "Blob_deleteImmutabilityPolicyExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobDeleteImmutabilityPolicyExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetLegalHoldHeaders = {\n serializedName: "Blob_setLegalHoldHeaders",\n type: {\n name: "Composite",\n className: "BlobSetLegalHoldHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n legalHold: {\n serializedName: "x-ms-legal-hold",\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst BlobSetLegalHoldExceptionHeaders = {\n serializedName: "Blob_setLegalHoldExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetLegalHoldExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetMetadataHeaders = {\n serializedName: "Blob_setMetadataHeaders",\n type: {\n name: "Composite",\n className: "BlobSetMetadataHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetMetadataExceptionHeaders = {\n serializedName: "Blob_setMetadataExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetMetadataExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobAcquireLeaseHeaders = {\n serializedName: "Blob_acquireLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobAcquireLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobAcquireLeaseExceptionHeaders = {\n serializedName: "Blob_acquireLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobAcquireLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobReleaseLeaseHeaders = {\n serializedName: "Blob_releaseLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobReleaseLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobReleaseLeaseExceptionHeaders = {\n serializedName: "Blob_releaseLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobReleaseLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobRenewLeaseHeaders = {\n serializedName: "Blob_renewLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobRenewLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobRenewLeaseExceptionHeaders = {\n serializedName: "Blob_renewLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobRenewLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobChangeLeaseHeaders = {\n serializedName: "Blob_changeLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobChangeLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n leaseId: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobChangeLeaseExceptionHeaders = {\n serializedName: "Blob_changeLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobChangeLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobBreakLeaseHeaders = {\n serializedName: "Blob_breakLeaseHeaders",\n type: {\n name: "Composite",\n className: "BlobBreakLeaseHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n leaseTime: {\n serializedName: "x-ms-lease-time",\n xmlName: "x-ms-lease-time",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n }\n }\n};\nconst BlobBreakLeaseExceptionHeaders = {\n serializedName: "Blob_breakLeaseExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobBreakLeaseExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobCreateSnapshotHeaders = {\n serializedName: "Blob_createSnapshotHeaders",\n type: {\n name: "Composite",\n className: "BlobCreateSnapshotHeaders",\n modelProperties: {\n snapshot: {\n serializedName: "x-ms-snapshot",\n xmlName: "x-ms-snapshot",\n type: {\n name: "String"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobCreateSnapshotExceptionHeaders = {\n serializedName: "Blob_createSnapshotExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobCreateSnapshotExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobStartCopyFromURLHeaders = {\n serializedName: "Blob_startCopyFromURLHeaders",\n type: {\n name: "Composite",\n className: "BlobStartCopyFromURLHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobStartCopyFromURLExceptionHeaders = {\n serializedName: "Blob_startCopyFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobStartCopyFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobCopyFromURLHeaders = {\n serializedName: "Blob_copyFromURLHeaders",\n type: {\n name: "Composite",\n className: "BlobCopyFromURLHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n defaultValue: "success",\n isConstant: true,\n serializedName: "x-ms-copy-status",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobCopyFromURLExceptionHeaders = {\n serializedName: "Blob_copyFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobCopyFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobAbortCopyFromURLHeaders = {\n serializedName: "Blob_abortCopyFromURLHeaders",\n type: {\n name: "Composite",\n className: "BlobAbortCopyFromURLHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobAbortCopyFromURLExceptionHeaders = {\n serializedName: "Blob_abortCopyFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobAbortCopyFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetTierHeaders = {\n serializedName: "Blob_setTierHeaders",\n type: {\n name: "Composite",\n className: "BlobSetTierHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetTierExceptionHeaders = {\n serializedName: "Blob_setTierExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetTierExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetAccountInfoHeaders = {\n serializedName: "Blob_getAccountInfoHeaders",\n type: {\n name: "Composite",\n className: "BlobGetAccountInfoHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n skuName: {\n serializedName: "x-ms-sku-name",\n xmlName: "x-ms-sku-name",\n type: {\n name: "Enum",\n allowedValues: [\n "Standard_LRS",\n "Standard_GRS",\n "Standard_RAGRS",\n "Standard_ZRS",\n "Premium_LRS"\n ]\n }\n },\n accountKind: {\n serializedName: "x-ms-account-kind",\n xmlName: "x-ms-account-kind",\n type: {\n name: "Enum",\n allowedValues: [\n "Storage",\n "BlobStorage",\n "StorageV2",\n "FileStorage",\n "BlockBlobStorage"\n ]\n }\n }\n }\n }\n};\nconst BlobGetAccountInfoExceptionHeaders = {\n serializedName: "Blob_getAccountInfoExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobGetAccountInfoExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobQueryHeaders = {\n serializedName: "Blob_queryHeaders",\n type: {\n name: "Composite",\n className: "BlobQueryHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n metadata: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n }\n },\n contentLength: {\n serializedName: "content-length",\n xmlName: "content-length",\n type: {\n name: "Number"\n }\n },\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n contentRange: {\n serializedName: "content-range",\n xmlName: "content-range",\n type: {\n name: "String"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n contentEncoding: {\n serializedName: "content-encoding",\n xmlName: "content-encoding",\n type: {\n name: "String"\n }\n },\n cacheControl: {\n serializedName: "cache-control",\n xmlName: "cache-control",\n type: {\n name: "String"\n }\n },\n contentDisposition: {\n serializedName: "content-disposition",\n xmlName: "content-disposition",\n type: {\n name: "String"\n }\n },\n contentLanguage: {\n serializedName: "content-language",\n xmlName: "content-language",\n type: {\n name: "String"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n blobType: {\n serializedName: "x-ms-blob-type",\n xmlName: "x-ms-blob-type",\n type: {\n name: "Enum",\n allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"]\n }\n },\n copyCompletionTime: {\n serializedName: "x-ms-copy-completion-time",\n xmlName: "x-ms-copy-completion-time",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyStatusDescription: {\n serializedName: "x-ms-copy-status-description",\n xmlName: "x-ms-copy-status-description",\n type: {\n name: "String"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyProgress: {\n serializedName: "x-ms-copy-progress",\n xmlName: "x-ms-copy-progress",\n type: {\n name: "String"\n }\n },\n copySource: {\n serializedName: "x-ms-copy-source",\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n leaseDuration: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Enum",\n allowedValues: ["infinite", "fixed"]\n }\n },\n leaseState: {\n serializedName: "x-ms-lease-state",\n xmlName: "x-ms-lease-state",\n type: {\n name: "Enum",\n allowedValues: [\n "available",\n "leased",\n "expired",\n "breaking",\n "broken"\n ]\n }\n },\n leaseStatus: {\n serializedName: "x-ms-lease-status",\n xmlName: "x-ms-lease-status",\n type: {\n name: "Enum",\n allowedValues: ["locked", "unlocked"]\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n acceptRanges: {\n serializedName: "accept-ranges",\n xmlName: "accept-ranges",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-server-encrypted",\n xmlName: "x-ms-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n blobContentMD5: {\n serializedName: "x-ms-blob-content-md5",\n xmlName: "x-ms-blob-content-md5",\n type: {\n name: "ByteArray"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n },\n contentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n }\n }\n }\n};\nconst BlobQueryExceptionHeaders = {\n serializedName: "Blob_queryExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobQueryExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetTagsHeaders = {\n serializedName: "Blob_getTagsHeaders",\n type: {\n name: "Composite",\n className: "BlobGetTagsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobGetTagsExceptionHeaders = {\n serializedName: "Blob_getTagsExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobGetTagsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetTagsHeaders = {\n serializedName: "Blob_setTagsHeaders",\n type: {\n name: "Composite",\n className: "BlobSetTagsHeaders",\n modelProperties: {\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlobSetTagsExceptionHeaders = {\n serializedName: "Blob_setTagsExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlobSetTagsExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobCreateHeaders = {\n serializedName: "PageBlob_createHeaders",\n type: {\n name: "Composite",\n className: "PageBlobCreateHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobCreateExceptionHeaders = {\n serializedName: "PageBlob_createExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobCreateExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUploadPagesHeaders = {\n serializedName: "PageBlob_uploadPagesHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUploadPagesHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUploadPagesExceptionHeaders = {\n serializedName: "PageBlob_uploadPagesExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUploadPagesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobClearPagesHeaders = {\n serializedName: "PageBlob_clearPagesHeaders",\n type: {\n name: "Composite",\n className: "PageBlobClearPagesHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobClearPagesExceptionHeaders = {\n serializedName: "PageBlob_clearPagesExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobClearPagesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUploadPagesFromURLHeaders = {\n serializedName: "PageBlob_uploadPagesFromURLHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUploadPagesFromURLHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUploadPagesFromURLExceptionHeaders = {\n serializedName: "PageBlob_uploadPagesFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUploadPagesFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobGetPageRangesHeaders = {\n serializedName: "PageBlob_getPageRangesHeaders",\n type: {\n name: "Composite",\n className: "PageBlobGetPageRangesHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n blobContentLength: {\n serializedName: "x-ms-blob-content-length",\n xmlName: "x-ms-blob-content-length",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobGetPageRangesExceptionHeaders = {\n serializedName: "PageBlob_getPageRangesExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobGetPageRangesExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobGetPageRangesDiffHeaders = {\n serializedName: "PageBlob_getPageRangesDiffHeaders",\n type: {\n name: "Composite",\n className: "PageBlobGetPageRangesDiffHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n blobContentLength: {\n serializedName: "x-ms-blob-content-length",\n xmlName: "x-ms-blob-content-length",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobGetPageRangesDiffExceptionHeaders = {\n serializedName: "PageBlob_getPageRangesDiffExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobGetPageRangesDiffExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobResizeHeaders = {\n serializedName: "PageBlob_resizeHeaders",\n type: {\n name: "Composite",\n className: "PageBlobResizeHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobResizeExceptionHeaders = {\n serializedName: "PageBlob_resizeExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobResizeExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUpdateSequenceNumberHeaders = {\n serializedName: "PageBlob_updateSequenceNumberHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUpdateSequenceNumberHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobSequenceNumber: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobUpdateSequenceNumberExceptionHeaders = {\n serializedName: "PageBlob_updateSequenceNumberExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobUpdateSequenceNumberExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobCopyIncrementalHeaders = {\n serializedName: "PageBlob_copyIncrementalHeaders",\n type: {\n name: "Composite",\n className: "PageBlobCopyIncrementalHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n copyId: {\n serializedName: "x-ms-copy-id",\n xmlName: "x-ms-copy-id",\n type: {\n name: "String"\n }\n },\n copyStatus: {\n serializedName: "x-ms-copy-status",\n xmlName: "x-ms-copy-status",\n type: {\n name: "Enum",\n allowedValues: ["pending", "success", "aborted", "failed"]\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst PageBlobCopyIncrementalExceptionHeaders = {\n serializedName: "PageBlob_copyIncrementalExceptionHeaders",\n type: {\n name: "Composite",\n className: "PageBlobCopyIncrementalExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobCreateHeaders = {\n serializedName: "AppendBlob_createHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobCreateHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobCreateExceptionHeaders = {\n serializedName: "AppendBlob_createExceptionHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobCreateExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobAppendBlockHeaders = {\n serializedName: "AppendBlob_appendBlockHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobAppendBlockHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobAppendOffset: {\n serializedName: "x-ms-blob-append-offset",\n xmlName: "x-ms-blob-append-offset",\n type: {\n name: "String"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobAppendBlockExceptionHeaders = {\n serializedName: "AppendBlob_appendBlockExceptionHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobAppendBlockExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobAppendBlockFromUrlHeaders = {\n serializedName: "AppendBlob_appendBlockFromUrlHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobAppendBlockFromUrlHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n blobAppendOffset: {\n serializedName: "x-ms-blob-append-offset",\n xmlName: "x-ms-blob-append-offset",\n type: {\n name: "String"\n }\n },\n blobCommittedBlockCount: {\n serializedName: "x-ms-blob-committed-block-count",\n xmlName: "x-ms-blob-committed-block-count",\n type: {\n name: "Number"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobAppendBlockFromUrlExceptionHeaders = {\n serializedName: "AppendBlob_appendBlockFromUrlExceptionHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobAppendBlockFromUrlExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst AppendBlobSealHeaders = {\n serializedName: "AppendBlob_sealHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobSealHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isSealed: {\n serializedName: "x-ms-blob-sealed",\n xmlName: "x-ms-blob-sealed",\n type: {\n name: "Boolean"\n }\n }\n }\n }\n};\nconst AppendBlobSealExceptionHeaders = {\n serializedName: "AppendBlob_sealExceptionHeaders",\n type: {\n name: "Composite",\n className: "AppendBlobSealExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobUploadHeaders = {\n serializedName: "BlockBlob_uploadHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobUploadHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobUploadExceptionHeaders = {\n serializedName: "BlockBlob_uploadExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobUploadExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobPutBlobFromUrlHeaders = {\n serializedName: "BlockBlob_putBlobFromUrlHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobPutBlobFromUrlHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobPutBlobFromUrlExceptionHeaders = {\n serializedName: "BlockBlob_putBlobFromUrlExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobPutBlobFromUrlExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobStageBlockHeaders = {\n serializedName: "BlockBlob_stageBlockHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobStageBlockHeaders",\n modelProperties: {\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobStageBlockExceptionHeaders = {\n serializedName: "BlockBlob_stageBlockExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobStageBlockExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobStageBlockFromURLHeaders = {\n serializedName: "BlockBlob_stageBlockFromURLHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobStageBlockFromURLHeaders",\n modelProperties: {\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobStageBlockFromURLExceptionHeaders = {\n serializedName: "BlockBlob_stageBlockFromURLExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobStageBlockFromURLExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobCommitBlockListHeaders = {\n serializedName: "BlockBlob_commitBlockListHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobCommitBlockListHeaders",\n modelProperties: {\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n contentMD5: {\n serializedName: "content-md5",\n xmlName: "content-md5",\n type: {\n name: "ByteArray"\n }\n },\n xMsContentCrc64: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n versionId: {\n serializedName: "x-ms-version-id",\n xmlName: "x-ms-version-id",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n isServerEncrypted: {\n serializedName: "x-ms-request-server-encrypted",\n xmlName: "x-ms-request-server-encrypted",\n type: {\n name: "Boolean"\n }\n },\n encryptionKeySha256: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n },\n encryptionScope: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobCommitBlockListExceptionHeaders = {\n serializedName: "BlockBlob_commitBlockListExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobCommitBlockListExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobGetBlockListHeaders = {\n serializedName: "BlockBlob_getBlockListHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobGetBlockListHeaders",\n modelProperties: {\n lastModified: {\n serializedName: "last-modified",\n xmlName: "last-modified",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n etag: {\n serializedName: "etag",\n xmlName: "etag",\n type: {\n name: "String"\n }\n },\n contentType: {\n serializedName: "content-type",\n xmlName: "content-type",\n type: {\n name: "String"\n }\n },\n blobContentLength: {\n serializedName: "x-ms-blob-content-length",\n xmlName: "x-ms-blob-content-length",\n type: {\n name: "Number"\n }\n },\n clientRequestId: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n },\n requestId: {\n serializedName: "x-ms-request-id",\n xmlName: "x-ms-request-id",\n type: {\n name: "String"\n }\n },\n version: {\n serializedName: "x-ms-version",\n xmlName: "x-ms-version",\n type: {\n name: "String"\n }\n },\n date: {\n serializedName: "date",\n xmlName: "date",\n type: {\n name: "DateTimeRfc1123"\n }\n },\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\nconst BlockBlobGetBlockListExceptionHeaders = {\n serializedName: "BlockBlob_getBlockListExceptionHeaders",\n type: {\n name: "Composite",\n className: "BlockBlobGetBlockListExceptionHeaders",\n modelProperties: {\n errorCode: {\n serializedName: "x-ms-error-code",\n xmlName: "x-ms-error-code",\n type: {\n name: "String"\n }\n }\n }\n }\n};\n//# sourceMappingURL=mappers.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/queryCollectionFormat.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * The format that will be used to join an array of values together for a query parameter value.\n */\nvar QueryCollectionFormat;\n(function (QueryCollectionFormat) {\n /**\n * CSV: Each pair of segments joined by a single comma.\n */\n QueryCollectionFormat["Csv"] = ",";\n /**\n * SSV: Each pair of segments joined by a single space character.\n */\n QueryCollectionFormat["Ssv"] = " ";\n /**\n * TSV: Each pair of segments joined by a single tab character.\n */\n QueryCollectionFormat["Tsv"] = "\\t";\n /**\n * Pipes: Each pair of segments joined by a single pipe character.\n */\n QueryCollectionFormat["Pipes"] = "|";\n /**\n * Denotes this is an array of values that should be passed to the server in multiple key/value pairs, e.g. `?queryParam=value1&queryParam=value2`\n */\n QueryCollectionFormat["Multi"] = "Multi";\n})(QueryCollectionFormat || (QueryCollectionFormat = {}));\n//# sourceMappingURL=queryCollectionFormat.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/models/parameters.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\nconst contentType = {\n parameterPath: ["options", "contentType"],\n mapper: {\n defaultValue: "application/xml",\n isConstant: true,\n serializedName: "Content-Type",\n type: {\n name: "String"\n }\n }\n};\nconst blobServiceProperties = {\n parameterPath: "blobServiceProperties",\n mapper: BlobServiceProperties\n};\nconst accept = {\n parameterPath: "accept",\n mapper: {\n defaultValue: "application/xml",\n isConstant: true,\n serializedName: "Accept",\n type: {\n name: "String"\n }\n }\n};\nconst url = {\n parameterPath: "url",\n mapper: {\n serializedName: "url",\n required: true,\n xmlName: "url",\n type: {\n name: "String"\n }\n },\n skipEncoding: true\n};\nconst restype = {\n parameterPath: "restype",\n mapper: {\n defaultValue: "service",\n isConstant: true,\n serializedName: "restype",\n type: {\n name: "String"\n }\n }\n};\nconst comp = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "properties",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst timeoutInSeconds = {\n parameterPath: ["options", "timeoutInSeconds"],\n mapper: {\n constraints: {\n InclusiveMinimum: 0\n },\n serializedName: "timeout",\n xmlName: "timeout",\n type: {\n name: "Number"\n }\n }\n};\nconst version = {\n parameterPath: "version",\n mapper: {\n defaultValue: "2023-11-03",\n isConstant: true,\n serializedName: "x-ms-version",\n type: {\n name: "String"\n }\n }\n};\nconst requestId = {\n parameterPath: ["options", "requestId"],\n mapper: {\n serializedName: "x-ms-client-request-id",\n xmlName: "x-ms-client-request-id",\n type: {\n name: "String"\n }\n }\n};\nconst accept1 = {\n parameterPath: "accept",\n mapper: {\n defaultValue: "application/xml",\n isConstant: true,\n serializedName: "Accept",\n type: {\n name: "String"\n }\n }\n};\nconst comp1 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "stats",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst comp2 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "list",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst prefix = {\n parameterPath: ["options", "prefix"],\n mapper: {\n serializedName: "prefix",\n xmlName: "prefix",\n type: {\n name: "String"\n }\n }\n};\nconst marker = {\n parameterPath: ["options", "marker"],\n mapper: {\n serializedName: "marker",\n xmlName: "marker",\n type: {\n name: "String"\n }\n }\n};\nconst maxPageSize = {\n parameterPath: ["options", "maxPageSize"],\n mapper: {\n constraints: {\n InclusiveMinimum: 1\n },\n serializedName: "maxresults",\n xmlName: "maxresults",\n type: {\n name: "Number"\n }\n }\n};\nconst include = {\n parameterPath: ["options", "include"],\n mapper: {\n serializedName: "include",\n xmlName: "include",\n xmlElementName: "ListContainersIncludeType",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Enum",\n allowedValues: ["metadata", "deleted", "system"]\n }\n }\n }\n },\n collectionFormat: QueryCollectionFormat.Csv\n};\nconst keyInfo = {\n parameterPath: "keyInfo",\n mapper: KeyInfo\n};\nconst comp3 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "userdelegationkey",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst restype1 = {\n parameterPath: "restype",\n mapper: {\n defaultValue: "account",\n isConstant: true,\n serializedName: "restype",\n type: {\n name: "String"\n }\n }\n};\nconst body = {\n parameterPath: "body",\n mapper: {\n serializedName: "body",\n required: true,\n xmlName: "body",\n type: {\n name: "Stream"\n }\n }\n};\nconst comp4 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "batch",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst contentLength = {\n parameterPath: "contentLength",\n mapper: {\n serializedName: "Content-Length",\n required: true,\n xmlName: "Content-Length",\n type: {\n name: "Number"\n }\n }\n};\nconst multipartContentType = {\n parameterPath: "multipartContentType",\n mapper: {\n serializedName: "Content-Type",\n required: true,\n xmlName: "Content-Type",\n type: {\n name: "String"\n }\n }\n};\nconst comp5 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "blobs",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst where = {\n parameterPath: ["options", "where"],\n mapper: {\n serializedName: "where",\n xmlName: "where",\n type: {\n name: "String"\n }\n }\n};\nconst restype2 = {\n parameterPath: "restype",\n mapper: {\n defaultValue: "container",\n isConstant: true,\n serializedName: "restype",\n type: {\n name: "String"\n }\n }\n};\nconst metadata = {\n parameterPath: ["options", "metadata"],\n mapper: {\n serializedName: "x-ms-meta",\n xmlName: "x-ms-meta",\n type: {\n name: "Dictionary",\n value: { type: { name: "String" } }\n },\n headerCollectionPrefix: "x-ms-meta-"\n }\n};\nconst access = {\n parameterPath: ["options", "access"],\n mapper: {\n serializedName: "x-ms-blob-public-access",\n xmlName: "x-ms-blob-public-access",\n type: {\n name: "Enum",\n allowedValues: ["container", "blob"]\n }\n }\n};\nconst defaultEncryptionScope = {\n parameterPath: [\n "options",\n "containerEncryptionScope",\n "defaultEncryptionScope"\n ],\n mapper: {\n serializedName: "x-ms-default-encryption-scope",\n xmlName: "x-ms-default-encryption-scope",\n type: {\n name: "String"\n }\n }\n};\nconst preventEncryptionScopeOverride = {\n parameterPath: [\n "options",\n "containerEncryptionScope",\n "preventEncryptionScopeOverride"\n ],\n mapper: {\n serializedName: "x-ms-deny-encryption-scope-override",\n xmlName: "x-ms-deny-encryption-scope-override",\n type: {\n name: "Boolean"\n }\n }\n};\nconst leaseId = {\n parameterPath: ["options", "leaseAccessConditions", "leaseId"],\n mapper: {\n serializedName: "x-ms-lease-id",\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst ifModifiedSince = {\n parameterPath: ["options", "modifiedAccessConditions", "ifModifiedSince"],\n mapper: {\n serializedName: "If-Modified-Since",\n xmlName: "If-Modified-Since",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst ifUnmodifiedSince = {\n parameterPath: ["options", "modifiedAccessConditions", "ifUnmodifiedSince"],\n mapper: {\n serializedName: "If-Unmodified-Since",\n xmlName: "If-Unmodified-Since",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst comp6 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "metadata",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst comp7 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "acl",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst containerAcl = {\n parameterPath: ["options", "containerAcl"],\n mapper: {\n serializedName: "containerAcl",\n xmlName: "SignedIdentifiers",\n xmlIsWrapped: true,\n xmlElementName: "SignedIdentifier",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Composite",\n className: "SignedIdentifier"\n }\n }\n }\n }\n};\nconst comp8 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "undelete",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst deletedContainerName = {\n parameterPath: ["options", "deletedContainerName"],\n mapper: {\n serializedName: "x-ms-deleted-container-name",\n xmlName: "x-ms-deleted-container-name",\n type: {\n name: "String"\n }\n }\n};\nconst deletedContainerVersion = {\n parameterPath: ["options", "deletedContainerVersion"],\n mapper: {\n serializedName: "x-ms-deleted-container-version",\n xmlName: "x-ms-deleted-container-version",\n type: {\n name: "String"\n }\n }\n};\nconst comp9 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "rename",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst sourceContainerName = {\n parameterPath: "sourceContainerName",\n mapper: {\n serializedName: "x-ms-source-container-name",\n required: true,\n xmlName: "x-ms-source-container-name",\n type: {\n name: "String"\n }\n }\n};\nconst sourceLeaseId = {\n parameterPath: ["options", "sourceLeaseId"],\n mapper: {\n serializedName: "x-ms-source-lease-id",\n xmlName: "x-ms-source-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst comp10 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "lease",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst action = {\n parameterPath: "action",\n mapper: {\n defaultValue: "acquire",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst duration = {\n parameterPath: ["options", "duration"],\n mapper: {\n serializedName: "x-ms-lease-duration",\n xmlName: "x-ms-lease-duration",\n type: {\n name: "Number"\n }\n }\n};\nconst proposedLeaseId = {\n parameterPath: ["options", "proposedLeaseId"],\n mapper: {\n serializedName: "x-ms-proposed-lease-id",\n xmlName: "x-ms-proposed-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst action1 = {\n parameterPath: "action",\n mapper: {\n defaultValue: "release",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst leaseId1 = {\n parameterPath: "leaseId",\n mapper: {\n serializedName: "x-ms-lease-id",\n required: true,\n xmlName: "x-ms-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst action2 = {\n parameterPath: "action",\n mapper: {\n defaultValue: "renew",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst action3 = {\n parameterPath: "action",\n mapper: {\n defaultValue: "break",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst breakPeriod = {\n parameterPath: ["options", "breakPeriod"],\n mapper: {\n serializedName: "x-ms-lease-break-period",\n xmlName: "x-ms-lease-break-period",\n type: {\n name: "Number"\n }\n }\n};\nconst action4 = {\n parameterPath: "action",\n mapper: {\n defaultValue: "change",\n isConstant: true,\n serializedName: "x-ms-lease-action",\n type: {\n name: "String"\n }\n }\n};\nconst proposedLeaseId1 = {\n parameterPath: "proposedLeaseId",\n mapper: {\n serializedName: "x-ms-proposed-lease-id",\n required: true,\n xmlName: "x-ms-proposed-lease-id",\n type: {\n name: "String"\n }\n }\n};\nconst include1 = {\n parameterPath: ["options", "include"],\n mapper: {\n serializedName: "include",\n xmlName: "include",\n xmlElementName: "ListBlobsIncludeItem",\n type: {\n name: "Sequence",\n element: {\n type: {\n name: "Enum",\n allowedValues: [\n "copy",\n "deleted",\n "metadata",\n "snapshots",\n "uncommittedblobs",\n "versions",\n "tags",\n "immutabilitypolicy",\n "legalhold",\n "deletedwithversions"\n ]\n }\n }\n }\n },\n collectionFormat: QueryCollectionFormat.Csv\n};\nconst delimiter = {\n parameterPath: "delimiter",\n mapper: {\n serializedName: "delimiter",\n required: true,\n xmlName: "delimiter",\n type: {\n name: "String"\n }\n }\n};\nconst snapshot = {\n parameterPath: ["options", "snapshot"],\n mapper: {\n serializedName: "snapshot",\n xmlName: "snapshot",\n type: {\n name: "String"\n }\n }\n};\nconst versionId = {\n parameterPath: ["options", "versionId"],\n mapper: {\n serializedName: "versionid",\n xmlName: "versionid",\n type: {\n name: "String"\n }\n }\n};\nconst range = {\n parameterPath: ["options", "range"],\n mapper: {\n serializedName: "x-ms-range",\n xmlName: "x-ms-range",\n type: {\n name: "String"\n }\n }\n};\nconst rangeGetContentMD5 = {\n parameterPath: ["options", "rangeGetContentMD5"],\n mapper: {\n serializedName: "x-ms-range-get-content-md5",\n xmlName: "x-ms-range-get-content-md5",\n type: {\n name: "Boolean"\n }\n }\n};\nconst rangeGetContentCRC64 = {\n parameterPath: ["options", "rangeGetContentCRC64"],\n mapper: {\n serializedName: "x-ms-range-get-content-crc64",\n xmlName: "x-ms-range-get-content-crc64",\n type: {\n name: "Boolean"\n }\n }\n};\nconst encryptionKey = {\n parameterPath: ["options", "cpkInfo", "encryptionKey"],\n mapper: {\n serializedName: "x-ms-encryption-key",\n xmlName: "x-ms-encryption-key",\n type: {\n name: "String"\n }\n }\n};\nconst encryptionKeySha256 = {\n parameterPath: ["options", "cpkInfo", "encryptionKeySha256"],\n mapper: {\n serializedName: "x-ms-encryption-key-sha256",\n xmlName: "x-ms-encryption-key-sha256",\n type: {\n name: "String"\n }\n }\n};\nconst encryptionAlgorithm = {\n parameterPath: ["options", "cpkInfo", "encryptionAlgorithm"],\n mapper: {\n serializedName: "x-ms-encryption-algorithm",\n xmlName: "x-ms-encryption-algorithm",\n type: {\n name: "String"\n }\n }\n};\nconst ifMatch = {\n parameterPath: ["options", "modifiedAccessConditions", "ifMatch"],\n mapper: {\n serializedName: "If-Match",\n xmlName: "If-Match",\n type: {\n name: "String"\n }\n }\n};\nconst ifNoneMatch = {\n parameterPath: ["options", "modifiedAccessConditions", "ifNoneMatch"],\n mapper: {\n serializedName: "If-None-Match",\n xmlName: "If-None-Match",\n type: {\n name: "String"\n }\n }\n};\nconst ifTags = {\n parameterPath: ["options", "modifiedAccessConditions", "ifTags"],\n mapper: {\n serializedName: "x-ms-if-tags",\n xmlName: "x-ms-if-tags",\n type: {\n name: "String"\n }\n }\n};\nconst deleteSnapshots = {\n parameterPath: ["options", "deleteSnapshots"],\n mapper: {\n serializedName: "x-ms-delete-snapshots",\n xmlName: "x-ms-delete-snapshots",\n type: {\n name: "Enum",\n allowedValues: ["include", "only"]\n }\n }\n};\nconst blobDeleteType = {\n parameterPath: ["options", "blobDeleteType"],\n mapper: {\n serializedName: "deletetype",\n xmlName: "deletetype",\n type: {\n name: "String"\n }\n }\n};\nconst comp11 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "expiry",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst expiryOptions = {\n parameterPath: "expiryOptions",\n mapper: {\n serializedName: "x-ms-expiry-option",\n required: true,\n xmlName: "x-ms-expiry-option",\n type: {\n name: "String"\n }\n }\n};\nconst expiresOn = {\n parameterPath: ["options", "expiresOn"],\n mapper: {\n serializedName: "x-ms-expiry-time",\n xmlName: "x-ms-expiry-time",\n type: {\n name: "String"\n }\n }\n};\nconst blobCacheControl = {\n parameterPath: ["options", "blobHttpHeaders", "blobCacheControl"],\n mapper: {\n serializedName: "x-ms-blob-cache-control",\n xmlName: "x-ms-blob-cache-control",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentType = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentType"],\n mapper: {\n serializedName: "x-ms-blob-content-type",\n xmlName: "x-ms-blob-content-type",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentMD5 = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentMD5"],\n mapper: {\n serializedName: "x-ms-blob-content-md5",\n xmlName: "x-ms-blob-content-md5",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst blobContentEncoding = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentEncoding"],\n mapper: {\n serializedName: "x-ms-blob-content-encoding",\n xmlName: "x-ms-blob-content-encoding",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentLanguage = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentLanguage"],\n mapper: {\n serializedName: "x-ms-blob-content-language",\n xmlName: "x-ms-blob-content-language",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentDisposition = {\n parameterPath: ["options", "blobHttpHeaders", "blobContentDisposition"],\n mapper: {\n serializedName: "x-ms-blob-content-disposition",\n xmlName: "x-ms-blob-content-disposition",\n type: {\n name: "String"\n }\n }\n};\nconst comp12 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "immutabilityPolicies",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst immutabilityPolicyExpiry = {\n parameterPath: ["options", "immutabilityPolicyExpiry"],\n mapper: {\n serializedName: "x-ms-immutability-policy-until-date",\n xmlName: "x-ms-immutability-policy-until-date",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst immutabilityPolicyMode = {\n parameterPath: ["options", "immutabilityPolicyMode"],\n mapper: {\n serializedName: "x-ms-immutability-policy-mode",\n xmlName: "x-ms-immutability-policy-mode",\n type: {\n name: "Enum",\n allowedValues: ["Mutable", "Unlocked", "Locked"]\n }\n }\n};\nconst comp13 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "legalhold",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst legalHold = {\n parameterPath: "legalHold",\n mapper: {\n serializedName: "x-ms-legal-hold",\n required: true,\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n }\n};\nconst encryptionScope = {\n parameterPath: ["options", "encryptionScope"],\n mapper: {\n serializedName: "x-ms-encryption-scope",\n xmlName: "x-ms-encryption-scope",\n type: {\n name: "String"\n }\n }\n};\nconst comp14 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "snapshot",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst tier = {\n parameterPath: ["options", "tier"],\n mapper: {\n serializedName: "x-ms-access-tier",\n xmlName: "x-ms-access-tier",\n type: {\n name: "Enum",\n allowedValues: [\n "P4",\n "P6",\n "P10",\n "P15",\n "P20",\n "P30",\n "P40",\n "P50",\n "P60",\n "P70",\n "P80",\n "Hot",\n "Cool",\n "Archive",\n "Cold"\n ]\n }\n }\n};\nconst rehydratePriority = {\n parameterPath: ["options", "rehydratePriority"],\n mapper: {\n serializedName: "x-ms-rehydrate-priority",\n xmlName: "x-ms-rehydrate-priority",\n type: {\n name: "Enum",\n allowedValues: ["High", "Standard"]\n }\n }\n};\nconst sourceIfModifiedSince = {\n parameterPath: [\n "options",\n "sourceModifiedAccessConditions",\n "sourceIfModifiedSince"\n ],\n mapper: {\n serializedName: "x-ms-source-if-modified-since",\n xmlName: "x-ms-source-if-modified-since",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst sourceIfUnmodifiedSince = {\n parameterPath: [\n "options",\n "sourceModifiedAccessConditions",\n "sourceIfUnmodifiedSince"\n ],\n mapper: {\n serializedName: "x-ms-source-if-unmodified-since",\n xmlName: "x-ms-source-if-unmodified-since",\n type: {\n name: "DateTimeRfc1123"\n }\n }\n};\nconst sourceIfMatch = {\n parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfMatch"],\n mapper: {\n serializedName: "x-ms-source-if-match",\n xmlName: "x-ms-source-if-match",\n type: {\n name: "String"\n }\n }\n};\nconst sourceIfNoneMatch = {\n parameterPath: [\n "options",\n "sourceModifiedAccessConditions",\n "sourceIfNoneMatch"\n ],\n mapper: {\n serializedName: "x-ms-source-if-none-match",\n xmlName: "x-ms-source-if-none-match",\n type: {\n name: "String"\n }\n }\n};\nconst sourceIfTags = {\n parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfTags"],\n mapper: {\n serializedName: "x-ms-source-if-tags",\n xmlName: "x-ms-source-if-tags",\n type: {\n name: "String"\n }\n }\n};\nconst copySource = {\n parameterPath: "copySource",\n mapper: {\n serializedName: "x-ms-copy-source",\n required: true,\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n }\n};\nconst blobTagsString = {\n parameterPath: ["options", "blobTagsString"],\n mapper: {\n serializedName: "x-ms-tags",\n xmlName: "x-ms-tags",\n type: {\n name: "String"\n }\n }\n};\nconst sealBlob = {\n parameterPath: ["options", "sealBlob"],\n mapper: {\n serializedName: "x-ms-seal-blob",\n xmlName: "x-ms-seal-blob",\n type: {\n name: "Boolean"\n }\n }\n};\nconst legalHold1 = {\n parameterPath: ["options", "legalHold"],\n mapper: {\n serializedName: "x-ms-legal-hold",\n xmlName: "x-ms-legal-hold",\n type: {\n name: "Boolean"\n }\n }\n};\nconst xMsRequiresSync = {\n parameterPath: "xMsRequiresSync",\n mapper: {\n defaultValue: "true",\n isConstant: true,\n serializedName: "x-ms-requires-sync",\n type: {\n name: "String"\n }\n }\n};\nconst sourceContentMD5 = {\n parameterPath: ["options", "sourceContentMD5"],\n mapper: {\n serializedName: "x-ms-source-content-md5",\n xmlName: "x-ms-source-content-md5",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst copySourceAuthorization = {\n parameterPath: ["options", "copySourceAuthorization"],\n mapper: {\n serializedName: "x-ms-copy-source-authorization",\n xmlName: "x-ms-copy-source-authorization",\n type: {\n name: "String"\n }\n }\n};\nconst copySourceTags = {\n parameterPath: ["options", "copySourceTags"],\n mapper: {\n serializedName: "x-ms-copy-source-tag-option",\n xmlName: "x-ms-copy-source-tag-option",\n type: {\n name: "Enum",\n allowedValues: ["REPLACE", "COPY"]\n }\n }\n};\nconst comp15 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "copy",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst copyActionAbortConstant = {\n parameterPath: "copyActionAbortConstant",\n mapper: {\n defaultValue: "abort",\n isConstant: true,\n serializedName: "x-ms-copy-action",\n type: {\n name: "String"\n }\n }\n};\nconst copyId = {\n parameterPath: "copyId",\n mapper: {\n serializedName: "copyid",\n required: true,\n xmlName: "copyid",\n type: {\n name: "String"\n }\n }\n};\nconst comp16 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "tier",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst tier1 = {\n parameterPath: "tier",\n mapper: {\n serializedName: "x-ms-access-tier",\n required: true,\n xmlName: "x-ms-access-tier",\n type: {\n name: "Enum",\n allowedValues: [\n "P4",\n "P6",\n "P10",\n "P15",\n "P20",\n "P30",\n "P40",\n "P50",\n "P60",\n "P70",\n "P80",\n "Hot",\n "Cool",\n "Archive",\n "Cold"\n ]\n }\n }\n};\nconst queryRequest = {\n parameterPath: ["options", "queryRequest"],\n mapper: QueryRequest\n};\nconst comp17 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "query",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst comp18 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "tags",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst tags = {\n parameterPath: ["options", "tags"],\n mapper: BlobTags\n};\nconst transactionalContentMD5 = {\n parameterPath: ["options", "transactionalContentMD5"],\n mapper: {\n serializedName: "Content-MD5",\n xmlName: "Content-MD5",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst transactionalContentCrc64 = {\n parameterPath: ["options", "transactionalContentCrc64"],\n mapper: {\n serializedName: "x-ms-content-crc64",\n xmlName: "x-ms-content-crc64",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst blobType = {\n parameterPath: "blobType",\n mapper: {\n defaultValue: "PageBlob",\n isConstant: true,\n serializedName: "x-ms-blob-type",\n type: {\n name: "String"\n }\n }\n};\nconst blobContentLength = {\n parameterPath: "blobContentLength",\n mapper: {\n serializedName: "x-ms-blob-content-length",\n required: true,\n xmlName: "x-ms-blob-content-length",\n type: {\n name: "Number"\n }\n }\n};\nconst blobSequenceNumber = {\n parameterPath: ["options", "blobSequenceNumber"],\n mapper: {\n serializedName: "x-ms-blob-sequence-number",\n xmlName: "x-ms-blob-sequence-number",\n type: {\n name: "Number"\n }\n }\n};\nconst contentType1 = {\n parameterPath: ["options", "contentType"],\n mapper: {\n defaultValue: "application/octet-stream",\n isConstant: true,\n serializedName: "Content-Type",\n type: {\n name: "String"\n }\n }\n};\nconst body1 = {\n parameterPath: "body",\n mapper: {\n serializedName: "body",\n required: true,\n xmlName: "body",\n type: {\n name: "Stream"\n }\n }\n};\nconst accept2 = {\n parameterPath: "accept",\n mapper: {\n defaultValue: "application/xml",\n isConstant: true,\n serializedName: "Accept",\n type: {\n name: "String"\n }\n }\n};\nconst comp19 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "page",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst pageWrite = {\n parameterPath: "pageWrite",\n mapper: {\n defaultValue: "update",\n isConstant: true,\n serializedName: "x-ms-page-write",\n type: {\n name: "String"\n }\n }\n};\nconst ifSequenceNumberLessThanOrEqualTo = {\n parameterPath: [\n "options",\n "sequenceNumberAccessConditions",\n "ifSequenceNumberLessThanOrEqualTo"\n ],\n mapper: {\n serializedName: "x-ms-if-sequence-number-le",\n xmlName: "x-ms-if-sequence-number-le",\n type: {\n name: "Number"\n }\n }\n};\nconst ifSequenceNumberLessThan = {\n parameterPath: [\n "options",\n "sequenceNumberAccessConditions",\n "ifSequenceNumberLessThan"\n ],\n mapper: {\n serializedName: "x-ms-if-sequence-number-lt",\n xmlName: "x-ms-if-sequence-number-lt",\n type: {\n name: "Number"\n }\n }\n};\nconst ifSequenceNumberEqualTo = {\n parameterPath: [\n "options",\n "sequenceNumberAccessConditions",\n "ifSequenceNumberEqualTo"\n ],\n mapper: {\n serializedName: "x-ms-if-sequence-number-eq",\n xmlName: "x-ms-if-sequence-number-eq",\n type: {\n name: "Number"\n }\n }\n};\nconst pageWrite1 = {\n parameterPath: "pageWrite",\n mapper: {\n defaultValue: "clear",\n isConstant: true,\n serializedName: "x-ms-page-write",\n type: {\n name: "String"\n }\n }\n};\nconst sourceUrl = {\n parameterPath: "sourceUrl",\n mapper: {\n serializedName: "x-ms-copy-source",\n required: true,\n xmlName: "x-ms-copy-source",\n type: {\n name: "String"\n }\n }\n};\nconst sourceRange = {\n parameterPath: "sourceRange",\n mapper: {\n serializedName: "x-ms-source-range",\n required: true,\n xmlName: "x-ms-source-range",\n type: {\n name: "String"\n }\n }\n};\nconst sourceContentCrc64 = {\n parameterPath: ["options", "sourceContentCrc64"],\n mapper: {\n serializedName: "x-ms-source-content-crc64",\n xmlName: "x-ms-source-content-crc64",\n type: {\n name: "ByteArray"\n }\n }\n};\nconst range1 = {\n parameterPath: "range",\n mapper: {\n serializedName: "x-ms-range",\n required: true,\n xmlName: "x-ms-range",\n type: {\n name: "String"\n }\n }\n};\nconst comp20 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "pagelist",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst prevsnapshot = {\n parameterPath: ["options", "prevsnapshot"],\n mapper: {\n serializedName: "prevsnapshot",\n xmlName: "prevsnapshot",\n type: {\n name: "String"\n }\n }\n};\nconst prevSnapshotUrl = {\n parameterPath: ["options", "prevSnapshotUrl"],\n mapper: {\n serializedName: "x-ms-previous-snapshot-url",\n xmlName: "x-ms-previous-snapshot-url",\n type: {\n name: "String"\n }\n }\n};\nconst sequenceNumberAction = {\n parameterPath: "sequenceNumberAction",\n mapper: {\n serializedName: "x-ms-sequence-number-action",\n required: true,\n xmlName: "x-ms-sequence-number-action",\n type: {\n name: "Enum",\n allowedValues: ["max", "update", "increment"]\n }\n }\n};\nconst comp21 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "incrementalcopy",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst blobType1 = {\n parameterPath: "blobType",\n mapper: {\n defaultValue: "AppendBlob",\n isConstant: true,\n serializedName: "x-ms-blob-type",\n type: {\n name: "String"\n }\n }\n};\nconst comp22 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "appendblock",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst maxSize = {\n parameterPath: ["options", "appendPositionAccessConditions", "maxSize"],\n mapper: {\n serializedName: "x-ms-blob-condition-maxsize",\n xmlName: "x-ms-blob-condition-maxsize",\n type: {\n name: "Number"\n }\n }\n};\nconst appendPosition = {\n parameterPath: [\n "options",\n "appendPositionAccessConditions",\n "appendPosition"\n ],\n mapper: {\n serializedName: "x-ms-blob-condition-appendpos",\n xmlName: "x-ms-blob-condition-appendpos",\n type: {\n name: "Number"\n }\n }\n};\nconst sourceRange1 = {\n parameterPath: ["options", "sourceRange"],\n mapper: {\n serializedName: "x-ms-source-range",\n xmlName: "x-ms-source-range",\n type: {\n name: "String"\n }\n }\n};\nconst comp23 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "seal",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst blobType2 = {\n parameterPath: "blobType",\n mapper: {\n defaultValue: "BlockBlob",\n isConstant: true,\n serializedName: "x-ms-blob-type",\n type: {\n name: "String"\n }\n }\n};\nconst copySourceBlobProperties = {\n parameterPath: ["options", "copySourceBlobProperties"],\n mapper: {\n serializedName: "x-ms-copy-source-blob-properties",\n xmlName: "x-ms-copy-source-blob-properties",\n type: {\n name: "Boolean"\n }\n }\n};\nconst comp24 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "block",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst blockId = {\n parameterPath: "blockId",\n mapper: {\n serializedName: "blockid",\n required: true,\n xmlName: "blockid",\n type: {\n name: "String"\n }\n }\n};\nconst blocks = {\n parameterPath: "blocks",\n mapper: BlockLookupList\n};\nconst comp25 = {\n parameterPath: "comp",\n mapper: {\n defaultValue: "blocklist",\n isConstant: true,\n serializedName: "comp",\n type: {\n name: "String"\n }\n }\n};\nconst listType = {\n parameterPath: "listType",\n mapper: {\n defaultValue: "committed",\n serializedName: "blocklisttype",\n required: true,\n xmlName: "blocklisttype",\n type: {\n name: "Enum",\n allowedValues: ["committed", "uncommitted", "all"]\n }\n }\n};\n//# sourceMappingURL=parameters.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/service.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a Service. */\nclass Service {\n /**\n * Initialize a new instance of the class Service class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * Sets properties for a storage account\'s Blob service endpoint, including properties for Storage\n * Analytics and CORS (Cross-Origin Resource Sharing) rules\n * @param blobServiceProperties The StorageService properties.\n * @param options The options parameters.\n */\n setProperties(blobServiceProperties, options) {\n const operationArguments = {\n blobServiceProperties,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setPropertiesOperationSpec);\n }\n /**\n * gets the properties of a storage account\'s Blob service, including properties for Storage Analytics\n * and CORS (Cross-Origin Resource Sharing) rules.\n * @param options The options parameters.\n */\n getProperties(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getPropertiesOperationSpec);\n }\n /**\n * Retrieves statistics related to replication for the Blob service. It is only available on the\n * secondary location endpoint when read-access geo-redundant replication is enabled for the storage\n * account.\n * @param options The options parameters.\n */\n getStatistics(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getStatisticsOperationSpec);\n }\n /**\n * The List Containers Segment operation returns a list of the containers under the specified account\n * @param options The options parameters.\n */\n listContainersSegment(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, listContainersSegmentOperationSpec);\n }\n /**\n * Retrieves a user delegation key for the Blob service. This is only a valid operation when using\n * bearer token authentication.\n * @param keyInfo Key information\n * @param options The options parameters.\n */\n getUserDelegationKey(keyInfo, options) {\n const operationArguments = {\n keyInfo,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getUserDelegationKeyOperationSpec);\n }\n /**\n * Returns the sku name and account kind\n * @param options The options parameters.\n */\n getAccountInfo(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getAccountInfoOperationSpec);\n }\n /**\n * The Batch operation allows multiple API calls to be embedded into a single HTTP request.\n * @param contentLength The length of the request.\n * @param multipartContentType Required. The value of this header must be multipart/mixed with a batch\n * boundary. Example header value: multipart/mixed; boundary=batch_\n * @param body Initial data\n * @param options The options parameters.\n */\n submitBatch(contentLength, multipartContentType, body, options) {\n const operationArguments = {\n contentLength,\n multipartContentType,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, submitBatchOperationSpec);\n }\n /**\n * The Filter Blobs operation enables callers to list blobs across all containers whose tags match a\n * given search expression. Filter blobs searches across all containers within a storage account but\n * can be scoped within the expression to a single container.\n * @param options The options parameters.\n */\n filterBlobs(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, filterBlobsOperationSpec);\n }\n}\n// Operation Specifications\nconst xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst setPropertiesOperationSpec = {\n path: "/",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: ServiceSetPropertiesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceSetPropertiesExceptionHeaders\n }\n },\n requestBody: blobServiceProperties,\n queryParameters: [\n restype,\n comp,\n timeoutInSeconds\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: xmlSerializer\n};\nconst getPropertiesOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: BlobServiceProperties,\n headersMapper: ServiceGetPropertiesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceGetPropertiesExceptionHeaders\n }\n },\n queryParameters: [\n restype,\n comp,\n timeoutInSeconds\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: xmlSerializer\n};\nconst getStatisticsOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: BlobServiceStatistics,\n headersMapper: ServiceGetStatisticsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceGetStatisticsExceptionHeaders\n }\n },\n queryParameters: [\n restype,\n timeoutInSeconds,\n comp1\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: xmlSerializer\n};\nconst listContainersSegmentOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: ListContainersSegmentResponse,\n headersMapper: ServiceListContainersSegmentHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceListContainersSegmentExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp2,\n prefix,\n marker,\n maxPageSize,\n include\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: xmlSerializer\n};\nconst getUserDelegationKeyOperationSpec = {\n path: "/",\n httpMethod: "POST",\n responses: {\n 200: {\n bodyMapper: UserDelegationKey,\n headersMapper: ServiceGetUserDelegationKeyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceGetUserDelegationKeyExceptionHeaders\n }\n },\n requestBody: keyInfo,\n queryParameters: [\n restype,\n timeoutInSeconds,\n comp3\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: xmlSerializer\n};\nconst getAccountInfoOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n headersMapper: ServiceGetAccountInfoHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceGetAccountInfoExceptionHeaders\n }\n },\n queryParameters: [comp, restype1],\n urlParameters: [url],\n headerParameters: [version, accept1],\n isXML: true,\n serializer: xmlSerializer\n};\nconst submitBatchOperationSpec = {\n path: "/",\n httpMethod: "POST",\n responses: {\n 202: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: ServiceSubmitBatchHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceSubmitBatchExceptionHeaders\n }\n },\n requestBody: body,\n queryParameters: [timeoutInSeconds, comp4],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n contentLength,\n multipartContentType\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: xmlSerializer\n};\nconst filterBlobsOperationSpec = {\n path: "/",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: FilterBlobSegment,\n headersMapper: ServiceFilterBlobsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ServiceFilterBlobsExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n marker,\n maxPageSize,\n comp5,\n where\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: xmlSerializer\n};\n//# sourceMappingURL=service.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/container.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a Container. */\nclass Container {\n /**\n * Initialize a new instance of the class Container class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * creates a new container under the specified account. If the container with the same name already\n * exists, the operation fails\n * @param options The options parameters.\n */\n create(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, createOperationSpec);\n }\n /**\n * returns all user-defined metadata and system properties for the specified container. The data\n * returned does not include the container\'s list of blobs\n * @param options The options parameters.\n */\n getProperties(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, container_getPropertiesOperationSpec);\n }\n /**\n * operation marks the specified container for deletion. The container and any blobs contained within\n * it are later deleted during garbage collection\n * @param options The options parameters.\n */\n delete(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, deleteOperationSpec);\n }\n /**\n * operation sets one or more user-defined name-value pairs for the specified container.\n * @param options The options parameters.\n */\n setMetadata(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setMetadataOperationSpec);\n }\n /**\n * gets the permissions for the specified container. The permissions indicate whether container data\n * may be accessed publicly.\n * @param options The options parameters.\n */\n getAccessPolicy(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getAccessPolicyOperationSpec);\n }\n /**\n * sets the permissions for the specified container. The permissions indicate whether blobs in a\n * container may be accessed publicly.\n * @param options The options parameters.\n */\n setAccessPolicy(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setAccessPolicyOperationSpec);\n }\n /**\n * Restores a previously-deleted container.\n * @param options The options parameters.\n */\n restore(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, restoreOperationSpec);\n }\n /**\n * Renames an existing container.\n * @param sourceContainerName Required. Specifies the name of the container to rename.\n * @param options The options parameters.\n */\n rename(sourceContainerName, options) {\n const operationArguments = {\n sourceContainerName,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, renameOperationSpec);\n }\n /**\n * The Batch operation allows multiple API calls to be embedded into a single HTTP request.\n * @param contentLength The length of the request.\n * @param multipartContentType Required. The value of this header must be multipart/mixed with a batch\n * boundary. Example header value: multipart/mixed; boundary=batch_\n * @param body Initial data\n * @param options The options parameters.\n */\n submitBatch(contentLength, multipartContentType, body, options) {\n const operationArguments = {\n contentLength,\n multipartContentType,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, container_submitBatchOperationSpec);\n }\n /**\n * The Filter Blobs operation enables callers to list blobs in a container whose tags match a given\n * search expression. Filter blobs searches within the given container.\n * @param options The options parameters.\n */\n filterBlobs(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, container_filterBlobsOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param options The options parameters.\n */\n acquireLease(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, acquireLeaseOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param leaseId Specifies the current lease ID on the resource.\n * @param options The options parameters.\n */\n releaseLease(leaseId, options) {\n const operationArguments = {\n leaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, releaseLeaseOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param leaseId Specifies the current lease ID on the resource.\n * @param options The options parameters.\n */\n renewLease(leaseId, options) {\n const operationArguments = {\n leaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, renewLeaseOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param options The options parameters.\n */\n breakLease(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, breakLeaseOperationSpec);\n }\n /**\n * [Update] establishes and manages a lock on a container for delete operations. The lock duration can\n * be 15 to 60 seconds, or can be infinite\n * @param leaseId Specifies the current lease ID on the resource.\n * @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400\n * (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor\n * (String) for a list of valid GUID string formats.\n * @param options The options parameters.\n */\n changeLease(leaseId, proposedLeaseId, options) {\n const operationArguments = {\n leaseId,\n proposedLeaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, changeLeaseOperationSpec);\n }\n /**\n * [Update] The List Blobs operation returns a list of the blobs under the specified container\n * @param options The options parameters.\n */\n listBlobFlatSegment(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, listBlobFlatSegmentOperationSpec);\n }\n /**\n * [Update] The List Blobs operation returns a list of the blobs under the specified container\n * @param delimiter When the request includes this parameter, the operation returns a BlobPrefix\n * element in the response body that acts as a placeholder for all blobs whose names begin with the\n * same substring up to the appearance of the delimiter character. The delimiter may be a single\n * character or a string.\n * @param options The options parameters.\n */\n listBlobHierarchySegment(delimiter, options) {\n const operationArguments = {\n delimiter,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, listBlobHierarchySegmentOperationSpec);\n }\n /**\n * Returns the sku name and account kind\n * @param options The options parameters.\n */\n getAccountInfo(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, container_getAccountInfoOperationSpec);\n }\n}\n// Operation Specifications\nconst container_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst createOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: ContainerCreateHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerCreateExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, restype2],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n access,\n defaultEncryptionScope,\n preventEncryptionScopeOverride\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst container_getPropertiesOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n headersMapper: ContainerGetPropertiesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerGetPropertiesExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, restype2],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst deleteOperationSpec = {\n path: "/{containerName}",\n httpMethod: "DELETE",\n responses: {\n 202: {\n headersMapper: ContainerDeleteHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerDeleteExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, restype2],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst setMetadataOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerSetMetadataHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerSetMetadataExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp6\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst getAccessPolicyOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: {\n type: {\n name: "Sequence",\n element: {\n type: { name: "Composite", className: "SignedIdentifier" }\n }\n },\n serializedName: "SignedIdentifiers",\n xmlName: "SignedIdentifiers",\n xmlIsWrapped: true,\n xmlElementName: "SignedIdentifier"\n },\n headersMapper: ContainerGetAccessPolicyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerGetAccessPolicyExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp7\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst setAccessPolicyOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerSetAccessPolicyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerSetAccessPolicyExceptionHeaders\n }\n },\n requestBody: containerAcl,\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp7\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n access,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: container_xmlSerializer\n};\nconst restoreOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: ContainerRestoreHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerRestoreExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp8\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n deletedContainerName,\n deletedContainerVersion\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst renameOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerRenameHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerRenameExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp9\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n sourceContainerName,\n sourceLeaseId\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst container_submitBatchOperationSpec = {\n path: "/{containerName}",\n httpMethod: "POST",\n responses: {\n 202: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: ContainerSubmitBatchHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerSubmitBatchExceptionHeaders\n }\n },\n requestBody: body,\n queryParameters: [\n timeoutInSeconds,\n comp4,\n restype2\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n contentLength,\n multipartContentType\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: container_xmlSerializer\n};\nconst container_filterBlobsOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: FilterBlobSegment,\n headersMapper: ContainerFilterBlobsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerFilterBlobsExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n marker,\n maxPageSize,\n comp5,\n where,\n restype2\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst acquireLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: ContainerAcquireLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerAcquireLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action,\n duration,\n proposedLeaseId\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst releaseLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerReleaseLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerReleaseLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action1,\n leaseId1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst renewLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerRenewLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerRenewLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n leaseId1,\n action2\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst breakLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: ContainerBreakLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerBreakLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action3,\n breakPeriod\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst changeLeaseOperationSpec = {\n path: "/{containerName}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: ContainerChangeLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerChangeLeaseExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n restype2,\n comp10\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n leaseId1,\n action4,\n proposedLeaseId1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst listBlobFlatSegmentOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: ListBlobsFlatSegmentResponse,\n headersMapper: ContainerListBlobFlatSegmentHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerListBlobFlatSegmentExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp2,\n prefix,\n marker,\n maxPageSize,\n restype2,\n include1\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst listBlobHierarchySegmentOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: ListBlobsHierarchySegmentResponse,\n headersMapper: ContainerListBlobHierarchySegmentHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerListBlobHierarchySegmentExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp2,\n prefix,\n marker,\n maxPageSize,\n restype2,\n include1,\n delimiter\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: container_xmlSerializer\n};\nconst container_getAccountInfoOperationSpec = {\n path: "/{containerName}",\n httpMethod: "GET",\n responses: {\n 200: {\n headersMapper: ContainerGetAccountInfoHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: ContainerGetAccountInfoExceptionHeaders\n }\n },\n queryParameters: [comp, restype1],\n urlParameters: [url],\n headerParameters: [version, accept1],\n isXML: true,\n serializer: container_xmlSerializer\n};\n//# sourceMappingURL=container.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist-esm/src/createSpan.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nfunction isTracingDisabled() {\n var _a;\n if (typeof process === "undefined") {\n // not supported in browser for now without polyfills\n return false;\n }\n const azureTracingDisabledValue = (_a = process.env.AZURE_TRACING_DISABLED) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n if (azureTracingDisabledValue === "false" || azureTracingDisabledValue === "0") {\n return false;\n }\n return Boolean(azureTracingDisabledValue);\n}\n/**\n * Creates a function that can be used to create spans using the global tracer.\n *\n * Usage:\n *\n * ```typescript\n * // once\n * const createSpan = createSpanFunction({ packagePrefix: "Azure.Data.AppConfiguration", namespace: "Microsoft.AppConfiguration" });\n *\n * // in each operation\n * const span = createSpan("deleteConfigurationSetting", operationOptions);\n * // code...\n * span.end();\n * ```\n *\n * @hidden\n * @param args - allows configuration of the prefix for each span as well as the az.namespace field.\n */\nfunction createSpanFunction(args) {\n return function (operationName, operationOptions) {\n const tracer = getTracer();\n const tracingOptions = (operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) || {};\n const spanOptions = Object.assign({ kind: SpanKind.INTERNAL }, tracingOptions.spanOptions);\n const spanName = args.packagePrefix ? `${args.packagePrefix}.${operationName}` : operationName;\n let span;\n if (isTracingDisabled()) {\n span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n }\n else {\n span = tracer.startSpan(spanName, spanOptions, tracingOptions.tracingContext);\n }\n if (args.namespace) {\n span.setAttribute("az.namespace", args.namespace);\n }\n let newSpanOptions = tracingOptions.spanOptions || {};\n if (span.isRecording() && args.namespace) {\n newSpanOptions = Object.assign(Object.assign({}, tracingOptions.spanOptions), { attributes: Object.assign(Object.assign({}, spanOptions.attributes), { "az.namespace": args.namespace }) });\n }\n const newTracingOptions = Object.assign(Object.assign({}, tracingOptions), { spanOptions: newSpanOptions, tracingContext: interfaces_setSpan(tracingOptions.tracingContext || interfaces_context.active(), span) });\n const newOperationOptions = Object.assign(Object.assign({}, operationOptions), { tracingOptions: newTracingOptions });\n return {\n span,\n updatedOptions: newOperationOptions\n };\n };\n}\n//# sourceMappingURL=createSpan.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist-esm/src/utils/traceParentHeader.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nconst traceParentHeader_VERSION = "00";\n/**\n * Generates a `SpanContext` given a `traceparent` header value.\n * @param traceParent - Serialized span context data as a `traceparent` header value.\n * @returns The `SpanContext` generated from the `traceparent` value.\n */\nfunction extractSpanContextFromTraceParentHeader(traceParentHeader) {\n const parts = traceParentHeader.split("-");\n if (parts.length !== 4) {\n return;\n }\n const [version, traceId, spanId, traceOptions] = parts;\n if (version !== traceParentHeader_VERSION) {\n return;\n }\n const traceFlags = parseInt(traceOptions, 16);\n const spanContext = {\n spanId,\n traceId,\n traceFlags\n };\n return spanContext;\n}\n/**\n * Generates a `traceparent` value given a span context.\n * @param spanContext - Contains context for a specific span.\n * @returns The `spanContext` represented as a `traceparent` value.\n */\nfunction getTraceParentHeader(spanContext) {\n const missingFields = [];\n if (!spanContext.traceId) {\n missingFields.push("traceId");\n }\n if (!spanContext.spanId) {\n missingFields.push("spanId");\n }\n if (missingFields.length) {\n return;\n }\n const flags = spanContext.traceFlags || 0 /* NONE */;\n const hexFlags = flags.toString(16);\n const traceFlags = hexFlags.length === 1 ? `0${hexFlags}` : hexFlags;\n // https://www.w3.org/TR/trace-context/#traceparent-header-field-values\n return `${traceParentHeader_VERSION}-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}`;\n}\n//# sourceMappingURL=traceParentHeader.js.map\n;// CONCATENATED MODULE: external "node:os"\nconst external_node_os_namespaceObject = require("node:os");\n// EXTERNAL MODULE: external "node:util"\nvar external_node_util_ = __webpack_require__(57975);\n;// CONCATENATED MODULE: external "node:process"\nconst external_node_process_namespaceObject = require("node:process");\n;// CONCATENATED MODULE: ./node_modules/@azure/logger/dist/esm/log.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nfunction log(message, ...args) {\n external_node_process_namespaceObject.stderr.write(`${external_node_util_.format(message, ...args)}${external_node_os_namespaceObject.EOL}`);\n}\n//# sourceMappingURL=log.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/logger/dist/esm/debug.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst debugEnvVariable = (typeof process !== "undefined" && process.env && process.env.DEBUG) || undefined;\nlet enabledString;\nlet enabledNamespaces = [];\nlet skippedNamespaces = [];\nconst debuggers = [];\nif (debugEnvVariable) {\n enable(debugEnvVariable);\n}\nconst debugObj = Object.assign((namespace) => {\n return createDebugger(namespace);\n}, {\n enable,\n enabled,\n disable,\n log: log,\n});\nfunction enable(namespaces) {\n enabledString = namespaces;\n enabledNamespaces = [];\n skippedNamespaces = [];\n const wildcard = /\\*/g;\n const namespaceList = namespaces.split(",").map((ns) => ns.trim().replace(wildcard, ".*?"));\n for (const ns of namespaceList) {\n if (ns.startsWith("-")) {\n skippedNamespaces.push(new RegExp(`^${ns.substr(1)}$`));\n }\n else {\n enabledNamespaces.push(new RegExp(`^${ns}$`));\n }\n }\n for (const instance of debuggers) {\n instance.enabled = enabled(instance.namespace);\n }\n}\nfunction enabled(namespace) {\n if (namespace.endsWith("*")) {\n return true;\n }\n for (const skipped of skippedNamespaces) {\n if (skipped.test(namespace)) {\n return false;\n }\n }\n for (const enabledNamespace of enabledNamespaces) {\n if (enabledNamespace.test(namespace)) {\n return true;\n }\n }\n return false;\n}\nfunction disable() {\n const result = enabledString || "";\n enable("");\n return result;\n}\nfunction createDebugger(namespace) {\n const newDebugger = Object.assign(debug, {\n enabled: enabled(namespace),\n destroy,\n log: debugObj.log,\n namespace,\n extend,\n });\n function debug(...args) {\n if (!newDebugger.enabled) {\n return;\n }\n if (args.length > 0) {\n args[0] = `${namespace} ${args[0]}`;\n }\n newDebugger.log(...args);\n }\n debuggers.push(newDebugger);\n return newDebugger;\n}\nfunction destroy() {\n const index = debuggers.indexOf(this);\n if (index >= 0) {\n debuggers.splice(index, 1);\n return true;\n }\n return false;\n}\nfunction extend(namespace) {\n const newDebugger = createDebugger(`${this.namespace}:${namespace}`);\n newDebugger.log = this.log;\n return newDebugger;\n}\n/* harmony default export */ const debug = (debugObj);\n//# sourceMappingURL=debug.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/logger/dist/esm/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst registeredLoggers = new Set();\nconst logLevelFromEnv = (typeof process !== "undefined" && process.env && process.env.AZURE_LOG_LEVEL) || undefined;\nlet azureLogLevel;\n/**\n * The AzureLogger provides a mechanism for overriding where logs are output to.\n * By default, logs are sent to stderr.\n * Override the `log` method to redirect logs to another location.\n */\nconst AzureLogger = debug("azure");\nAzureLogger.log = (...args) => {\n debug.log(...args);\n};\nconst AZURE_LOG_LEVELS = ["verbose", "info", "warning", "error"];\nif (logLevelFromEnv) {\n // avoid calling setLogLevel because we don\'t want a mis-set environment variable to crash\n if (isAzureLogLevel(logLevelFromEnv)) {\n setLogLevel(logLevelFromEnv);\n }\n else {\n console.error(`AZURE_LOG_LEVEL set to unknown log level \'${logLevelFromEnv}\'; logging is not enabled. Acceptable values: ${AZURE_LOG_LEVELS.join(", ")}.`);\n }\n}\n/**\n * Immediately enables logging at the specified log level. If no level is specified, logging is disabled.\n * @param level - The log level to enable for logging.\n * Options from most verbose to least verbose are:\n * - verbose\n * - info\n * - warning\n * - error\n */\nfunction setLogLevel(level) {\n if (level && !isAzureLogLevel(level)) {\n throw new Error(`Unknown log level \'${level}\'. Acceptable values: ${AZURE_LOG_LEVELS.join(",")}`);\n }\n azureLogLevel = level;\n const enabledNamespaces = [];\n for (const logger of registeredLoggers) {\n if (shouldEnable(logger)) {\n enabledNamespaces.push(logger.namespace);\n }\n }\n debug.enable(enabledNamespaces.join(","));\n}\n/**\n * Retrieves the currently specified log level.\n */\nfunction getLogLevel() {\n return azureLogLevel;\n}\nconst levelMap = {\n verbose: 400,\n info: 300,\n warning: 200,\n error: 100,\n};\n/**\n * Creates a logger for use by the Azure SDKs that inherits from `AzureLogger`.\n * @param namespace - The name of the SDK package.\n * @hidden\n */\nfunction createClientLogger(namespace) {\n const clientRootLogger = AzureLogger.extend(namespace);\n patchLogMethod(AzureLogger, clientRootLogger);\n return {\n error: createLogger(clientRootLogger, "error"),\n warning: createLogger(clientRootLogger, "warning"),\n info: createLogger(clientRootLogger, "info"),\n verbose: createLogger(clientRootLogger, "verbose"),\n };\n}\nfunction patchLogMethod(parent, child) {\n child.log = (...args) => {\n parent.log(...args);\n };\n}\nfunction createLogger(parent, level) {\n const logger = Object.assign(parent.extend(level), {\n level,\n });\n patchLogMethod(parent, logger);\n if (shouldEnable(logger)) {\n const enabledNamespaces = debug.disable();\n debug.enable(enabledNamespaces + "," + logger.namespace);\n }\n registeredLoggers.add(logger);\n return logger;\n}\nfunction shouldEnable(logger) {\n return Boolean(azureLogLevel && levelMap[logger.level] <= levelMap[azureLogLevel]);\n}\nfunction isAzureLogLevel(logLevel) {\n return AZURE_LOG_LEVELS.includes(logLevel);\n}\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/log.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst log_logger = createClientLogger("core-http");\n//# sourceMappingURL=log.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/tracingPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nconst createSpan = createSpanFunction({\n packagePrefix: "",\n namespace: "",\n});\n/**\n * Creates a policy that wraps outgoing requests with a tracing span.\n * @param tracingOptions - Tracing options.\n * @returns An instance of the {@link TracingPolicy} class.\n */\nfunction tracingPolicy_tracingPolicy(tracingOptions = {}) {\n return {\n create(nextPolicy, options) {\n return new TracingPolicy(nextPolicy, options, tracingOptions);\n },\n };\n}\n/**\n * A policy that wraps outgoing requests with a tracing span.\n */\nclass TracingPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, tracingOptions) {\n super(nextPolicy, options);\n this.userAgent = tracingOptions.userAgent;\n }\n async sendRequest(request) {\n if (!request.tracingContext) {\n return this._nextPolicy.sendRequest(request);\n }\n const span = this.tryCreateSpan(request);\n if (!span) {\n return this._nextPolicy.sendRequest(request);\n }\n try {\n const response = await this._nextPolicy.sendRequest(request);\n this.tryProcessResponse(span, response);\n return response;\n }\n catch (err) {\n this.tryProcessError(span, err);\n throw err;\n }\n }\n tryCreateSpan(request) {\n var _a;\n try {\n // Passing spanOptions as part of tracingOptions to maintain compatibility @azure/core-tracing@preview.13 and earlier.\n // We can pass this as a separate parameter once we upgrade to the latest core-tracing.\n const { span } = createSpan(`HTTP ${request.method}`, {\n tracingOptions: {\n spanOptions: Object.assign(Object.assign({}, request.spanOptions), { kind: SpanKind.CLIENT }),\n tracingContext: request.tracingContext,\n },\n });\n // If the span is not recording, don\'t do any more work.\n if (!span.isRecording()) {\n span.end();\n return undefined;\n }\n const namespaceFromContext = (_a = request.tracingContext) === null || _a === void 0 ? void 0 : _a.getValue(Symbol.for("az.namespace"));\n if (typeof namespaceFromContext === "string") {\n span.setAttribute("az.namespace", namespaceFromContext);\n }\n span.setAttributes({\n "http.method": request.method,\n "http.url": request.url,\n requestId: request.requestId,\n });\n if (this.userAgent) {\n span.setAttribute("http.user_agent", this.userAgent);\n }\n // set headers\n const spanContext = span.spanContext();\n const traceParentHeader = getTraceParentHeader(spanContext);\n if (traceParentHeader && interfaces_isSpanContextValid(spanContext)) {\n request.headers.set("traceparent", traceParentHeader);\n const traceState = spanContext.traceState && spanContext.traceState.serialize();\n // if tracestate is set, traceparent MUST be set, so only set tracestate after traceparent\n if (traceState) {\n request.headers.set("tracestate", traceState);\n }\n }\n return span;\n }\n catch (error) {\n log_logger.warning(`Skipping creating a tracing span due to an error: ${error.message}`);\n return undefined;\n }\n }\n tryProcessError(span, err) {\n try {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n if (err.statusCode) {\n span.setAttribute("http.status_code", err.statusCode);\n }\n span.end();\n }\n catch (error) {\n log_logger.warning(`Skipping tracing span processing due to an error: ${error.message}`);\n }\n }\n tryProcessResponse(span, response) {\n try {\n span.setAttribute("http.status_code", response.status);\n const serviceRequestId = response.headers.get("x-ms-request-id");\n if (serviceRequestId) {\n span.setAttribute("serviceRequestId", serviceRequestId);\n }\n span.setStatus({\n code: SpanStatusCode.OK,\n });\n span.end();\n }\n catch (error) {\n log_logger.warning(`Skipping tracing span processing due to an error: ${error.message}`);\n }\n }\n}\n//# sourceMappingURL=tracingPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/keepAlivePolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * By default, HTTP connections are maintained for future requests.\n */\nconst keepAlivePolicy_DefaultKeepAliveOptions = {\n enable: true,\n};\n/**\n * Creates a policy that controls whether HTTP connections are maintained on future requests.\n * @param keepAliveOptions - Keep alive options. By default, HTTP connections are maintained for future requests.\n * @returns An instance of the {@link KeepAlivePolicy}\n */\nfunction keepAlivePolicy_keepAlivePolicy(keepAliveOptions) {\n return {\n create: (nextPolicy, options) => {\n return new KeepAlivePolicy(nextPolicy, options, keepAliveOptions || keepAlivePolicy_DefaultKeepAliveOptions);\n },\n };\n}\n/**\n * KeepAlivePolicy is a policy used to control keep alive settings for every request.\n */\nclass KeepAlivePolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of KeepAlivePolicy.\n *\n * @param nextPolicy -\n * @param options -\n * @param keepAliveOptions -\n */\n constructor(nextPolicy, options, keepAliveOptions) {\n super(nextPolicy, options);\n this.keepAliveOptions = keepAliveOptions;\n }\n /**\n * Sends out request.\n *\n * @param request -\n * @returns\n */\n async sendRequest(request) {\n request.keepAlive = this.keepAliveOptions.enable;\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=keepAlivePolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/generateClientRequestIdPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Creates a policy that assigns a unique request id to outgoing requests.\n * @param requestIdHeaderName - The name of the header to use when assigning the unique id to the request.\n */\nfunction generateClientRequestIdPolicy_generateClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {\n return {\n create: (nextPolicy, options) => {\n return new GenerateClientRequestIdPolicy(nextPolicy, options, requestIdHeaderName);\n },\n };\n}\nclass GenerateClientRequestIdPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, _requestIdHeaderName) {\n super(nextPolicy, options);\n this._requestIdHeaderName = _requestIdHeaderName;\n }\n sendRequest(request) {\n if (!request.headers.contains(this._requestIdHeaderName)) {\n request.headers.set(this._requestIdHeaderName, request.requestId);\n }\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=generateClientRequestIdPolicy.js.map\n// EXTERNAL MODULE: ./node_modules/xml2js/lib/xml2js.js\nvar xml2js = __webpack_require__(38805);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/xml.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n// Note: The reason we re-define all of the xml2js default settings (version 2.0) here is because the default settings object exposed\n// by the xm2js library is mutable. See https://github.com/Leonidas-from-XIV/node-xml2js/issues/536\n// By creating a new copy of the settings each time we instantiate the parser,\n// we are safeguarding against the possibility of the default settings being mutated elsewhere unintentionally.\nconst xml2jsDefaultOptionsV2 = {\n explicitCharkey: false,\n trim: false,\n normalize: false,\n normalizeTags: false,\n attrkey: XML_ATTRKEY,\n explicitArray: true,\n ignoreAttrs: false,\n mergeAttrs: false,\n explicitRoot: true,\n validator: undefined,\n xmlns: false,\n explicitChildren: false,\n preserveChildrenOrder: false,\n childkey: "$$",\n charsAsChildren: false,\n includeWhiteChars: false,\n async: false,\n strict: true,\n attrNameProcessors: undefined,\n attrValueProcessors: undefined,\n tagNameProcessors: undefined,\n valueProcessors: undefined,\n rootName: "root",\n xmldec: {\n version: "1.0",\n encoding: "UTF-8",\n standalone: true,\n },\n doctype: undefined,\n renderOpts: {\n pretty: true,\n indent: " ",\n newline: "\\n",\n },\n headless: false,\n chunkSize: 10000,\n emptyTag: "",\n cdata: false,\n};\n// The xml2js settings for general XML parsing operations.\nconst xml2jsParserSettings = Object.assign({}, xml2jsDefaultOptionsV2);\nxml2jsParserSettings.explicitArray = false;\n// The xml2js settings for general XML building operations.\nconst xml2jsBuilderSettings = Object.assign({}, xml2jsDefaultOptionsV2);\nxml2jsBuilderSettings.explicitArray = false;\nxml2jsBuilderSettings.renderOpts = {\n pretty: false,\n};\n/**\n * Converts given JSON object to XML string\n * @param obj - JSON object to be converted into XML string\n * @param opts - Options that govern the parsing of given JSON object\n */\nfunction stringifyXML(obj, opts = {}) {\n var _a;\n xml2jsBuilderSettings.rootName = opts.rootName;\n xml2jsBuilderSettings.charkey = (_a = opts.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;\n const builder = new xml2js.Builder(xml2jsBuilderSettings);\n return builder.buildObject(obj);\n}\n/**\n * Converts given XML string into JSON\n * @param str - String containing the XML content to be parsed into JSON\n * @param opts - Options that govern the parsing of given xml string\n */\nfunction parseXML(str, opts = {}) {\n var _a;\n xml2jsParserSettings.explicitRoot = !!opts.includeRoot;\n xml2jsParserSettings.charkey = (_a = opts.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;\n const xmlParser = new xml2js.Parser(xml2jsParserSettings);\n return new Promise((resolve, reject) => {\n if (!str) {\n reject(new Error("Document is empty"));\n }\n else {\n xmlParser.parseString(str, (err, res) => {\n if (err) {\n reject(err);\n }\n else {\n resolve(res);\n }\n });\n }\n });\n}\n//# sourceMappingURL=xml.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/deserializationPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n/**\n * Create a new serialization RequestPolicyCreator that will serialized HTTP request bodies as they\n * pass through the HTTP pipeline.\n */\nfunction deserializationPolicy_deserializationPolicy(deserializationContentTypes, parsingOptions) {\n return {\n create: (nextPolicy, options) => {\n return new DeserializationPolicy(nextPolicy, options, deserializationContentTypes, parsingOptions);\n },\n };\n}\nconst defaultJsonContentTypes = ["application/json", "text/json"];\nconst defaultXmlContentTypes = ["application/xml", "application/atom+xml"];\nconst deserializationPolicy_DefaultDeserializationOptions = {\n expectedContentTypes: {\n json: defaultJsonContentTypes,\n xml: defaultXmlContentTypes,\n },\n};\n/**\n * A RequestPolicy that will deserialize HTTP response bodies and headers as they pass through the\n * HTTP pipeline.\n */\nclass DeserializationPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, requestPolicyOptions, deserializationContentTypes, parsingOptions = {}) {\n var _a;\n super(nextPolicy, requestPolicyOptions);\n this.jsonContentTypes =\n (deserializationContentTypes && deserializationContentTypes.json) || defaultJsonContentTypes;\n this.xmlContentTypes =\n (deserializationContentTypes && deserializationContentTypes.xml) || defaultXmlContentTypes;\n this.xmlCharKey = (_a = parsingOptions.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;\n }\n async sendRequest(request) {\n return this._nextPolicy.sendRequest(request).then((response) => deserializeResponseBody(this.jsonContentTypes, this.xmlContentTypes, response, {\n xmlCharKey: this.xmlCharKey,\n }));\n }\n}\nfunction getOperationResponse(parsedResponse) {\n let result;\n const request = parsedResponse.request;\n const operationSpec = request.operationSpec;\n if (operationSpec) {\n const operationResponseGetter = request.operationResponseGetter;\n if (!operationResponseGetter) {\n result = operationSpec.responses[parsedResponse.status];\n }\n else {\n result = operationResponseGetter(operationSpec, parsedResponse);\n }\n }\n return result;\n}\nfunction shouldDeserializeResponse(parsedResponse) {\n const shouldDeserialize = parsedResponse.request.shouldDeserialize;\n let result;\n if (shouldDeserialize === undefined) {\n result = true;\n }\n else if (typeof shouldDeserialize === "boolean") {\n result = shouldDeserialize;\n }\n else {\n result = shouldDeserialize(parsedResponse);\n }\n return result;\n}\n/**\n * Given a particular set of content types to parse as either JSON or XML, consumes the HTTP response to produce the result object defined by the request\'s {@link OperationSpec}.\n * @param jsonContentTypes - Response content types to parse the body as JSON.\n * @param xmlContentTypes - Response content types to parse the body as XML.\n * @param response - HTTP Response from the pipeline.\n * @param options - Options to the serializer, mostly for configuring the XML parser if needed.\n * @returns A parsed {@link HttpOperationResponse} object that can be returned by the {@link ServiceClient}.\n */\nfunction deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options = {}) {\n var _a, _b, _c;\n const updatedOptions = {\n rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",\n includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,\n xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,\n };\n return parse(jsonContentTypes, xmlContentTypes, response, updatedOptions).then((parsedResponse) => {\n if (!shouldDeserializeResponse(parsedResponse)) {\n return parsedResponse;\n }\n const operationSpec = parsedResponse.request.operationSpec;\n if (!operationSpec || !operationSpec.responses) {\n return parsedResponse;\n }\n const responseSpec = getOperationResponse(parsedResponse);\n const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec);\n if (error) {\n throw error;\n }\n else if (shouldReturnResponse) {\n return parsedResponse;\n }\n // An operation response spec does exist for current status code, so\n // use it to deserialize the response.\n if (responseSpec) {\n if (responseSpec.bodyMapper) {\n let valueToDeserialize = parsedResponse.parsedBody;\n if (operationSpec.isXML && responseSpec.bodyMapper.type.name === MapperType.Sequence) {\n valueToDeserialize =\n typeof valueToDeserialize === "object"\n ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]\n : [];\n }\n try {\n parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody", options);\n }\n catch (innerError) {\n const restError = new RestError(`Error ${innerError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, undefined, parsedResponse.status, parsedResponse.request, parsedResponse);\n throw restError;\n }\n }\n else if (operationSpec.httpMethod === "HEAD") {\n // head methods never have a body, but we return a boolean to indicate presence/absence of the resource\n parsedResponse.parsedBody = response.status >= 200 && response.status < 300;\n }\n if (responseSpec.headersMapper) {\n parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.toJson(), "operationRes.parsedHeaders", options);\n }\n }\n return parsedResponse;\n });\n}\nfunction isOperationSpecEmpty(operationSpec) {\n const expectedStatusCodes = Object.keys(operationSpec.responses);\n return (expectedStatusCodes.length === 0 ||\n (expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));\n}\nfunction handleErrorResponse(parsedResponse, operationSpec, responseSpec) {\n var _a;\n const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;\n const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)\n ? isSuccessByStatus\n : !!responseSpec;\n if (isExpectedStatusCode) {\n if (responseSpec) {\n if (!responseSpec.isError) {\n return { error: null, shouldReturnResponse: false };\n }\n }\n else {\n return { error: null, shouldReturnResponse: false };\n }\n }\n const errorResponseSpec = responseSpec !== null && responseSpec !== void 0 ? responseSpec : operationSpec.responses.default;\n const streaming = ((_a = parsedResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(parsedResponse.status)) ||\n parsedResponse.request.streamResponseBody;\n const initialErrorMessage = streaming\n ? `Unexpected status code: ${parsedResponse.status}`\n : parsedResponse.bodyAsText;\n const error = new RestError(initialErrorMessage, undefined, parsedResponse.status, parsedResponse.request, parsedResponse);\n // If the item failed but there\'s no error spec or default spec to deserialize the error,\n // we should fail so we just throw the parsed response\n if (!errorResponseSpec) {\n throw error;\n }\n const defaultBodyMapper = errorResponseSpec.bodyMapper;\n const defaultHeadersMapper = errorResponseSpec.headersMapper;\n try {\n // If error response has a body, try to deserialize it using default body mapper.\n // Then try to extract error code & message from it\n if (parsedResponse.parsedBody) {\n const parsedBody = parsedResponse.parsedBody;\n let parsedError;\n if (defaultBodyMapper) {\n let valueToDeserialize = parsedBody;\n if (operationSpec.isXML && defaultBodyMapper.type.name === MapperType.Sequence) {\n valueToDeserialize =\n typeof parsedBody === "object" ? parsedBody[defaultBodyMapper.xmlElementName] : [];\n }\n parsedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody");\n }\n const internalError = parsedBody.error || parsedError || parsedBody;\n error.code = internalError.code;\n if (internalError.message) {\n error.message = internalError.message;\n }\n if (defaultBodyMapper) {\n error.response.parsedBody = parsedError;\n }\n }\n // If error response has headers, try to deserialize it using default header mapper\n if (parsedResponse.headers && defaultHeadersMapper) {\n error.response.parsedHeaders = operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.toJson(), "operationRes.parsedHeaders");\n }\n }\n catch (defaultError) {\n error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;\n }\n return { error, shouldReturnResponse: false };\n}\nfunction parse(jsonContentTypes, xmlContentTypes, operationResponse, opts) {\n var _a;\n const errorHandler = (err) => {\n const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;\n const errCode = err.code || RestError.PARSE_ERROR;\n const e = new RestError(msg, errCode, operationResponse.status, operationResponse.request, operationResponse);\n return Promise.reject(e);\n };\n const streaming = ((_a = operationResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(operationResponse.status)) ||\n operationResponse.request.streamResponseBody;\n if (!streaming && operationResponse.bodyAsText) {\n const text = operationResponse.bodyAsText;\n const contentType = operationResponse.headers.get("Content-Type") || "";\n const contentComponents = !contentType\n ? []\n : contentType.split(";").map((component) => component.toLowerCase());\n if (contentComponents.length === 0 ||\n contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {\n return new Promise((resolve) => {\n operationResponse.parsedBody = JSON.parse(text);\n resolve(operationResponse);\n }).catch(errorHandler);\n }\n else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {\n return parseXML(text, opts)\n .then((body) => {\n operationResponse.parsedBody = body;\n return operationResponse;\n })\n .catch(errorHandler);\n }\n }\n return Promise.resolve(operationResponse);\n}\n//# sourceMappingURL=deserializationPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/logPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * Creates a policy that logs information about the outgoing request and the incoming responses.\n * @param loggingOptions - Logging options.\n * @returns An instance of the {@link LogPolicy}\n */\nfunction logPolicy_logPolicy(loggingOptions = {}) {\n return {\n create: (nextPolicy, options) => {\n return new LogPolicy(nextPolicy, options, loggingOptions);\n },\n };\n}\n/**\n * A policy that logs information about the outgoing request and the incoming responses.\n */\nclass LogPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, { logger = log_logger.info, allowedHeaderNames = [], allowedQueryParameters = [], } = {}) {\n super(nextPolicy, options);\n this.logger = logger;\n this.sanitizer = new Sanitizer({ allowedHeaderNames, allowedQueryParameters });\n }\n /**\n * Header names whose values will be logged when logging is enabled. Defaults to\n * Date, traceparent, x-ms-client-request-id, and x-ms-request id. Any headers\n * specified in this field will be added to that list. Any other values will\n * be written to logs as "REDACTED".\n * @deprecated Pass these into the constructor instead.\n */\n get allowedHeaderNames() {\n return this.sanitizer.allowedHeaderNames;\n }\n /**\n * Header names whose values will be logged when logging is enabled. Defaults to\n * Date, traceparent, x-ms-client-request-id, and x-ms-request id. Any headers\n * specified in this field will be added to that list. Any other values will\n * be written to logs as "REDACTED".\n * @deprecated Pass these into the constructor instead.\n */\n set allowedHeaderNames(allowedHeaderNames) {\n this.sanitizer.allowedHeaderNames = allowedHeaderNames;\n }\n /**\n * Query string names whose values will be logged when logging is enabled. By default no\n * query string values are logged.\n * @deprecated Pass these into the constructor instead.\n */\n get allowedQueryParameters() {\n return this.sanitizer.allowedQueryParameters;\n }\n /**\n * Query string names whose values will be logged when logging is enabled. By default no\n * query string values are logged.\n * @deprecated Pass these into the constructor instead.\n */\n set allowedQueryParameters(allowedQueryParameters) {\n this.sanitizer.allowedQueryParameters = allowedQueryParameters;\n }\n sendRequest(request) {\n if (!this.logger.enabled)\n return this._nextPolicy.sendRequest(request);\n this.logRequest(request);\n return this._nextPolicy.sendRequest(request).then((response) => this.logResponse(response));\n }\n logRequest(request) {\n this.logger(`Request: ${this.sanitizer.sanitize(request)}`);\n }\n logResponse(response) {\n this.logger(`Response status code: ${response.status}`);\n this.logger(`Headers: ${this.sanitizer.sanitize(response.headers)}`);\n return response;\n }\n}\n//# sourceMappingURL=logPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/disableResponseDecompressionPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Returns a request policy factory that can be used to create an instance of\n * {@link DisableResponseDecompressionPolicy}.\n */\nfunction disableResponseDecompressionPolicy_disableResponseDecompressionPolicy() {\n return {\n create: (nextPolicy, options) => {\n return new DisableResponseDecompressionPolicy(nextPolicy, options);\n },\n };\n}\n/**\n * A policy to disable response decompression according to Accept-Encoding header\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding\n */\nclass DisableResponseDecompressionPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of DisableResponseDecompressionPolicy.\n *\n * @param nextPolicy -\n * @param options -\n */\n // The parent constructor is protected.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor */\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n /**\n * Sends out request.\n *\n * @param request -\n * @returns\n */\n async sendRequest(request) {\n request.decompressResponse = false;\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=disableResponseDecompressionPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/httpHeaders.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * A collection of HttpHeaders that can be sent with a HTTP request.\n */\nfunction getHeaderKey(headerName) {\n return headerName.toLowerCase();\n}\nfunction isHttpHeadersLike(object) {\n if (object && typeof object === "object") {\n const castObject = object;\n if (typeof castObject.rawHeaders === "function" &&\n typeof castObject.clone === "function" &&\n typeof castObject.get === "function" &&\n typeof castObject.set === "function" &&\n typeof castObject.contains === "function" &&\n typeof castObject.remove === "function" &&\n typeof castObject.headersArray === "function" &&\n typeof castObject.headerValues === "function" &&\n typeof castObject.headerNames === "function" &&\n typeof castObject.toJson === "function") {\n return true;\n }\n }\n return false;\n}\n/**\n * A collection of HTTP header key/value pairs.\n */\nclass httpHeaders_HttpHeaders {\n constructor(rawHeaders) {\n this._headersMap = {};\n if (rawHeaders) {\n for (const headerName in rawHeaders) {\n this.set(headerName, rawHeaders[headerName]);\n }\n }\n }\n /**\n * Set a header in this collection with the provided name and value. The name is\n * case-insensitive.\n * @param headerName - The name of the header to set. This value is case-insensitive.\n * @param headerValue - The value of the header to set.\n */\n set(headerName, headerValue) {\n this._headersMap[getHeaderKey(headerName)] = {\n name: headerName,\n value: headerValue.toString().trim(),\n };\n }\n /**\n * Get the header value for the provided header name, or undefined if no header exists in this\n * collection with the provided name.\n * @param headerName - The name of the header.\n */\n get(headerName) {\n const header = this._headersMap[getHeaderKey(headerName)];\n return !header ? undefined : header.value;\n }\n /**\n * Get whether or not this header collection contains a header entry for the provided header name.\n */\n contains(headerName) {\n return !!this._headersMap[getHeaderKey(headerName)];\n }\n /**\n * Remove the header with the provided headerName. Return whether or not the header existed and\n * was removed.\n * @param headerName - The name of the header to remove.\n */\n remove(headerName) {\n const result = this.contains(headerName);\n delete this._headersMap[getHeaderKey(headerName)];\n return result;\n }\n /**\n * Get the headers that are contained this collection as an object.\n */\n rawHeaders() {\n return this.toJson({ preserveCase: true });\n }\n /**\n * Get the headers that are contained in this collection as an array.\n */\n headersArray() {\n const headers = [];\n for (const headerKey in this._headersMap) {\n headers.push(this._headersMap[headerKey]);\n }\n return headers;\n }\n /**\n * Get the header names that are contained in this collection.\n */\n headerNames() {\n const headerNames = [];\n const headers = this.headersArray();\n for (let i = 0; i < headers.length; ++i) {\n headerNames.push(headers[i].name);\n }\n return headerNames;\n }\n /**\n * Get the header values that are contained in this collection.\n */\n headerValues() {\n const headerValues = [];\n const headers = this.headersArray();\n for (let i = 0; i < headers.length; ++i) {\n headerValues.push(headers[i].value);\n }\n return headerValues;\n }\n /**\n * Get the JSON object representation of this HTTP header collection.\n */\n toJson(options = {}) {\n const result = {};\n if (options.preserveCase) {\n for (const headerKey in this._headersMap) {\n const header = this._headersMap[headerKey];\n result[header.name] = header.value;\n }\n }\n else {\n for (const headerKey in this._headersMap) {\n const header = this._headersMap[headerKey];\n result[getHeaderKey(header.name)] = header.value;\n }\n }\n return result;\n }\n /**\n * Get the string representation of this HTTP header collection.\n */\n toString() {\n return JSON.stringify(this.toJson({ preserveCase: true }));\n }\n /**\n * Create a deep clone/copy of this HttpHeaders collection.\n */\n clone() {\n const resultPreservingCasing = {};\n for (const headerKey in this._headersMap) {\n const header = this._headersMap[headerKey];\n resultPreservingCasing[header.name] = header.value;\n }\n return new httpHeaders_HttpHeaders(resultPreservingCasing);\n }\n}\n//# sourceMappingURL=httpHeaders.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/webResource.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nfunction isWebResourceLike(object) {\n if (object && typeof object === "object") {\n const castObject = object;\n if (typeof castObject.url === "string" &&\n typeof castObject.method === "string" &&\n typeof castObject.headers === "object" &&\n isHttpHeadersLike(castObject.headers) &&\n typeof castObject.validateRequestProperties === "function" &&\n typeof castObject.prepare === "function" &&\n typeof castObject.clone === "function") {\n return true;\n }\n }\n return false;\n}\n/**\n * Creates a new WebResource object.\n *\n * This class provides an abstraction over a REST call by being library / implementation agnostic and wrapping the necessary\n * properties to initiate a request.\n */\nclass WebResource {\n constructor(url, method, body, query, headers, streamResponseBody, withCredentials, abortSignal, timeout, onUploadProgress, onDownloadProgress, proxySettings, keepAlive, decompressResponse, streamResponseStatusCodes) {\n this.streamResponseBody = streamResponseBody;\n this.streamResponseStatusCodes = streamResponseStatusCodes;\n this.url = url || "";\n this.method = method || "GET";\n this.headers = isHttpHeadersLike(headers) ? headers : new httpHeaders_HttpHeaders(headers);\n this.body = body;\n this.query = query;\n this.formData = undefined;\n this.withCredentials = withCredentials || false;\n this.abortSignal = abortSignal;\n this.timeout = timeout || 0;\n this.onUploadProgress = onUploadProgress;\n this.onDownloadProgress = onDownloadProgress;\n this.proxySettings = proxySettings;\n this.keepAlive = keepAlive;\n this.decompressResponse = decompressResponse;\n this.requestId = this.headers.get("x-ms-client-request-id") || generateUuid();\n }\n /**\n * Validates that the required properties such as method, url, headers["Content-Type"],\n * headers["accept-language"] are defined. It will throw an error if one of the above\n * mentioned properties are not defined.\n */\n validateRequestProperties() {\n if (!this.method) {\n throw new Error("WebResource.method is required.");\n }\n if (!this.url) {\n throw new Error("WebResource.url is required.");\n }\n }\n /**\n * Prepares the request.\n * @param options - Options to provide for preparing the request.\n * @returns Returns the prepared WebResource (HTTP Request) object that needs to be given to the request pipeline.\n */\n prepare(options) {\n if (!options) {\n throw new Error("options object is required");\n }\n if (options.method === undefined ||\n options.method === null ||\n typeof options.method.valueOf() !== "string") {\n throw new Error("options.method must be a string.");\n }\n if (options.url && options.pathTemplate) {\n throw new Error("options.url and options.pathTemplate are mutually exclusive. Please provide exactly one of them.");\n }\n if ((options.pathTemplate === undefined ||\n options.pathTemplate === null ||\n typeof options.pathTemplate.valueOf() !== "string") &&\n (options.url === undefined ||\n options.url === null ||\n typeof options.url.valueOf() !== "string")) {\n throw new Error("Please provide exactly one of options.pathTemplate or options.url.");\n }\n // set the url if it is provided.\n if (options.url) {\n if (typeof options.url !== "string") {\n throw new Error(\'options.url must be of type "string".\');\n }\n this.url = options.url;\n }\n // set the method\n if (options.method) {\n const validMethods = ["GET", "PUT", "HEAD", "DELETE", "OPTIONS", "POST", "PATCH", "TRACE"];\n if (validMethods.indexOf(options.method.toUpperCase()) === -1) {\n throw new Error(\'The provided method "\' +\n options.method +\n \'" is invalid. Supported HTTP methods are: \' +\n JSON.stringify(validMethods));\n }\n }\n this.method = options.method.toUpperCase();\n // construct the url if path template is provided\n if (options.pathTemplate) {\n const { pathTemplate, pathParameters } = options;\n if (typeof pathTemplate !== "string") {\n throw new Error(\'options.pathTemplate must be of type "string".\');\n }\n if (!options.baseUrl) {\n options.baseUrl = "https://management.azure.com";\n }\n const baseUrl = options.baseUrl;\n let url = baseUrl +\n (baseUrl.endsWith("/") ? "" : "/") +\n (pathTemplate.startsWith("/") ? pathTemplate.slice(1) : pathTemplate);\n const segments = url.match(/({[\\w-]*\\s*[\\w-]*})/gi);\n if (segments && segments.length) {\n if (!pathParameters) {\n throw new Error(`pathTemplate: ${pathTemplate} has been provided. Hence, options.pathParameters must also be provided.`);\n }\n segments.forEach(function (item) {\n const pathParamName = item.slice(1, -1);\n const pathParam = pathParameters[pathParamName];\n if (pathParam === null ||\n pathParam === undefined ||\n !(typeof pathParam === "string" || typeof pathParam === "object")) {\n const stringifiedPathParameters = JSON.stringify(pathParameters, undefined, 2);\n throw new Error(`pathTemplate: ${pathTemplate} contains the path parameter ${pathParamName}` +\n ` however, it is not present in parameters: ${stringifiedPathParameters}.` +\n `The value of the path parameter can either be a "string" of the form { ${pathParamName}: "some sample value" } or ` +\n `it can be an "object" of the form { "${pathParamName}": { value: "some sample value", skipUrlEncoding: true } }.`);\n }\n if (typeof pathParam.valueOf() === "string") {\n url = url.replace(item, encodeURIComponent(pathParam));\n }\n if (typeof pathParam.valueOf() === "object") {\n if (!pathParam.value) {\n throw new Error(`options.pathParameters[${pathParamName}] is of type "object" but it does not contain a "value" property.`);\n }\n if (pathParam.skipUrlEncoding) {\n url = url.replace(item, pathParam.value);\n }\n else {\n url = url.replace(item, encodeURIComponent(pathParam.value));\n }\n }\n });\n }\n this.url = url;\n }\n // append query parameters to the url if they are provided. They can be provided with pathTemplate or url option.\n if (options.queryParameters) {\n const queryParameters = options.queryParameters;\n if (typeof queryParameters !== "object") {\n throw new Error(`options.queryParameters must be of type object. It should be a JSON object ` +\n `of "query-parameter-name" as the key and the "query-parameter-value" as the value. ` +\n `The "query-parameter-value" may be fo type "string" or an "object" of the form { value: "query-parameter-value", skipUrlEncoding: true }.`);\n }\n // append question mark if it is not present in the url\n if (this.url && this.url.indexOf("?") === -1) {\n this.url += "?";\n }\n // construct queryString\n const queryParams = [];\n // We need to populate this.query as a dictionary if the request is being used for Sway\'s validateRequest().\n this.query = {};\n for (const queryParamName in queryParameters) {\n const queryParam = queryParameters[queryParamName];\n if (queryParam) {\n if (typeof queryParam === "string") {\n queryParams.push(queryParamName + "=" + encodeURIComponent(queryParam));\n this.query[queryParamName] = encodeURIComponent(queryParam);\n }\n else if (typeof queryParam === "object") {\n if (!queryParam.value) {\n throw new Error(`options.queryParameters[${queryParamName}] is of type "object" but it does not contain a "value" property.`);\n }\n if (queryParam.skipUrlEncoding) {\n queryParams.push(queryParamName + "=" + queryParam.value);\n this.query[queryParamName] = queryParam.value;\n }\n else {\n queryParams.push(queryParamName + "=" + encodeURIComponent(queryParam.value));\n this.query[queryParamName] = encodeURIComponent(queryParam.value);\n }\n }\n }\n } // end-of-for\n // append the queryString\n this.url += queryParams.join("&");\n }\n // add headers to the request if they are provided\n if (options.headers) {\n const headers = options.headers;\n for (const headerName of Object.keys(options.headers)) {\n this.headers.set(headerName, headers[headerName]);\n }\n }\n // ensure accept-language is set correctly\n if (!this.headers.get("accept-language")) {\n this.headers.set("accept-language", "en-US");\n }\n // ensure the request-id is set correctly\n if (!this.headers.get("x-ms-client-request-id") && !options.disableClientRequestId) {\n this.headers.set("x-ms-client-request-id", this.requestId);\n }\n // default\n if (!this.headers.get("Content-Type")) {\n this.headers.set("Content-Type", "application/json; charset=utf-8");\n }\n // set the request body. request.js automatically sets the Content-Length request header, so we need not set it explicitly\n this.body = options.body;\n if (options.body !== undefined && options.body !== null) {\n // body as a stream special case. set the body as-is and check for some special request headers specific to sending a stream.\n if (options.bodyIsStream) {\n if (!this.headers.get("Transfer-Encoding")) {\n this.headers.set("Transfer-Encoding", "chunked");\n }\n if (this.headers.get("Content-Type") !== "application/octet-stream") {\n this.headers.set("Content-Type", "application/octet-stream");\n }\n }\n else {\n if (options.serializationMapper) {\n this.body = new Serializer(options.mappers).serialize(options.serializationMapper, options.body, "requestBody");\n }\n if (!options.disableJsonStringifyOnBody) {\n this.body = JSON.stringify(options.body);\n }\n }\n }\n if (options.spanOptions) {\n this.spanOptions = options.spanOptions;\n }\n if (options.tracingContext) {\n this.tracingContext = options.tracingContext;\n }\n this.abortSignal = options.abortSignal;\n this.onDownloadProgress = options.onDownloadProgress;\n this.onUploadProgress = options.onUploadProgress;\n return this;\n }\n /**\n * Clone this WebResource HTTP request object.\n * @returns The clone of this WebResource HTTP request object.\n */\n clone() {\n const result = new WebResource(this.url, this.method, this.body, this.query, this.headers && this.headers.clone(), this.streamResponseBody, this.withCredentials, this.abortSignal, this.timeout, this.onUploadProgress, this.onDownloadProgress, this.proxySettings, this.keepAlive, this.decompressResponse, this.streamResponseStatusCodes);\n if (this.formData) {\n result.formData = this.formData;\n }\n if (this.operationSpec) {\n result.operationSpec = this.operationSpec;\n }\n if (this.shouldDeserialize) {\n result.shouldDeserialize = this.shouldDeserialize;\n }\n if (this.operationResponseGetter) {\n result.operationResponseGetter = this.operationResponseGetter;\n }\n return result;\n }\n}\n//# sourceMappingURL=webResource.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/log.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * The `@azure/logger` configuration for this package.\n */\nconst logger = createClientLogger("storage-blob");\n//# sourceMappingURL=log.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/constants.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nconst SDK_VERSION = "12.17.0";\nconst SERVICE_VERSION = "2023-11-03";\nconst BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = 256 * 1024 * 1024; // 256MB\nconst BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = 4000 * 1024 * 1024; // 4000MB\nconst BLOCK_BLOB_MAX_BLOCKS = 50000;\nconst DEFAULT_BLOCK_BUFFER_SIZE_BYTES = 8 * 1024 * 1024; // 8MB\nconst DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES = 4 * 1024 * 1024; // 4MB\nconst DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS = 5;\nconst REQUEST_TIMEOUT = 100 * 1000; // In ms\n/**\n * The OAuth scope to use with Azure Storage.\n */\nconst StorageOAuthScopes = "https://storage.azure.com/.default";\nconst constants_URLConstants = {\n Parameters: {\n FORCE_BROWSER_NO_CACHE: "_",\n SIGNATURE: "sig",\n SNAPSHOT: "snapshot",\n VERSIONID: "versionid",\n TIMEOUT: "timeout",\n },\n};\nconst HTTPURLConnection = {\n HTTP_ACCEPTED: 202,\n HTTP_CONFLICT: 409,\n HTTP_NOT_FOUND: 404,\n HTTP_PRECON_FAILED: 412,\n HTTP_RANGE_NOT_SATISFIABLE: 416,\n};\nconst constants_HeaderConstants = {\n AUTHORIZATION: "Authorization",\n AUTHORIZATION_SCHEME: "Bearer",\n CONTENT_ENCODING: "Content-Encoding",\n CONTENT_ID: "Content-ID",\n CONTENT_LANGUAGE: "Content-Language",\n CONTENT_LENGTH: "Content-Length",\n CONTENT_MD5: "Content-Md5",\n CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding",\n CONTENT_TYPE: "Content-Type",\n COOKIE: "Cookie",\n DATE: "date",\n IF_MATCH: "if-match",\n IF_MODIFIED_SINCE: "if-modified-since",\n IF_NONE_MATCH: "if-none-match",\n IF_UNMODIFIED_SINCE: "if-unmodified-since",\n PREFIX_FOR_STORAGE: "x-ms-",\n RANGE: "Range",\n USER_AGENT: "User-Agent",\n X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id",\n X_MS_COPY_SOURCE: "x-ms-copy-source",\n X_MS_DATE: "x-ms-date",\n X_MS_ERROR_CODE: "x-ms-error-code",\n X_MS_VERSION: "x-ms-version",\n};\nconst ETagNone = "";\nconst ETagAny = "*";\nconst SIZE_1_MB = 1 * 1024 * 1024;\nconst BATCH_MAX_REQUEST = 256;\nconst BATCH_MAX_PAYLOAD_IN_BYTES = 4 * SIZE_1_MB;\nconst HTTP_LINE_ENDING = "\\r\\n";\nconst HTTP_VERSION_1_1 = "HTTP/1.1";\nconst EncryptionAlgorithmAES25 = "AES256";\nconst DevelopmentConnectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`;\nconst StorageBlobLoggingAllowedHeaderNames = [\n "Access-Control-Allow-Origin",\n "Cache-Control",\n "Content-Length",\n "Content-Type",\n "Date",\n "Request-Id",\n "traceparent",\n "Transfer-Encoding",\n "User-Agent",\n "x-ms-client-request-id",\n "x-ms-date",\n "x-ms-error-code",\n "x-ms-request-id",\n "x-ms-return-client-request-id",\n "x-ms-version",\n "Accept-Ranges",\n "Content-Disposition",\n "Content-Encoding",\n "Content-Language",\n "Content-MD5",\n "Content-Range",\n "ETag",\n "Last-Modified",\n "Server",\n "Vary",\n "x-ms-content-crc64",\n "x-ms-copy-action",\n "x-ms-copy-completion-time",\n "x-ms-copy-id",\n "x-ms-copy-progress",\n "x-ms-copy-status",\n "x-ms-has-immutability-policy",\n "x-ms-has-legal-hold",\n "x-ms-lease-state",\n "x-ms-lease-status",\n "x-ms-range",\n "x-ms-request-server-encrypted",\n "x-ms-server-encrypted",\n "x-ms-snapshot",\n "x-ms-source-range",\n "If-Match",\n "If-Modified-Since",\n "If-None-Match",\n "If-Unmodified-Since",\n "x-ms-access-tier",\n "x-ms-access-tier-change-time",\n "x-ms-access-tier-inferred",\n "x-ms-account-kind",\n "x-ms-archive-status",\n "x-ms-blob-append-offset",\n "x-ms-blob-cache-control",\n "x-ms-blob-committed-block-count",\n "x-ms-blob-condition-appendpos",\n "x-ms-blob-condition-maxsize",\n "x-ms-blob-content-disposition",\n "x-ms-blob-content-encoding",\n "x-ms-blob-content-language",\n "x-ms-blob-content-length",\n "x-ms-blob-content-md5",\n "x-ms-blob-content-type",\n "x-ms-blob-public-access",\n "x-ms-blob-sequence-number",\n "x-ms-blob-type",\n "x-ms-copy-destination-snapshot",\n "x-ms-creation-time",\n "x-ms-default-encryption-scope",\n "x-ms-delete-snapshots",\n "x-ms-delete-type-permanent",\n "x-ms-deny-encryption-scope-override",\n "x-ms-encryption-algorithm",\n "x-ms-if-sequence-number-eq",\n "x-ms-if-sequence-number-le",\n "x-ms-if-sequence-number-lt",\n "x-ms-incremental-copy",\n "x-ms-lease-action",\n "x-ms-lease-break-period",\n "x-ms-lease-duration",\n "x-ms-lease-id",\n "x-ms-lease-time",\n "x-ms-page-write",\n "x-ms-proposed-lease-id",\n "x-ms-range-get-content-md5",\n "x-ms-rehydrate-priority",\n "x-ms-sequence-number-action",\n "x-ms-sku-name",\n "x-ms-source-content-md5",\n "x-ms-source-if-match",\n "x-ms-source-if-modified-since",\n "x-ms-source-if-none-match",\n "x-ms-source-if-unmodified-since",\n "x-ms-tag-count",\n "x-ms-encryption-key-sha256",\n "x-ms-if-tags",\n "x-ms-source-if-tags",\n];\nconst StorageBlobLoggingAllowedQueryParameters = [\n "comp",\n "maxresults",\n "rscc",\n "rscd",\n "rsce",\n "rscl",\n "rsct",\n "se",\n "si",\n "sip",\n "sp",\n "spr",\n "sr",\n "srt",\n "ss",\n "st",\n "sv",\n "include",\n "marker",\n "prefix",\n "copyid",\n "restype",\n "blockid",\n "blocklisttype",\n "delimiter",\n "prevsnapshot",\n "ske",\n "skoid",\n "sks",\n "skt",\n "sktid",\n "skv",\n "snapshot",\n];\nconst BlobUsesCustomerSpecifiedEncryptionMsg = "BlobUsesCustomerSpecifiedEncryption";\nconst BlobDoesNotUseCustomerSpecifiedEncryption = "BlobDoesNotUseCustomerSpecifiedEncryption";\n/// List of ports used for path style addressing.\n/// Path style addressing means that storage account is put in URI\'s Path segment in instead of in host.\nconst PathStylePorts = [\n "10000",\n "10001",\n "10002",\n "10003",\n "10004",\n "10100",\n "10101",\n "10102",\n "10103",\n "10104",\n "11000",\n "11001",\n "11002",\n "11003",\n "11004",\n "11100",\n "11101",\n "11102",\n "11103",\n "11104",\n];\n//# sourceMappingURL=constants.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/utils.common.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * Reserved URL characters must be properly escaped for Storage services like Blob or File.\n *\n * ## URL encode and escape strategy for JS SDKs\n *\n * When customers pass a URL string into XxxClient classes constructor, the URL string may already be URL encoded or not.\n * But before sending to Azure Storage server, the URL must be encoded. However, it\'s hard for a SDK to guess whether the URL\n * string has been encoded or not. We have 2 potential strategies, and chose strategy two for the XxxClient constructors.\n *\n * ### Strategy One: Assume the customer URL string is not encoded, and always encode URL string in SDK.\n *\n * This is what legacy V2 SDK does, simple and works for most of the cases.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b:",\n * SDK will encode it to "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",\n * SDK will encode it to "http://account.blob.core.windows.net/con/b%253A" and send to server. A blob named "b%3A" will be created.\n *\n * But this strategy will make it not possible to create a blob with "?" in it\'s name. Because when customer URL string is\n * "http://account.blob.core.windows.net/con/blob?name", the "?name" will be treated as URL paramter instead of blob name.\n * If customer URL string is "http://account.blob.core.windows.net/con/blob%3Fname", a blob named "blob%3Fname" will be created.\n * V2 SDK doesn\'t have this issue because it doesn\'t allow customer pass in a full URL, it accepts a separate blob name and encodeURIComponent for it.\n * We cannot accept a SDK cannot create a blob name with "?". So we implement strategy two:\n *\n * ### Strategy Two: SDK doesn\'t assume the URL has been encoded or not. It will just escape the special characters.\n *\n * This is what V10 Blob Go SDK does. It accepts a URL type in Go, and call url.EscapedPath() to escape the special chars unescaped.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b:",\n * SDK will escape ":" like "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",\n * There is no special characters, so send "http://account.blob.core.windows.net/con/b%3A" to server. A blob named "b:" will be created.\n * - When customer URL string is "http://account.blob.core.windows.net/con/b%253A",\n * There is no special characters, so send "http://account.blob.core.windows.net/con/b%253A" to server. A blob named "b%3A" will be created.\n *\n * This strategy gives us flexibility to create with any special characters. But "%" will be treated as a special characters, if the URL string\n * is not encoded, there shouldn\'t a "%" in the URL string, otherwise the URL is not a valid URL.\n * If customer needs to create a blob with "%" in it\'s blob name, use "%25" instead of "%". Just like above 3rd sample.\n * And following URL strings are invalid:\n * - "http://account.blob.core.windows.net/con/b%"\n * - "http://account.blob.core.windows.net/con/b%2"\n * - "http://account.blob.core.windows.net/con/b%G"\n *\n * Another special character is "?", use "%2F" to represent a blob name with "?" in a URL string.\n *\n * ### Strategy for containerName, blobName or other specific XXXName parameters in methods such as `containerClient.getBlobClient(blobName)`\n *\n * We will apply strategy one, and call encodeURIComponent for these parameters like blobName. Because what customers passes in is a plain name instead of a URL.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata\n *\n * @param url -\n */\nfunction escapeURLPath(url) {\n const urlParsed = URLBuilder.parse(url);\n let path = urlParsed.getPath();\n path = path || "/";\n path = utils_common_escape(path);\n urlParsed.setPath(path);\n return urlParsed.toString();\n}\nfunction getProxyUriFromDevConnString(connectionString) {\n // Development Connection String\n // https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string#connect-to-the-emulator-account-using-the-well-known-account-name-and-key\n let proxyUri = "";\n if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) {\n // CONNECTION_STRING=UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://myProxyUri\n const matchCredentials = connectionString.split(";");\n for (const element of matchCredentials) {\n if (element.trim().startsWith("DevelopmentStorageProxyUri=")) {\n proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1];\n }\n }\n }\n return proxyUri;\n}\nfunction getValueInConnString(connectionString, argument) {\n const elements = connectionString.split(";");\n for (const element of elements) {\n if (element.trim().startsWith(argument)) {\n return element.trim().match(argument + "=(.*)")[1];\n }\n }\n return "";\n}\n/**\n * Extracts the parts of an Azure Storage account connection string.\n *\n * @param connectionString - Connection string.\n * @returns String key value pairs of the storage account\'s url and credentials.\n */\nfunction extractConnectionStringParts(connectionString) {\n let proxyUri = "";\n if (connectionString.startsWith("UseDevelopmentStorage=true")) {\n // Development connection string\n proxyUri = getProxyUriFromDevConnString(connectionString);\n connectionString = DevelopmentConnectionString;\n }\n // Matching BlobEndpoint in the Account connection string\n let blobEndpoint = getValueInConnString(connectionString, "BlobEndpoint");\n // Slicing off \'/\' at the end if exists\n // (The methods that use `extractConnectionStringParts` expect the url to not have `/` at the end)\n blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint;\n if (connectionString.search("DefaultEndpointsProtocol=") !== -1 &&\n connectionString.search("AccountKey=") !== -1) {\n // Account connection string\n let defaultEndpointsProtocol = "";\n let accountName = "";\n let accountKey = Buffer.from("accountKey", "base64");\n let endpointSuffix = "";\n // Get account name and key\n accountName = getValueInConnString(connectionString, "AccountName");\n accountKey = Buffer.from(getValueInConnString(connectionString, "AccountKey"), "base64");\n if (!blobEndpoint) {\n // BlobEndpoint is not present in the Account connection string\n // Can be obtained from `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`\n defaultEndpointsProtocol = getValueInConnString(connectionString, "DefaultEndpointsProtocol");\n const protocol = defaultEndpointsProtocol.toLowerCase();\n if (protocol !== "https" && protocol !== "http") {\n throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting \'https\' or \'http\'");\n }\n endpointSuffix = getValueInConnString(connectionString, "EndpointSuffix");\n if (!endpointSuffix) {\n throw new Error("Invalid EndpointSuffix in the provided Connection String");\n }\n blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;\n }\n if (!accountName) {\n throw new Error("Invalid AccountName in the provided Connection String");\n }\n else if (accountKey.length === 0) {\n throw new Error("Invalid AccountKey in the provided Connection String");\n }\n return {\n kind: "AccountConnString",\n url: blobEndpoint,\n accountName,\n accountKey,\n proxyUri,\n };\n }\n else {\n // SAS connection string\n const accountSas = getValueInConnString(connectionString, "SharedAccessSignature");\n let accountName = getValueInConnString(connectionString, "AccountName");\n // if accountName is empty, try to read it from BlobEndpoint\n if (!accountName) {\n accountName = getAccountNameFromUrl(blobEndpoint);\n }\n if (!blobEndpoint) {\n throw new Error("Invalid BlobEndpoint in the provided SAS Connection String");\n }\n else if (!accountSas) {\n throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String");\n }\n return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas };\n }\n}\n/**\n * Internal escape method implemented Strategy Two mentioned in escapeURL() description.\n *\n * @param text -\n */\nfunction utils_common_escape(text) {\n return encodeURIComponent(text)\n .replace(/%2F/g, "/") // Don\'t escape for "/"\n .replace(/\'/g, "%27") // Escape for "\'"\n .replace(/\\+/g, "%20")\n .replace(/%25/g, "%"); // Revert encoded "%"\n}\n/**\n * Append a string to URL path. Will remove duplicated "/" in front of the string\n * when URL path ends with a "/".\n *\n * @param url - Source URL string\n * @param name - String to be appended to URL\n * @returns An updated URL string\n */\nfunction appendToURLPath(url, name) {\n const urlParsed = URLBuilder.parse(url);\n let path = urlParsed.getPath();\n path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name;\n urlParsed.setPath(path);\n const normalizedUrl = new URL(urlParsed.toString());\n return normalizedUrl.toString();\n}\n/**\n * Set URL parameter name and value. If name exists in URL parameters, old value\n * will be replaced by name key. If not provide value, the parameter will be deleted.\n *\n * @param url - Source URL string\n * @param name - Parameter name\n * @param value - Parameter value\n * @returns An updated URL string\n */\nfunction setURLParameter(url, name, value) {\n const urlParsed = URLBuilder.parse(url);\n urlParsed.setQueryParameter(name, value);\n return urlParsed.toString();\n}\n/**\n * Get URL parameter by name.\n *\n * @param url -\n * @param name -\n */\nfunction getURLParameter(url, name) {\n const urlParsed = URLBuilder.parse(url);\n return urlParsed.getQueryParameterValue(name);\n}\n/**\n * Set URL host.\n *\n * @param url - Source URL string\n * @param host - New host string\n * @returns An updated URL string\n */\nfunction setURLHost(url, host) {\n const urlParsed = URLBuilder.parse(url);\n urlParsed.setHost(host);\n return urlParsed.toString();\n}\n/**\n * Get URL path from an URL string.\n *\n * @param url - Source URL string\n */\nfunction getURLPath(url) {\n const urlParsed = URLBuilder.parse(url);\n return urlParsed.getPath();\n}\n/**\n * Get URL scheme from an URL string.\n *\n * @param url - Source URL string\n */\nfunction getURLScheme(url) {\n const urlParsed = URLBuilder.parse(url);\n return urlParsed.getScheme();\n}\n/**\n * Get URL path and query from an URL string.\n *\n * @param url - Source URL string\n */\nfunction getURLPathAndQuery(url) {\n const urlParsed = URLBuilder.parse(url);\n const pathString = urlParsed.getPath();\n if (!pathString) {\n throw new RangeError("Invalid url without valid path.");\n }\n let queryString = urlParsed.getQuery() || "";\n queryString = queryString.trim();\n if (queryString !== "") {\n queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; // Ensure query string start with \'?\'\n }\n return `${pathString}${queryString}`;\n}\n/**\n * Get URL query key value pairs from an URL string.\n *\n * @param url -\n */\nfunction getURLQueries(url) {\n let queryString = URLBuilder.parse(url).getQuery();\n if (!queryString) {\n return {};\n }\n queryString = queryString.trim();\n queryString = queryString.startsWith("?") ? queryString.substr(1) : queryString;\n let querySubStrings = queryString.split("&");\n querySubStrings = querySubStrings.filter((value) => {\n const indexOfEqual = value.indexOf("=");\n const lastIndexOfEqual = value.lastIndexOf("=");\n return (indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1);\n });\n const queries = {};\n for (const querySubString of querySubStrings) {\n const splitResults = querySubString.split("=");\n const key = splitResults[0];\n const value = splitResults[1];\n queries[key] = value;\n }\n return queries;\n}\n/**\n * Append a string to URL query.\n *\n * @param url - Source URL string.\n * @param queryParts - String to be appended to the URL query.\n * @returns An updated URL string.\n */\nfunction appendToURLQuery(url, queryParts) {\n const urlParsed = URLBuilder.parse(url);\n let query = urlParsed.getQuery();\n if (query) {\n query += "&" + queryParts;\n }\n else {\n query = queryParts;\n }\n urlParsed.setQuery(query);\n return urlParsed.toString();\n}\n/**\n * Rounds a date off to seconds.\n *\n * @param date -\n * @param withMilliseconds - If true, YYYY-MM-DDThh:mm:ss.fffffffZ will be returned;\n * If false, YYYY-MM-DDThh:mm:ssZ will be returned.\n * @returns Date string in ISO8061 format, with or without 7 milliseconds component\n */\nfunction truncatedISO8061Date(date, withMilliseconds = true) {\n // Date.toISOString() will return like "2018-10-29T06:34:36.139Z"\n const dateString = date.toISOString();\n return withMilliseconds\n ? dateString.substring(0, dateString.length - 1) + "0000" + "Z"\n : dateString.substring(0, dateString.length - 5) + "Z";\n}\n/**\n * Base64 encode.\n *\n * @param content -\n */\nfunction base64encode(content) {\n return !checkEnvironment_isNode ? btoa(content) : Buffer.from(content).toString("base64");\n}\n/**\n * Base64 decode.\n *\n * @param encodedString -\n */\nfunction base64decode(encodedString) {\n return !isNode ? atob(encodedString) : Buffer.from(encodedString, "base64").toString();\n}\n/**\n * Generate a 64 bytes base64 block ID string.\n *\n * @param blockIndex -\n */\nfunction generateBlockID(blockIDPrefix, blockIndex) {\n // To generate a 64 bytes base64 string, source string should be 48\n const maxSourceStringLength = 48;\n // A blob can have a maximum of 100,000 uncommitted blocks at any given time\n const maxBlockIndexLength = 6;\n const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength;\n if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) {\n blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength);\n }\n const res = blockIDPrefix +\n padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0");\n return base64encode(res);\n}\n/**\n * Delay specified time interval.\n *\n * @param timeInMs -\n * @param aborter -\n * @param abortError -\n */\nasync function utils_common_delay(timeInMs, aborter, abortError) {\n return new Promise((resolve, reject) => {\n /* eslint-disable-next-line prefer-const */\n let timeout;\n const abortHandler = () => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n reject(abortError);\n };\n const resolveHandler = () => {\n if (aborter !== undefined) {\n aborter.removeEventListener("abort", abortHandler);\n }\n resolve();\n };\n timeout = setTimeout(resolveHandler, timeInMs);\n if (aborter !== undefined) {\n aborter.addEventListener("abort", abortHandler);\n }\n });\n}\n/**\n * String.prototype.padStart()\n *\n * @param currentString -\n * @param targetLength -\n * @param padString -\n */\nfunction padStart(currentString, targetLength, padString = " ") {\n // @ts-expect-error: TS doesn\'t know this code needs to run downlevel sometimes\n if (String.prototype.padStart) {\n return currentString.padStart(targetLength, padString);\n }\n padString = padString || " ";\n if (currentString.length > targetLength) {\n return currentString;\n }\n else {\n targetLength = targetLength - currentString.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + currentString;\n }\n}\nfunction sanitizeURL(url) {\n let safeURL = url;\n if (getURLParameter(safeURL, URLConstants.Parameters.SIGNATURE)) {\n safeURL = setURLParameter(safeURL, URLConstants.Parameters.SIGNATURE, "*****");\n }\n return safeURL;\n}\nfunction sanitizeHeaders(originalHeader) {\n const headers = new HttpHeaders();\n for (const header of originalHeader.headersArray()) {\n if (header.name.toLowerCase() === HeaderConstants.AUTHORIZATION.toLowerCase()) {\n headers.set(header.name, "*****");\n }\n else if (header.name.toLowerCase() === HeaderConstants.X_MS_COPY_SOURCE) {\n headers.set(header.name, sanitizeURL(header.value));\n }\n else {\n headers.set(header.name, header.value);\n }\n }\n return headers;\n}\n/**\n * If two strings are equal when compared case insensitive.\n *\n * @param str1 -\n * @param str2 -\n */\nfunction iEqual(str1, str2) {\n return str1.toLocaleLowerCase() === str2.toLocaleLowerCase();\n}\n/**\n * Extracts account name from the url\n * @param url - url to extract the account name from\n * @returns with the account name\n */\nfunction getAccountNameFromUrl(url) {\n const parsedUrl = URLBuilder.parse(url);\n let accountName;\n try {\n if (parsedUrl.getHost().split(".")[1] === "blob") {\n // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;\n accountName = parsedUrl.getHost().split(".")[0];\n }\n else if (isIpEndpointStyle(parsedUrl)) {\n // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/\n // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/\n // .getPath() -> /devstoreaccount1/\n accountName = parsedUrl.getPath().split("/")[1];\n }\n else {\n // Custom domain case: "https://customdomain.com/containername/blob".\n accountName = "";\n }\n return accountName;\n }\n catch (error) {\n throw new Error("Unable to extract accountName with provided information.");\n }\n}\nfunction isIpEndpointStyle(parsedUrl) {\n if (parsedUrl.getHost() === undefined) {\n return false;\n }\n const host = parsedUrl.getHost() + (parsedUrl.getPort() === undefined ? "" : ":" + parsedUrl.getPort());\n // Case 1: Ipv6, use a broad regex to find out candidates whose host contains two \':\'.\n // Case 2: localhost(:port) or host.docker.internal, use broad regex to match port part.\n // Case 3: Ipv4, use broad regex which just check if host contains Ipv4.\n // For valid host please refer to https://man7.org/linux/man-pages/man7/hostname.7.html.\n return (/^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])){3}(:[0-9]+)?$/.test(host) ||\n (parsedUrl.getPort() !== undefined && PathStylePorts.includes(parsedUrl.getPort())));\n}\n/**\n * Convert Tags to encoded string.\n *\n * @param tags -\n */\nfunction toBlobTagsString(tags) {\n if (tags === undefined) {\n return undefined;\n }\n const tagPairs = [];\n for (const key in tags) {\n if (Object.prototype.hasOwnProperty.call(tags, key)) {\n const value = tags[key];\n tagPairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n }\n }\n return tagPairs.join("&");\n}\n/**\n * Convert Tags type to BlobTags.\n *\n * @param tags -\n */\nfunction toBlobTags(tags) {\n if (tags === undefined) {\n return undefined;\n }\n const res = {\n blobTagSet: [],\n };\n for (const key in tags) {\n if (Object.prototype.hasOwnProperty.call(tags, key)) {\n const value = tags[key];\n res.blobTagSet.push({\n key,\n value,\n });\n }\n }\n return res;\n}\n/**\n * Covert BlobTags to Tags type.\n *\n * @param tags -\n */\nfunction toTags(tags) {\n if (tags === undefined) {\n return undefined;\n }\n const res = {};\n for (const blobTag of tags.blobTagSet) {\n res[blobTag.key] = blobTag.value;\n }\n return res;\n}\n/**\n * Convert BlobQueryTextConfiguration to QuerySerialization type.\n *\n * @param textConfiguration -\n */\nfunction toQuerySerialization(textConfiguration) {\n if (textConfiguration === undefined) {\n return undefined;\n }\n switch (textConfiguration.kind) {\n case "csv":\n return {\n format: {\n type: "delimited",\n delimitedTextConfiguration: {\n columnSeparator: textConfiguration.columnSeparator || ",",\n fieldQuote: textConfiguration.fieldQuote || "",\n recordSeparator: textConfiguration.recordSeparator,\n escapeChar: textConfiguration.escapeCharacter || "",\n headersPresent: textConfiguration.hasHeaders || false,\n },\n },\n };\n case "json":\n return {\n format: {\n type: "json",\n jsonTextConfiguration: {\n recordSeparator: textConfiguration.recordSeparator,\n },\n },\n };\n case "arrow":\n return {\n format: {\n type: "arrow",\n arrowConfiguration: {\n schema: textConfiguration.schema,\n },\n },\n };\n case "parquet":\n return {\n format: {\n type: "parquet",\n },\n };\n default:\n throw Error("Invalid BlobQueryTextConfiguration.");\n }\n}\nfunction parseObjectReplicationRecord(objectReplicationRecord) {\n if (!objectReplicationRecord) {\n return undefined;\n }\n if ("policy-id" in objectReplicationRecord) {\n // If the dictionary contains a key with policy id, we are not required to do any parsing since\n // the policy id should already be stored in the ObjectReplicationDestinationPolicyId.\n return undefined;\n }\n const orProperties = [];\n for (const key in objectReplicationRecord) {\n const ids = key.split("_");\n const policyPrefix = "or-";\n if (ids[0].startsWith(policyPrefix)) {\n ids[0] = ids[0].substring(policyPrefix.length);\n }\n const rule = {\n ruleId: ids[1],\n replicationStatus: objectReplicationRecord[key],\n };\n const policyIndex = orProperties.findIndex((policy) => policy.policyId === ids[0]);\n if (policyIndex > -1) {\n orProperties[policyIndex].rules.push(rule);\n }\n else {\n orProperties.push({\n policyId: ids[0],\n rules: [rule],\n });\n }\n }\n return orProperties;\n}\n/**\n * Attach a TokenCredential to an object.\n *\n * @param thing -\n * @param credential -\n */\nfunction attachCredential(thing, credential) {\n thing.credential = credential;\n return thing;\n}\nfunction httpAuthorizationToString(httpAuthorization) {\n return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined;\n}\nfunction BlobNameToString(name) {\n if (name.encoded) {\n return decodeURIComponent(name.content);\n }\n else {\n return name.content;\n }\n}\nfunction ConvertInternalResponseOfListBlobFlat(internalResponse) {\n return Object.assign(Object.assign({}, internalResponse), { segment: {\n blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {\n const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name) });\n return blobItem;\n }),\n } });\n}\nfunction ConvertInternalResponseOfListBlobHierarchy(internalResponse) {\n var _a;\n return Object.assign(Object.assign({}, internalResponse), { segment: {\n blobPrefixes: (_a = internalResponse.segment.blobPrefixes) === null || _a === void 0 ? void 0 : _a.map((blobPrefixInternal) => {\n const blobPrefix = Object.assign(Object.assign({}, blobPrefixInternal), { name: BlobNameToString(blobPrefixInternal.name) });\n return blobPrefix;\n }),\n blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {\n const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name) });\n return blobItem;\n }),\n } });\n}\nfunction* ExtractPageRangeInfoItems(getPageRangesSegment) {\n let pageRange = [];\n let clearRange = [];\n if (getPageRangesSegment.pageRange)\n pageRange = getPageRangesSegment.pageRange;\n if (getPageRangesSegment.clearRange)\n clearRange = getPageRangesSegment.clearRange;\n let pageRangeIndex = 0;\n let clearRangeIndex = 0;\n while (pageRangeIndex < pageRange.length && clearRangeIndex < clearRange.length) {\n if (pageRange[pageRangeIndex].start < clearRange[clearRangeIndex].start) {\n yield {\n start: pageRange[pageRangeIndex].start,\n end: pageRange[pageRangeIndex].end,\n isClear: false,\n };\n ++pageRangeIndex;\n }\n else {\n yield {\n start: clearRange[clearRangeIndex].start,\n end: clearRange[clearRangeIndex].end,\n isClear: true,\n };\n ++clearRangeIndex;\n }\n }\n for (; pageRangeIndex < pageRange.length; ++pageRangeIndex) {\n yield {\n start: pageRange[pageRangeIndex].start,\n end: pageRange[pageRangeIndex].end,\n isClear: false,\n };\n }\n for (; clearRangeIndex < clearRange.length; ++clearRangeIndex) {\n yield {\n start: clearRange[clearRangeIndex].start,\n end: clearRange[clearRangeIndex].end,\n isClear: true,\n };\n }\n}\n/**\n * Escape the blobName but keep path separator (\'/\').\n */\nfunction EscapePath(blobName) {\n const split = blobName.split("/");\n for (let i = 0; i < split.length; i++) {\n split[i] = encodeURIComponent(split[i]);\n }\n return split.join("/");\n}\n//# sourceMappingURL=utils.common.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/StorageBrowserPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:\n *\n * 1. Browsers cache GET/HEAD requests by adding conditional headers such as \'IF_MODIFIED_SINCE\'.\n * StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL\n * thus avoid the browser cache.\n *\n * 2. Remove cookie header for security\n *\n * 3. Remove content-length header to avoid browsers warning\n */\nclass StorageBrowserPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of StorageBrowserPolicy.\n * @param nextPolicy -\n * @param options -\n */\n // The base class has a protected constructor. Adding a public one to enable constructing of this class.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n /**\n * Sends out request.\n *\n * @param request -\n */\n async sendRequest(request) {\n if (checkEnvironment_isNode) {\n return this._nextPolicy.sendRequest(request);\n }\n if (request.method.toUpperCase() === "GET" || request.method.toUpperCase() === "HEAD") {\n request.url = setURLParameter(request.url, constants_URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());\n }\n request.headers.remove(constants_HeaderConstants.COOKIE);\n // According to XHR standards, content-length should be fully controlled by browsers\n request.headers.remove(constants_HeaderConstants.CONTENT_LENGTH);\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=StorageBrowserPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/StorageBrowserPolicyFactory.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.\n */\nclass StorageBrowserPolicyFactory {\n /**\n * Creates a StorageBrowserPolicyFactory object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new StorageBrowserPolicy(nextPolicy, options);\n }\n}\n//# sourceMappingURL=StorageBrowserPolicyFactory.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/abort-controller/dist-esm/src/AbortSignal.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/// \nconst listenersMap = new WeakMap();\nconst abortedMap = new WeakMap();\n/**\n * An aborter instance implements AbortSignal interface, can abort HTTP requests.\n *\n * - Call AbortSignal.none to create a new AbortSignal instance that cannot be cancelled.\n * Use `AbortSignal.none` when you are required to pass a cancellation token but the operation\n * cannot or will not ever be cancelled.\n *\n * @example\n * Abort without timeout\n * ```ts\n * await doAsyncWork(AbortSignal.none);\n * ```\n */\nclass AbortSignal {\n constructor() {\n /**\n * onabort event listener.\n */\n this.onabort = null;\n listenersMap.set(this, []);\n abortedMap.set(this, false);\n }\n /**\n * Status of whether aborted or not.\n *\n * @readonly\n */\n get aborted() {\n if (!abortedMap.has(this)) {\n throw new TypeError("Expected `this` to be an instance of AbortSignal.");\n }\n return abortedMap.get(this);\n }\n /**\n * Creates a new AbortSignal instance that will never be aborted.\n *\n * @readonly\n */\n static get none() {\n return new AbortSignal();\n }\n /**\n * Added new "abort" event listener, only support "abort" event.\n *\n * @param _type - Only support "abort" event\n * @param listener - The listener to be added\n */\n addEventListener(\n // tslint:disable-next-line:variable-name\n _type, listener) {\n if (!listenersMap.has(this)) {\n throw new TypeError("Expected `this` to be an instance of AbortSignal.");\n }\n const listeners = listenersMap.get(this);\n listeners.push(listener);\n }\n /**\n * Remove "abort" event listener, only support "abort" event.\n *\n * @param _type - Only support "abort" event\n * @param listener - The listener to be removed\n */\n removeEventListener(\n // tslint:disable-next-line:variable-name\n _type, listener) {\n if (!listenersMap.has(this)) {\n throw new TypeError("Expected `this` to be an instance of AbortSignal.");\n }\n const listeners = listenersMap.get(this);\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n /**\n * Dispatches a synthetic event to the AbortSignal.\n */\n dispatchEvent(_event) {\n throw new Error("This is a stub dispatchEvent implementation that should not be used. It only exists for type-checking purposes.");\n }\n}\n/**\n * Helper to trigger an abort event immediately, the onabort and all abort event listeners will be triggered.\n * Will try to trigger abort event for all linked AbortSignal nodes.\n *\n * - If there is a timeout, the timer will be cancelled.\n * - If aborted is true, nothing will happen.\n *\n * @internal\n */\n// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\nfunction abortSignal(signal) {\n if (signal.aborted) {\n return;\n }\n if (signal.onabort) {\n signal.onabort.call(signal);\n }\n const listeners = listenersMap.get(signal);\n if (listeners) {\n // Create a copy of listeners so mutations to the array\n // (e.g. via removeListener calls) don\'t affect the listeners\n // we invoke.\n listeners.slice().forEach((listener) => {\n listener.call(signal, { type: "abort" });\n });\n }\n abortedMap.set(signal, true);\n}\n//# sourceMappingURL=AbortSignal.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/abort-controller/dist-esm/src/AbortController.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * This error is thrown when an asynchronous operation has been aborted.\n * Check for this error by testing the `name` that the name property of the\n * error matches `"AbortError"`.\n *\n * @example\n * ```ts\n * const controller = new AbortController();\n * controller.abort();\n * try {\n * doAsyncWork(controller.signal)\n * } catch (e) {\n * if (e.name === \'AbortError\') {\n * // handle abort error here.\n * }\n * }\n * ```\n */\nclass AbortController_AbortError extends Error {\n constructor(message) {\n super(message);\n this.name = "AbortError";\n }\n}\n/**\n * An AbortController provides an AbortSignal and the associated controls to signal\n * that an asynchronous operation should be aborted.\n *\n * @example\n * Abort an operation when another event fires\n * ```ts\n * const controller = new AbortController();\n * const signal = controller.signal;\n * doAsyncWork(signal);\n * button.addEventListener(\'click\', () => controller.abort());\n * ```\n *\n * @example\n * Share aborter cross multiple operations in 30s\n * ```ts\n * // Upload the same data to 2 different data centers at the same time,\n * // abort another when any of them is finished\n * const controller = AbortController.withTimeout(30 * 1000);\n * doAsyncWork(controller.signal).then(controller.abort);\n * doAsyncWork(controller.signal).then(controller.abort);\n *```\n *\n * @example\n * Cascaded aborting\n * ```ts\n * // All operations can\'t take more than 30 seconds\n * const aborter = Aborter.timeout(30 * 1000);\n *\n * // Following 2 operations can\'t take more than 25 seconds\n * await doAsyncWork(aborter.withTimeout(25 * 1000));\n * await doAsyncWork(aborter.withTimeout(25 * 1000));\n * ```\n */\nclass AbortController_AbortController {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n constructor(parentSignals) {\n this._signal = new AbortSignal();\n if (!parentSignals) {\n return;\n }\n // coerce parentSignals into an array\n if (!Array.isArray(parentSignals)) {\n // eslint-disable-next-line prefer-rest-params\n parentSignals = arguments;\n }\n for (const parentSignal of parentSignals) {\n // if the parent signal has already had abort() called,\n // then call abort on this signal as well.\n if (parentSignal.aborted) {\n this.abort();\n }\n else {\n // when the parent signal aborts, this signal should as well.\n parentSignal.addEventListener("abort", () => {\n this.abort();\n });\n }\n }\n }\n /**\n * The AbortSignal associated with this controller that will signal aborted\n * when the abort method is called on this controller.\n *\n * @readonly\n */\n get signal() {\n return this._signal;\n }\n /**\n * Signal that any operations passed this controller\'s associated abort signal\n * to cancel any remaining work and throw an `AbortError`.\n */\n abort() {\n abortSignal(this._signal);\n }\n /**\n * Creates a new AbortSignal instance that will abort after the provided ms.\n * @param ms - Elapsed time in milliseconds to trigger an abort.\n */\n static timeout(ms) {\n const signal = new AbortSignal();\n const timer = setTimeout(abortSignal, ms, signal);\n // Prevent the active Timer from keeping the Node.js event loop active.\n if (typeof timer.unref === "function") {\n timer.unref();\n }\n return signal;\n }\n}\n//# sourceMappingURL=AbortController.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/StorageRetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n/**\n * A factory method used to generated a RetryPolicy factory.\n *\n * @param retryOptions -\n */\nfunction NewRetryPolicyFactory(retryOptions) {\n return {\n create: (nextPolicy, options) => {\n return new StorageRetryPolicy(nextPolicy, options, retryOptions);\n },\n };\n}\n/**\n * RetryPolicy types.\n */\nvar StorageRetryPolicyType;\n(function (StorageRetryPolicyType) {\n /**\n * Exponential retry. Retry time delay grows exponentially.\n */\n StorageRetryPolicyType[StorageRetryPolicyType["EXPONENTIAL"] = 0] = "EXPONENTIAL";\n /**\n * Linear retry. Retry time delay grows linearly.\n */\n StorageRetryPolicyType[StorageRetryPolicyType["FIXED"] = 1] = "FIXED";\n})(StorageRetryPolicyType || (StorageRetryPolicyType = {}));\n// Default values of StorageRetryOptions\nconst DEFAULT_RETRY_OPTIONS = {\n maxRetryDelayInMs: 120 * 1000,\n maxTries: 4,\n retryDelayInMs: 4 * 1000,\n retryPolicyType: StorageRetryPolicyType.EXPONENTIAL,\n secondaryHost: "",\n tryTimeoutInMs: undefined, // Use server side default timeout strategy\n};\nconst RETRY_ABORT_ERROR = new AbortController_AbortError("The operation was aborted.");\n/**\n * Retry policy with exponential retry and linear retry implemented.\n */\nclass StorageRetryPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of RetryPolicy.\n *\n * @param nextPolicy -\n * @param options -\n * @param retryOptions -\n */\n constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS) {\n super(nextPolicy, options);\n // Initialize retry options\n this.retryOptions = {\n retryPolicyType: retryOptions.retryPolicyType\n ? retryOptions.retryPolicyType\n : DEFAULT_RETRY_OPTIONS.retryPolicyType,\n maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1\n ? Math.floor(retryOptions.maxTries)\n : DEFAULT_RETRY_OPTIONS.maxTries,\n tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0\n ? retryOptions.tryTimeoutInMs\n : DEFAULT_RETRY_OPTIONS.tryTimeoutInMs,\n retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0\n ? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs\n ? retryOptions.maxRetryDelayInMs\n : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs)\n : DEFAULT_RETRY_OPTIONS.retryDelayInMs,\n maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0\n ? retryOptions.maxRetryDelayInMs\n : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs,\n secondaryHost: retryOptions.secondaryHost\n ? retryOptions.secondaryHost\n : DEFAULT_RETRY_OPTIONS.secondaryHost,\n };\n }\n /**\n * Sends request.\n *\n * @param request -\n */\n async sendRequest(request) {\n return this.attemptSendRequest(request, false, 1);\n }\n /**\n * Decide and perform next retry. Won\'t mutate request parameter.\n *\n * @param request -\n * @param secondaryHas404 - If attempt was against the secondary & it returned a StatusNotFound (404), then\n * the resource was not found. This may be due to replication delay. So, in this\n * case, we\'ll never try the secondary again for this operation.\n * @param attempt - How many retries has been attempted to performed, starting from 1, which includes\n * the attempt will be performed by this method call.\n */\n async attemptSendRequest(request, secondaryHas404, attempt) {\n const newRequest = request.clone();\n const isPrimaryRetry = secondaryHas404 ||\n !this.retryOptions.secondaryHost ||\n !(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") ||\n attempt % 2 === 1;\n if (!isPrimaryRetry) {\n newRequest.url = setURLHost(newRequest.url, this.retryOptions.secondaryHost);\n }\n // Set the server-side timeout query parameter "timeout=[seconds]"\n if (this.retryOptions.tryTimeoutInMs) {\n newRequest.url = setURLParameter(newRequest.url, constants_URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString());\n }\n let response;\n try {\n logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);\n response = await this._nextPolicy.sendRequest(newRequest);\n if (!this.shouldRetry(isPrimaryRetry, attempt, response)) {\n return response;\n }\n secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);\n }\n catch (err) {\n logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`);\n if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) {\n throw err;\n }\n }\n await this.delay(isPrimaryRetry, attempt, request.abortSignal);\n return this.attemptSendRequest(request, secondaryHas404, ++attempt);\n }\n /**\n * Decide whether to retry according to last HTTP response and retry counters.\n *\n * @param isPrimaryRetry -\n * @param attempt -\n * @param response -\n * @param err -\n */\n shouldRetry(isPrimaryRetry, attempt, response, err) {\n if (attempt >= this.retryOptions.maxTries) {\n logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions\n .maxTries}, no further try.`);\n return false;\n }\n // Handle network failures, you may need to customize the list when you implement\n // your own http client\n const retriableErrors = [\n "ETIMEDOUT",\n "ESOCKETTIMEDOUT",\n "ECONNREFUSED",\n "ECONNRESET",\n "ENOENT",\n "ENOTFOUND",\n "TIMEOUT",\n "EPIPE",\n "REQUEST_SEND_ERROR", // For default xhr based http client provided in ms-rest-js\n ];\n if (err) {\n for (const retriableError of retriableErrors) {\n if (err.name.toUpperCase().includes(retriableError) ||\n err.message.toUpperCase().includes(retriableError) ||\n (err.code && err.code.toString().toUpperCase() === retriableError)) {\n logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);\n return true;\n }\n }\n }\n // If attempt was against the secondary & it returned a StatusNotFound (404), then\n // the resource was not found. This may be due to replication delay. So, in this\n // case, we\'ll never try the secondary again for this operation.\n if (response || err) {\n const statusCode = response ? response.status : err ? err.statusCode : 0;\n if (!isPrimaryRetry && statusCode === 404) {\n logger.info(`RetryPolicy: Secondary access with 404, will retry.`);\n return true;\n }\n // Server internal error or server timeout\n if (statusCode === 503 || statusCode === 500) {\n logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);\n return true;\n }\n }\n if ((err === null || err === void 0 ? void 0 : err.code) === "PARSE_ERROR" && (err === null || err === void 0 ? void 0 : err.message.startsWith(`Error "Error: Unclosed root tag`))) {\n logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");\n return true;\n }\n return false;\n }\n /**\n * Delay a calculated time between retries.\n *\n * @param isPrimaryRetry -\n * @param attempt -\n * @param abortSignal -\n */\n async delay(isPrimaryRetry, attempt, abortSignal) {\n let delayTimeInMs = 0;\n if (isPrimaryRetry) {\n switch (this.retryOptions.retryPolicyType) {\n case StorageRetryPolicyType.EXPONENTIAL:\n delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs);\n break;\n case StorageRetryPolicyType.FIXED:\n delayTimeInMs = this.retryOptions.retryDelayInMs;\n break;\n }\n }\n else {\n delayTimeInMs = Math.random() * 1000;\n }\n logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);\n return utils_common_delay(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR);\n }\n}\n//# sourceMappingURL=StorageRetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/StorageRetryPolicyFactory.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.\n */\nclass StorageRetryPolicyFactory {\n /**\n * Creates an instance of StorageRetryPolicyFactory.\n * @param retryOptions -\n */\n constructor(retryOptions) {\n this.retryOptions = retryOptions;\n }\n /**\n * Creates a StorageRetryPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new StorageRetryPolicy(nextPolicy, options, this.retryOptions);\n }\n}\n//# sourceMappingURL=StorageRetryPolicyFactory.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/CredentialPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Credential policy used to sign HTTP(S) requests before sending. This is an\n * abstract class.\n */\nclass CredentialPolicy extends BaseRequestPolicy {\n /**\n * Sends out request.\n *\n * @param request -\n */\n sendRequest(request) {\n return this._nextPolicy.sendRequest(this.signRequest(request));\n }\n /**\n * Child classes must implement this method with request signing. This method\n * will be executed in {@link sendRequest}.\n *\n * @param request -\n */\n signRequest(request) {\n // Child classes must override this method with request signing. This method\n // will be executed in sendRequest().\n return request;\n }\n}\n//# sourceMappingURL=CredentialPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/AnonymousCredentialPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources\n * or for use with Shared Access Signatures (SAS).\n */\nclass AnonymousCredentialPolicy extends CredentialPolicy {\n /**\n * Creates an instance of AnonymousCredentialPolicy.\n * @param nextPolicy -\n * @param options -\n */\n // The base class has a protected constructor. Adding a public one to enable constructing of this class.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n}\n//# sourceMappingURL=AnonymousCredentialPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/credentials/Credential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Credential is an abstract class for Azure Storage HTTP requests signing. This\n * class will host an credentialPolicyCreator factory which generates CredentialPolicy.\n */\nclass Credential {\n /**\n * Creates a RequestPolicy object.\n *\n * @param _nextPolicy -\n * @param _options -\n */\n create(_nextPolicy, _options) {\n throw new Error("Method should be implemented in children classes.");\n }\n}\n//# sourceMappingURL=Credential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/credentials/AnonymousCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * AnonymousCredential provides a credentialPolicyCreator member used to create\n * AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with\n * HTTP(S) requests that read public resources or for use with Shared Access\n * Signatures (SAS).\n */\nclass AnonymousCredential extends Credential {\n /**\n * Creates an {@link AnonymousCredentialPolicy} object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new AnonymousCredentialPolicy(nextPolicy, options);\n }\n}\n//# sourceMappingURL=AnonymousCredential.js.map\n// EXTERNAL MODULE: external "os"\nvar external_os_ = __webpack_require__(70857);\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/TelemetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * TelemetryPolicy is a policy used to tag user-agent header for every requests.\n */\nclass TelemetryPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of TelemetryPolicy.\n * @param nextPolicy -\n * @param options -\n * @param telemetry -\n */\n constructor(nextPolicy, options, telemetry) {\n super(nextPolicy, options);\n this.telemetry = telemetry;\n }\n /**\n * Sends out request.\n *\n * @param request -\n */\n async sendRequest(request) {\n if (checkEnvironment_isNode) {\n if (!request.headers) {\n request.headers = new httpHeaders_HttpHeaders();\n }\n if (!request.headers.get(constants_HeaderConstants.USER_AGENT)) {\n request.headers.set(constants_HeaderConstants.USER_AGENT, this.telemetry);\n }\n }\n return this._nextPolicy.sendRequest(request);\n }\n}\n//# sourceMappingURL=TelemetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/TelemetryPolicyFactory.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n/**\n * TelemetryPolicyFactory is a factory class helping generating {@link TelemetryPolicy} objects.\n */\nclass TelemetryPolicyFactory {\n /**\n * Creates an instance of TelemetryPolicyFactory.\n * @param telemetry -\n */\n constructor(telemetry) {\n const userAgentInfo = [];\n if (checkEnvironment_isNode) {\n if (telemetry) {\n const telemetryString = telemetry.userAgentPrefix || "";\n if (telemetryString.length > 0 && userAgentInfo.indexOf(telemetryString) === -1) {\n userAgentInfo.push(telemetryString);\n }\n }\n // e.g. azsdk-js-storageblob/10.0.0\n const libInfo = `azsdk-js-storageblob/${SDK_VERSION}`;\n if (userAgentInfo.indexOf(libInfo) === -1) {\n userAgentInfo.push(libInfo);\n }\n // e.g. (NODE-VERSION 4.9.1; Windows_NT 10.0.16299)\n let runtimeInfo = `(NODE-VERSION ${process.version})`;\n if (external_os_) {\n runtimeInfo = `(NODE-VERSION ${process.version}; ${external_os_.type()} ${external_os_.release()})`;\n }\n if (userAgentInfo.indexOf(runtimeInfo) === -1) {\n userAgentInfo.push(runtimeInfo);\n }\n }\n this.telemetryString = userAgentInfo.join(" ");\n }\n /**\n * Creates a TelemetryPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new TelemetryPolicy(nextPolicy, options, this.telemetryString);\n }\n}\n//# sourceMappingURL=TelemetryPolicyFactory.js.map\n// EXTERNAL MODULE: external "http"\nvar external_http_ = __webpack_require__(58611);\n// EXTERNAL MODULE: external "https"\nvar external_https_ = __webpack_require__(65692);\n// EXTERNAL MODULE: ./node_modules/tunnel/index.js\nvar tunnel = __webpack_require__(10803);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/proxyAgent.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nfunction createProxyAgent(requestUrl, proxySettings, headers) {\n const host = URLBuilder.parse(proxySettings.host).getHost();\n if (!host) {\n throw new Error("Expecting a non-empty host in proxy settings.");\n }\n if (!isValidPort(proxySettings.port)) {\n throw new Error("Expecting a valid port number in the range of [0, 65535] in proxy settings.");\n }\n const tunnelOptions = {\n proxy: {\n host: host,\n port: proxySettings.port,\n headers: (headers && headers.rawHeaders()) || {},\n },\n };\n if (proxySettings.username && proxySettings.password) {\n tunnelOptions.proxy.proxyAuth = `${proxySettings.username}:${proxySettings.password}`;\n }\n else if (proxySettings.username) {\n tunnelOptions.proxy.proxyAuth = `${proxySettings.username}`;\n }\n const isRequestHttps = isUrlHttps(requestUrl);\n const isProxyHttps = isUrlHttps(proxySettings.host);\n const proxyAgent = {\n isHttps: isRequestHttps,\n agent: createTunnel(isRequestHttps, isProxyHttps, tunnelOptions),\n };\n return proxyAgent;\n}\nfunction isUrlHttps(url) {\n const urlScheme = URLBuilder.parse(url).getScheme() || "";\n return urlScheme.toLowerCase() === "https";\n}\nfunction createTunnel(isRequestHttps, isProxyHttps, tunnelOptions) {\n if (isRequestHttps && isProxyHttps) {\n return tunnel.httpsOverHttps(tunnelOptions);\n }\n else if (isRequestHttps && !isProxyHttps) {\n return tunnel.httpsOverHttp(tunnelOptions);\n }\n else if (!isRequestHttps && isProxyHttps) {\n return tunnel.httpOverHttps(tunnelOptions);\n }\n else {\n return tunnel.httpOverHttp(tunnelOptions);\n }\n}\nfunction isValidPort(port) {\n // any port in 0-65535 range is valid (RFC 793) even though almost all implementations\n // will reserve 0 for a specific purpose, and a range of numbers for ephemeral ports\n return 0 <= port && port <= 65535;\n}\n//# sourceMappingURL=proxyAgent.js.map\n// EXTERNAL MODULE: external "stream"\nvar external_stream_ = __webpack_require__(2203);\n// EXTERNAL MODULE: ./node_modules/form-data/lib/form_data.js\nvar form_data = __webpack_require__(30737);\nvar form_data_default = /*#__PURE__*/__webpack_require__.n(form_data);\n// EXTERNAL MODULE: ./node_modules/node-fetch/lib/index.mjs\nvar lib = __webpack_require__(78540);\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/nodeFetchHttpClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\nfunction getCachedAgent(isHttps, agentCache) {\n return isHttps ? agentCache.httpsAgent : agentCache.httpAgent;\n}\nclass ReportTransform extends external_stream_.Transform {\n constructor(progressCallback) {\n super();\n this.progressCallback = progressCallback;\n this.loadedBytes = 0;\n }\n _transform(chunk, _encoding, callback) {\n this.push(chunk);\n this.loadedBytes += chunk.length;\n this.progressCallback({ loadedBytes: this.loadedBytes });\n callback(undefined);\n }\n}\nfunction isReadableStream(body) {\n return body && typeof body.pipe === "function";\n}\nfunction isStreamComplete(stream, aborter) {\n return new Promise((resolve) => {\n stream.once("close", () => {\n aborter === null || aborter === void 0 ? void 0 : aborter.abort();\n resolve();\n });\n stream.once("end", resolve);\n stream.once("error", resolve);\n });\n}\n/**\n * Transforms a set of headers into the key/value pair defined by {@link HttpHeadersLike}\n */\nfunction parseHeaders(headers) {\n const httpHeaders = new httpHeaders_HttpHeaders();\n headers.forEach((value, key) => {\n httpHeaders.set(key, value);\n });\n return httpHeaders;\n}\n/**\n * An HTTP client that uses `node-fetch`.\n */\nclass NodeFetchHttpClient {\n constructor() {\n // a mapping of proxy settings string `${host}:${port}:${username}:${password}` to agent\n this.proxyAgentMap = new Map();\n this.keepAliveAgents = {};\n }\n /**\n * Provides minimum viable error handling and the logic that executes the abstract methods.\n * @param httpRequest - Object representing the outgoing HTTP request.\n * @returns An object representing the incoming HTTP response.\n */\n async sendRequest(httpRequest) {\n var _a;\n if (!httpRequest && typeof httpRequest !== "object") {\n throw new Error("\'httpRequest\' (WebResourceLike) cannot be null or undefined and must be of type object.");\n }\n const abortController = new AbortController_AbortController();\n let abortListener;\n if (httpRequest.abortSignal) {\n if (httpRequest.abortSignal.aborted) {\n throw new AbortController_AbortError("The operation was aborted.");\n }\n abortListener = (event) => {\n if (event.type === "abort") {\n abortController.abort();\n }\n };\n httpRequest.abortSignal.addEventListener("abort", abortListener);\n }\n if (httpRequest.timeout) {\n setTimeout(() => {\n abortController.abort();\n }, httpRequest.timeout);\n }\n if (httpRequest.formData) {\n const formData = httpRequest.formData;\n const requestForm = new (form_data_default())();\n const appendFormValue = (key, value) => {\n // value function probably returns a stream so we can provide a fresh stream on each retry\n if (typeof value === "function") {\n value = value();\n }\n if (value &&\n Object.prototype.hasOwnProperty.call(value, "value") &&\n Object.prototype.hasOwnProperty.call(value, "options")) {\n requestForm.append(key, value.value, value.options);\n }\n else {\n requestForm.append(key, value);\n }\n };\n for (const formKey of Object.keys(formData)) {\n const formValue = formData[formKey];\n if (Array.isArray(formValue)) {\n for (let j = 0; j < formValue.length; j++) {\n appendFormValue(formKey, formValue[j]);\n }\n }\n else {\n appendFormValue(formKey, formValue);\n }\n }\n httpRequest.body = requestForm;\n httpRequest.formData = undefined;\n const contentType = httpRequest.headers.get("Content-Type");\n if (contentType && contentType.indexOf("multipart/form-data") !== -1) {\n if (typeof requestForm.getBoundary === "function") {\n httpRequest.headers.set("Content-Type", `multipart/form-data; boundary=${requestForm.getBoundary()}`);\n }\n else {\n // browser will automatically apply a suitable content-type header\n httpRequest.headers.remove("Content-Type");\n }\n }\n }\n let body = httpRequest.body\n ? typeof httpRequest.body === "function"\n ? httpRequest.body()\n : httpRequest.body\n : undefined;\n if (httpRequest.onUploadProgress && httpRequest.body) {\n const onUploadProgress = httpRequest.onUploadProgress;\n const uploadReportStream = new ReportTransform(onUploadProgress);\n if (isReadableStream(body)) {\n body.pipe(uploadReportStream);\n }\n else {\n uploadReportStream.end(body);\n }\n body = uploadReportStream;\n }\n const platformSpecificRequestInit = await this.prepareRequest(httpRequest);\n const requestInit = Object.assign({ body: body, headers: httpRequest.headers.rawHeaders(), method: httpRequest.method, \n // the types for RequestInit are from the browser, which expects AbortSignal to\n // have `reason` and `throwIfAborted`, but these don\'t exist on our polyfill\n // for Node.\n signal: abortController.signal, redirect: "manual" }, platformSpecificRequestInit);\n let operationResponse;\n try {\n const response = await this.fetch(httpRequest.url, requestInit);\n const headers = parseHeaders(response.headers);\n const streaming = ((_a = httpRequest.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(response.status)) ||\n httpRequest.streamResponseBody;\n operationResponse = {\n headers: headers,\n request: httpRequest,\n status: response.status,\n readableStreamBody: streaming\n ? response.body\n : undefined,\n bodyAsText: !streaming ? await response.text() : undefined,\n };\n const onDownloadProgress = httpRequest.onDownloadProgress;\n if (onDownloadProgress) {\n const responseBody = response.body || undefined;\n if (isReadableStream(responseBody)) {\n const downloadReportStream = new ReportTransform(onDownloadProgress);\n responseBody.pipe(downloadReportStream);\n operationResponse.readableStreamBody = downloadReportStream;\n }\n else {\n const length = parseInt(headers.get("Content-Length")) || undefined;\n if (length) {\n // Calling callback for non-stream response for consistency with browser\n onDownloadProgress({ loadedBytes: length });\n }\n }\n }\n await this.processRequest(operationResponse);\n return operationResponse;\n }\n catch (error) {\n const fetchError = error;\n if (fetchError.code === "ENOTFOUND") {\n throw new RestError(fetchError.message, RestError.REQUEST_SEND_ERROR, undefined, httpRequest);\n }\n else if (fetchError.type === "aborted") {\n throw new AbortController_AbortError("The operation was aborted.");\n }\n throw fetchError;\n }\n finally {\n // clean up event listener\n if (httpRequest.abortSignal && abortListener) {\n let uploadStreamDone = Promise.resolve();\n if (isReadableStream(body)) {\n uploadStreamDone = isStreamComplete(body);\n }\n let downloadStreamDone = Promise.resolve();\n if (isReadableStream(operationResponse === null || operationResponse === void 0 ? void 0 : operationResponse.readableStreamBody)) {\n downloadStreamDone = isStreamComplete(operationResponse.readableStreamBody, abortController);\n }\n Promise.all([uploadStreamDone, downloadStreamDone])\n .then(() => {\n var _a;\n (_a = httpRequest.abortSignal) === null || _a === void 0 ? void 0 : _a.removeEventListener("abort", abortListener);\n return;\n })\n .catch((e) => {\n log_logger.warning("Error when cleaning up abortListener on httpRequest", e);\n });\n }\n }\n }\n getOrCreateAgent(httpRequest) {\n var _a;\n const isHttps = isUrlHttps(httpRequest.url);\n // At the moment, proxy settings and keepAlive are mutually\n // exclusive because the \'tunnel\' library currently lacks the\n // ability to create a proxy with keepAlive turned on.\n if (httpRequest.proxySettings) {\n const { host, port, username, password } = httpRequest.proxySettings;\n const key = `${host}:${port}:${username}:${password}`;\n const proxyAgents = (_a = this.proxyAgentMap.get(key)) !== null && _a !== void 0 ? _a : {};\n let agent = getCachedAgent(isHttps, proxyAgents);\n if (agent) {\n return agent;\n }\n const tunnel = createProxyAgent(httpRequest.url, httpRequest.proxySettings, httpRequest.headers);\n agent = tunnel.agent;\n if (tunnel.isHttps) {\n proxyAgents.httpsAgent = tunnel.agent;\n }\n else {\n proxyAgents.httpAgent = tunnel.agent;\n }\n this.proxyAgentMap.set(key, proxyAgents);\n return agent;\n }\n else if (httpRequest.keepAlive) {\n let agent = getCachedAgent(isHttps, this.keepAliveAgents);\n if (agent) {\n return agent;\n }\n const agentOptions = {\n keepAlive: httpRequest.keepAlive,\n };\n if (isHttps) {\n agent = this.keepAliveAgents.httpsAgent = new external_https_.Agent(agentOptions);\n }\n else {\n agent = this.keepAliveAgents.httpAgent = new external_http_.Agent(agentOptions);\n }\n return agent;\n }\n else {\n return isHttps ? external_https_.globalAgent : external_http_.globalAgent;\n }\n }\n /**\n * Uses `node-fetch` to perform the request.\n */\n // eslint-disable-next-line @azure/azure-sdk/ts-apisurface-standardized-verbs\n async fetch(input, init) {\n return (0,lib/* default */.Ay)(input, init);\n }\n /**\n * Prepares a request based on the provided web resource.\n */\n async prepareRequest(httpRequest) {\n const requestInit = {};\n // Set the http(s) agent\n requestInit.agent = this.getOrCreateAgent(httpRequest);\n requestInit.compress = httpRequest.decompressResponse;\n return requestInit;\n }\n /**\n * Process an HTTP response.\n */\n async processRequest(_operationResponse) {\n /* no_op */\n }\n}\n//# sourceMappingURL=nodeFetchHttpClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/cache.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nconst _defaultHttpClient = new NodeFetchHttpClient();\nfunction getCachedDefaultHttpClient() {\n return _defaultHttpClient;\n}\n//# sourceMappingURL=cache.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/StorageBearerTokenChallengeAuthenticationPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * A set of constants used internally when processing requests.\n */\nconst StorageBearerTokenChallengeAuthenticationPolicy_Constants = {\n DefaultScope: "/.default",\n /**\n * Defines constants for use with HTTP headers.\n */\n HeaderConstants: {\n /**\n * The Authorization header.\n */\n AUTHORIZATION: "authorization",\n },\n};\n// Default options for the cycler if none are provided\nconst DEFAULT_CYCLER_OPTIONS = {\n forcedRefreshWindowInMs: 1000,\n retryIntervalInMs: 3000,\n refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry\n};\n/**\n * Converts an an unreliable access token getter (which may resolve with null)\n * into an AccessTokenGetter by retrying the unreliable getter in a regular\n * interval.\n *\n * @param getAccessToken - a function that produces a promise of an access\n * token that may fail by returning null\n * @param retryIntervalInMs - the time (in milliseconds) to wait between retry\n * attempts\n * @param timeoutInMs - the timestamp after which the refresh attempt will fail,\n * throwing an exception\n * @returns - a promise that, if it resolves, will resolve with an access token\n */\nasync function beginRefresh(getAccessToken, retryIntervalInMs, timeoutInMs) {\n // This wrapper handles exceptions gracefully as long as we haven\'t exceeded\n // the timeout.\n async function tryGetAccessToken() {\n if (Date.now() < timeoutInMs) {\n try {\n return await getAccessToken();\n }\n catch (_a) {\n return null;\n }\n }\n else {\n const finalToken = await getAccessToken();\n // Timeout is up, so throw if it\'s still null\n if (finalToken === null) {\n throw new Error("Failed to refresh access token.");\n }\n return finalToken;\n }\n }\n let token = await tryGetAccessToken();\n while (token === null) {\n await delay_delay(retryIntervalInMs);\n token = await tryGetAccessToken();\n }\n return token;\n}\n/**\n * Creates a token cycler from a credential, scopes, and optional settings.\n *\n * A token cycler represents a way to reliably retrieve a valid access token\n * from a TokenCredential. It will handle initializing the token, refreshing it\n * when it nears expiration, and synchronizes refresh attempts to avoid\n * concurrency hazards.\n *\n * @param credential - the underlying TokenCredential that provides the access\n * token\n * @param scopes - the scopes to request authorization for\n * @param tokenCyclerOptions - optionally override default settings for the cycler\n *\n * @returns - a function that reliably produces a valid access token\n */\nfunction createTokenCycler(credential, scopes, tokenCyclerOptions) {\n let refreshWorker = null;\n let token = null;\n const options = Object.assign(Object.assign({}, DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);\n /**\n * This little holder defines several predicates that we use to construct\n * the rules of refreshing the token.\n */\n const cycler = {\n /**\n * Produces true if a refresh job is currently in progress.\n */\n get isRefreshing() {\n return refreshWorker !== null;\n },\n /**\n * Produces true if the cycler SHOULD refresh (we are within the refresh\n * window and not already refreshing)\n */\n get shouldRefresh() {\n var _a;\n return (!cycler.isRefreshing &&\n ((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());\n },\n /**\n * Produces true if the cycler MUST refresh (null or nearly-expired\n * token).\n */\n get mustRefresh() {\n return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());\n },\n };\n /**\n * Starts a refresh job or returns the existing job if one is already\n * running.\n */\n function refresh(getTokenOptions) {\n var _a;\n if (!cycler.isRefreshing) {\n // We bind `scopes` here to avoid passing it around a lot\n const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);\n // Take advantage of promise chaining to insert an assignment to `token`\n // before the refresh can be considered done.\n refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, \n // If we don\'t have a token, then we should timeout immediately\n (_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())\n .then((_token) => {\n refreshWorker = null;\n token = _token;\n return token;\n })\n .catch((reason) => {\n // We also should reset the refresher if we enter a failed state. All\n // existing awaiters will throw, but subsequent requests will start a\n // new retry chain.\n refreshWorker = null;\n token = null;\n throw reason;\n });\n }\n return refreshWorker;\n }\n return async (tokenOptions) => {\n //\n // Simple rules:\n // - If we MUST refresh, then return the refresh task, blocking\n // the pipeline until a token is available.\n // - If we SHOULD refresh, then run refresh but don\'t return it\n // (we can still use the cached token).\n // - Return the token, since it\'s fine if we didn\'t return in\n // step 1.\n //\n if (cycler.mustRefresh)\n return refresh(tokenOptions);\n if (cycler.shouldRefresh) {\n refresh(tokenOptions);\n }\n return token;\n };\n}\n/**\n * We will retrieve the challenge only if the response status code was 401,\n * and if the response contained the header "WWW-Authenticate" with a non-empty value.\n */\nfunction getChallenge(response) {\n const challenge = response.headers.get("WWW-Authenticate");\n if (response.status === 401 && challenge) {\n return challenge;\n }\n return;\n}\n/**\n * Converts: `Bearer a="b" c="d"`.\n * Into: `[ { a: \'b\', c: \'d\' }]`.\n *\n * @internal\n */\nfunction parseChallenge(challenge) {\n const bearerChallenge = challenge.slice("Bearer ".length);\n const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x);\n const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("=")));\n // Key-value pairs to plain object:\n return keyValuePairs.reduce((a, b) => (Object.assign(Object.assign({}, a), b)), {});\n}\n// #endregion\n/**\n * Creates a new factory for a RequestPolicy that applies a bearer token to\n * the requests\' `Authorization` headers.\n *\n * @param credential - The TokenCredential implementation that can supply the bearer token.\n * @param scopes - The scopes for which the bearer token applies.\n */\nfunction storageBearerTokenChallengeAuthenticationPolicy(credential, scopes) {\n // This simple function encapsulates the entire process of reliably retrieving the token\n let getToken = createTokenCycler(credential, scopes);\n class StorageBearerTokenChallengeAuthenticationPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n async sendRequest(webResource) {\n if (!webResource.url.toLowerCase().startsWith("https://")) {\n throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");\n }\n const getTokenInternal = getToken;\n const token = (await getTokenInternal({\n abortSignal: webResource.abortSignal,\n tracingOptions: {\n tracingContext: webResource.tracingContext,\n },\n })).token;\n webResource.headers.set(StorageBearerTokenChallengeAuthenticationPolicy_Constants.HeaderConstants.AUTHORIZATION, `Bearer ${token}`);\n const response = await this._nextPolicy.sendRequest(webResource);\n if ((response === null || response === void 0 ? void 0 : response.status) === 401) {\n const challenge = getChallenge(response);\n if (challenge) {\n const challengeInfo = parseChallenge(challenge);\n const challengeScopes = challengeInfo.resource_id + StorageBearerTokenChallengeAuthenticationPolicy_Constants.DefaultScope;\n const parsedAuthUri = URLBuilder.parse(challengeInfo.authorization_uri);\n const pathSegments = parsedAuthUri.getPath().split("/");\n const tenantId = pathSegments[1];\n const getTokenForChallenge = createTokenCycler(credential, challengeScopes);\n const tokenForChallenge = (await getTokenForChallenge({\n abortSignal: webResource.abortSignal,\n tracingOptions: {\n tracingContext: webResource.tracingContext,\n },\n tenantId: tenantId,\n })).token;\n getToken = getTokenForChallenge;\n webResource.headers.set(StorageBearerTokenChallengeAuthenticationPolicy_Constants.HeaderConstants.AUTHORIZATION, `Bearer ${tokenForChallenge}`);\n return this._nextPolicy.sendRequest(webResource);\n }\n }\n return response;\n }\n }\n return {\n create: (nextPolicy, options) => {\n return new StorageBearerTokenChallengeAuthenticationPolicy(nextPolicy, options);\n },\n };\n}\n//# sourceMappingURL=StorageBearerTokenChallengeAuthenticationPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/Pipeline.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n// Export following interfaces and types for customers who want to implement their\n// own RequestPolicy or HTTPClient\n\n/**\n * A helper to decide if a given argument satisfies the Pipeline contract\n * @param pipeline - An argument that may be a Pipeline\n * @returns true when the argument satisfies the Pipeline contract\n */\nfunction isPipelineLike(pipeline) {\n if (!pipeline || typeof pipeline !== "object") {\n return false;\n }\n const castPipeline = pipeline;\n return (Array.isArray(castPipeline.factories) &&\n typeof castPipeline.options === "object" &&\n typeof castPipeline.toServiceClientOptions === "function");\n}\n/**\n * A Pipeline class containing HTTP request policies.\n * You can create a default Pipeline by calling {@link newPipeline}.\n * Or you can create a Pipeline with your own policies by the constructor of Pipeline.\n *\n * Refer to {@link newPipeline} and provided policies before implementing your\n * customized Pipeline.\n */\nclass Pipeline {\n /**\n * Creates an instance of Pipeline. Customize HTTPClient by implementing IHttpClient interface.\n *\n * @param factories -\n * @param options -\n */\n constructor(factories, options = {}) {\n this.factories = factories;\n // when options.httpClient is not specified, passing in a DefaultHttpClient instance to\n // avoid each client creating its own http client.\n this.options = Object.assign(Object.assign({}, options), { httpClient: options.httpClient || getCachedDefaultHttpClient() });\n }\n /**\n * Transfer Pipeline object to ServiceClientOptions object which is required by\n * ServiceClient constructor.\n *\n * @returns The ServiceClientOptions object from this Pipeline.\n */\n toServiceClientOptions() {\n return {\n httpClient: this.options.httpClient,\n requestPolicyFactories: this.factories,\n };\n }\n}\n/**\n * Creates a new Pipeline object with Credential provided.\n *\n * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n * @param pipelineOptions - Optional. Options.\n * @returns A new Pipeline object.\n */\nfunction newPipeline(credential, pipelineOptions = {}) {\n var _a;\n if (credential === undefined) {\n credential = new AnonymousCredential();\n }\n // Order is important. Closer to the API at the top & closer to the network at the bottom.\n // The credential\'s policy factory must appear close to the wire so it can sign any\n // changes made by other factories (like UniqueRequestIDPolicyFactory)\n const telemetryPolicy = new TelemetryPolicyFactory(pipelineOptions.userAgentOptions);\n const factories = [\n tracingPolicy_tracingPolicy({ userAgent: telemetryPolicy.telemetryString }),\n keepAlivePolicy_keepAlivePolicy(pipelineOptions.keepAliveOptions),\n telemetryPolicy,\n generateClientRequestIdPolicy_generateClientRequestIdPolicy(),\n new StorageBrowserPolicyFactory(),\n new StorageRetryPolicyFactory(pipelineOptions.retryOptions),\n // Default deserializationPolicy is provided by protocol layer\n // Use customized XML char key of "#" so we could deserialize metadata\n // with "_" key\n deserializationPolicy_deserializationPolicy(undefined, { xmlCharKey: "#" }),\n logPolicy_logPolicy({\n logger: logger.info,\n allowedHeaderNames: StorageBlobLoggingAllowedHeaderNames,\n allowedQueryParameters: StorageBlobLoggingAllowedQueryParameters,\n }),\n ];\n if (checkEnvironment_isNode) {\n // policies only available in Node.js runtime, not in browsers\n factories.push(proxyPolicy_proxyPolicy(pipelineOptions.proxyOptions));\n factories.push(disableResponseDecompressionPolicy_disableResponseDecompressionPolicy());\n }\n factories.push(isTokenCredential(credential)\n ? attachCredential(storageBearerTokenChallengeAuthenticationPolicy(credential, (_a = pipelineOptions.audience) !== null && _a !== void 0 ? _a : StorageOAuthScopes), credential)\n : credential);\n return new Pipeline(factories, pipelineOptions);\n}\n//# sourceMappingURL=Pipeline.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/policies/StorageSharedKeyCredentialPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * StorageSharedKeyCredentialPolicy is a policy used to sign HTTP request with a shared key.\n */\nclass StorageSharedKeyCredentialPolicy extends CredentialPolicy {\n /**\n * Creates an instance of StorageSharedKeyCredentialPolicy.\n * @param nextPolicy -\n * @param options -\n * @param factory -\n */\n constructor(nextPolicy, options, factory) {\n super(nextPolicy, options);\n this.factory = factory;\n }\n /**\n * Signs request.\n *\n * @param request -\n */\n signRequest(request) {\n request.headers.set(constants_HeaderConstants.X_MS_DATE, new Date().toUTCString());\n if (request.body &&\n (typeof request.body === "string" || request.body !== undefined) &&\n request.body.length > 0) {\n request.headers.set(constants_HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));\n }\n const stringToSign = [\n request.method.toUpperCase(),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_LANGUAGE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_ENCODING),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_LENGTH),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_MD5),\n this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_TYPE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.DATE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.IF_MODIFIED_SINCE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.IF_MATCH),\n this.getHeaderValueToSign(request, constants_HeaderConstants.IF_NONE_MATCH),\n this.getHeaderValueToSign(request, constants_HeaderConstants.IF_UNMODIFIED_SINCE),\n this.getHeaderValueToSign(request, constants_HeaderConstants.RANGE),\n ].join("\\n") +\n "\\n" +\n this.getCanonicalizedHeadersString(request) +\n this.getCanonicalizedResourceString(request);\n const signature = this.factory.computeHMACSHA256(stringToSign);\n request.headers.set(constants_HeaderConstants.AUTHORIZATION, `SharedKey ${this.factory.accountName}:${signature}`);\n // console.log(`[URL]:${request.url}`);\n // console.log(`[HEADERS]:${request.headers.toString()}`);\n // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);\n // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);\n return request;\n }\n /**\n * Retrieve header value according to shared key sign rules.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key\n *\n * @param request -\n * @param headerName -\n */\n getHeaderValueToSign(request, headerName) {\n const value = request.headers.get(headerName);\n if (!value) {\n return "";\n }\n // When using version 2015-02-21 or later, if Content-Length is zero, then\n // set the Content-Length part of the StringToSign to an empty string.\n // https://docs.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key\n if (headerName === constants_HeaderConstants.CONTENT_LENGTH && value === "0") {\n return "";\n }\n return value;\n }\n /**\n * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:\n * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.\n * 2. Convert each HTTP header name to lowercase.\n * 3. Sort the headers lexicographically by header name, in ascending order.\n * Each header may appear only once in the string.\n * 4. Replace any linear whitespace in the header value with a single space.\n * 5. Trim any whitespace around the colon in the header.\n * 6. Finally, append a new-line character to each canonicalized header in the resulting list.\n * Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.\n *\n * @param request -\n */\n getCanonicalizedHeadersString(request) {\n let headersArray = request.headers.headersArray().filter((value) => {\n return value.name.toLowerCase().startsWith(constants_HeaderConstants.PREFIX_FOR_STORAGE);\n });\n headersArray.sort((a, b) => {\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n });\n // Remove duplicate headers\n headersArray = headersArray.filter((value, index, array) => {\n if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {\n return false;\n }\n return true;\n });\n let canonicalizedHeadersStringToSign = "";\n headersArray.forEach((header) => {\n canonicalizedHeadersStringToSign += `${header.name\n .toLowerCase()\n .trimRight()}:${header.value.trimLeft()}\\n`;\n });\n return canonicalizedHeadersStringToSign;\n }\n /**\n * Retrieves the webResource canonicalized resource string.\n *\n * @param request -\n */\n getCanonicalizedResourceString(request) {\n const path = getURLPath(request.url) || "/";\n let canonicalizedResourceString = "";\n canonicalizedResourceString += `/${this.factory.accountName}${path}`;\n const queries = getURLQueries(request.url);\n const lowercaseQueries = {};\n if (queries) {\n const queryKeys = [];\n for (const key in queries) {\n if (Object.prototype.hasOwnProperty.call(queries, key)) {\n const lowercaseKey = key.toLowerCase();\n lowercaseQueries[lowercaseKey] = queries[key];\n queryKeys.push(lowercaseKey);\n }\n }\n queryKeys.sort();\n for (const key of queryKeys) {\n canonicalizedResourceString += `\\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;\n }\n }\n return canonicalizedResourceString;\n }\n}\n//# sourceMappingURL=StorageSharedKeyCredentialPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/credentials/StorageSharedKeyCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * StorageSharedKeyCredential for account key authorization of Azure Storage service.\n */\nclass StorageSharedKeyCredential extends Credential {\n /**\n * Creates an instance of StorageSharedKeyCredential.\n * @param accountName -\n * @param accountKey -\n */\n constructor(accountName, accountKey) {\n super();\n this.accountName = accountName;\n this.accountKey = Buffer.from(accountKey, "base64");\n }\n /**\n * Creates a StorageSharedKeyCredentialPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n create(nextPolicy, options) {\n return new StorageSharedKeyCredentialPolicy(nextPolicy, options, this);\n }\n /**\n * Generates a hash signature for an HTTP request or for a SAS.\n *\n * @param stringToSign -\n */\n computeHMACSHA256(stringToSign) {\n return (0,external_crypto_.createHmac)("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64");\n }\n}\n//# sourceMappingURL=StorageSharedKeyCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/redirectPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * Methods that are allowed to follow redirects 301 and 302\n */\nconst allowedRedirect = ["GET", "HEAD"];\nconst redirectPolicy_DefaultRedirectOptions = {\n handleRedirects: true,\n maxRetries: 20,\n};\n/**\n * Creates a redirect policy, which sends a repeats the request to a new destination if a response arrives with a "location" header, and a status code between 300 and 307.\n * @param maximumRetries - Maximum number of redirects to follow.\n * @returns An instance of the {@link RedirectPolicy}\n */\nfunction redirectPolicy_redirectPolicy(maximumRetries = 20) {\n return {\n create: (nextPolicy, options) => {\n return new RedirectPolicy(nextPolicy, options, maximumRetries);\n },\n };\n}\n/**\n * Resends the request to a new destination if a response arrives with a "location" header, and a status code between 300 and 307.\n */\nclass RedirectPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, maxRetries = 20) {\n super(nextPolicy, options);\n this.maxRetries = maxRetries;\n }\n sendRequest(request) {\n return this._nextPolicy\n .sendRequest(request)\n .then((response) => handleRedirect(this, response, 0));\n }\n}\nfunction handleRedirect(policy, response, currentRetries) {\n const { request, status } = response;\n const locationHeader = response.headers.get("location");\n if (locationHeader &&\n (status === 300 ||\n (status === 301 && allowedRedirect.includes(request.method)) ||\n (status === 302 && allowedRedirect.includes(request.method)) ||\n (status === 303 && request.method === "POST") ||\n status === 307) &&\n (!policy.maxRetries || currentRetries < policy.maxRetries)) {\n const builder = URLBuilder.parse(request.url);\n builder.setPath(locationHeader);\n request.url = builder.toString();\n // POST request with Status code 303 should be converted into a\n // redirected GET request if the redirect url is present in the location header\n if (status === 303) {\n request.method = "GET";\n delete request.body;\n }\n return policy._nextPolicy\n .sendRequest(request)\n .then((res) => handleRedirect(policy, res, currentRetries + 1));\n }\n return Promise.resolve(response);\n}\n//# sourceMappingURL=redirectPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/exponentialBackoffStrategy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nconst DEFAULT_CLIENT_RETRY_COUNT = 3;\n// intervals are in ms\nconst DEFAULT_CLIENT_RETRY_INTERVAL = 1000 * 30;\nconst DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 90;\nconst DEFAULT_CLIENT_MIN_RETRY_INTERVAL = 1000 * 3;\nfunction isNumber(n) {\n return typeof n === "number";\n}\n/**\n * @internal\n * Determines if the operation should be retried.\n *\n * @param retryLimit - Specifies the max number of retries.\n * @param predicate - Initial chekck on whether to retry based on given responses or errors\n * @param retryData - The retry data.\n * @returns True if the operation qualifies for a retry; false otherwise.\n */\nfunction shouldRetry(retryLimit, predicate, retryData, response, error) {\n if (!predicate(response, error)) {\n return false;\n }\n return retryData.retryCount < retryLimit;\n}\n/**\n * @internal\n * Updates the retry data for the next attempt.\n *\n * @param retryOptions - specifies retry interval, and its lower bound and upper bound.\n * @param retryData - The retry data.\n * @param err - The operation"s error, if any.\n */\nfunction updateRetryData(retryOptions, retryData = { retryCount: 0, retryInterval: 0 }, err) {\n if (err) {\n if (retryData.error) {\n err.innerError = retryData.error;\n }\n retryData.error = err;\n }\n // Adjust retry count\n retryData.retryCount++;\n // Adjust retry interval\n let incrementDelta = Math.pow(2, retryData.retryCount - 1) - 1;\n const boundedRandDelta = retryOptions.retryInterval * 0.8 +\n Math.floor(Math.random() * (retryOptions.retryInterval * 0.4));\n incrementDelta *= boundedRandDelta;\n retryData.retryInterval = Math.min(retryOptions.minRetryInterval + incrementDelta, retryOptions.maxRetryInterval);\n return retryData;\n}\n//# sourceMappingURL=exponentialBackoffStrategy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/exponentialRetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n/**\n * Policy that retries the request as many times as configured for as long as the max retry time interval specified, each retry waiting longer to begin than the last time.\n * @param retryCount - Maximum number of retries.\n * @param retryInterval - Base time between retries.\n * @param maxRetryInterval - Maximum time to wait between retries.\n */\nfunction exponentialRetryPolicy_exponentialRetryPolicy(retryCount, retryInterval, maxRetryInterval) {\n return {\n create: (nextPolicy, options) => {\n return new ExponentialRetryPolicy(nextPolicy, options, retryCount, retryInterval, maxRetryInterval);\n },\n };\n}\n/**\n * Describes the Retry Mode type. Currently supporting only Exponential.\n */\nvar RetryMode;\n(function (RetryMode) {\n /**\n * Currently supported retry mode.\n * Each time a retry happens, it will take exponentially more time than the last time.\n */\n RetryMode[RetryMode["Exponential"] = 0] = "Exponential";\n})(RetryMode || (RetryMode = {}));\nconst exponentialRetryPolicy_DefaultRetryOptions = {\n maxRetries: DEFAULT_CLIENT_RETRY_COUNT,\n retryDelayInMs: DEFAULT_CLIENT_RETRY_INTERVAL,\n maxRetryDelayInMs: DEFAULT_CLIENT_MAX_RETRY_INTERVAL,\n};\n/**\n * Instantiates a new "ExponentialRetryPolicyFilter" instance.\n */\nclass ExponentialRetryPolicy extends BaseRequestPolicy {\n /**\n * @param nextPolicy - The next RequestPolicy in the pipeline chain.\n * @param options - The options for this RequestPolicy.\n * @param retryCount - The client retry count.\n * @param retryInterval - The client retry interval, in milliseconds.\n * @param minRetryInterval - The minimum retry interval, in milliseconds.\n * @param maxRetryInterval - The maximum retry interval, in milliseconds.\n */\n constructor(nextPolicy, options, retryCount, retryInterval, maxRetryInterval) {\n super(nextPolicy, options);\n this.retryCount = isNumber(retryCount) ? retryCount : DEFAULT_CLIENT_RETRY_COUNT;\n this.retryInterval = isNumber(retryInterval) ? retryInterval : DEFAULT_CLIENT_RETRY_INTERVAL;\n this.maxRetryInterval = isNumber(maxRetryInterval)\n ? maxRetryInterval\n : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;\n }\n sendRequest(request) {\n return this._nextPolicy\n .sendRequest(request.clone())\n .then((response) => retry(this, request, response))\n .catch((error) => retry(this, request, error.response, undefined, error));\n }\n}\nasync function retry(policy, request, response, retryData, requestError) {\n function shouldPolicyRetry(responseParam) {\n const statusCode = responseParam === null || responseParam === void 0 ? void 0 : responseParam.status;\n if (statusCode === 503 && (response === null || response === void 0 ? void 0 : response.headers.get(constants_Constants.HeaderConstants.RETRY_AFTER))) {\n return false;\n }\n if (statusCode === undefined ||\n (statusCode < 500 && statusCode !== 408) ||\n statusCode === 501 ||\n statusCode === 505) {\n return false;\n }\n return true;\n }\n retryData = updateRetryData({\n retryInterval: policy.retryInterval,\n minRetryInterval: 0,\n maxRetryInterval: policy.maxRetryInterval,\n }, retryData, requestError);\n const isAborted = request.abortSignal && request.abortSignal.aborted;\n if (!isAborted && shouldRetry(policy.retryCount, shouldPolicyRetry, retryData, response)) {\n log_logger.info(`Retrying request in ${retryData.retryInterval}`);\n try {\n await delay_delay(retryData.retryInterval);\n const res = await policy._nextPolicy.sendRequest(request.clone());\n return retry(policy, request, res, retryData);\n }\n catch (err) {\n return retry(policy, request, response, retryData, err);\n }\n }\n else if (isAborted || requestError || !response) {\n // If the operation failed in the end, return all errors instead of just the last one\n const err = retryData.error ||\n new RestError("Failed to send the request.", RestError.REQUEST_SEND_ERROR, response && response.status, response && response.request, response);\n throw err;\n }\n else {\n return response;\n }\n}\n//# sourceMappingURL=exponentialRetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/operationParameter.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Get the path to this parameter\'s value as a dotted string (a.b.c).\n * @param parameter - The parameter to get the path string for.\n * @returns The path to this parameter\'s value as a dotted string.\n */\nfunction getPathStringFromParameter(parameter) {\n return getPathStringFromParameterPath(parameter.parameterPath, parameter.mapper);\n}\nfunction getPathStringFromParameterPath(parameterPath, mapper) {\n let result;\n if (typeof parameterPath === "string") {\n result = parameterPath;\n }\n else if (Array.isArray(parameterPath)) {\n result = parameterPath.join(".");\n }\n else {\n result = mapper.serializedName;\n }\n return result;\n}\n//# sourceMappingURL=operationParameter.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/operationSpec.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Gets the list of status codes for streaming responses.\n * @internal\n */\nfunction getStreamResponseStatusCodes(operationSpec) {\n const result = new Set();\n for (const statusCode in operationSpec.responses) {\n const operationResponse = operationSpec.responses[statusCode];\n if (operationResponse.bodyMapper &&\n operationResponse.bodyMapper.type.name === MapperType.Stream) {\n result.add(Number(statusCode));\n }\n }\n return result;\n}\n//# sourceMappingURL=operationSpec.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/msRestUserAgentPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nfunction getDefaultUserAgentKey() {\n return constants_Constants.HeaderConstants.USER_AGENT;\n}\nfunction getPlatformSpecificData() {\n const runtimeInfo = {\n key: "Node",\n value: process.version,\n };\n const osInfo = {\n key: "OS",\n value: `(${external_os_.arch()}-${external_os_.type()}-${external_os_.release()})`,\n };\n return [runtimeInfo, osInfo];\n}\n//# sourceMappingURL=msRestUserAgentPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/userAgentPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\nfunction getRuntimeInfo() {\n const msRestRuntime = {\n key: "core-http",\n value: constants_Constants.coreHttpVersion,\n };\n return [msRestRuntime];\n}\nfunction getUserAgentString(telemetryInfo, keySeparator = " ", valueSeparator = "/") {\n return telemetryInfo\n .map((info) => {\n const value = info.value ? `${valueSeparator}${info.value}` : "";\n return `${info.key}${value}`;\n })\n .join(keySeparator);\n}\nconst getDefaultUserAgentHeaderName = getDefaultUserAgentKey;\n/**\n * The default approach to generate user agents.\n * Uses static information from this package, plus system information available from the runtime.\n */\nfunction userAgentPolicy_getDefaultUserAgentValue() {\n const runtimeInfo = getRuntimeInfo();\n const platformSpecificData = getPlatformSpecificData();\n const userAgent = getUserAgentString(runtimeInfo.concat(platformSpecificData));\n return userAgent;\n}\n/**\n * Returns a policy that adds the user agent header to outgoing requests based on the given {@link TelemetryInfo}.\n * @param userAgentData - Telemetry information.\n * @returns A new {@link UserAgentPolicy}.\n */\nfunction userAgentPolicy_userAgentPolicy(userAgentData) {\n const key = !userAgentData || userAgentData.key === undefined || userAgentData.key === null\n ? getDefaultUserAgentKey()\n : userAgentData.key;\n const value = !userAgentData || userAgentData.value === undefined || userAgentData.value === null\n ? userAgentPolicy_getDefaultUserAgentValue()\n : userAgentData.value;\n return {\n create: (nextPolicy, options) => {\n return new UserAgentPolicy(nextPolicy, options, key, value);\n },\n };\n}\n/**\n * A policy that adds the user agent header to outgoing requests based on the given {@link TelemetryInfo}.\n */\nclass UserAgentPolicy extends BaseRequestPolicy {\n constructor(_nextPolicy, _options, headerKey, headerValue) {\n super(_nextPolicy, _options);\n this._nextPolicy = _nextPolicy;\n this._options = _options;\n this.headerKey = headerKey;\n this.headerValue = headerValue;\n }\n sendRequest(request) {\n this.addUserAgentHeader(request);\n return this._nextPolicy.sendRequest(request);\n }\n /**\n * Adds the user agent header to the outgoing request.\n */\n addUserAgentHeader(request) {\n if (!request.headers) {\n request.headers = new httpHeaders_HttpHeaders();\n }\n if (!request.headers.get(this.headerKey) && this.headerValue) {\n request.headers.set(this.headerKey, this.headerValue);\n }\n }\n}\n//# sourceMappingURL=userAgentPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/bearerTokenAuthenticationPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n// Default options for the cycler if none are provided\nconst bearerTokenAuthenticationPolicy_DEFAULT_CYCLER_OPTIONS = {\n forcedRefreshWindowInMs: 1000,\n retryIntervalInMs: 3000,\n refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry\n};\n/**\n * Converts an an unreliable access token getter (which may resolve with null)\n * into an AccessTokenGetter by retrying the unreliable getter in a regular\n * interval.\n *\n * @param getAccessToken - a function that produces a promise of an access\n * token that may fail by returning null\n * @param retryIntervalInMs - the time (in milliseconds) to wait between retry\n * attempts\n * @param timeoutInMs - the timestamp after which the refresh attempt will fail,\n * throwing an exception\n * @returns - a promise that, if it resolves, will resolve with an access token\n */\nasync function bearerTokenAuthenticationPolicy_beginRefresh(getAccessToken, retryIntervalInMs, timeoutInMs) {\n // This wrapper handles exceptions gracefully as long as we haven\'t exceeded\n // the timeout.\n async function tryGetAccessToken() {\n if (Date.now() < timeoutInMs) {\n try {\n return await getAccessToken();\n }\n catch (_a) {\n return null;\n }\n }\n else {\n const finalToken = await getAccessToken();\n // Timeout is up, so throw if it\'s still null\n if (finalToken === null) {\n throw new Error("Failed to refresh access token.");\n }\n return finalToken;\n }\n }\n let token = await tryGetAccessToken();\n while (token === null) {\n await delay_delay(retryIntervalInMs);\n token = await tryGetAccessToken();\n }\n return token;\n}\n/**\n * Creates a token cycler from a credential, scopes, and optional settings.\n *\n * A token cycler represents a way to reliably retrieve a valid access token\n * from a TokenCredential. It will handle initializing the token, refreshing it\n * when it nears expiration, and synchronizes refresh attempts to avoid\n * concurrency hazards.\n *\n * @param credential - the underlying TokenCredential that provides the access\n * token\n * @param scopes - the scopes to request authorization for\n * @param tokenCyclerOptions - optionally override default settings for the cycler\n *\n * @returns - a function that reliably produces a valid access token\n */\nfunction bearerTokenAuthenticationPolicy_createTokenCycler(credential, scopes, tokenCyclerOptions) {\n let refreshWorker = null;\n let token = null;\n const options = Object.assign(Object.assign({}, bearerTokenAuthenticationPolicy_DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);\n /**\n * This little holder defines several predicates that we use to construct\n * the rules of refreshing the token.\n */\n const cycler = {\n /**\n * Produces true if a refresh job is currently in progress.\n */\n get isRefreshing() {\n return refreshWorker !== null;\n },\n /**\n * Produces true if the cycler SHOULD refresh (we are within the refresh\n * window and not already refreshing)\n */\n get shouldRefresh() {\n var _a;\n return (!cycler.isRefreshing &&\n ((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());\n },\n /**\n * Produces true if the cycler MUST refresh (null or nearly-expired\n * token).\n */\n get mustRefresh() {\n return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());\n },\n };\n /**\n * Starts a refresh job or returns the existing job if one is already\n * running.\n */\n function refresh(getTokenOptions) {\n var _a;\n if (!cycler.isRefreshing) {\n // We bind `scopes` here to avoid passing it around a lot\n const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);\n // Take advantage of promise chaining to insert an assignment to `token`\n // before the refresh can be considered done.\n refreshWorker = bearerTokenAuthenticationPolicy_beginRefresh(tryGetAccessToken, options.retryIntervalInMs, \n // If we don\'t have a token, then we should timeout immediately\n (_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())\n .then((_token) => {\n refreshWorker = null;\n token = _token;\n return token;\n })\n .catch((reason) => {\n // We also should reset the refresher if we enter a failed state. All\n // existing awaiters will throw, but subsequent requests will start a\n // new retry chain.\n refreshWorker = null;\n token = null;\n throw reason;\n });\n }\n return refreshWorker;\n }\n return async (tokenOptions) => {\n //\n // Simple rules:\n // - If we MUST refresh, then return the refresh task, blocking\n // the pipeline until a token is available.\n // - If we SHOULD refresh, then run refresh but don\'t return it\n // (we can still use the cached token).\n // - Return the token, since it\'s fine if we didn\'t return in\n // step 1.\n //\n if (cycler.mustRefresh)\n return refresh(tokenOptions);\n if (cycler.shouldRefresh) {\n refresh(tokenOptions);\n }\n return token;\n };\n}\n// #endregion\n/**\n * Creates a new factory for a RequestPolicy that applies a bearer token to\n * the requests\' `Authorization` headers.\n *\n * @param credential - The TokenCredential implementation that can supply the bearer token.\n * @param scopes - The scopes for which the bearer token applies.\n */\nfunction bearerTokenAuthenticationPolicy(credential, scopes) {\n // This simple function encapsulates the entire process of reliably retrieving the token\n const getToken = bearerTokenAuthenticationPolicy_createTokenCycler(credential, scopes /* , options */);\n class BearerTokenAuthenticationPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n async sendRequest(webResource) {\n if (!webResource.url.toLowerCase().startsWith("https://")) {\n throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");\n }\n const { token } = await getToken({\n abortSignal: webResource.abortSignal,\n tracingOptions: {\n tracingContext: webResource.tracingContext,\n },\n });\n webResource.headers.set(constants_Constants.HeaderConstants.AUTHORIZATION, `Bearer ${token}`);\n return this._nextPolicy.sendRequest(webResource);\n }\n }\n return {\n create: (nextPolicy, options) => {\n return new BearerTokenAuthenticationPolicy(nextPolicy, options);\n },\n };\n}\n//# sourceMappingURL=bearerTokenAuthenticationPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/httpClientCache.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nlet cachedHttpClient;\nfunction httpClientCache_getCachedDefaultHttpClient() {\n if (!cachedHttpClient) {\n cachedHttpClient = new NodeFetchHttpClient();\n }\n return cachedHttpClient;\n}\n//# sourceMappingURL=httpClientCache.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/rpRegistrationPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nfunction rpRegistrationPolicy(retryTimeout = 30) {\n return {\n create: (nextPolicy, options) => {\n return new RPRegistrationPolicy(nextPolicy, options, retryTimeout);\n },\n };\n}\nclass RPRegistrationPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, _retryTimeout = 30) {\n super(nextPolicy, options);\n this._retryTimeout = _retryTimeout;\n }\n sendRequest(request) {\n return this._nextPolicy\n .sendRequest(request.clone())\n .then((response) => registerIfNeeded(this, request, response));\n }\n}\nfunction registerIfNeeded(policy, request, response) {\n if (response.status === 409) {\n const rpName = checkRPNotRegisteredError(response.bodyAsText);\n if (rpName) {\n const urlPrefix = extractSubscriptionUrl(request.url);\n return (registerRP(policy, urlPrefix, rpName, request)\n // Autoregistration of ${provider} failed for some reason. We will not return this error\n // instead will return the initial response with 409 status code back to the user.\n // do nothing here as we are returning the original response at the end of this method.\n .catch(() => false)\n .then((registrationStatus) => {\n if (registrationStatus) {\n // Retry the original request. We have to change the x-ms-client-request-id\n // otherwise Azure endpoint will return the initial 409 (cached) response.\n request.headers.set("x-ms-client-request-id", generateUuid());\n return policy._nextPolicy.sendRequest(request.clone());\n }\n return response;\n }));\n }\n }\n return Promise.resolve(response);\n}\n/**\n * Reuses the headers of the original request and url (if specified).\n * @param originalRequest - The original request\n * @param reuseUrlToo - Should the url from the original request be reused as well. Default false.\n * @returns A new request object with desired headers.\n */\nfunction getRequestEssentials(originalRequest, reuseUrlToo = false) {\n const reqOptions = originalRequest.clone();\n if (reuseUrlToo) {\n reqOptions.url = originalRequest.url;\n }\n // We have to change the x-ms-client-request-id otherwise Azure endpoint\n // will return the initial 409 (cached) response.\n reqOptions.headers.set("x-ms-client-request-id", generateUuid());\n // Set content-type to application/json\n reqOptions.headers.set("Content-Type", "application/json; charset=utf-8");\n return reqOptions;\n}\n/**\n * Validates the error code and message associated with 409 response status code. If it matches to that of\n * RP not registered then it returns the name of the RP else returns undefined.\n * @param body - The response body received after making the original request.\n * @returns The name of the RP if condition is satisfied else undefined.\n */\nfunction checkRPNotRegisteredError(body) {\n let result, responseBody;\n if (body) {\n try {\n responseBody = JSON.parse(body);\n }\n catch (err) {\n // do nothing;\n }\n if (responseBody &&\n responseBody.error &&\n responseBody.error.message &&\n responseBody.error.code &&\n responseBody.error.code === "MissingSubscriptionRegistration") {\n const matchRes = responseBody.error.message.match(/.*\'(.*)\'/i);\n if (matchRes) {\n result = matchRes.pop();\n }\n }\n }\n return result;\n}\n/**\n * Extracts the first part of the URL, just after subscription:\n * https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/\n * @param url - The original request url\n * @returns The url prefix as explained above.\n */\nfunction extractSubscriptionUrl(url) {\n let result;\n const matchRes = url.match(/.*\\/subscriptions\\/[a-f0-9-]+\\//gi);\n if (matchRes && matchRes[0]) {\n result = matchRes[0];\n }\n else {\n throw new Error(`Unable to extract subscriptionId from the given url - ${url}.`);\n }\n return result;\n}\n/**\n * Registers the given provider.\n * @param policy - The RPRegistrationPolicy this function is being called against.\n * @param urlPrefix - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/\n * @param provider - The provider name to be registered.\n * @param originalRequest - The original request sent by the user that returned a 409 response\n * with a message that the provider is not registered.\n */\nasync function registerRP(policy, urlPrefix, provider, originalRequest) {\n const postUrl = `${urlPrefix}providers/${provider}/register?api-version=2016-02-01`;\n const getUrl = `${urlPrefix}providers/${provider}?api-version=2016-02-01`;\n const reqOptions = getRequestEssentials(originalRequest);\n reqOptions.method = "POST";\n reqOptions.url = postUrl;\n const response = await policy._nextPolicy.sendRequest(reqOptions);\n if (response.status !== 200) {\n throw new Error(`Autoregistration of ${provider} failed. Please try registering manually.`);\n }\n return getRegistrationStatus(policy, getUrl, originalRequest);\n}\n/**\n * Polls the registration status of the provider that was registered. Polling happens at an interval of 30 seconds.\n * Polling will happen till the registrationState property of the response body is "Registered".\n * @param policy - The RPRegistrationPolicy this function is being called against.\n * @param url - The request url for polling\n * @param originalRequest - The original request sent by the user that returned a 409 response\n * with a message that the provider is not registered.\n * @returns True if RP Registration is successful.\n */\nasync function getRegistrationStatus(policy, url, originalRequest) {\n const reqOptions = getRequestEssentials(originalRequest);\n reqOptions.url = url;\n reqOptions.method = "GET";\n const res = await policy._nextPolicy.sendRequest(reqOptions);\n const obj = res.parsedBody;\n if (res.parsedBody && obj.registrationState && obj.registrationState === "Registered") {\n return true;\n }\n else {\n await delay_delay(policy._retryTimeout * 1000);\n return getRegistrationStatus(policy, url, originalRequest);\n }\n}\n//# sourceMappingURL=rpRegistrationPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/signingPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Creates a policy that signs outgoing requests by calling to the provided `authenticationProvider`\'s `signRequest` method.\n * @param authenticationProvider - The authentication provider.\n * @returns An instance of the {@link SigningPolicy}.\n */\nfunction signingPolicy(authenticationProvider) {\n return {\n create: (nextPolicy, options) => {\n return new SigningPolicy(nextPolicy, options, authenticationProvider);\n },\n };\n}\n/**\n * A policy that signs outgoing requests by calling to the provided `authenticationProvider`\'s `signRequest` method.\n */\nclass SigningPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, authenticationProvider) {\n super(nextPolicy, options);\n this.authenticationProvider = authenticationProvider;\n }\n signRequest(request) {\n return this.authenticationProvider.signRequest(request);\n }\n sendRequest(request) {\n return this.signRequest(request).then((nextRequest) => this._nextPolicy.sendRequest(nextRequest));\n }\n}\n//# sourceMappingURL=signingPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/systemErrorRetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * A policy that retries when there\'s a system error, identified by the codes "ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNREFUSED", "ECONNRESET" or "ENOENT".\n * @param retryCount - Maximum number of retries.\n * @param retryInterval - The client retry interval, in milliseconds.\n * @param minRetryInterval - The minimum retry interval, in milliseconds.\n * @param maxRetryInterval - The maximum retry interval, in milliseconds.\n * @returns An instance of the {@link SystemErrorRetryPolicy}\n */\nfunction systemErrorRetryPolicy_systemErrorRetryPolicy(retryCount, retryInterval, minRetryInterval, maxRetryInterval) {\n return {\n create: (nextPolicy, options) => {\n return new SystemErrorRetryPolicy(nextPolicy, options, retryCount, retryInterval, minRetryInterval, maxRetryInterval);\n },\n };\n}\n/**\n * A policy that retries when there\'s a system error, identified by the codes "ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNREFUSED", "ECONNRESET" or "ENOENT".\n * @param retryCount - The client retry count.\n * @param retryInterval - The client retry interval, in milliseconds.\n * @param minRetryInterval - The minimum retry interval, in milliseconds.\n * @param maxRetryInterval - The maximum retry interval, in milliseconds.\n */\nclass SystemErrorRetryPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, retryCount, retryInterval, minRetryInterval, maxRetryInterval) {\n super(nextPolicy, options);\n this.retryCount = isNumber(retryCount) ? retryCount : DEFAULT_CLIENT_RETRY_COUNT;\n this.retryInterval = isNumber(retryInterval) ? retryInterval : DEFAULT_CLIENT_RETRY_INTERVAL;\n this.minRetryInterval = isNumber(minRetryInterval)\n ? minRetryInterval\n : DEFAULT_CLIENT_MIN_RETRY_INTERVAL;\n this.maxRetryInterval = isNumber(maxRetryInterval)\n ? maxRetryInterval\n : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;\n }\n sendRequest(request) {\n return this._nextPolicy\n .sendRequest(request.clone())\n .catch((error) => systemErrorRetryPolicy_retry(this, request, error.response, error));\n }\n}\nasync function systemErrorRetryPolicy_retry(policy, request, operationResponse, err, retryData) {\n retryData = updateRetryData(policy, retryData, err);\n function shouldPolicyRetry(_response, error) {\n if (error &&\n error.code &&\n (error.code === "ETIMEDOUT" ||\n error.code === "ESOCKETTIMEDOUT" ||\n error.code === "ECONNREFUSED" ||\n error.code === "ECONNRESET" ||\n error.code === "ENOENT")) {\n return true;\n }\n return false;\n }\n if (shouldRetry(policy.retryCount, shouldPolicyRetry, retryData, operationResponse, err)) {\n // If previous operation ended with an error and the policy allows a retry, do that\n try {\n await delay_delay(retryData.retryInterval);\n return policy._nextPolicy.sendRequest(request.clone());\n }\n catch (nestedErr) {\n return systemErrorRetryPolicy_retry(policy, request, operationResponse, nestedErr, retryData);\n }\n }\n else {\n if (err) {\n // If the operation failed in the end, return all errors instead of just the last one\n return Promise.reject(retryData.error);\n }\n return operationResponse;\n }\n}\n//# sourceMappingURL=systemErrorRetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/util/throttlingRetryStrategy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Maximum number of retries for the throttling retry policy\n */\nconst DEFAULT_CLIENT_MAX_RETRY_COUNT = 3;\n//# sourceMappingURL=throttlingRetryStrategy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/policies/throttlingRetryPolicy.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\nconst StatusCodes = constants_Constants.HttpConstants.StatusCodes;\n/**\n * Creates a policy that re-sends the request if the response indicates the request failed because of throttling reasons.\n * For example, if the response contains a `Retry-After` header, it will retry sending the request based on the value of that header.\n *\n * To learn more, please refer to\n * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,\n * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and\n * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors\n * @returns\n */\nfunction throttlingRetryPolicy_throttlingRetryPolicy() {\n return {\n create: (nextPolicy, options) => {\n return new ThrottlingRetryPolicy(nextPolicy, options);\n },\n };\n}\nconst throttlingRetryPolicy_StandardAbortMessage = "The operation was aborted.";\n/**\n * Creates a policy that re-sends the request if the response indicates the request failed because of throttling reasons.\n * For example, if the response contains a `Retry-After` header, it will retry sending the request based on the value of that header.\n *\n * To learn more, please refer to\n * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,\n * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and\n * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors\n */\nclass ThrottlingRetryPolicy extends BaseRequestPolicy {\n constructor(nextPolicy, options, _handleResponse) {\n super(nextPolicy, options);\n this.numberOfRetries = 0;\n this._handleResponse = _handleResponse || this._defaultResponseHandler;\n }\n async sendRequest(httpRequest) {\n const response = await this._nextPolicy.sendRequest(httpRequest.clone());\n if (response.status !== StatusCodes.TooManyRequests &&\n response.status !== StatusCodes.ServiceUnavailable) {\n return response;\n }\n else {\n return this._handleResponse(httpRequest, response);\n }\n }\n async _defaultResponseHandler(httpRequest, httpResponse) {\n var _a;\n const retryAfterHeader = httpResponse.headers.get(constants_Constants.HeaderConstants.RETRY_AFTER);\n if (retryAfterHeader) {\n const delayInMs = ThrottlingRetryPolicy.parseRetryAfterHeader(retryAfterHeader);\n if (delayInMs) {\n this.numberOfRetries += 1;\n await delay_delay(delayInMs, {\n abortSignal: httpRequest.abortSignal,\n abortErrorMsg: throttlingRetryPolicy_StandardAbortMessage,\n });\n if ((_a = httpRequest.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {\n throw new AbortController_AbortError(throttlingRetryPolicy_StandardAbortMessage);\n }\n if (this.numberOfRetries < DEFAULT_CLIENT_MAX_RETRY_COUNT) {\n return this.sendRequest(httpRequest);\n }\n else {\n return this._nextPolicy.sendRequest(httpRequest);\n }\n }\n }\n return httpResponse;\n }\n static parseRetryAfterHeader(headerValue) {\n const retryAfterInSeconds = Number(headerValue);\n if (Number.isNaN(retryAfterInSeconds)) {\n return ThrottlingRetryPolicy.parseDateRetryAfterHeader(headerValue);\n }\n else {\n return retryAfterInSeconds * 1000;\n }\n }\n static parseDateRetryAfterHeader(headerValue) {\n try {\n const now = Date.now();\n const date = Date.parse(headerValue);\n const diff = date - now;\n return Number.isNaN(diff) ? undefined : diff;\n }\n catch (error) {\n return undefined;\n }\n }\n}\n//# sourceMappingURL=throttlingRetryPolicy.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-http/dist-esm/src/serviceClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * ServiceClient sends service requests and receives responses.\n */\nclass ServiceClient {\n /**\n * The ServiceClient constructor\n * @param credentials - The credentials used for authentication with the service.\n * @param options - The service client options that govern the behavior of the client.\n */\n constructor(credentials, \n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n options) {\n if (!options) {\n options = {};\n }\n this._withCredentials = options.withCredentials || false;\n this._httpClient = options.httpClient || httpClientCache_getCachedDefaultHttpClient();\n this._requestPolicyOptions = new RequestPolicyOptions(options.httpPipelineLogger);\n let requestPolicyFactories;\n if (Array.isArray(options.requestPolicyFactories)) {\n log_logger.info("ServiceClient: using custom request policies");\n requestPolicyFactories = options.requestPolicyFactories;\n }\n else {\n let authPolicyFactory = undefined;\n if (isTokenCredential(credentials)) {\n log_logger.info("ServiceClient: creating bearer token authentication policy from provided credentials");\n // Create a wrapped RequestPolicyFactory here so that we can provide the\n // correct scope to the BearerTokenAuthenticationPolicy at the first time\n // one is requested. This is needed because generated ServiceClient\n // implementations do not set baseUri until after ServiceClient\'s constructor\n // is finished, leaving baseUri empty at the time when it is needed to\n // build the correct scope name.\n const wrappedPolicyFactory = () => {\n let bearerTokenPolicyFactory = undefined;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const serviceClient = this;\n const serviceClientOptions = options;\n return {\n create(nextPolicy, createOptions) {\n const credentialScopes = getCredentialScopes(serviceClientOptions, serviceClient.baseUri);\n if (!credentialScopes) {\n throw new Error(`When using credential, the ServiceClient must contain a baseUri or a credentialScopes in ServiceClientOptions. Unable to create a bearerTokenAuthenticationPolicy`);\n }\n if (bearerTokenPolicyFactory === undefined || bearerTokenPolicyFactory === null) {\n bearerTokenPolicyFactory = bearerTokenAuthenticationPolicy(credentials, credentialScopes);\n }\n return bearerTokenPolicyFactory.create(nextPolicy, createOptions);\n },\n };\n };\n authPolicyFactory = wrappedPolicyFactory();\n }\n else if (credentials && typeof credentials.signRequest === "function") {\n log_logger.info("ServiceClient: creating signing policy from provided credentials");\n authPolicyFactory = signingPolicy(credentials);\n }\n else if (credentials !== undefined && credentials !== null) {\n throw new Error("The credentials argument must implement the TokenCredential interface");\n }\n log_logger.info("ServiceClient: using default request policies");\n requestPolicyFactories = createDefaultRequestPolicyFactories(authPolicyFactory, options);\n if (options.requestPolicyFactories) {\n // options.requestPolicyFactories can also be a function that manipulates\n // the default requestPolicyFactories array\n const newRequestPolicyFactories = options.requestPolicyFactories(requestPolicyFactories);\n if (newRequestPolicyFactories) {\n requestPolicyFactories = newRequestPolicyFactories;\n }\n }\n }\n this._requestPolicyFactories = requestPolicyFactories;\n }\n /**\n * Send the provided httpRequest.\n */\n sendRequest(options) {\n if (options === null || options === undefined || typeof options !== "object") {\n throw new Error("options cannot be null or undefined and it must be of type object.");\n }\n let httpRequest;\n try {\n if (isWebResourceLike(options)) {\n options.validateRequestProperties();\n httpRequest = options;\n }\n else {\n httpRequest = new WebResource();\n httpRequest = httpRequest.prepare(options);\n }\n }\n catch (error) {\n return Promise.reject(error);\n }\n let httpPipeline = this._httpClient;\n if (this._requestPolicyFactories && this._requestPolicyFactories.length > 0) {\n for (let i = this._requestPolicyFactories.length - 1; i >= 0; --i) {\n httpPipeline = this._requestPolicyFactories[i].create(httpPipeline, this._requestPolicyOptions);\n }\n }\n return httpPipeline.sendRequest(httpRequest);\n }\n /**\n * Send an HTTP request that is populated using the provided OperationSpec.\n * @param operationArguments - The arguments that the HTTP request\'s templated values will be populated from.\n * @param operationSpec - The OperationSpec to use to populate the httpRequest.\n * @param callback - The callback to call when the response is received.\n */\n async sendOperationRequest(operationArguments, operationSpec, callback) {\n var _a;\n if (typeof operationArguments.options === "function") {\n callback = operationArguments.options;\n operationArguments.options = undefined;\n }\n const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;\n const httpRequest = new WebResource();\n let result;\n try {\n const baseUri = operationSpec.baseUrl || this.baseUri;\n if (!baseUri) {\n throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a baseUri string property that contains the base URL to use.");\n }\n httpRequest.method = operationSpec.httpMethod;\n httpRequest.operationSpec = operationSpec;\n const requestUrl = URLBuilder.parse(baseUri);\n if (operationSpec.path) {\n requestUrl.appendPath(operationSpec.path);\n }\n if (operationSpec.urlParameters && operationSpec.urlParameters.length > 0) {\n for (const urlParameter of operationSpec.urlParameters) {\n let urlParameterValue = getOperationArgumentValueFromParameter(this, operationArguments, urlParameter, operationSpec.serializer);\n urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, getPathStringFromParameter(urlParameter), serializerOptions);\n if (!urlParameter.skipEncoding) {\n urlParameterValue = encodeURIComponent(urlParameterValue);\n }\n requestUrl.replaceAll(`{${urlParameter.mapper.serializedName || getPathStringFromParameter(urlParameter)}}`, urlParameterValue);\n }\n }\n if (operationSpec.queryParameters && operationSpec.queryParameters.length > 0) {\n for (const queryParameter of operationSpec.queryParameters) {\n let queryParameterValue = getOperationArgumentValueFromParameter(this, operationArguments, queryParameter, operationSpec.serializer);\n if (queryParameterValue !== undefined && queryParameterValue !== null) {\n queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, getPathStringFromParameter(queryParameter), serializerOptions);\n if (queryParameter.collectionFormat !== undefined &&\n queryParameter.collectionFormat !== null) {\n if (queryParameter.collectionFormat === QueryCollectionFormat.Multi) {\n if (queryParameterValue.length === 0) {\n // The collection is empty, no need to try serializing the current queryParam\n continue;\n }\n else {\n for (const index in queryParameterValue) {\n const item = queryParameterValue[index];\n queryParameterValue[index] =\n item === undefined || item === null ? "" : item.toString();\n }\n }\n }\n else if (queryParameter.collectionFormat === QueryCollectionFormat.Ssv ||\n queryParameter.collectionFormat === QueryCollectionFormat.Tsv) {\n queryParameterValue = queryParameterValue.join(queryParameter.collectionFormat);\n }\n }\n if (!queryParameter.skipEncoding) {\n if (Array.isArray(queryParameterValue)) {\n for (const index in queryParameterValue) {\n if (queryParameterValue[index] !== undefined &&\n queryParameterValue[index] !== null) {\n queryParameterValue[index] = encodeURIComponent(queryParameterValue[index]);\n }\n }\n }\n else {\n queryParameterValue = encodeURIComponent(queryParameterValue);\n }\n }\n if (queryParameter.collectionFormat !== undefined &&\n queryParameter.collectionFormat !== null &&\n queryParameter.collectionFormat !== QueryCollectionFormat.Multi &&\n queryParameter.collectionFormat !== QueryCollectionFormat.Ssv &&\n queryParameter.collectionFormat !== QueryCollectionFormat.Tsv) {\n queryParameterValue = queryParameterValue.join(queryParameter.collectionFormat);\n }\n requestUrl.setQueryParameter(queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter), queryParameterValue);\n }\n }\n }\n httpRequest.url = requestUrl.toString();\n const contentType = operationSpec.contentType || this.requestContentType;\n if (contentType && operationSpec.requestBody) {\n httpRequest.headers.set("Content-Type", contentType);\n }\n if (operationSpec.headerParameters) {\n for (const headerParameter of operationSpec.headerParameters) {\n let headerValue = getOperationArgumentValueFromParameter(this, operationArguments, headerParameter, operationSpec.serializer);\n if (headerValue !== undefined && headerValue !== null) {\n headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, getPathStringFromParameter(headerParameter), serializerOptions);\n const headerCollectionPrefix = headerParameter.mapper\n .headerCollectionPrefix;\n if (headerCollectionPrefix) {\n for (const key of Object.keys(headerValue)) {\n httpRequest.headers.set(headerCollectionPrefix + key, headerValue[key]);\n }\n }\n else {\n httpRequest.headers.set(headerParameter.mapper.serializedName ||\n getPathStringFromParameter(headerParameter), headerValue);\n }\n }\n }\n }\n const options = operationArguments.options;\n if (options) {\n if (options.customHeaders) {\n for (const customHeaderName in options.customHeaders) {\n httpRequest.headers.set(customHeaderName, options.customHeaders[customHeaderName]);\n }\n }\n if (options.abortSignal) {\n httpRequest.abortSignal = options.abortSignal;\n }\n if (options.timeout) {\n httpRequest.timeout = options.timeout;\n }\n if (options.onUploadProgress) {\n httpRequest.onUploadProgress = options.onUploadProgress;\n }\n if (options.onDownloadProgress) {\n httpRequest.onDownloadProgress = options.onDownloadProgress;\n }\n if (options.spanOptions) {\n // By passing spanOptions if they exist at runtime, we\'re backwards compatible with @azure/core-tracing@preview.13 and earlier.\n httpRequest.spanOptions = options.spanOptions;\n }\n if (options.tracingContext) {\n httpRequest.tracingContext = options.tracingContext;\n }\n if (options.shouldDeserialize !== undefined && options.shouldDeserialize !== null) {\n httpRequest.shouldDeserialize = options.shouldDeserialize;\n }\n }\n httpRequest.withCredentials = this._withCredentials;\n serializeRequestBody(this, httpRequest, operationArguments, operationSpec);\n if (httpRequest.streamResponseStatusCodes === undefined) {\n httpRequest.streamResponseStatusCodes = getStreamResponseStatusCodes(operationSpec);\n }\n let rawResponse;\n let sendRequestError;\n try {\n rawResponse = await this.sendRequest(httpRequest);\n }\n catch (error) {\n sendRequestError = error;\n }\n if (sendRequestError) {\n if (sendRequestError.response) {\n sendRequestError.details = flattenResponse(sendRequestError.response, operationSpec.responses[sendRequestError.statusCode] ||\n operationSpec.responses["default"]);\n }\n result = Promise.reject(sendRequestError);\n }\n else {\n result = Promise.resolve(flattenResponse(rawResponse, operationSpec.responses[rawResponse.status]));\n }\n }\n catch (error) {\n result = Promise.reject(error);\n }\n const cb = callback;\n if (cb) {\n result\n .then((res) => cb(null, res._response.parsedBody, res._response.request, res._response))\n .catch((err) => cb(err));\n }\n return result;\n }\n}\nfunction serializeRequestBody(serviceClient, httpRequest, operationArguments, operationSpec) {\n var _a, _b, _c, _d, _e, _f;\n const serializerOptions = (_b = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions) !== null && _b !== void 0 ? _b : {};\n const updatedOptions = {\n rootName: (_c = serializerOptions.rootName) !== null && _c !== void 0 ? _c : "",\n includeRoot: (_d = serializerOptions.includeRoot) !== null && _d !== void 0 ? _d : false,\n xmlCharKey: (_e = serializerOptions.xmlCharKey) !== null && _e !== void 0 ? _e : XML_CHARKEY,\n };\n const xmlCharKey = serializerOptions.xmlCharKey;\n if (operationSpec.requestBody && operationSpec.requestBody.mapper) {\n httpRequest.body = getOperationArgumentValueFromParameter(serviceClient, operationArguments, operationSpec.requestBody, operationSpec.serializer);\n const bodyMapper = operationSpec.requestBody.mapper;\n const { required, xmlName, xmlElementName, serializedName, xmlNamespace, xmlNamespacePrefix } = bodyMapper;\n const typeName = bodyMapper.type.name;\n try {\n if ((httpRequest.body !== undefined && httpRequest.body !== null) || required) {\n const requestBodyParameterPathString = getPathStringFromParameter(operationSpec.requestBody);\n httpRequest.body = operationSpec.serializer.serialize(bodyMapper, httpRequest.body, requestBodyParameterPathString, updatedOptions);\n const isStream = typeName === MapperType.Stream;\n if (operationSpec.isXML) {\n const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";\n const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, httpRequest.body, updatedOptions);\n if (typeName === MapperType.Sequence) {\n httpRequest.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), {\n rootName: xmlName || serializedName,\n xmlCharKey,\n });\n }\n else if (!isStream) {\n httpRequest.body = stringifyXML(value, {\n rootName: xmlName || serializedName,\n xmlCharKey,\n });\n }\n }\n else if (typeName === MapperType.String &&\n (((_f = operationSpec.contentType) === null || _f === void 0 ? void 0 : _f.match("text/plain")) || operationSpec.mediaType === "text")) {\n // the String serializer has validated that request body is a string\n // so just send the string.\n return;\n }\n else if (!isStream) {\n httpRequest.body = JSON.stringify(httpRequest.body);\n }\n }\n }\n catch (error) {\n throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, " ")}.`);\n }\n }\n else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {\n httpRequest.formData = {};\n for (const formDataParameter of operationSpec.formDataParameters) {\n const formDataParameterValue = getOperationArgumentValueFromParameter(serviceClient, operationArguments, formDataParameter, operationSpec.serializer);\n if (formDataParameterValue !== undefined && formDataParameterValue !== null) {\n const formDataParameterPropertyName = formDataParameter.mapper.serializedName || getPathStringFromParameter(formDataParameter);\n httpRequest.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, getPathStringFromParameter(formDataParameter), updatedOptions);\n }\n }\n }\n}\n/**\n * Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself\n */\nfunction getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {\n // Composite and Sequence schemas already got their root namespace set during serialization\n // We just need to add xmlns to the other schema types\n if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {\n const result = {};\n result[options.xmlCharKey] = serializedValue;\n result[XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };\n return result;\n }\n return serializedValue;\n}\nfunction getValueOrFunctionResult(value, defaultValueCreator) {\n let result;\n if (typeof value === "string") {\n result = value;\n }\n else {\n result = defaultValueCreator();\n if (typeof value === "function") {\n result = value(result);\n }\n }\n return result;\n}\nfunction createDefaultRequestPolicyFactories(authPolicyFactory, options) {\n const factories = [];\n if (options.generateClientRequestIdHeader) {\n factories.push(generateClientRequestIdPolicy_generateClientRequestIdPolicy(options.clientRequestIdHeaderName));\n }\n if (authPolicyFactory) {\n factories.push(authPolicyFactory);\n }\n const userAgentHeaderName = getValueOrFunctionResult(options.userAgentHeaderName, getDefaultUserAgentHeaderName);\n const userAgentHeaderValue = getValueOrFunctionResult(options.userAgent, userAgentPolicy_getDefaultUserAgentValue);\n if (userAgentHeaderName && userAgentHeaderValue) {\n factories.push(userAgentPolicy_userAgentPolicy({ key: userAgentHeaderName, value: userAgentHeaderValue }));\n }\n factories.push(redirectPolicy_redirectPolicy());\n factories.push(rpRegistrationPolicy(options.rpRegistrationRetryTimeout));\n if (!options.noRetryPolicy) {\n factories.push(exponentialRetryPolicy_exponentialRetryPolicy());\n factories.push(systemErrorRetryPolicy_systemErrorRetryPolicy());\n factories.push(throttlingRetryPolicy_throttlingRetryPolicy());\n }\n factories.push(deserializationPolicy_deserializationPolicy(options.deserializationContentTypes));\n if (checkEnvironment_isNode) {\n factories.push(proxyPolicy_proxyPolicy(options.proxySettings));\n }\n factories.push(logPolicy_logPolicy({ logger: log_logger.info }));\n return factories;\n}\n/**\n * Creates an HTTP pipeline based on the given options.\n * @param pipelineOptions - Defines options that are used to configure policies in the HTTP pipeline for an SDK client.\n * @param authPolicyFactory - An optional authentication policy factory to use for signing requests.\n * @returns A set of options that can be passed to create a new {@link ServiceClient}.\n */\nfunction createPipelineFromOptions(pipelineOptions, authPolicyFactory) {\n const requestPolicyFactories = [];\n if (pipelineOptions.sendStreamingJson) {\n requestPolicyFactories.push(ndJsonPolicy());\n }\n let userAgentValue = undefined;\n if (pipelineOptions.userAgentOptions && pipelineOptions.userAgentOptions.userAgentPrefix) {\n const userAgentInfo = [];\n userAgentInfo.push(pipelineOptions.userAgentOptions.userAgentPrefix);\n // Add the default user agent value if it isn\'t already specified\n // by the userAgentPrefix option.\n const defaultUserAgentInfo = getDefaultUserAgentValue();\n if (userAgentInfo.indexOf(defaultUserAgentInfo) === -1) {\n userAgentInfo.push(defaultUserAgentInfo);\n }\n userAgentValue = userAgentInfo.join(" ");\n }\n const keepAliveOptions = Object.assign(Object.assign({}, DefaultKeepAliveOptions), pipelineOptions.keepAliveOptions);\n const retryOptions = Object.assign(Object.assign({}, DefaultRetryOptions), pipelineOptions.retryOptions);\n const redirectOptions = Object.assign(Object.assign({}, DefaultRedirectOptions), pipelineOptions.redirectOptions);\n if (isNode) {\n requestPolicyFactories.push(proxyPolicy(pipelineOptions.proxyOptions));\n }\n const deserializationOptions = Object.assign(Object.assign({}, DefaultDeserializationOptions), pipelineOptions.deserializationOptions);\n const loggingOptions = Object.assign({}, pipelineOptions.loggingOptions);\n requestPolicyFactories.push(tracingPolicy({ userAgent: userAgentValue }), keepAlivePolicy(keepAliveOptions), userAgentPolicy({ value: userAgentValue }), generateClientRequestIdPolicy(), deserializationPolicy(deserializationOptions.expectedContentTypes), throttlingRetryPolicy(), systemErrorRetryPolicy(), exponentialRetryPolicy(retryOptions.maxRetries, retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs));\n if (redirectOptions.handleRedirects) {\n requestPolicyFactories.push(redirectPolicy(redirectOptions.maxRetries));\n }\n if (authPolicyFactory) {\n requestPolicyFactories.push(authPolicyFactory);\n }\n requestPolicyFactories.push(logPolicy(loggingOptions));\n if (isNode && pipelineOptions.decompressResponse === false) {\n requestPolicyFactories.push(disableResponseDecompressionPolicy());\n }\n return {\n httpClient: pipelineOptions.httpClient,\n requestPolicyFactories,\n };\n}\n/**\n * Get the property parent for the property at the provided path when starting with the provided\n * parent object.\n */\nfunction getPropertyParent(parent, propertyPath) {\n if (parent && propertyPath) {\n const propertyPathLength = propertyPath.length;\n for (let i = 0; i < propertyPathLength - 1; ++i) {\n const propertyName = propertyPath[i];\n if (!parent[propertyName]) {\n parent[propertyName] = {};\n }\n parent = parent[propertyName];\n }\n }\n return parent;\n}\nfunction getOperationArgumentValueFromParameter(serviceClient, operationArguments, parameter, serializer) {\n return getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, parameter.parameterPath, parameter.mapper, serializer);\n}\nfunction getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, parameterPath, parameterMapper, serializer) {\n var _a;\n let value;\n if (typeof parameterPath === "string") {\n parameterPath = [parameterPath];\n }\n const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;\n if (Array.isArray(parameterPath)) {\n if (parameterPath.length > 0) {\n if (parameterMapper.isConstant) {\n value = parameterMapper.defaultValue;\n }\n else {\n let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);\n if (!propertySearchResult.propertyFound) {\n propertySearchResult = getPropertyFromParameterPath(serviceClient, parameterPath);\n }\n let useDefaultValue = false;\n if (!propertySearchResult.propertyFound) {\n useDefaultValue =\n parameterMapper.required ||\n (parameterPath[0] === "options" && parameterPath.length === 2);\n }\n value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;\n }\n // Serialize just for validation purposes.\n const parameterPathString = getPathStringFromParameterPath(parameterPath, parameterMapper);\n serializer.serialize(parameterMapper, value, parameterPathString, serializerOptions);\n }\n }\n else {\n if (parameterMapper.required) {\n value = {};\n }\n for (const propertyName in parameterPath) {\n const propertyMapper = parameterMapper.type.modelProperties[propertyName];\n const propertyPath = parameterPath[propertyName];\n const propertyValue = getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, propertyPath, propertyMapper, serializer);\n // Serialize just for validation purposes.\n const propertyPathString = getPathStringFromParameterPath(propertyPath, propertyMapper);\n serializer.serialize(propertyMapper, propertyValue, propertyPathString, serializerOptions);\n if (propertyValue !== undefined && propertyValue !== null) {\n if (!value) {\n value = {};\n }\n value[propertyName] = propertyValue;\n }\n }\n }\n return value;\n}\nfunction getPropertyFromParameterPath(parent, parameterPath) {\n const result = { propertyFound: false };\n let i = 0;\n for (; i < parameterPath.length; ++i) {\n const parameterPathPart = parameterPath[i];\n // Make sure to check inherited properties too, so don\'t use hasOwnProperty().\n if (parent !== undefined && parent !== null && parameterPathPart in parent) {\n parent = parent[parameterPathPart];\n }\n else {\n break;\n }\n }\n if (i === parameterPath.length) {\n result.propertyValue = parent;\n result.propertyFound = true;\n }\n return result;\n}\n/**\n * Parses an {@link HttpOperationResponse} into a normalized HTTP response object ({@link RestResponse}).\n * @param _response - Wrapper object for http response.\n * @param responseSpec - Mappers for how to parse the response properties.\n * @returns - A normalized response object.\n */\nfunction flattenResponse(_response, responseSpec) {\n const parsedHeaders = _response.parsedHeaders;\n const bodyMapper = responseSpec && responseSpec.bodyMapper;\n const addOperationResponse = (obj) => {\n return Object.defineProperty(obj, "_response", {\n value: _response,\n });\n };\n if (bodyMapper) {\n const typeName = bodyMapper.type.name;\n if (typeName === "Stream") {\n return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), { blobBody: _response.blobBody, readableStreamBody: _response.readableStreamBody }));\n }\n const modelProperties = (typeName === "Composite" && bodyMapper.type.modelProperties) || {};\n const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");\n if (typeName === "Sequence" || isPageableResponse) {\n const arrayResponse = [...(_response.parsedBody || [])];\n for (const key of Object.keys(modelProperties)) {\n if (modelProperties[key].serializedName) {\n arrayResponse[key] = _response.parsedBody[key];\n }\n }\n if (parsedHeaders) {\n for (const key of Object.keys(parsedHeaders)) {\n arrayResponse[key] = parsedHeaders[key];\n }\n }\n addOperationResponse(arrayResponse);\n return arrayResponse;\n }\n if (typeName === "Composite" || typeName === "Dictionary") {\n return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), _response.parsedBody));\n }\n }\n if (bodyMapper ||\n _response.request.method === "HEAD" ||\n isPrimitiveType(_response.parsedBody)) {\n // primitive body types and HEAD booleans\n return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), { body: _response.parsedBody }));\n }\n return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), _response.parsedBody));\n}\nfunction getCredentialScopes(options, baseUri) {\n if (options === null || options === void 0 ? void 0 : options.credentialScopes) {\n return options.credentialScopes;\n }\n if (baseUri) {\n return `${baseUri}/.default`;\n }\n return undefined;\n}\n//# sourceMappingURL=serviceClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/storageClientContext.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\nconst packageName = "azure-storage-blob";\nconst packageVersion = "12.17.0";\nclass StorageClientContext extends ServiceClient {\n /**\n * Initializes a new instance of the StorageClientContext class.\n * @param url The URL of the service account, container, or blob that is the target of the desired\n * operation.\n * @param options The parameter options\n */\n constructor(url, options) {\n if (url === undefined) {\n throw new Error("\'url\' cannot be null");\n }\n // Initializing default values for options\n if (!options) {\n options = {};\n }\n if (!options.userAgent) {\n const defaultUserAgent = userAgentPolicy_getDefaultUserAgentValue();\n options.userAgent = `${packageName}/${packageVersion} ${defaultUserAgent}`;\n }\n super(undefined, options);\n this.requestContentType = "application/json; charset=utf-8";\n this.baseUri = options.endpoint || "{url}";\n // Parameter assignments\n this.url = url;\n // Assigning values to Constant parameters\n this.version = options.version || "2023-11-03";\n }\n}\n//# sourceMappingURL=storageClientContext.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/StorageClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n/**\n * A StorageClient represents a based URL class for {@link BlobServiceClient}, {@link ContainerClient}\n * and etc.\n */\nclass StorageClient {\n /**\n * Creates an instance of StorageClient.\n * @param url - url to resource\n * @param pipeline - request policy pipeline.\n */\n constructor(url, pipeline) {\n // URL should be encoded and only once, protocol layer shouldn\'t encode URL again\n this.url = escapeURLPath(url);\n this.accountName = getAccountNameFromUrl(url);\n this.pipeline = pipeline;\n this.storageClientContext = new StorageClientContext(this.url, pipeline.toServiceClientOptions());\n this.isHttps = iEqual(getURLScheme(this.url) || "", "https");\n this.credential = new AnonymousCredential();\n for (const factory of this.pipeline.factories) {\n if ((checkEnvironment_isNode && factory instanceof StorageSharedKeyCredential) ||\n factory instanceof AnonymousCredential) {\n this.credential = factory;\n }\n else if (isTokenCredential(factory.credential)) {\n // Only works if the factory has been attached a "credential" property.\n // We do that in newPipeline() when using TokenCredential.\n this.credential = factory.credential;\n }\n }\n // Override protocol layer\'s default content-type\n const storageClientContext = this.storageClientContext;\n storageClientContext.requestContentType = undefined;\n }\n}\n//# sourceMappingURL=StorageClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/tracing.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Creates a span using the global tracer.\n * @internal\n */\nconst tracing_createSpan = createSpanFunction({\n packagePrefix: "Azure.Storage.Blob",\n namespace: "Microsoft.Storage",\n});\n/**\n * @internal\n *\n * Adapt the tracing options from OperationOptions to what they need to be for\n * RequestOptionsBase (when we update to later OpenTelemetry versions this is now\n * two separate fields, not just one).\n */\nfunction convertTracingToRequestOptionsBase(options) {\n var _a, _b;\n return {\n // By passing spanOptions if they exist at runtime, we\'re backwards compatible with @azure/core-tracing@preview.13 and earlier.\n spanOptions: (_a = options === null || options === void 0 ? void 0 : options.tracingOptions) === null || _a === void 0 ? void 0 : _a.spanOptions,\n tracingContext: (_b = options === null || options === void 0 ? void 0 : options.tracingOptions) === null || _b === void 0 ? void 0 : _b.tracingContext,\n };\n}\n//# sourceMappingURL=tracing.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/BlobSASPermissions.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a blob. Setting\n * a value to true means that any SAS which uses these permissions will grant permissions for that operation. Once all\n * the values are set, this should be serialized with toString and set as the permissions field on a\n * {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but\n * the order of the permissions is particular and this class guarantees correctness.\n */\nclass BlobSASPermissions {\n constructor() {\n /**\n * Specifies Read access granted.\n */\n this.read = false;\n /**\n * Specifies Add access granted.\n */\n this.add = false;\n /**\n * Specifies Create access granted.\n */\n this.create = false;\n /**\n * Specifies Write access granted.\n */\n this.write = false;\n /**\n * Specifies Delete access granted.\n */\n this.delete = false;\n /**\n * Specifies Delete version access granted.\n */\n this.deleteVersion = false;\n /**\n * Specfies Tag access granted.\n */\n this.tag = false;\n /**\n * Specifies Move access granted.\n */\n this.move = false;\n /**\n * Specifies Execute access granted.\n */\n this.execute = false;\n /**\n * Specifies SetImmutabilityPolicy access granted.\n */\n this.setImmutabilityPolicy = false;\n /**\n * Specifies that Permanent Delete is permitted.\n */\n this.permanentDelete = false;\n }\n /**\n * Creates a {@link BlobSASPermissions} from the specified permissions string. This method will throw an\n * Error if it encounters a character that does not correspond to a valid permission.\n *\n * @param permissions -\n */\n static parse(permissions) {\n const blobSASPermissions = new BlobSASPermissions();\n for (const char of permissions) {\n switch (char) {\n case "r":\n blobSASPermissions.read = true;\n break;\n case "a":\n blobSASPermissions.add = true;\n break;\n case "c":\n blobSASPermissions.create = true;\n break;\n case "w":\n blobSASPermissions.write = true;\n break;\n case "d":\n blobSASPermissions.delete = true;\n break;\n case "x":\n blobSASPermissions.deleteVersion = true;\n break;\n case "t":\n blobSASPermissions.tag = true;\n break;\n case "m":\n blobSASPermissions.move = true;\n break;\n case "e":\n blobSASPermissions.execute = true;\n break;\n case "i":\n blobSASPermissions.setImmutabilityPolicy = true;\n break;\n case "y":\n blobSASPermissions.permanentDelete = true;\n break;\n default:\n throw new RangeError(`Invalid permission: ${char}`);\n }\n }\n return blobSASPermissions;\n }\n /**\n * Creates a {@link BlobSASPermissions} from a raw object which contains same keys as it\n * and boolean values for them.\n *\n * @param permissionLike -\n */\n static from(permissionLike) {\n const blobSASPermissions = new BlobSASPermissions();\n if (permissionLike.read) {\n blobSASPermissions.read = true;\n }\n if (permissionLike.add) {\n blobSASPermissions.add = true;\n }\n if (permissionLike.create) {\n blobSASPermissions.create = true;\n }\n if (permissionLike.write) {\n blobSASPermissions.write = true;\n }\n if (permissionLike.delete) {\n blobSASPermissions.delete = true;\n }\n if (permissionLike.deleteVersion) {\n blobSASPermissions.deleteVersion = true;\n }\n if (permissionLike.tag) {\n blobSASPermissions.tag = true;\n }\n if (permissionLike.move) {\n blobSASPermissions.move = true;\n }\n if (permissionLike.execute) {\n blobSASPermissions.execute = true;\n }\n if (permissionLike.setImmutabilityPolicy) {\n blobSASPermissions.setImmutabilityPolicy = true;\n }\n if (permissionLike.permanentDelete) {\n blobSASPermissions.permanentDelete = true;\n }\n return blobSASPermissions;\n }\n /**\n * Converts the given permissions to a string. Using this method will guarantee the permissions are in an\n * order accepted by the service.\n *\n * @returns A string which represents the BlobSASPermissions\n */\n toString() {\n const permissions = [];\n if (this.read) {\n permissions.push("r");\n }\n if (this.add) {\n permissions.push("a");\n }\n if (this.create) {\n permissions.push("c");\n }\n if (this.write) {\n permissions.push("w");\n }\n if (this.delete) {\n permissions.push("d");\n }\n if (this.deleteVersion) {\n permissions.push("x");\n }\n if (this.tag) {\n permissions.push("t");\n }\n if (this.move) {\n permissions.push("m");\n }\n if (this.execute) {\n permissions.push("e");\n }\n if (this.setImmutabilityPolicy) {\n permissions.push("i");\n }\n if (this.permanentDelete) {\n permissions.push("y");\n }\n return permissions.join("");\n }\n}\n//# sourceMappingURL=BlobSASPermissions.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/ContainerSASPermissions.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a container.\n * Setting a value to true means that any SAS which uses these permissions will grant permissions for that operation.\n * Once all the values are set, this should be serialized with toString and set as the permissions field on a\n * {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but\n * the order of the permissions is particular and this class guarantees correctness.\n */\nclass ContainerSASPermissions {\n constructor() {\n /**\n * Specifies Read access granted.\n */\n this.read = false;\n /**\n * Specifies Add access granted.\n */\n this.add = false;\n /**\n * Specifies Create access granted.\n */\n this.create = false;\n /**\n * Specifies Write access granted.\n */\n this.write = false;\n /**\n * Specifies Delete access granted.\n */\n this.delete = false;\n /**\n * Specifies Delete version access granted.\n */\n this.deleteVersion = false;\n /**\n * Specifies List access granted.\n */\n this.list = false;\n /**\n * Specfies Tag access granted.\n */\n this.tag = false;\n /**\n * Specifies Move access granted.\n */\n this.move = false;\n /**\n * Specifies Execute access granted.\n */\n this.execute = false;\n /**\n * Specifies SetImmutabilityPolicy access granted.\n */\n this.setImmutabilityPolicy = false;\n /**\n * Specifies that Permanent Delete is permitted.\n */\n this.permanentDelete = false;\n /**\n * Specifies that Filter Blobs by Tags is permitted.\n */\n this.filterByTags = false;\n }\n /**\n * Creates an {@link ContainerSASPermissions} from the specified permissions string. This method will throw an\n * Error if it encounters a character that does not correspond to a valid permission.\n *\n * @param permissions -\n */\n static parse(permissions) {\n const containerSASPermissions = new ContainerSASPermissions();\n for (const char of permissions) {\n switch (char) {\n case "r":\n containerSASPermissions.read = true;\n break;\n case "a":\n containerSASPermissions.add = true;\n break;\n case "c":\n containerSASPermissions.create = true;\n break;\n case "w":\n containerSASPermissions.write = true;\n break;\n case "d":\n containerSASPermissions.delete = true;\n break;\n case "l":\n containerSASPermissions.list = true;\n break;\n case "t":\n containerSASPermissions.tag = true;\n break;\n case "x":\n containerSASPermissions.deleteVersion = true;\n break;\n case "m":\n containerSASPermissions.move = true;\n break;\n case "e":\n containerSASPermissions.execute = true;\n break;\n case "i":\n containerSASPermissions.setImmutabilityPolicy = true;\n break;\n case "y":\n containerSASPermissions.permanentDelete = true;\n break;\n case "f":\n containerSASPermissions.filterByTags = true;\n break;\n default:\n throw new RangeError(`Invalid permission ${char}`);\n }\n }\n return containerSASPermissions;\n }\n /**\n * Creates a {@link ContainerSASPermissions} from a raw object which contains same keys as it\n * and boolean values for them.\n *\n * @param permissionLike -\n */\n static from(permissionLike) {\n const containerSASPermissions = new ContainerSASPermissions();\n if (permissionLike.read) {\n containerSASPermissions.read = true;\n }\n if (permissionLike.add) {\n containerSASPermissions.add = true;\n }\n if (permissionLike.create) {\n containerSASPermissions.create = true;\n }\n if (permissionLike.write) {\n containerSASPermissions.write = true;\n }\n if (permissionLike.delete) {\n containerSASPermissions.delete = true;\n }\n if (permissionLike.list) {\n containerSASPermissions.list = true;\n }\n if (permissionLike.deleteVersion) {\n containerSASPermissions.deleteVersion = true;\n }\n if (permissionLike.tag) {\n containerSASPermissions.tag = true;\n }\n if (permissionLike.move) {\n containerSASPermissions.move = true;\n }\n if (permissionLike.execute) {\n containerSASPermissions.execute = true;\n }\n if (permissionLike.setImmutabilityPolicy) {\n containerSASPermissions.setImmutabilityPolicy = true;\n }\n if (permissionLike.permanentDelete) {\n containerSASPermissions.permanentDelete = true;\n }\n if (permissionLike.filterByTags) {\n containerSASPermissions.filterByTags = true;\n }\n return containerSASPermissions;\n }\n /**\n * Converts the given permissions to a string. Using this method will guarantee the permissions are in an\n * order accepted by the service.\n *\n * The order of the characters should be as specified here to ensure correctness.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas\n *\n */\n toString() {\n const permissions = [];\n if (this.read) {\n permissions.push("r");\n }\n if (this.add) {\n permissions.push("a");\n }\n if (this.create) {\n permissions.push("c");\n }\n if (this.write) {\n permissions.push("w");\n }\n if (this.delete) {\n permissions.push("d");\n }\n if (this.deleteVersion) {\n permissions.push("x");\n }\n if (this.list) {\n permissions.push("l");\n }\n if (this.tag) {\n permissions.push("t");\n }\n if (this.move) {\n permissions.push("m");\n }\n if (this.execute) {\n permissions.push("e");\n }\n if (this.setImmutabilityPolicy) {\n permissions.push("i");\n }\n if (this.permanentDelete) {\n permissions.push("y");\n }\n if (this.filterByTags) {\n permissions.push("f");\n }\n return permissions.join("");\n }\n}\n//# sourceMappingURL=ContainerSASPermissions.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/credentials/UserDelegationKeyCredential.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * UserDelegationKeyCredential is only used for generation of user delegation SAS.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas\n */\nclass UserDelegationKeyCredential {\n /**\n * Creates an instance of UserDelegationKeyCredential.\n * @param accountName -\n * @param userDelegationKey -\n */\n constructor(accountName, userDelegationKey) {\n this.accountName = accountName;\n this.userDelegationKey = userDelegationKey;\n this.key = Buffer.from(userDelegationKey.value, "base64");\n }\n /**\n * Generates a hash signature for an HTTP request or for a SAS.\n *\n * @param stringToSign -\n */\n computeHMACSHA256(stringToSign) {\n // console.log(`stringToSign: ${JSON.stringify(stringToSign)}`);\n return (0,external_crypto_.createHmac)("sha256", this.key).update(stringToSign, "utf8").digest("base64");\n }\n}\n//# sourceMappingURL=UserDelegationKeyCredential.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/SasIPRange.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Generate SasIPRange format string. For example:\n *\n * "8.8.8.8" or "1.1.1.1-255.255.255.255"\n *\n * @param ipRange -\n */\nfunction ipRangeToString(ipRange) {\n return ipRange.end ? `${ipRange.start}-${ipRange.end}` : ipRange.start;\n}\n//# sourceMappingURL=SasIPRange.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/SASQueryParameters.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * Protocols for generated SAS.\n */\nvar SASProtocol;\n(function (SASProtocol) {\n /**\n * Protocol that allows HTTPS only\n */\n SASProtocol["Https"] = "https";\n /**\n * Protocol that allows both HTTPS and HTTP\n */\n SASProtocol["HttpsAndHttp"] = "https,http";\n})(SASProtocol || (SASProtocol = {}));\n/**\n * Represents the components that make up an Azure Storage SAS\' query parameters. This type is not constructed directly\n * by the user; it is only generated by the {@link AccountSASSignatureValues} and {@link BlobSASSignatureValues}\n * types. Once generated, it can be encoded into a {@link String} and appended to a URL directly (though caution should\n * be taken here in case there are existing query parameters, which might affect the appropriate means of appending\n * these query parameters).\n *\n * NOTE: Instances of this class are immutable.\n */\nclass SASQueryParameters {\n constructor(version, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope) {\n this.version = version;\n this.signature = signature;\n if (permissionsOrOptions !== undefined && typeof permissionsOrOptions !== "string") {\n // SASQueryParametersOptions\n this.permissions = permissionsOrOptions.permissions;\n this.services = permissionsOrOptions.services;\n this.resourceTypes = permissionsOrOptions.resourceTypes;\n this.protocol = permissionsOrOptions.protocol;\n this.startsOn = permissionsOrOptions.startsOn;\n this.expiresOn = permissionsOrOptions.expiresOn;\n this.ipRangeInner = permissionsOrOptions.ipRange;\n this.identifier = permissionsOrOptions.identifier;\n this.encryptionScope = permissionsOrOptions.encryptionScope;\n this.resource = permissionsOrOptions.resource;\n this.cacheControl = permissionsOrOptions.cacheControl;\n this.contentDisposition = permissionsOrOptions.contentDisposition;\n this.contentEncoding = permissionsOrOptions.contentEncoding;\n this.contentLanguage = permissionsOrOptions.contentLanguage;\n this.contentType = permissionsOrOptions.contentType;\n if (permissionsOrOptions.userDelegationKey) {\n this.signedOid = permissionsOrOptions.userDelegationKey.signedObjectId;\n this.signedTenantId = permissionsOrOptions.userDelegationKey.signedTenantId;\n this.signedStartsOn = permissionsOrOptions.userDelegationKey.signedStartsOn;\n this.signedExpiresOn = permissionsOrOptions.userDelegationKey.signedExpiresOn;\n this.signedService = permissionsOrOptions.userDelegationKey.signedService;\n this.signedVersion = permissionsOrOptions.userDelegationKey.signedVersion;\n this.preauthorizedAgentObjectId = permissionsOrOptions.preauthorizedAgentObjectId;\n this.correlationId = permissionsOrOptions.correlationId;\n }\n }\n else {\n this.services = services;\n this.resourceTypes = resourceTypes;\n this.expiresOn = expiresOn;\n this.permissions = permissionsOrOptions;\n this.protocol = protocol;\n this.startsOn = startsOn;\n this.ipRangeInner = ipRange;\n this.encryptionScope = encryptionScope;\n this.identifier = identifier;\n this.resource = resource;\n this.cacheControl = cacheControl;\n this.contentDisposition = contentDisposition;\n this.contentEncoding = contentEncoding;\n this.contentLanguage = contentLanguage;\n this.contentType = contentType;\n if (userDelegationKey) {\n this.signedOid = userDelegationKey.signedObjectId;\n this.signedTenantId = userDelegationKey.signedTenantId;\n this.signedStartsOn = userDelegationKey.signedStartsOn;\n this.signedExpiresOn = userDelegationKey.signedExpiresOn;\n this.signedService = userDelegationKey.signedService;\n this.signedVersion = userDelegationKey.signedVersion;\n this.preauthorizedAgentObjectId = preauthorizedAgentObjectId;\n this.correlationId = correlationId;\n }\n }\n }\n /**\n * Optional. IP range allowed for this SAS.\n *\n * @readonly\n */\n get ipRange() {\n if (this.ipRangeInner) {\n return {\n end: this.ipRangeInner.end,\n start: this.ipRangeInner.start,\n };\n }\n return undefined;\n }\n /**\n * Encodes all SAS query parameters into a string that can be appended to a URL.\n *\n */\n toString() {\n const params = [\n "sv",\n "ss",\n "srt",\n "spr",\n "st",\n "se",\n "sip",\n "si",\n "ses",\n "skoid",\n "sktid",\n "skt",\n "ske",\n "sks",\n "skv",\n "sr",\n "sp",\n "sig",\n "rscc",\n "rscd",\n "rsce",\n "rscl",\n "rsct",\n "saoid",\n "scid",\n ];\n const queries = [];\n for (const param of params) {\n switch (param) {\n case "sv":\n this.tryAppendQueryParameter(queries, param, this.version);\n break;\n case "ss":\n this.tryAppendQueryParameter(queries, param, this.services);\n break;\n case "srt":\n this.tryAppendQueryParameter(queries, param, this.resourceTypes);\n break;\n case "spr":\n this.tryAppendQueryParameter(queries, param, this.protocol);\n break;\n case "st":\n this.tryAppendQueryParameter(queries, param, this.startsOn ? truncatedISO8061Date(this.startsOn, false) : undefined);\n break;\n case "se":\n this.tryAppendQueryParameter(queries, param, this.expiresOn ? truncatedISO8061Date(this.expiresOn, false) : undefined);\n break;\n case "sip":\n this.tryAppendQueryParameter(queries, param, this.ipRange ? ipRangeToString(this.ipRange) : undefined);\n break;\n case "si":\n this.tryAppendQueryParameter(queries, param, this.identifier);\n break;\n case "ses":\n this.tryAppendQueryParameter(queries, param, this.encryptionScope);\n break;\n case "skoid": // Signed object ID\n this.tryAppendQueryParameter(queries, param, this.signedOid);\n break;\n case "sktid": // Signed tenant ID\n this.tryAppendQueryParameter(queries, param, this.signedTenantId);\n break;\n case "skt": // Signed key start time\n this.tryAppendQueryParameter(queries, param, this.signedStartsOn ? truncatedISO8061Date(this.signedStartsOn, false) : undefined);\n break;\n case "ske": // Signed key expiry time\n this.tryAppendQueryParameter(queries, param, this.signedExpiresOn ? truncatedISO8061Date(this.signedExpiresOn, false) : undefined);\n break;\n case "sks": // Signed key service\n this.tryAppendQueryParameter(queries, param, this.signedService);\n break;\n case "skv": // Signed key version\n this.tryAppendQueryParameter(queries, param, this.signedVersion);\n break;\n case "sr":\n this.tryAppendQueryParameter(queries, param, this.resource);\n break;\n case "sp":\n this.tryAppendQueryParameter(queries, param, this.permissions);\n break;\n case "sig":\n this.tryAppendQueryParameter(queries, param, this.signature);\n break;\n case "rscc":\n this.tryAppendQueryParameter(queries, param, this.cacheControl);\n break;\n case "rscd":\n this.tryAppendQueryParameter(queries, param, this.contentDisposition);\n break;\n case "rsce":\n this.tryAppendQueryParameter(queries, param, this.contentEncoding);\n break;\n case "rscl":\n this.tryAppendQueryParameter(queries, param, this.contentLanguage);\n break;\n case "rsct":\n this.tryAppendQueryParameter(queries, param, this.contentType);\n break;\n case "saoid":\n this.tryAppendQueryParameter(queries, param, this.preauthorizedAgentObjectId);\n break;\n case "scid":\n this.tryAppendQueryParameter(queries, param, this.correlationId);\n break;\n }\n }\n return queries.join("&");\n }\n /**\n * A private helper method used to filter and append query key/value pairs into an array.\n *\n * @param queries -\n * @param key -\n * @param value -\n */\n tryAppendQueryParameter(queries, key, value) {\n if (!value) {\n return;\n }\n key = encodeURIComponent(key);\n value = encodeURIComponent(value);\n if (key.length > 0 && value.length > 0) {\n queries.push(`${key}=${value}`);\n }\n }\n}\n//# sourceMappingURL=SASQueryParameters.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/BlobSASSignatureValues.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\nfunction generateBlobSASQueryParameters(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) {\n const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION;\n const sharedKeyCredential = sharedKeyCredentialOrUserDelegationKey instanceof StorageSharedKeyCredential\n ? sharedKeyCredentialOrUserDelegationKey\n : undefined;\n let userDelegationKeyCredential;\n if (sharedKeyCredential === undefined && accountName !== undefined) {\n userDelegationKeyCredential = new UserDelegationKeyCredential(accountName, sharedKeyCredentialOrUserDelegationKey);\n }\n if (sharedKeyCredential === undefined && userDelegationKeyCredential === undefined) {\n throw TypeError("Invalid sharedKeyCredential, userDelegationKey or accountName.");\n }\n // Version 2020-12-06 adds support for encryptionscope in SAS.\n if (version >= "2020-12-06") {\n if (sharedKeyCredential !== undefined) {\n return generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential);\n }\n else {\n return generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential);\n }\n }\n // Version 2019-12-12 adds support for the blob tags permission.\n // Version 2018-11-09 adds support for the signed resource and signed blob snapshot time fields.\n // https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas#constructing-the-signature-string\n if (version >= "2018-11-09") {\n if (sharedKeyCredential !== undefined) {\n return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential);\n }\n else {\n // Version 2020-02-10 delegation SAS signature construction includes preauthorizedAgentObjectId, agentObjectId, correlationId.\n if (version >= "2020-02-10") {\n return generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential);\n }\n else {\n return generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential);\n }\n }\n }\n if (version >= "2015-04-05") {\n if (sharedKeyCredential !== undefined) {\n return generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential);\n }\n else {\n throw new RangeError("\'version\' must be >= \'2018-11-09\' when generating user delegation SAS using user delegation key.");\n }\n }\n throw new RangeError("\'version\' must be >= \'2015-04-05\'.");\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2015-04-05 AND BEFORE 2018-11-09.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn and identifier.\n *\n * WARNING: When identifier is not provided, permissions and expiresOn are required.\n * You MUST assign value to identifier or expiresOn & permissions manually if you initial with\n * this constructor.\n *\n * @param blobSASSignatureValues -\n * @param sharedKeyCredential -\n */\nfunction generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n if (!blobSASSignatureValues.identifier &&\n !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when \'identifier\' is not provided.");\n }\n let resource = "c";\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n blobSASSignatureValues.identifier,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",\n blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",\n blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",\n blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",\n blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",\n ].join("\\n");\n const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2018-11-09.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn and identifier.\n *\n * WARNING: When identifier is not provided, permissions and expiresOn are required.\n * You MUST assign value to identifier or expiresOn & permissions manually if you initial with\n * this constructor.\n *\n * @param blobSASSignatureValues -\n * @param sharedKeyCredential -\n */\nfunction generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n if (!blobSASSignatureValues.identifier &&\n !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when \'identifier\' is not provided.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n blobSASSignatureValues.identifier,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",\n blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",\n blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",\n blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",\n blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",\n ].join("\\n");\n const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn and identifier.\n *\n * WARNING: When identifier is not provided, permissions and expiresOn are required.\n * You MUST assign value to identifier or expiresOn & permissions manually if you initial with\n * this constructor.\n *\n * @param blobSASSignatureValues -\n * @param sharedKeyCredential -\n */\nfunction generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n if (!blobSASSignatureValues.identifier &&\n !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when \'identifier\' is not provided.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n blobSASSignatureValues.identifier,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.encryptionScope,\n blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",\n blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",\n blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",\n blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",\n blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",\n ].join("\\n");\n const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, blobSASSignatureValues.encryptionScope);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2018-11-09.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn.\n *\n * WARNING: identifier will be ignored, permissions and expiresOn are required.\n *\n * @param blobSASSignatureValues -\n * @param userDelegationKeyCredential -\n */\nfunction generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n // Stored access policies are not supported for a user delegation SAS.\n if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when generating user delegation SAS.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n userDelegationKeyCredential.userDelegationKey.signedObjectId,\n userDelegationKeyCredential.userDelegationKey.signedTenantId,\n userDelegationKeyCredential.userDelegationKey.signedStartsOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedExpiresOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedService,\n userDelegationKeyCredential.userDelegationKey.signedVersion,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.cacheControl,\n blobSASSignatureValues.contentDisposition,\n blobSASSignatureValues.contentEncoding,\n blobSASSignatureValues.contentLanguage,\n blobSASSignatureValues.contentType,\n ].join("\\n");\n const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2020-02-10.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn.\n *\n * WARNING: identifier will be ignored, permissions and expiresOn are required.\n *\n * @param blobSASSignatureValues -\n * @param userDelegationKeyCredential -\n */\nfunction generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n // Stored access policies are not supported for a user delegation SAS.\n if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when generating user delegation SAS.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n userDelegationKeyCredential.userDelegationKey.signedObjectId,\n userDelegationKeyCredential.userDelegationKey.signedTenantId,\n userDelegationKeyCredential.userDelegationKey.signedStartsOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedExpiresOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedService,\n userDelegationKeyCredential.userDelegationKey.signedVersion,\n blobSASSignatureValues.preauthorizedAgentObjectId,\n undefined,\n blobSASSignatureValues.correlationId,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.cacheControl,\n blobSASSignatureValues.contentDisposition,\n blobSASSignatureValues.contentEncoding,\n blobSASSignatureValues.contentLanguage,\n blobSASSignatureValues.contentType,\n ].join("\\n");\n const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId);\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.\n *\n * Creates an instance of SASQueryParameters.\n *\n * Only accepts required settings needed to create a SAS. For optional settings please\n * set corresponding properties directly, such as permissions, startsOn.\n *\n * WARNING: identifier will be ignored, permissions and expiresOn are required.\n *\n * @param blobSASSignatureValues -\n * @param userDelegationKeyCredential -\n */\nfunction generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential) {\n blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);\n // Stored access policies are not supported for a user delegation SAS.\n if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {\n throw new RangeError("Must provide \'permissions\' and \'expiresOn\' for Blob SAS generation when generating user delegation SAS.");\n }\n let resource = "c";\n let timestamp = blobSASSignatureValues.snapshotTime;\n if (blobSASSignatureValues.blobName) {\n resource = "b";\n if (blobSASSignatureValues.snapshotTime) {\n resource = "bs";\n }\n else if (blobSASSignatureValues.versionId) {\n resource = "bv";\n timestamp = blobSASSignatureValues.versionId;\n }\n }\n // Calling parse and toString guarantees the proper ordering and throws on invalid characters.\n let verifiedPermissions;\n if (blobSASSignatureValues.permissions) {\n if (blobSASSignatureValues.blobName) {\n verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n else {\n verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();\n }\n }\n // Signature is generated on the un-url-encoded values.\n const stringToSign = [\n verifiedPermissions ? verifiedPermissions : "",\n blobSASSignatureValues.startsOn\n ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false)\n : "",\n blobSASSignatureValues.expiresOn\n ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)\n : "",\n getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),\n userDelegationKeyCredential.userDelegationKey.signedObjectId,\n userDelegationKeyCredential.userDelegationKey.signedTenantId,\n userDelegationKeyCredential.userDelegationKey.signedStartsOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedExpiresOn\n ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)\n : "",\n userDelegationKeyCredential.userDelegationKey.signedService,\n userDelegationKeyCredential.userDelegationKey.signedVersion,\n blobSASSignatureValues.preauthorizedAgentObjectId,\n undefined,\n blobSASSignatureValues.correlationId,\n blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",\n blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",\n blobSASSignatureValues.version,\n resource,\n timestamp,\n blobSASSignatureValues.encryptionScope,\n blobSASSignatureValues.cacheControl,\n blobSASSignatureValues.contentDisposition,\n blobSASSignatureValues.contentEncoding,\n blobSASSignatureValues.contentLanguage,\n blobSASSignatureValues.contentType,\n ].join("\\n");\n const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope);\n}\nfunction getCanonicalName(accountName, containerName, blobName) {\n // Container: "/blob/account/containerName"\n // Blob: "/blob/account/containerName/blobName"\n const elements = [`/blob/${accountName}/${containerName}`];\n if (blobName) {\n elements.push(`/${blobName}`);\n }\n return elements.join("");\n}\nfunction SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) {\n const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION;\n if (blobSASSignatureValues.snapshotTime && version < "2018-11-09") {\n throw RangeError("\'version\' must be >= \'2018-11-09\' when providing \'snapshotTime\'.");\n }\n if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.snapshotTime) {\n throw RangeError("Must provide \'blobName\' when providing \'snapshotTime\'.");\n }\n if (blobSASSignatureValues.versionId && version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when providing \'versionId\'.");\n }\n if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.versionId) {\n throw RangeError("Must provide \'blobName\' when providing \'versionId\'.");\n }\n if (blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.setImmutabilityPolicy &&\n version < "2020-08-04") {\n throw RangeError("\'version\' must be >= \'2020-08-04\' when provided \'i\' permission.");\n }\n if (blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.deleteVersion &&\n version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when providing \'x\' permission.");\n }\n if (blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.permanentDelete &&\n version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when providing \'y\' permission.");\n }\n if (blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.tag &&\n version < "2019-12-12") {\n throw RangeError("\'version\' must be >= \'2019-12-12\' when providing \'t\' permission.");\n }\n if (version < "2020-02-10" &&\n blobSASSignatureValues.permissions &&\n (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) {\n throw RangeError("\'version\' must be >= \'2020-02-10\' when providing the \'m\' or \'e\' permission.");\n }\n if (version < "2021-04-10" &&\n blobSASSignatureValues.permissions &&\n blobSASSignatureValues.permissions.filterByTags) {\n throw RangeError("\'version\' must be >= \'2021-04-10\' when providing the \'f\' permission.");\n }\n if (version < "2020-02-10" &&\n (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) {\n throw RangeError("\'version\' must be >= \'2020-02-10\' when providing \'preauthorizedAgentObjectId\' or \'correlationId\'.");\n }\n if (blobSASSignatureValues.encryptionScope && version < "2020-12-06") {\n throw RangeError("\'version\' must be >= \'2020-12-06\' when provided \'encryptionScope\' in SAS.");\n }\n blobSASSignatureValues.version = version;\n return blobSASSignatureValues;\n}\n//# sourceMappingURL=BlobSASSignatureValues.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/blob.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a Blob. */\nclass blob_Blob {\n /**\n * Initialize a new instance of the class Blob class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * The Download operation reads or downloads a blob from the system, including its metadata and\n * properties. You can also call Download to read a snapshot.\n * @param options The options parameters.\n */\n download(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, downloadOperationSpec);\n }\n /**\n * The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system\n * properties for the blob. It does not return the content of the blob.\n * @param options The options parameters.\n */\n getProperties(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_getPropertiesOperationSpec);\n }\n /**\n * If the storage account\'s soft delete feature is disabled then, when a blob is deleted, it is\n * permanently removed from the storage account. If the storage account\'s soft delete feature is\n * enabled, then, when a blob is deleted, it is marked for deletion and becomes inaccessible\n * immediately. However, the blob service retains the blob or snapshot for the number of days specified\n * by the DeleteRetentionPolicy section of [Storage service properties]\n * (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob\'s data is\n * permanently removed from the storage account. Note that you continue to be charged for the\n * soft-deleted blob\'s storage until it is permanently removed. Use the List Blobs API and specify the\n * "include=deleted" query parameter to discover which blobs and snapshots have been soft deleted. You\n * can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a\n * soft-deleted blob or snapshot causes the service to return an HTTP status code of 404\n * (ResourceNotFound).\n * @param options The options parameters.\n */\n delete(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_deleteOperationSpec);\n }\n /**\n * Undelete a blob that was previously soft deleted\n * @param options The options parameters.\n */\n undelete(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, undeleteOperationSpec);\n }\n /**\n * Sets the time a blob will expire and be deleted.\n * @param expiryOptions Required. Indicates mode of the expiry time\n * @param options The options parameters.\n */\n setExpiry(expiryOptions, options) {\n const operationArguments = {\n expiryOptions,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setExpiryOperationSpec);\n }\n /**\n * The Set HTTP Headers operation sets system properties on the blob\n * @param options The options parameters.\n */\n setHttpHeaders(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setHttpHeadersOperationSpec);\n }\n /**\n * The Set Immutability Policy operation sets the immutability policy on the blob\n * @param options The options parameters.\n */\n setImmutabilityPolicy(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setImmutabilityPolicyOperationSpec);\n }\n /**\n * The Delete Immutability Policy operation deletes the immutability policy on the blob\n * @param options The options parameters.\n */\n deleteImmutabilityPolicy(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, deleteImmutabilityPolicyOperationSpec);\n }\n /**\n * The Set Legal Hold operation sets a legal hold on the blob.\n * @param legalHold Specified if a legal hold should be set on the blob.\n * @param options The options parameters.\n */\n setLegalHold(legalHold, options) {\n const operationArguments = {\n legalHold,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setLegalHoldOperationSpec);\n }\n /**\n * The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more\n * name-value pairs\n * @param options The options parameters.\n */\n setMetadata(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_setMetadataOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param options The options parameters.\n */\n acquireLease(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_acquireLeaseOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param leaseId Specifies the current lease ID on the resource.\n * @param options The options parameters.\n */\n releaseLease(leaseId, options) {\n const operationArguments = {\n leaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_releaseLeaseOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param leaseId Specifies the current lease ID on the resource.\n * @param options The options parameters.\n */\n renewLease(leaseId, options) {\n const operationArguments = {\n leaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_renewLeaseOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param leaseId Specifies the current lease ID on the resource.\n * @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400\n * (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor\n * (String) for a list of valid GUID string formats.\n * @param options The options parameters.\n */\n changeLease(leaseId, proposedLeaseId, options) {\n const operationArguments = {\n leaseId,\n proposedLeaseId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_changeLeaseOperationSpec);\n }\n /**\n * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n * operations\n * @param options The options parameters.\n */\n breakLease(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_breakLeaseOperationSpec);\n }\n /**\n * The Create Snapshot operation creates a read-only snapshot of a blob\n * @param options The options parameters.\n */\n createSnapshot(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, createSnapshotOperationSpec);\n }\n /**\n * The Start Copy From URL operation copies a blob or an internet resource to a new blob.\n * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to\n * 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would\n * appear in a request URI. The source blob must either be public or must be authenticated via a shared\n * access signature.\n * @param options The options parameters.\n */\n startCopyFromURL(copySource, options) {\n const operationArguments = {\n copySource,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, startCopyFromURLOperationSpec);\n }\n /**\n * The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return\n * a response until the copy is complete.\n * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to\n * 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would\n * appear in a request URI. The source blob must either be public or must be authenticated via a shared\n * access signature.\n * @param options The options parameters.\n */\n copyFromURL(copySource, options) {\n const operationArguments = {\n copySource,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, copyFromURLOperationSpec);\n }\n /**\n * The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination\n * blob with zero length and full metadata.\n * @param copyId The copy identifier provided in the x-ms-copy-id header of the original Copy Blob\n * operation.\n * @param options The options parameters.\n */\n abortCopyFromURL(copyId, options) {\n const operationArguments = {\n copyId,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, abortCopyFromURLOperationSpec);\n }\n /**\n * The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium\n * storage account and on a block blob in a blob storage account (locally redundant storage only). A\n * premium page blob\'s tier determines the allowed size, IOPS, and bandwidth of the blob. A block\n * blob\'s tier determines Hot/Cool/Archive storage type. This operation does not update the blob\'s\n * ETag.\n * @param tier Indicates the tier to be set on the blob.\n * @param options The options parameters.\n */\n setTier(tier, options) {\n const operationArguments = {\n tier,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setTierOperationSpec);\n }\n /**\n * Returns the sku name and account kind\n * @param options The options parameters.\n */\n getAccountInfo(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, blob_getAccountInfoOperationSpec);\n }\n /**\n * The Query operation enables users to select/project on blob data by providing simple query\n * expressions.\n * @param options The options parameters.\n */\n query(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, queryOperationSpec);\n }\n /**\n * The Get Tags operation enables users to get the tags associated with a blob.\n * @param options The options parameters.\n */\n getTags(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getTagsOperationSpec);\n }\n /**\n * The Set Tags operation enables users to set tags on a blob.\n * @param options The options parameters.\n */\n setTags(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, setTagsOperationSpec);\n }\n}\n// Operation Specifications\nconst blob_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst downloadOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: BlobDownloadHeaders\n },\n 206: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: BlobDownloadHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobDownloadExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n rangeGetContentMD5,\n rangeGetContentCRC64,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_getPropertiesOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "HEAD",\n responses: {\n 200: {\n headersMapper: BlobGetPropertiesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobGetPropertiesExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_deleteOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "DELETE",\n responses: {\n 202: {\n headersMapper: BlobDeleteHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobDeleteExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId,\n blobDeleteType\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n deleteSnapshots\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst undeleteOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobUndeleteHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobUndeleteExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp8],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setExpiryOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetExpiryHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetExpiryExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp11],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n expiryOptions,\n expiresOn\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setHttpHeadersOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetHttpHeadersHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetHttpHeadersExceptionHeaders\n }\n },\n queryParameters: [comp, timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setImmutabilityPolicyOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetImmutabilityPolicyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetImmutabilityPolicyExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp12],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifUnmodifiedSince,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst deleteImmutabilityPolicyOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "DELETE",\n responses: {\n 200: {\n headersMapper: BlobDeleteImmutabilityPolicyHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobDeleteImmutabilityPolicyExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp12],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setLegalHoldOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetLegalHoldHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetLegalHoldExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp13],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n legalHold\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_setMetadataOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetMetadataHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetMetadataExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp6],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_acquireLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlobAcquireLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobAcquireLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action,\n duration,\n proposedLeaseId,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_releaseLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobReleaseLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobReleaseLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action1,\n leaseId1,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_renewLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobRenewLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobRenewLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n leaseId1,\n action2,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_changeLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobChangeLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobChangeLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n leaseId1,\n action4,\n proposedLeaseId1,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_breakLeaseOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: BlobBreakLeaseHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobBreakLeaseExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp10],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n action3,\n breakPeriod,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst createSnapshotOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlobCreateSnapshotHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobCreateSnapshotExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp14],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst startCopyFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: BlobStartCopyFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobStartCopyFromURLExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n tier,\n rehydratePriority,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceIfTags,\n copySource,\n blobTagsString,\n sealBlob,\n legalHold1\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst copyFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: BlobCopyFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobCopyFromURLExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n tier,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n copySource,\n blobTagsString,\n legalHold1,\n xMsRequiresSync,\n sourceContentMD5,\n copySourceAuthorization,\n copySourceTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst abortCopyFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 204: {\n headersMapper: BlobAbortCopyFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobAbortCopyFromURLExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp15,\n copyId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n copyActionAbortConstant\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setTierOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: BlobSetTierHeaders\n },\n 202: {\n headersMapper: BlobSetTierHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetTierExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId,\n comp16\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifTags,\n rehydratePriority,\n tier1\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst blob_getAccountInfoOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n headersMapper: BlobGetAccountInfoHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobGetAccountInfoExceptionHeaders\n }\n },\n queryParameters: [comp, restype1],\n urlParameters: [url],\n headerParameters: [version, accept1],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst queryOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "POST",\n responses: {\n 200: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: BlobQueryHeaders\n },\n 206: {\n bodyMapper: {\n type: { name: "Stream" },\n serializedName: "parsedResponse"\n },\n headersMapper: BlobQueryHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobQueryExceptionHeaders\n }\n },\n requestBody: queryRequest,\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n comp17\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: blob_xmlSerializer\n};\nconst getTagsOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: BlobTags,\n headersMapper: BlobGetTagsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobGetTagsExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n versionId,\n comp18\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifTags\n ],\n isXML: true,\n serializer: blob_xmlSerializer\n};\nconst setTagsOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 204: {\n headersMapper: BlobSetTagsHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlobSetTagsExceptionHeaders\n }\n },\n requestBody: tags,\n queryParameters: [\n timeoutInSeconds,\n versionId,\n comp18\n ],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n leaseId,\n ifTags,\n transactionalContentMD5,\n transactionalContentCrc64\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: blob_xmlSerializer\n};\n//# sourceMappingURL=blob.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobLeaseClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n/**\n * A client that manages leases for a {@link ContainerClient} or a {@link BlobClient}.\n */\nclass BlobLeaseClient {\n /**\n * Creates an instance of BlobLeaseClient.\n * @param client - The client to make the lease operation requests.\n * @param leaseId - Initial proposed lease id.\n */\n constructor(client, leaseId) {\n const clientContext = new StorageClientContext(client.url, client.pipeline.toServiceClientOptions());\n this._url = client.url;\n if (client.name === undefined) {\n this._isContainer = true;\n this._containerOrBlobOperation = new Container(clientContext);\n }\n else {\n this._isContainer = false;\n this._containerOrBlobOperation = new blob_Blob(clientContext);\n }\n if (!leaseId) {\n leaseId = generateUuid();\n }\n this._leaseId = leaseId;\n }\n /**\n * Gets the lease Id.\n *\n * @readonly\n */\n get leaseId() {\n return this._leaseId;\n }\n /**\n * Gets the url.\n *\n * @readonly\n */\n get url() {\n return this._url;\n }\n /**\n * Establishes and manages a lock on a container for delete operations, or on a blob\n * for write and delete operations.\n * The lock duration can be 15 to 60 seconds, or can be infinite.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param duration - Must be between 15 to 60 seconds, or infinite (-1)\n * @param options - option to configure lease management operations.\n * @returns Response data for acquire lease operation.\n */\n async acquireLease(duration, options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-acquireLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n return await this._containerOrBlobOperation.acquireLease(Object.assign({ abortSignal: options.abortSignal, duration, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }), proposedLeaseId: this._leaseId }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * To change the ID of the lease.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param proposedLeaseId - the proposed new lease Id.\n * @param options - option to configure lease management operations.\n * @returns Response data for change lease operation.\n */\n async changeLease(proposedLeaseId, options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-changeLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n const response = await this._containerOrBlobOperation.changeLease(this._leaseId, proposedLeaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n this._leaseId = proposedLeaseId;\n return response;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * To free the lease if it is no longer needed so that another client may\n * immediately acquire a lease against the container or the blob.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param options - option to configure lease management operations.\n * @returns Response data for release lease operation.\n */\n async releaseLease(options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-releaseLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n return await this._containerOrBlobOperation.releaseLease(this._leaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * To renew the lease.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param options - Optional option to configure lease management operations.\n * @returns Response data for renew lease operation.\n */\n async renewLease(options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-renewLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n return await this._containerOrBlobOperation.renewLease(this._leaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * To end the lease but ensure that another client cannot acquire a new lease\n * until the current lease period has expired.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container\n * and\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob\n *\n * @param breakPeriod - Break period\n * @param options - Optional options to configure lease management operations.\n * @returns Response data for break lease operation.\n */\n async breakLease(breakPeriod, options = {}) {\n var _a, _b, _c, _d, _e, _f;\n const { span, updatedOptions } = tracing_createSpan("BlobLeaseClient-breakLease", options);\n if (this._isContainer &&\n ((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||\n (((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||\n ((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {\n throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");\n }\n try {\n const operationOptions = Object.assign({ abortSignal: options.abortSignal, breakPeriod, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions));\n return await this._containerOrBlobOperation.breakLease(operationOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n//# sourceMappingURL=BlobLeaseClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/RetriableReadableStream.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * A Node.js ReadableStream will internally retry when internal ReadableStream unexpected ends.\n */\nclass RetriableReadableStream extends external_stream_.Readable {\n /**\n * Creates an instance of RetriableReadableStream.\n *\n * @param source - The current ReadableStream returned from getter\n * @param getter - A method calling downloading request returning\n * a new ReadableStream from specified offset\n * @param offset - Offset position in original data source to read\n * @param count - How much data in original data source to read\n * @param options -\n */\n constructor(source, getter, offset, count, options = {}) {\n super({ highWaterMark: options.highWaterMark });\n this.retries = 0;\n this.sourceDataHandler = (data) => {\n if (this.options.doInjectErrorOnce) {\n this.options.doInjectErrorOnce = undefined;\n this.source.pause();\n this.source.removeAllListeners("data");\n this.source.emit("end");\n return;\n }\n // console.log(\n // `Offset: ${this.offset}, Received ${data.length} from internal stream`\n // );\n this.offset += data.length;\n if (this.onProgress) {\n this.onProgress({ loadedBytes: this.offset - this.start });\n }\n if (!this.push(data)) {\n this.source.pause();\n }\n };\n this.sourceErrorOrEndHandler = (err) => {\n if (err && err.name === "AbortError") {\n this.destroy(err);\n return;\n }\n // console.log(\n // `Source stream emits end or error, offset: ${\n // this.offset\n // }, dest end : ${this.end}`\n // );\n this.removeSourceEventHandlers();\n if (this.offset - 1 === this.end) {\n this.push(null);\n }\n else if (this.offset <= this.end) {\n // console.log(\n // `retries: ${this.retries}, max retries: ${this.maxRetries}`\n // );\n if (this.retries < this.maxRetryRequests) {\n this.retries += 1;\n this.getter(this.offset)\n .then((newSource) => {\n this.source = newSource;\n this.setSourceEventHandlers();\n return;\n })\n .catch((error) => {\n this.destroy(error);\n });\n }\n else {\n this.destroy(new Error(`Data corruption failure: received less data than required and reached maxRetires limitation. Received data offset: ${this.offset - 1}, data needed offset: ${this.end}, retries: ${this.retries}, max retries: ${this.maxRetryRequests}`));\n }\n }\n else {\n this.destroy(new Error(`Data corruption failure: Received more data than original request, data needed offset is ${this.end}, received offset: ${this.offset - 1}`));\n }\n };\n this.getter = getter;\n this.source = source;\n this.start = offset;\n this.offset = offset;\n this.end = offset + count - 1;\n this.maxRetryRequests =\n options.maxRetryRequests && options.maxRetryRequests >= 0 ? options.maxRetryRequests : 0;\n this.onProgress = options.onProgress;\n this.options = options;\n this.setSourceEventHandlers();\n }\n _read() {\n this.source.resume();\n }\n setSourceEventHandlers() {\n this.source.on("data", this.sourceDataHandler);\n this.source.on("end", this.sourceErrorOrEndHandler);\n this.source.on("error", this.sourceErrorOrEndHandler);\n }\n removeSourceEventHandlers() {\n this.source.removeListener("data", this.sourceDataHandler);\n this.source.removeListener("end", this.sourceErrorOrEndHandler);\n this.source.removeListener("error", this.sourceErrorOrEndHandler);\n }\n _destroy(error, callback) {\n // remove listener from source and release source\n this.removeSourceEventHandlers();\n this.source.destroy();\n callback(error === null ? undefined : error);\n }\n}\n//# sourceMappingURL=RetriableReadableStream.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobDownloadResponse.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * BlobDownloadResponse implements BlobDownloadResponseParsed interface, and in Node.js runtime it will\n * automatically retry when internal read stream unexpected ends. (This kind of unexpected ends cannot\n * trigger retries defined in pipeline retry policy.)\n *\n * The {@link readableStreamBody} stream will retry underlayer, you can just use it as a normal Node.js\n * Readable stream.\n */\nclass BlobDownloadResponse {\n /**\n * Creates an instance of BlobDownloadResponse.\n *\n * @param originalResponse -\n * @param getter -\n * @param offset -\n * @param count -\n * @param options -\n */\n constructor(originalResponse, getter, offset, count, options = {}) {\n this.originalResponse = originalResponse;\n this.blobDownloadStream = new RetriableReadableStream(this.originalResponse.readableStreamBody, getter, offset, count, options);\n }\n /**\n * Indicates that the service supports\n * requests for partial file content.\n *\n * @readonly\n */\n get acceptRanges() {\n return this.originalResponse.acceptRanges;\n }\n /**\n * Returns if it was previously specified\n * for the file.\n *\n * @readonly\n */\n get cacheControl() {\n return this.originalResponse.cacheControl;\n }\n /**\n * Returns the value that was specified\n * for the \'x-ms-content-disposition\' header and specifies how to process the\n * response.\n *\n * @readonly\n */\n get contentDisposition() {\n return this.originalResponse.contentDisposition;\n }\n /**\n * Returns the value that was specified\n * for the Content-Encoding request header.\n *\n * @readonly\n */\n get contentEncoding() {\n return this.originalResponse.contentEncoding;\n }\n /**\n * Returns the value that was specified\n * for the Content-Language request header.\n *\n * @readonly\n */\n get contentLanguage() {\n return this.originalResponse.contentLanguage;\n }\n /**\n * The current sequence number for a\n * page blob. This header is not returned for block blobs or append blobs.\n *\n * @readonly\n */\n get blobSequenceNumber() {\n return this.originalResponse.blobSequenceNumber;\n }\n /**\n * The blob\'s type. Possible values include:\n * \'BlockBlob\', \'PageBlob\', \'AppendBlob\'.\n *\n * @readonly\n */\n get blobType() {\n return this.originalResponse.blobType;\n }\n /**\n * The number of bytes present in the\n * response body.\n *\n * @readonly\n */\n get contentLength() {\n return this.originalResponse.contentLength;\n }\n /**\n * If the file has an MD5 hash and the\n * request is to read the full file, this response header is returned so that\n * the client can check for message content integrity. If the request is to\n * read a specified range and the \'x-ms-range-get-content-md5\' is set to\n * true, then the request returns an MD5 hash for the range, as long as the\n * range size is less than or equal to 4 MB. If neither of these sets of\n * conditions is true, then no value is returned for the \'Content-MD5\'\n * header.\n *\n * @readonly\n */\n get contentMD5() {\n return this.originalResponse.contentMD5;\n }\n /**\n * Indicates the range of bytes returned if\n * the client requested a subset of the file by setting the Range request\n * header.\n *\n * @readonly\n */\n get contentRange() {\n return this.originalResponse.contentRange;\n }\n /**\n * The content type specified for the file.\n * The default content type is \'application/octet-stream\'\n *\n * @readonly\n */\n get contentType() {\n return this.originalResponse.contentType;\n }\n /**\n * Conclusion time of the last attempted\n * Copy File operation where this file was the destination file. This value\n * can specify the time of a completed, aborted, or failed copy attempt.\n *\n * @readonly\n */\n get copyCompletedOn() {\n return this.originalResponse.copyCompletedOn;\n }\n /**\n * String identifier for the last attempted Copy\n * File operation where this file was the destination file.\n *\n * @readonly\n */\n get copyId() {\n return this.originalResponse.copyId;\n }\n /**\n * Contains the number of bytes copied and\n * the total bytes in the source in the last attempted Copy File operation\n * where this file was the destination file. Can show between 0 and\n * Content-Length bytes copied.\n *\n * @readonly\n */\n get copyProgress() {\n return this.originalResponse.copyProgress;\n }\n /**\n * URL up to 2KB in length that specifies the\n * source file used in the last attempted Copy File operation where this file\n * was the destination file.\n *\n * @readonly\n */\n get copySource() {\n return this.originalResponse.copySource;\n }\n /**\n * State of the copy operation\n * identified by \'x-ms-copy-id\'. Possible values include: \'pending\',\n * \'success\', \'aborted\', \'failed\'\n *\n * @readonly\n */\n get copyStatus() {\n return this.originalResponse.copyStatus;\n }\n /**\n * Only appears when\n * x-ms-copy-status is failed or pending. Describes cause of fatal or\n * non-fatal copy operation failure.\n *\n * @readonly\n */\n get copyStatusDescription() {\n return this.originalResponse.copyStatusDescription;\n }\n /**\n * When a blob is leased,\n * specifies whether the lease is of infinite or fixed duration. Possible\n * values include: \'infinite\', \'fixed\'.\n *\n * @readonly\n */\n get leaseDuration() {\n return this.originalResponse.leaseDuration;\n }\n /**\n * Lease state of the blob. Possible\n * values include: \'available\', \'leased\', \'expired\', \'breaking\', \'broken\'.\n *\n * @readonly\n */\n get leaseState() {\n return this.originalResponse.leaseState;\n }\n /**\n * The current lease status of the\n * blob. Possible values include: \'locked\', \'unlocked\'.\n *\n * @readonly\n */\n get leaseStatus() {\n return this.originalResponse.leaseStatus;\n }\n /**\n * A UTC date/time value generated by the service that\n * indicates the time at which the response was initiated.\n *\n * @readonly\n */\n get date() {\n return this.originalResponse.date;\n }\n /**\n * The number of committed blocks\n * present in the blob. This header is returned only for append blobs.\n *\n * @readonly\n */\n get blobCommittedBlockCount() {\n return this.originalResponse.blobCommittedBlockCount;\n }\n /**\n * The ETag contains a value that you can use to\n * perform operations conditionally, in quotes.\n *\n * @readonly\n */\n get etag() {\n return this.originalResponse.etag;\n }\n /**\n * The number of tags associated with the blob\n *\n * @readonly\n */\n get tagCount() {\n return this.originalResponse.tagCount;\n }\n /**\n * The error code.\n *\n * @readonly\n */\n get errorCode() {\n return this.originalResponse.errorCode;\n }\n /**\n * The value of this header is set to\n * true if the file data and application metadata are completely encrypted\n * using the specified algorithm. Otherwise, the value is set to false (when\n * the file is unencrypted, or if only parts of the file/application metadata\n * are encrypted).\n *\n * @readonly\n */\n get isServerEncrypted() {\n return this.originalResponse.isServerEncrypted;\n }\n /**\n * If the blob has a MD5 hash, and if\n * request contains range header (Range or x-ms-range), this response header\n * is returned with the value of the whole blob\'s MD5 value. This value may\n * or may not be equal to the value returned in Content-MD5 header, with the\n * latter calculated from the requested range.\n *\n * @readonly\n */\n get blobContentMD5() {\n return this.originalResponse.blobContentMD5;\n }\n /**\n * Returns the date and time the file was last\n * modified. Any operation that modifies the file or its properties updates\n * the last modified time.\n *\n * @readonly\n */\n get lastModified() {\n return this.originalResponse.lastModified;\n }\n /**\n * Returns the UTC date and time generated by the service that indicates the time at which the blob was\n * last read or written to.\n *\n * @readonly\n */\n get lastAccessed() {\n return this.originalResponse.lastAccessed;\n }\n /**\n * Returns the date and time the blob was created.\n *\n * @readonly\n */\n get createdOn() {\n return this.originalResponse.createdOn;\n }\n /**\n * A name-value pair\n * to associate with a file storage object.\n *\n * @readonly\n */\n get metadata() {\n return this.originalResponse.metadata;\n }\n /**\n * This header uniquely identifies the request\n * that was made and can be used for troubleshooting the request.\n *\n * @readonly\n */\n get requestId() {\n return this.originalResponse.requestId;\n }\n /**\n * If a client request id header is sent in the request, this header will be present in the\n * response with the same value.\n *\n * @readonly\n */\n get clientRequestId() {\n return this.originalResponse.clientRequestId;\n }\n /**\n * Indicates the version of the Blob service used\n * to execute the request.\n *\n * @readonly\n */\n get version() {\n return this.originalResponse.version;\n }\n /**\n * Indicates the versionId of the downloaded blob version.\n *\n * @readonly\n */\n get versionId() {\n return this.originalResponse.versionId;\n }\n /**\n * Indicates whether version of this blob is a current version.\n *\n * @readonly\n */\n get isCurrentVersion() {\n return this.originalResponse.isCurrentVersion;\n }\n /**\n * The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned\n * when the blob was encrypted with a customer-provided key.\n *\n * @readonly\n */\n get encryptionKeySha256() {\n return this.originalResponse.encryptionKeySha256;\n }\n /**\n * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to\n * true, then the request returns a crc64 for the range, as long as the range size is less than\n * or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is\n * specified in the same request, it will fail with 400(Bad Request)\n */\n get contentCrc64() {\n return this.originalResponse.contentCrc64;\n }\n /**\n * Object Replication Policy Id of the destination blob.\n *\n * @readonly\n */\n get objectReplicationDestinationPolicyId() {\n return this.originalResponse.objectReplicationDestinationPolicyId;\n }\n /**\n * Parsed Object Replication Policy Id, Rule Id(s) and status of the source blob.\n *\n * @readonly\n */\n get objectReplicationSourceProperties() {\n return this.originalResponse.objectReplicationSourceProperties;\n }\n /**\n * If this blob has been sealed.\n *\n * @readonly\n */\n get isSealed() {\n return this.originalResponse.isSealed;\n }\n /**\n * UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire.\n *\n * @readonly\n */\n get immutabilityPolicyExpiresOn() {\n return this.originalResponse.immutabilityPolicyExpiresOn;\n }\n /**\n * Indicates immutability policy mode.\n *\n * @readonly\n */\n get immutabilityPolicyMode() {\n return this.originalResponse.immutabilityPolicyMode;\n }\n /**\n * Indicates if a legal hold is present on the blob.\n *\n * @readonly\n */\n get legalHold() {\n return this.originalResponse.legalHold;\n }\n /**\n * The response body as a browser Blob.\n * Always undefined in node.js.\n *\n * @readonly\n */\n get contentAsBlob() {\n return this.originalResponse.blobBody;\n }\n /**\n * The response body as a node.js Readable stream.\n * Always undefined in the browser.\n *\n * It will automatically retry when internal read stream unexpected ends.\n *\n * @readonly\n */\n get readableStreamBody() {\n return checkEnvironment_isNode ? this.blobDownloadStream : undefined;\n }\n /**\n * The HTTP response.\n */\n get _response() {\n return this.originalResponse._response;\n }\n}\n//# sourceMappingURL=BlobDownloadResponse.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroConstants.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nconst AVRO_SYNC_MARKER_SIZE = 16;\nconst AVRO_INIT_BYTES = new Uint8Array([79, 98, 106, 1]);\nconst AVRO_CODEC_KEY = "avro.codec";\nconst AVRO_SCHEMA_KEY = "avro.schema";\n//# sourceMappingURL=AvroConstants.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroParser.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nclass AvroParser {\n /**\n * Reads a fixed number of bytes from the stream.\n *\n * @param stream -\n * @param length -\n * @param options -\n */\n static async readFixedBytes(stream, length, options = {}) {\n const bytes = await stream.read(length, { abortSignal: options.abortSignal });\n if (bytes.length !== length) {\n throw new Error("Hit stream end.");\n }\n return bytes;\n }\n /**\n * Reads a single byte from the stream.\n *\n * @param stream -\n * @param options -\n */\n static async readByte(stream, options = {}) {\n const buf = await AvroParser.readFixedBytes(stream, 1, options);\n return buf[0];\n }\n // int and long are stored in variable-length zig-zag coding.\n // variable-length: https://lucene.apache.org/core/3_5_0/fileformats.html#VInt\n // zig-zag: https://developers.google.com/protocol-buffers/docs/encoding?csw=1#types\n static async readZigZagLong(stream, options = {}) {\n let zigZagEncoded = 0;\n let significanceInBit = 0;\n let byte, haveMoreByte, significanceInFloat;\n do {\n byte = await AvroParser.readByte(stream, options);\n haveMoreByte = byte & 0x80;\n zigZagEncoded |= (byte & 0x7f) << significanceInBit;\n significanceInBit += 7;\n } while (haveMoreByte && significanceInBit < 28); // bitwise operation only works for 32-bit integers\n if (haveMoreByte) {\n // Switch to float arithmetic\n // eslint-disable-next-line no-self-assign\n zigZagEncoded = zigZagEncoded;\n significanceInFloat = 268435456; // 2 ** 28.\n do {\n byte = await AvroParser.readByte(stream, options);\n zigZagEncoded += (byte & 0x7f) * significanceInFloat;\n significanceInFloat *= 128; // 2 ** 7\n } while (byte & 0x80);\n const res = (zigZagEncoded % 2 ? -(zigZagEncoded + 1) : zigZagEncoded) / 2;\n if (res < Number.MIN_SAFE_INTEGER || res > Number.MAX_SAFE_INTEGER) {\n throw new Error("Integer overflow.");\n }\n return res;\n }\n return (zigZagEncoded >> 1) ^ -(zigZagEncoded & 1);\n }\n static async readLong(stream, options = {}) {\n return AvroParser.readZigZagLong(stream, options);\n }\n static async readInt(stream, options = {}) {\n return AvroParser.readZigZagLong(stream, options);\n }\n static async readNull() {\n return null;\n }\n static async readBoolean(stream, options = {}) {\n const b = await AvroParser.readByte(stream, options);\n if (b === 1) {\n return true;\n }\n else if (b === 0) {\n return false;\n }\n else {\n throw new Error("Byte was not a boolean.");\n }\n }\n static async readFloat(stream, options = {}) {\n const u8arr = await AvroParser.readFixedBytes(stream, 4, options);\n const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);\n return view.getFloat32(0, true); // littleEndian = true\n }\n static async readDouble(stream, options = {}) {\n const u8arr = await AvroParser.readFixedBytes(stream, 8, options);\n const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);\n return view.getFloat64(0, true); // littleEndian = true\n }\n static async readBytes(stream, options = {}) {\n const size = await AvroParser.readLong(stream, options);\n if (size < 0) {\n throw new Error("Bytes size was negative.");\n }\n return stream.read(size, { abortSignal: options.abortSignal });\n }\n static async readString(stream, options = {}) {\n const u8arr = await AvroParser.readBytes(stream, options);\n const utf8decoder = new TextDecoder();\n return utf8decoder.decode(u8arr);\n }\n static async readMapPair(stream, readItemMethod, options = {}) {\n const key = await AvroParser.readString(stream, options);\n // FUTURE: this won\'t work with readFixed (currently not supported) which needs a length as the parameter.\n const value = await readItemMethod(stream, options);\n return { key, value };\n }\n static async readMap(stream, readItemMethod, options = {}) {\n const readPairMethod = (s, opts = {}) => {\n return AvroParser.readMapPair(s, readItemMethod, opts);\n };\n const pairs = await AvroParser.readArray(stream, readPairMethod, options);\n const dict = {};\n for (const pair of pairs) {\n dict[pair.key] = pair.value;\n }\n return dict;\n }\n static async readArray(stream, readItemMethod, options = {}) {\n const items = [];\n for (let count = await AvroParser.readLong(stream, options); count !== 0; count = await AvroParser.readLong(stream, options)) {\n if (count < 0) {\n // Ignore block sizes\n await AvroParser.readLong(stream, options);\n count = -count;\n }\n while (count--) {\n const item = await readItemMethod(stream, options);\n items.push(item);\n }\n }\n return items;\n }\n}\nvar AvroComplex;\n(function (AvroComplex) {\n AvroComplex["RECORD"] = "record";\n AvroComplex["ENUM"] = "enum";\n AvroComplex["ARRAY"] = "array";\n AvroComplex["MAP"] = "map";\n AvroComplex["UNION"] = "union";\n AvroComplex["FIXED"] = "fixed";\n})(AvroComplex || (AvroComplex = {}));\nvar AvroPrimitive;\n(function (AvroPrimitive) {\n AvroPrimitive["NULL"] = "null";\n AvroPrimitive["BOOLEAN"] = "boolean";\n AvroPrimitive["INT"] = "int";\n AvroPrimitive["LONG"] = "long";\n AvroPrimitive["FLOAT"] = "float";\n AvroPrimitive["DOUBLE"] = "double";\n AvroPrimitive["BYTES"] = "bytes";\n AvroPrimitive["STRING"] = "string";\n})(AvroPrimitive || (AvroPrimitive = {}));\nclass AvroType {\n /**\n * Determines the AvroType from the Avro Schema.\n */\n static fromSchema(schema) {\n if (typeof schema === "string") {\n return AvroType.fromStringSchema(schema);\n }\n else if (Array.isArray(schema)) {\n return AvroType.fromArraySchema(schema);\n }\n else {\n return AvroType.fromObjectSchema(schema);\n }\n }\n static fromStringSchema(schema) {\n switch (schema) {\n case AvroPrimitive.NULL:\n case AvroPrimitive.BOOLEAN:\n case AvroPrimitive.INT:\n case AvroPrimitive.LONG:\n case AvroPrimitive.FLOAT:\n case AvroPrimitive.DOUBLE:\n case AvroPrimitive.BYTES:\n case AvroPrimitive.STRING:\n return new AvroPrimitiveType(schema);\n default:\n throw new Error(`Unexpected Avro type ${schema}`);\n }\n }\n static fromArraySchema(schema) {\n return new AvroUnionType(schema.map(AvroType.fromSchema));\n }\n static fromObjectSchema(schema) {\n const type = schema.type;\n // Primitives can be defined as strings or objects\n try {\n return AvroType.fromStringSchema(type);\n }\n catch (err) {\n // eslint-disable-line no-empty\n }\n switch (type) {\n case AvroComplex.RECORD:\n if (schema.aliases) {\n throw new Error(`aliases currently is not supported, schema: ${schema}`);\n }\n if (!schema.name) {\n throw new Error(`Required attribute \'name\' doesn\'t exist on schema: ${schema}`);\n }\n // eslint-disable-next-line no-case-declarations\n const fields = {};\n if (!schema.fields) {\n throw new Error(`Required attribute \'fields\' doesn\'t exist on schema: ${schema}`);\n }\n for (const field of schema.fields) {\n fields[field.name] = AvroType.fromSchema(field.type);\n }\n return new AvroRecordType(fields, schema.name);\n case AvroComplex.ENUM:\n if (schema.aliases) {\n throw new Error(`aliases currently is not supported, schema: ${schema}`);\n }\n if (!schema.symbols) {\n throw new Error(`Required attribute \'symbols\' doesn\'t exist on schema: ${schema}`);\n }\n return new AvroEnumType(schema.symbols);\n case AvroComplex.MAP:\n if (!schema.values) {\n throw new Error(`Required attribute \'values\' doesn\'t exist on schema: ${schema}`);\n }\n return new AvroMapType(AvroType.fromSchema(schema.values));\n case AvroComplex.ARRAY: // Unused today\n case AvroComplex.FIXED: // Unused today\n default:\n throw new Error(`Unexpected Avro type ${type} in ${schema}`);\n }\n }\n}\nclass AvroPrimitiveType extends AvroType {\n constructor(primitive) {\n super();\n this._primitive = primitive;\n }\n read(stream, options = {}) {\n switch (this._primitive) {\n case AvroPrimitive.NULL:\n return AvroParser.readNull();\n case AvroPrimitive.BOOLEAN:\n return AvroParser.readBoolean(stream, options);\n case AvroPrimitive.INT:\n return AvroParser.readInt(stream, options);\n case AvroPrimitive.LONG:\n return AvroParser.readLong(stream, options);\n case AvroPrimitive.FLOAT:\n return AvroParser.readFloat(stream, options);\n case AvroPrimitive.DOUBLE:\n return AvroParser.readDouble(stream, options);\n case AvroPrimitive.BYTES:\n return AvroParser.readBytes(stream, options);\n case AvroPrimitive.STRING:\n return AvroParser.readString(stream, options);\n default:\n throw new Error("Unknown Avro Primitive");\n }\n }\n}\nclass AvroEnumType extends AvroType {\n constructor(symbols) {\n super();\n this._symbols = symbols;\n }\n async read(stream, options = {}) {\n const value = await AvroParser.readInt(stream, options);\n return this._symbols[value];\n }\n}\nclass AvroUnionType extends AvroType {\n constructor(types) {\n super();\n this._types = types;\n }\n async read(stream, options = {}) {\n // eslint-disable-line @typescript-eslint/ban-types\n const typeIndex = await AvroParser.readInt(stream, options);\n return this._types[typeIndex].read(stream, options);\n }\n}\nclass AvroMapType extends AvroType {\n constructor(itemType) {\n super();\n this._itemType = itemType;\n }\n read(stream, options = {}) {\n const readItemMethod = (s, opts) => {\n return this._itemType.read(s, opts);\n };\n return AvroParser.readMap(stream, readItemMethod, options);\n }\n}\nclass AvroRecordType extends AvroType {\n constructor(fields, name) {\n super();\n this._fields = fields;\n this._name = name;\n }\n async read(stream, options = {}) {\n const record = {};\n record["$schema"] = this._name;\n for (const key in this._fields) {\n if (Object.prototype.hasOwnProperty.call(this._fields, key)) {\n record[key] = await this._fields[key].read(stream, options);\n }\n }\n return record;\n }\n}\n//# sourceMappingURL=AvroParser.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/utils/utils.common.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nfunction arraysEqual(a, b) {\n if (a === b)\n return true;\n // eslint-disable-next-line eqeqeq\n if (a == null || b == null)\n return false;\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n}\n//# sourceMappingURL=utils.common.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroReader.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n// TODO: Do a review of non-interfaces\n/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */\n\n\n\n\nclass AvroReader {\n constructor(dataStream, headerStream, currentBlockOffset, indexWithinCurrentBlock) {\n this._dataStream = dataStream;\n this._headerStream = headerStream || dataStream;\n this._initialized = false;\n this._blockOffset = currentBlockOffset || 0;\n this._objectIndex = indexWithinCurrentBlock || 0;\n this._initialBlockOffset = currentBlockOffset || 0;\n }\n get blockOffset() {\n return this._blockOffset;\n }\n get objectIndex() {\n return this._objectIndex;\n }\n async initialize(options = {}) {\n const header = await AvroParser.readFixedBytes(this._headerStream, AVRO_INIT_BYTES.length, {\n abortSignal: options.abortSignal,\n });\n if (!arraysEqual(header, AVRO_INIT_BYTES)) {\n throw new Error("Stream is not an Avro file.");\n }\n // File metadata is written as if defined by the following map schema:\n // { "type": "map", "values": "bytes"}\n this._metadata = await AvroParser.readMap(this._headerStream, AvroParser.readString, {\n abortSignal: options.abortSignal,\n });\n // Validate codec\n const codec = this._metadata[AVRO_CODEC_KEY];\n if (!(codec === undefined || codec === null || codec === "null")) {\n throw new Error("Codecs are not supported");\n }\n // The 16-byte, randomly-generated sync marker for this file.\n this._syncMarker = await AvroParser.readFixedBytes(this._headerStream, AVRO_SYNC_MARKER_SIZE, {\n abortSignal: options.abortSignal,\n });\n // Parse the schema\n const schema = JSON.parse(this._metadata[AVRO_SCHEMA_KEY]);\n this._itemType = AvroType.fromSchema(schema);\n if (this._blockOffset === 0) {\n this._blockOffset = this._initialBlockOffset + this._dataStream.position;\n }\n this._itemsRemainingInBlock = await AvroParser.readLong(this._dataStream, {\n abortSignal: options.abortSignal,\n });\n // skip block length\n await AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });\n this._initialized = true;\n if (this._objectIndex && this._objectIndex > 0) {\n for (let i = 0; i < this._objectIndex; i++) {\n await this._itemType.read(this._dataStream, { abortSignal: options.abortSignal });\n this._itemsRemainingInBlock--;\n }\n }\n }\n hasNext() {\n return !this._initialized || this._itemsRemainingInBlock > 0;\n }\n parseObjects(options = {}) {\n return __asyncGenerator(this, arguments, function* parseObjects_1() {\n if (!this._initialized) {\n yield __await(this.initialize(options));\n }\n while (this.hasNext()) {\n const result = yield __await(this._itemType.read(this._dataStream, {\n abortSignal: options.abortSignal,\n }));\n this._itemsRemainingInBlock--;\n this._objectIndex++;\n if (this._itemsRemainingInBlock === 0) {\n const marker = yield __await(AvroParser.readFixedBytes(this._dataStream, AVRO_SYNC_MARKER_SIZE, {\n abortSignal: options.abortSignal,\n }));\n this._blockOffset = this._initialBlockOffset + this._dataStream.position;\n this._objectIndex = 0;\n if (!arraysEqual(this._syncMarker, marker)) {\n throw new Error("Stream is not a valid Avro file.");\n }\n try {\n this._itemsRemainingInBlock = yield __await(AvroParser.readLong(this._dataStream, {\n abortSignal: options.abortSignal,\n }));\n }\n catch (err) {\n // We hit the end of the stream.\n this._itemsRemainingInBlock = 0;\n }\n if (this._itemsRemainingInBlock > 0) {\n // Ignore block size\n yield __await(AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal }));\n }\n }\n yield yield __await(result);\n }\n });\n }\n}\n//# sourceMappingURL=AvroReader.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroReadable.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nclass AvroReadable {\n}\n//# sourceMappingURL=AvroReadable.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-internal-avro/src/AvroReadableFromStream.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nconst ABORT_ERROR = new AbortController_AbortError("Reading from the avro stream was aborted.");\nclass AvroReadableFromStream extends AvroReadable {\n constructor(readable) {\n super();\n this._readable = readable;\n this._position = 0;\n }\n toUint8Array(data) {\n if (typeof data === "string") {\n return Buffer.from(data);\n }\n return data;\n }\n get position() {\n return this._position;\n }\n async read(size, options = {}) {\n var _a;\n if ((_a = options.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {\n throw ABORT_ERROR;\n }\n if (size < 0) {\n throw new Error(`size parameter should be positive: ${size}`);\n }\n if (size === 0) {\n return new Uint8Array();\n }\n if (!this._readable.readable) {\n throw new Error("Stream no longer readable.");\n }\n // See if there is already enough data.\n const chunk = this._readable.read(size);\n if (chunk) {\n this._position += chunk.length;\n // chunk.length maybe less than desired size if the stream ends.\n return this.toUint8Array(chunk);\n }\n else {\n // register callback to wait for enough data to read\n return new Promise((resolve, reject) => {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n const cleanUp = () => {\n this._readable.removeListener("readable", readableCallback);\n this._readable.removeListener("error", rejectCallback);\n this._readable.removeListener("end", rejectCallback);\n this._readable.removeListener("close", rejectCallback);\n if (options.abortSignal) {\n options.abortSignal.removeEventListener("abort", abortHandler);\n }\n };\n const readableCallback = () => {\n const callbackChunk = this._readable.read(size);\n if (callbackChunk) {\n this._position += callbackChunk.length;\n cleanUp();\n // callbackChunk.length maybe less than desired size if the stream ends.\n resolve(this.toUint8Array(callbackChunk));\n }\n };\n const rejectCallback = () => {\n cleanUp();\n reject();\n };\n const abortHandler = () => {\n cleanUp();\n reject(ABORT_ERROR);\n };\n this._readable.on("readable", readableCallback);\n this._readable.once("error", rejectCallback);\n this._readable.once("end", rejectCallback);\n this._readable.once("close", rejectCallback);\n if (options.abortSignal) {\n options.abortSignal.addEventListener("abort", abortHandler);\n }\n /* eslint-enable @typescript-eslint/no-use-before-define */\n });\n }\n }\n}\n//# sourceMappingURL=AvroReadableFromStream.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/BlobQuickQueryStream.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * A Node.js BlobQuickQueryStream will internally parse avro data stream for blob query.\n */\nclass BlobQuickQueryStream extends external_stream_.Readable {\n /**\n * Creates an instance of BlobQuickQueryStream.\n *\n * @param source - The current ReadableStream returned from getter\n * @param options -\n */\n constructor(source, options = {}) {\n super();\n this.avroPaused = true;\n this.source = source;\n this.onProgress = options.onProgress;\n this.onError = options.onError;\n this.avroReader = new AvroReader(new AvroReadableFromStream(this.source));\n this.avroIter = this.avroReader.parseObjects({ abortSignal: options.abortSignal });\n }\n _read() {\n if (this.avroPaused) {\n this.readInternal().catch((err) => {\n this.emit("error", err);\n });\n }\n }\n async readInternal() {\n this.avroPaused = false;\n let avroNext;\n do {\n avroNext = await this.avroIter.next();\n if (avroNext.done) {\n break;\n }\n const obj = avroNext.value;\n const schema = obj.$schema;\n if (typeof schema !== "string") {\n throw Error("Missing schema in avro record.");\n }\n switch (schema) {\n case "com.microsoft.azure.storage.queryBlobContents.resultData":\n {\n const data = obj.data;\n if (data instanceof Uint8Array === false) {\n throw Error("Invalid data in avro result record.");\n }\n if (!this.push(Buffer.from(data))) {\n this.avroPaused = true;\n }\n }\n break;\n case "com.microsoft.azure.storage.queryBlobContents.progress":\n {\n const bytesScanned = obj.bytesScanned;\n if (typeof bytesScanned !== "number") {\n throw Error("Invalid bytesScanned in avro progress record.");\n }\n if (this.onProgress) {\n this.onProgress({ loadedBytes: bytesScanned });\n }\n }\n break;\n case "com.microsoft.azure.storage.queryBlobContents.end":\n if (this.onProgress) {\n const totalBytes = obj.totalBytes;\n if (typeof totalBytes !== "number") {\n throw Error("Invalid totalBytes in avro end record.");\n }\n this.onProgress({ loadedBytes: totalBytes });\n }\n this.push(null);\n break;\n case "com.microsoft.azure.storage.queryBlobContents.error":\n if (this.onError) {\n const fatal = obj.fatal;\n if (typeof fatal !== "boolean") {\n throw Error("Invalid fatal in avro error record.");\n }\n const name = obj.name;\n if (typeof name !== "string") {\n throw Error("Invalid name in avro error record.");\n }\n const description = obj.description;\n if (typeof description !== "string") {\n throw Error("Invalid description in avro error record.");\n }\n const position = obj.position;\n if (typeof position !== "number") {\n throw Error("Invalid position in avro error record.");\n }\n this.onError({\n position,\n name,\n isFatal: fatal,\n description,\n });\n }\n break;\n default:\n throw Error(`Unknown schema ${schema} in avro progress record.`);\n }\n } while (!avroNext.done && !this.avroPaused);\n }\n}\n//# sourceMappingURL=BlobQuickQueryStream.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobQueryResponse.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * BlobQueryResponse implements BlobDownloadResponseModel interface, and in Node.js runtime it will\n * parse avor data returned by blob query.\n */\nclass BlobQueryResponse {\n /**\n * Creates an instance of BlobQueryResponse.\n *\n * @param originalResponse -\n * @param options -\n */\n constructor(originalResponse, options = {}) {\n this.originalResponse = originalResponse;\n this.blobDownloadStream = new BlobQuickQueryStream(this.originalResponse.readableStreamBody, options);\n }\n /**\n * Indicates that the service supports\n * requests for partial file content.\n *\n * @readonly\n */\n get acceptRanges() {\n return this.originalResponse.acceptRanges;\n }\n /**\n * Returns if it was previously specified\n * for the file.\n *\n * @readonly\n */\n get cacheControl() {\n return this.originalResponse.cacheControl;\n }\n /**\n * Returns the value that was specified\n * for the \'x-ms-content-disposition\' header and specifies how to process the\n * response.\n *\n * @readonly\n */\n get contentDisposition() {\n return this.originalResponse.contentDisposition;\n }\n /**\n * Returns the value that was specified\n * for the Content-Encoding request header.\n *\n * @readonly\n */\n get contentEncoding() {\n return this.originalResponse.contentEncoding;\n }\n /**\n * Returns the value that was specified\n * for the Content-Language request header.\n *\n * @readonly\n */\n get contentLanguage() {\n return this.originalResponse.contentLanguage;\n }\n /**\n * The current sequence number for a\n * page blob. This header is not returned for block blobs or append blobs.\n *\n * @readonly\n */\n get blobSequenceNumber() {\n return this.originalResponse.blobSequenceNumber;\n }\n /**\n * The blob\'s type. Possible values include:\n * \'BlockBlob\', \'PageBlob\', \'AppendBlob\'.\n *\n * @readonly\n */\n get blobType() {\n return this.originalResponse.blobType;\n }\n /**\n * The number of bytes present in the\n * response body.\n *\n * @readonly\n */\n get contentLength() {\n return this.originalResponse.contentLength;\n }\n /**\n * If the file has an MD5 hash and the\n * request is to read the full file, this response header is returned so that\n * the client can check for message content integrity. If the request is to\n * read a specified range and the \'x-ms-range-get-content-md5\' is set to\n * true, then the request returns an MD5 hash for the range, as long as the\n * range size is less than or equal to 4 MB. If neither of these sets of\n * conditions is true, then no value is returned for the \'Content-MD5\'\n * header.\n *\n * @readonly\n */\n get contentMD5() {\n return this.originalResponse.contentMD5;\n }\n /**\n * Indicates the range of bytes returned if\n * the client requested a subset of the file by setting the Range request\n * header.\n *\n * @readonly\n */\n get contentRange() {\n return this.originalResponse.contentRange;\n }\n /**\n * The content type specified for the file.\n * The default content type is \'application/octet-stream\'\n *\n * @readonly\n */\n get contentType() {\n return this.originalResponse.contentType;\n }\n /**\n * Conclusion time of the last attempted\n * Copy File operation where this file was the destination file. This value\n * can specify the time of a completed, aborted, or failed copy attempt.\n *\n * @readonly\n */\n get copyCompletedOn() {\n return undefined;\n }\n /**\n * String identifier for the last attempted Copy\n * File operation where this file was the destination file.\n *\n * @readonly\n */\n get copyId() {\n return this.originalResponse.copyId;\n }\n /**\n * Contains the number of bytes copied and\n * the total bytes in the source in the last attempted Copy File operation\n * where this file was the destination file. Can show between 0 and\n * Content-Length bytes copied.\n *\n * @readonly\n */\n get copyProgress() {\n return this.originalResponse.copyProgress;\n }\n /**\n * URL up to 2KB in length that specifies the\n * source file used in the last attempted Copy File operation where this file\n * was the destination file.\n *\n * @readonly\n */\n get copySource() {\n return this.originalResponse.copySource;\n }\n /**\n * State of the copy operation\n * identified by \'x-ms-copy-id\'. Possible values include: \'pending\',\n * \'success\', \'aborted\', \'failed\'\n *\n * @readonly\n */\n get copyStatus() {\n return this.originalResponse.copyStatus;\n }\n /**\n * Only appears when\n * x-ms-copy-status is failed or pending. Describes cause of fatal or\n * non-fatal copy operation failure.\n *\n * @readonly\n */\n get copyStatusDescription() {\n return this.originalResponse.copyStatusDescription;\n }\n /**\n * When a blob is leased,\n * specifies whether the lease is of infinite or fixed duration. Possible\n * values include: \'infinite\', \'fixed\'.\n *\n * @readonly\n */\n get leaseDuration() {\n return this.originalResponse.leaseDuration;\n }\n /**\n * Lease state of the blob. Possible\n * values include: \'available\', \'leased\', \'expired\', \'breaking\', \'broken\'.\n *\n * @readonly\n */\n get leaseState() {\n return this.originalResponse.leaseState;\n }\n /**\n * The current lease status of the\n * blob. Possible values include: \'locked\', \'unlocked\'.\n *\n * @readonly\n */\n get leaseStatus() {\n return this.originalResponse.leaseStatus;\n }\n /**\n * A UTC date/time value generated by the service that\n * indicates the time at which the response was initiated.\n *\n * @readonly\n */\n get date() {\n return this.originalResponse.date;\n }\n /**\n * The number of committed blocks\n * present in the blob. This header is returned only for append blobs.\n *\n * @readonly\n */\n get blobCommittedBlockCount() {\n return this.originalResponse.blobCommittedBlockCount;\n }\n /**\n * The ETag contains a value that you can use to\n * perform operations conditionally, in quotes.\n *\n * @readonly\n */\n get etag() {\n return this.originalResponse.etag;\n }\n /**\n * The error code.\n *\n * @readonly\n */\n get errorCode() {\n return this.originalResponse.errorCode;\n }\n /**\n * The value of this header is set to\n * true if the file data and application metadata are completely encrypted\n * using the specified algorithm. Otherwise, the value is set to false (when\n * the file is unencrypted, or if only parts of the file/application metadata\n * are encrypted).\n *\n * @readonly\n */\n get isServerEncrypted() {\n return this.originalResponse.isServerEncrypted;\n }\n /**\n * If the blob has a MD5 hash, and if\n * request contains range header (Range or x-ms-range), this response header\n * is returned with the value of the whole blob\'s MD5 value. This value may\n * or may not be equal to the value returned in Content-MD5 header, with the\n * latter calculated from the requested range.\n *\n * @readonly\n */\n get blobContentMD5() {\n return this.originalResponse.blobContentMD5;\n }\n /**\n * Returns the date and time the file was last\n * modified. Any operation that modifies the file or its properties updates\n * the last modified time.\n *\n * @readonly\n */\n get lastModified() {\n return this.originalResponse.lastModified;\n }\n /**\n * A name-value pair\n * to associate with a file storage object.\n *\n * @readonly\n */\n get metadata() {\n return this.originalResponse.metadata;\n }\n /**\n * This header uniquely identifies the request\n * that was made and can be used for troubleshooting the request.\n *\n * @readonly\n */\n get requestId() {\n return this.originalResponse.requestId;\n }\n /**\n * If a client request id header is sent in the request, this header will be present in the\n * response with the same value.\n *\n * @readonly\n */\n get clientRequestId() {\n return this.originalResponse.clientRequestId;\n }\n /**\n * Indicates the version of the File service used\n * to execute the request.\n *\n * @readonly\n */\n get version() {\n return this.originalResponse.version;\n }\n /**\n * The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned\n * when the blob was encrypted with a customer-provided key.\n *\n * @readonly\n */\n get encryptionKeySha256() {\n return this.originalResponse.encryptionKeySha256;\n }\n /**\n * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to\n * true, then the request returns a crc64 for the range, as long as the range size is less than\n * or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is\n * specified in the same request, it will fail with 400(Bad Request)\n */\n get contentCrc64() {\n return this.originalResponse.contentCrc64;\n }\n /**\n * The response body as a browser Blob.\n * Always undefined in node.js.\n *\n * @readonly\n */\n get blobBody() {\n return undefined;\n }\n /**\n * The response body as a node.js Readable stream.\n * Always undefined in the browser.\n *\n * It will parse avor data returned by blob query.\n *\n * @readonly\n */\n get readableStreamBody() {\n return checkEnvironment_isNode ? this.blobDownloadStream : undefined;\n }\n /**\n * The HTTP response.\n */\n get _response() {\n return this.originalResponse._response;\n }\n}\n//# sourceMappingURL=BlobQueryResponse.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/appendBlob.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a AppendBlob. */\nclass AppendBlob {\n /**\n * Initialize a new instance of the class AppendBlob class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * The Create Append Blob operation creates a new append blob.\n * @param contentLength The length of the request.\n * @param options The options parameters.\n */\n create(contentLength, options) {\n const operationArguments = {\n contentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, appendBlob_createOperationSpec);\n }\n /**\n * The Append Block operation commits a new block of data to the end of an existing append blob. The\n * Append Block operation is permitted only if the blob was created with x-ms-blob-type set to\n * AppendBlob. Append Block is supported only on version 2015-02-21 version or later.\n * @param contentLength The length of the request.\n * @param body Initial data\n * @param options The options parameters.\n */\n appendBlock(contentLength, body, options) {\n const operationArguments = {\n contentLength,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, appendBlockOperationSpec);\n }\n /**\n * The Append Block operation commits a new block of data to the end of an existing append blob where\n * the contents are read from a source url. The Append Block operation is permitted only if the blob\n * was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version\n * 2015-02-21 version or later.\n * @param sourceUrl Specify a URL to the copy source.\n * @param contentLength The length of the request.\n * @param options The options parameters.\n */\n appendBlockFromUrl(sourceUrl, contentLength, options) {\n const operationArguments = {\n sourceUrl,\n contentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, appendBlockFromUrlOperationSpec);\n }\n /**\n * The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version\n * 2019-12-12 version or later.\n * @param options The options parameters.\n */\n seal(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, sealOperationSpec);\n }\n}\n// Operation Specifications\nconst appendBlob_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst serializer = new Serializer(mappers_namespaceObject, /* isXml */ false);\nconst appendBlob_createOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: AppendBlobCreateHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: AppendBlobCreateExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n blobTagsString,\n legalHold1,\n blobType1\n ],\n isXML: true,\n serializer: appendBlob_xmlSerializer\n};\nconst appendBlockOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: AppendBlobAppendBlockHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: AppendBlobAppendBlockExceptionHeaders\n }\n },\n requestBody: body1,\n queryParameters: [timeoutInSeconds, comp22],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n transactionalContentMD5,\n transactionalContentCrc64,\n contentType1,\n accept2,\n maxSize,\n appendPosition\n ],\n mediaType: "binary",\n serializer\n};\nconst appendBlockFromUrlOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: AppendBlobAppendBlockFromUrlHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: AppendBlobAppendBlockFromUrlExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp22],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceContentMD5,\n copySourceAuthorization,\n transactionalContentMD5,\n sourceUrl,\n sourceContentCrc64,\n maxSize,\n appendPosition,\n sourceRange1\n ],\n isXML: true,\n serializer: appendBlob_xmlSerializer\n};\nconst sealOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: AppendBlobSealHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: AppendBlobSealExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp23],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n appendPosition\n ],\n isXML: true,\n serializer: appendBlob_xmlSerializer\n};\n//# sourceMappingURL=appendBlob.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/blockBlob.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a BlockBlob. */\nclass BlockBlob {\n /**\n * Initialize a new instance of the class BlockBlob class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * The Upload Block Blob operation updates the content of an existing block blob. Updating an existing\n * block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put\n * Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a\n * partial update of the content of a block blob, use the Put Block List operation.\n * @param contentLength The length of the request.\n * @param body Initial data\n * @param options The options parameters.\n */\n upload(contentLength, body, options) {\n const operationArguments = {\n contentLength,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, uploadOperationSpec);\n }\n /**\n * The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read\n * from a given URL. This API is supported beginning with the 2020-04-08 version. Partial updates are\n * not supported with Put Blob from URL; the content of an existing blob is overwritten with the\n * content of the new blob. To perform partial updates to a block blob’s contents using a source URL,\n * use the Put Block from URL API in conjunction with Put Block List.\n * @param contentLength The length of the request.\n * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to\n * 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would\n * appear in a request URI. The source blob must either be public or must be authenticated via a shared\n * access signature.\n * @param options The options parameters.\n */\n putBlobFromUrl(contentLength, copySource, options) {\n const operationArguments = {\n contentLength,\n copySource,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, putBlobFromUrlOperationSpec);\n }\n /**\n * The Stage Block operation creates a new block to be committed as part of a blob\n * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string\n * must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified\n * for the blockid parameter must be the same size for each block.\n * @param contentLength The length of the request.\n * @param body Initial data\n * @param options The options parameters.\n */\n stageBlock(blockId, contentLength, body, options) {\n const operationArguments = {\n blockId,\n contentLength,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, stageBlockOperationSpec);\n }\n /**\n * The Stage Block operation creates a new block to be committed as part of a blob where the contents\n * are read from a URL.\n * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string\n * must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified\n * for the blockid parameter must be the same size for each block.\n * @param contentLength The length of the request.\n * @param sourceUrl Specify a URL to the copy source.\n * @param options The options parameters.\n */\n stageBlockFromURL(blockId, contentLength, sourceUrl, options) {\n const operationArguments = {\n blockId,\n contentLength,\n sourceUrl,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, stageBlockFromURLOperationSpec);\n }\n /**\n * The Commit Block List operation writes a blob by specifying the list of block IDs that make up the\n * blob. In order to be written as part of a blob, a block must have been successfully written to the\n * server in a prior Put Block operation. You can call Put Block List to update a blob by uploading\n * only those blocks that have changed, then committing the new and existing blocks together. You can\n * do this by specifying whether to commit a block from the committed block list or from the\n * uncommitted block list, or to commit the most recently uploaded version of the block, whichever list\n * it may belong to.\n * @param blocks Blob Blocks.\n * @param options The options parameters.\n */\n commitBlockList(blocks, options) {\n const operationArguments = {\n blocks,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, commitBlockListOperationSpec);\n }\n /**\n * The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block\n * blob\n * @param listType Specifies whether to return the list of committed blocks, the list of uncommitted\n * blocks, or both lists together.\n * @param options The options parameters.\n */\n getBlockList(listType, options) {\n const operationArguments = {\n listType,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getBlockListOperationSpec);\n }\n}\n// Operation Specifications\nconst blockBlob_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst blockBlob_serializer = new Serializer(mappers_namespaceObject, /* isXml */ false);\nconst uploadOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobUploadHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobUploadExceptionHeaders\n }\n },\n requestBody: body1,\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n contentLength,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n tier,\n blobTagsString,\n legalHold1,\n transactionalContentMD5,\n transactionalContentCrc64,\n contentType1,\n accept2,\n blobType2\n ],\n mediaType: "binary",\n serializer: blockBlob_serializer\n};\nconst putBlobFromUrlOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobPutBlobFromUrlHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobPutBlobFromUrlExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n encryptionScope,\n tier,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceIfTags,\n copySource,\n blobTagsString,\n sourceContentMD5,\n copySourceAuthorization,\n copySourceTags,\n transactionalContentMD5,\n blobType2,\n copySourceBlobProperties\n ],\n isXML: true,\n serializer: blockBlob_xmlSerializer\n};\nconst stageBlockOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobStageBlockHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobStageBlockExceptionHeaders\n }\n },\n requestBody: body1,\n queryParameters: [\n timeoutInSeconds,\n comp24,\n blockId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n contentLength,\n leaseId,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n encryptionScope,\n transactionalContentMD5,\n transactionalContentCrc64,\n contentType1,\n accept2\n ],\n mediaType: "binary",\n serializer: blockBlob_serializer\n};\nconst stageBlockFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobStageBlockFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobStageBlockFromURLExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n comp24,\n blockId\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n leaseId,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n encryptionScope,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceContentMD5,\n copySourceAuthorization,\n sourceUrl,\n sourceContentCrc64,\n sourceRange1\n ],\n isXML: true,\n serializer: blockBlob_xmlSerializer\n};\nconst commitBlockListOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: BlockBlobCommitBlockListHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobCommitBlockListExceptionHeaders\n }\n },\n requestBody: blocks,\n queryParameters: [timeoutInSeconds, comp25],\n urlParameters: [url],\n headerParameters: [\n contentType,\n accept,\n version,\n requestId,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n tier,\n blobTagsString,\n legalHold1,\n transactionalContentMD5,\n transactionalContentCrc64\n ],\n isXML: true,\n contentType: "application/xml; charset=utf-8",\n mediaType: "xml",\n serializer: blockBlob_xmlSerializer\n};\nconst getBlockListOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: BlockList,\n headersMapper: BlockBlobGetBlockListHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: BlockBlobGetBlockListExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n snapshot,\n comp25,\n listType\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifTags\n ],\n isXML: true,\n serializer: blockBlob_xmlSerializer\n};\n//# sourceMappingURL=blockBlob.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generated/src/operations/pageBlob.js\n/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\n\n\n/** Class representing a PageBlob. */\nclass PageBlob {\n /**\n * Initialize a new instance of the class PageBlob class.\n * @param client Reference to the service client\n */\n constructor(client) {\n this.client = client;\n }\n /**\n * The Create operation creates a new page blob.\n * @param contentLength The length of the request.\n * @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The\n * page blob size must be aligned to a 512-byte boundary.\n * @param options The options parameters.\n */\n create(contentLength, blobContentLength, options) {\n const operationArguments = {\n contentLength,\n blobContentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, pageBlob_createOperationSpec);\n }\n /**\n * The Upload Pages operation writes a range of pages to a page blob\n * @param contentLength The length of the request.\n * @param body Initial data\n * @param options The options parameters.\n */\n uploadPages(contentLength, body, options) {\n const operationArguments = {\n contentLength,\n body,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, uploadPagesOperationSpec);\n }\n /**\n * The Clear Pages operation clears a set of pages from a page blob\n * @param contentLength The length of the request.\n * @param options The options parameters.\n */\n clearPages(contentLength, options) {\n const operationArguments = {\n contentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, clearPagesOperationSpec);\n }\n /**\n * The Upload Pages operation writes a range of pages to a page blob where the contents are read from a\n * URL\n * @param sourceUrl Specify a URL to the copy source.\n * @param sourceRange Bytes of source data in the specified range. The length of this range should\n * match the ContentLength header and x-ms-range/Range destination range header.\n * @param contentLength The length of the request.\n * @param range The range of bytes to which the source range would be written. The range should be 512\n * aligned and range-end is required.\n * @param options The options parameters.\n */\n uploadPagesFromURL(sourceUrl, sourceRange, contentLength, range, options) {\n const operationArguments = {\n sourceUrl,\n sourceRange,\n contentLength,\n range,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, uploadPagesFromURLOperationSpec);\n }\n /**\n * The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a\n * page blob\n * @param options The options parameters.\n */\n getPageRanges(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getPageRangesOperationSpec);\n }\n /**\n * The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were\n * changed between target blob and previous snapshot.\n * @param options The options parameters.\n */\n getPageRangesDiff(options) {\n const operationArguments = {\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, getPageRangesDiffOperationSpec);\n }\n /**\n * Resize the Blob\n * @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The\n * page blob size must be aligned to a 512-byte boundary.\n * @param options The options parameters.\n */\n resize(blobContentLength, options) {\n const operationArguments = {\n blobContentLength,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, resizeOperationSpec);\n }\n /**\n * Update the sequence number of the blob\n * @param sequenceNumberAction Required if the x-ms-blob-sequence-number header is set for the request.\n * This property applies to page blobs only. This property indicates how the service should modify the\n * blob\'s sequence number\n * @param options The options parameters.\n */\n updateSequenceNumber(sequenceNumberAction, options) {\n const operationArguments = {\n sequenceNumberAction,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, updateSequenceNumberOperationSpec);\n }\n /**\n * The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob.\n * The snapshot is copied such that only the differential changes between the previously copied\n * snapshot are transferred to the destination. The copied snapshots are complete copies of the\n * original snapshot and can be read or copied from as usual. This API is supported since REST version\n * 2016-05-31.\n * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to\n * 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would\n * appear in a request URI. The source blob must either be public or must be authenticated via a shared\n * access signature.\n * @param options The options parameters.\n */\n copyIncremental(copySource, options) {\n const operationArguments = {\n copySource,\n options: operationOptionsToRequestOptionsBase(options || {})\n };\n return this.client.sendOperationRequest(operationArguments, copyIncrementalOperationSpec);\n }\n}\n// Operation Specifications\nconst pageBlob_xmlSerializer = new Serializer(mappers_namespaceObject, /* isXml */ true);\nconst pageBlob_serializer = new Serializer(mappers_namespaceObject, /* isXml */ false);\nconst pageBlob_createOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: PageBlobCreateHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobCreateExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n metadata,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobCacheControl,\n blobContentType,\n blobContentMD5,\n blobContentEncoding,\n blobContentLanguage,\n blobContentDisposition,\n immutabilityPolicyExpiry,\n immutabilityPolicyMode,\n encryptionScope,\n tier,\n blobTagsString,\n legalHold1,\n blobType,\n blobContentLength,\n blobSequenceNumber\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst uploadPagesOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: PageBlobUploadPagesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobUploadPagesExceptionHeaders\n }\n },\n requestBody: body1,\n queryParameters: [timeoutInSeconds, comp19],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n transactionalContentMD5,\n transactionalContentCrc64,\n contentType1,\n accept2,\n pageWrite,\n ifSequenceNumberLessThanOrEqualTo,\n ifSequenceNumberLessThan,\n ifSequenceNumberEqualTo\n ],\n mediaType: "binary",\n serializer: pageBlob_serializer\n};\nconst clearPagesOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: PageBlobClearPagesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobClearPagesExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp19],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n ifSequenceNumberLessThanOrEqualTo,\n ifSequenceNumberLessThan,\n ifSequenceNumberEqualTo,\n pageWrite1\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst uploadPagesFromURLOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 201: {\n headersMapper: PageBlobUploadPagesFromURLHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobUploadPagesFromURLExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp19],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n contentLength,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n sourceIfModifiedSince,\n sourceIfUnmodifiedSince,\n sourceIfMatch,\n sourceIfNoneMatch,\n sourceContentMD5,\n copySourceAuthorization,\n pageWrite,\n ifSequenceNumberLessThanOrEqualTo,\n ifSequenceNumberLessThan,\n ifSequenceNumberEqualTo,\n sourceUrl,\n sourceRange,\n sourceContentCrc64,\n range1\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst getPageRangesOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: PageList,\n headersMapper: PageBlobGetPageRangesHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobGetPageRangesExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n marker,\n maxPageSize,\n snapshot,\n comp20\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n ifMatch,\n ifNoneMatch,\n ifTags\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst getPageRangesDiffOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "GET",\n responses: {\n 200: {\n bodyMapper: PageList,\n headersMapper: PageBlobGetPageRangesDiffHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobGetPageRangesDiffExceptionHeaders\n }\n },\n queryParameters: [\n timeoutInSeconds,\n marker,\n maxPageSize,\n snapshot,\n comp20,\n prevsnapshot\n ],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n range,\n ifMatch,\n ifNoneMatch,\n ifTags,\n prevSnapshotUrl\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst resizeOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: PageBlobResizeHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobResizeExceptionHeaders\n }\n },\n queryParameters: [comp, timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n encryptionKey,\n encryptionKeySha256,\n encryptionAlgorithm,\n ifMatch,\n ifNoneMatch,\n ifTags,\n encryptionScope,\n blobContentLength\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst updateSequenceNumberOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 200: {\n headersMapper: PageBlobUpdateSequenceNumberHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobUpdateSequenceNumberExceptionHeaders\n }\n },\n queryParameters: [comp, timeoutInSeconds],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n leaseId,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n blobSequenceNumber,\n sequenceNumberAction\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\nconst copyIncrementalOperationSpec = {\n path: "/{containerName}/{blob}",\n httpMethod: "PUT",\n responses: {\n 202: {\n headersMapper: PageBlobCopyIncrementalHeaders\n },\n default: {\n bodyMapper: StorageError,\n headersMapper: PageBlobCopyIncrementalExceptionHeaders\n }\n },\n queryParameters: [timeoutInSeconds, comp21],\n urlParameters: [url],\n headerParameters: [\n version,\n requestId,\n accept1,\n ifModifiedSince,\n ifUnmodifiedSince,\n ifMatch,\n ifNoneMatch,\n ifTags,\n copySource\n ],\n isXML: true,\n serializer: pageBlob_xmlSerializer\n};\n//# sourceMappingURL=pageBlob.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/models.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Represents the access tier on a blob.\n * For detailed information about block blob level tiering see {@link https://docs.microsoft.com/azure/storage/blobs/storage-blob-storage-tiers|Hot, cool and archive storage tiers.}\n */\nvar BlockBlobTier;\n(function (BlockBlobTier) {\n /**\n * Optimized for storing data that is accessed frequently.\n */\n BlockBlobTier["Hot"] = "Hot";\n /**\n * Optimized for storing data that is infrequently accessed and stored for at least 30 days.\n */\n BlockBlobTier["Cool"] = "Cool";\n /**\n * Optimized for storing data that is rarely accessed.\n */\n BlockBlobTier["Cold"] = "Cold";\n /**\n * Optimized for storing data that is rarely accessed and stored for at least 180 days\n * with flexible latency requirements (on the order of hours).\n */\n BlockBlobTier["Archive"] = "Archive";\n})(BlockBlobTier || (BlockBlobTier = {}));\n/**\n * Specifies the page blob tier to set the blob to. This is only applicable to page blobs on premium storage accounts.\n * Please see {@link https://docs.microsoft.com/azure/storage/storage-premium-storage#scalability-and-performance-targets|here}\n * for detailed information on the corresponding IOPS and throughput per PageBlobTier.\n */\nvar PremiumPageBlobTier;\n(function (PremiumPageBlobTier) {\n /**\n * P4 Tier.\n */\n PremiumPageBlobTier["P4"] = "P4";\n /**\n * P6 Tier.\n */\n PremiumPageBlobTier["P6"] = "P6";\n /**\n * P10 Tier.\n */\n PremiumPageBlobTier["P10"] = "P10";\n /**\n * P15 Tier.\n */\n PremiumPageBlobTier["P15"] = "P15";\n /**\n * P20 Tier.\n */\n PremiumPageBlobTier["P20"] = "P20";\n /**\n * P30 Tier.\n */\n PremiumPageBlobTier["P30"] = "P30";\n /**\n * P40 Tier.\n */\n PremiumPageBlobTier["P40"] = "P40";\n /**\n * P50 Tier.\n */\n PremiumPageBlobTier["P50"] = "P50";\n /**\n * P60 Tier.\n */\n PremiumPageBlobTier["P60"] = "P60";\n /**\n * P70 Tier.\n */\n PremiumPageBlobTier["P70"] = "P70";\n /**\n * P80 Tier.\n */\n PremiumPageBlobTier["P80"] = "P80";\n})(PremiumPageBlobTier || (PremiumPageBlobTier = {}));\nfunction toAccessTier(tier) {\n if (tier === undefined) {\n return undefined;\n }\n return tier; // No more check if string is a valid AccessTier, and left this to underlay logic to decide(service).\n}\nfunction ensureCpkIfSpecified(cpk, isHttps) {\n if (cpk && !isHttps) {\n throw new RangeError("Customer-provided encryption key must be used over HTTPS.");\n }\n if (cpk && !cpk.encryptionAlgorithm) {\n cpk.encryptionAlgorithm = EncryptionAlgorithmAES25;\n }\n}\n/**\n * Defines the known cloud audiences for Storage.\n */\nvar StorageBlobAudience;\n(function (StorageBlobAudience) {\n /**\n * The OAuth scope to use to retrieve an AAD token for Azure Storage.\n */\n StorageBlobAudience["StorageOAuthScopes"] = "https://storage.azure.com/.default";\n /**\n * The OAuth scope to use to retrieve an AAD token for Azure Disk.\n */\n StorageBlobAudience["DiskComputeOAuthScopes"] = "https://disk.compute.azure.com/.default";\n})(StorageBlobAudience || (StorageBlobAudience = {}));\nfunction getBlobServiceAccountAudience(storageAccountName) {\n return `https://${storageAccountName}.blob.core.windows.net/.default`;\n}\n//# sourceMappingURL=models.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/PageBlobRangeResponse.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Function that converts PageRange and ClearRange to a common Range object.\n * PageRange and ClearRange have start and end while Range offset and count\n * this function normalizes to Range.\n * @param response - Model PageBlob Range response\n */\nfunction rangeResponseFromModel(response) {\n const pageRange = (response._response.parsedBody.pageRange || []).map((x) => ({\n offset: x.start,\n count: x.end - x.start,\n }));\n const clearRange = (response._response.parsedBody.clearRange || []).map((x) => ({\n offset: x.start,\n count: x.end - x.start,\n }));\n return Object.assign(Object.assign({}, response), { pageRange,\n clearRange, _response: Object.assign(Object.assign({}, response._response), { parsedBody: {\n pageRange,\n clearRange,\n } }) });\n}\n//# sourceMappingURL=PageBlobRangeResponse.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/logger.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * The `@azure/logger` configuration for this package.\n * @internal\n */\nconst logger_logger = createClientLogger("core-lro");\n//# sourceMappingURL=logger.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/poller/constants.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * The default time interval to wait before sending the next polling request.\n */\nconst constants_POLL_INTERVAL_IN_MS = 2000;\n/**\n * The closed set of terminal states.\n */\nconst terminalStates = ["succeeded", "canceled", "failed"];\n//# sourceMappingURL=constants.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/poller/operation.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * Deserializes the state\n */\nfunction operation_deserializeState(serializedState) {\n try {\n return JSON.parse(serializedState).state;\n }\n catch (e) {\n throw new Error(`Unable to deserialize input state: ${serializedState}`);\n }\n}\nfunction setStateError(inputs) {\n const { state, stateProxy, isOperationError } = inputs;\n return (error) => {\n if (isOperationError(error)) {\n stateProxy.setError(state, error);\n stateProxy.setFailed(state);\n }\n throw error;\n };\n}\nfunction appendReadableErrorMessage(currentMessage, innerMessage) {\n let message = currentMessage;\n if (message.slice(-1) !== ".") {\n message = message + ".";\n }\n return message + " " + innerMessage;\n}\nfunction simplifyError(err) {\n let message = err.message;\n let code = err.code;\n let curErr = err;\n while (curErr.innererror) {\n curErr = curErr.innererror;\n code = curErr.code;\n message = appendReadableErrorMessage(message, curErr.message);\n }\n return {\n code,\n message,\n };\n}\nfunction processOperationStatus(result) {\n const { state, stateProxy, status, isDone, processResult, getError, response, setErrorAsResult } = result;\n switch (status) {\n case "succeeded": {\n stateProxy.setSucceeded(state);\n break;\n }\n case "failed": {\n const err = getError === null || getError === void 0 ? void 0 : getError(response);\n let postfix = "";\n if (err) {\n const { code, message } = simplifyError(err);\n postfix = `. ${code}. ${message}`;\n }\n const errStr = `The long-running operation has failed${postfix}`;\n stateProxy.setError(state, new Error(errStr));\n stateProxy.setFailed(state);\n logger_logger.warning(errStr);\n break;\n }\n case "canceled": {\n stateProxy.setCanceled(state);\n break;\n }\n }\n if ((isDone === null || isDone === void 0 ? void 0 : isDone(response, state)) ||\n (isDone === undefined &&\n ["succeeded", "canceled"].concat(setErrorAsResult ? [] : ["failed"]).includes(status))) {\n stateProxy.setResult(state, buildResult({\n response,\n state,\n processResult,\n }));\n }\n}\nfunction buildResult(inputs) {\n const { processResult, response, state } = inputs;\n return processResult ? processResult(response, state) : response;\n}\n/**\n * Initiates the long-running operation.\n */\nasync function operation_initOperation(inputs) {\n const { init, stateProxy, processResult, getOperationStatus, withOperationLocation, setErrorAsResult, } = inputs;\n const { operationLocation, resourceLocation, metadata, response } = await init();\n if (operationLocation)\n withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(operationLocation, false);\n const config = {\n metadata,\n operationLocation,\n resourceLocation,\n };\n logger_logger.verbose(`LRO: Operation description:`, config);\n const state = stateProxy.initState(config);\n const status = getOperationStatus({ response, state, operationLocation });\n processOperationStatus({ state, status, stateProxy, response, setErrorAsResult, processResult });\n return state;\n}\nasync function pollOperationHelper(inputs) {\n const { poll, state, stateProxy, operationLocation, getOperationStatus, getResourceLocation, isOperationError, options, } = inputs;\n const response = await poll(operationLocation, options).catch(setStateError({\n state,\n stateProxy,\n isOperationError,\n }));\n const status = getOperationStatus(response, state);\n logger_logger.verbose(`LRO: Status:\\n\\tPolling from: ${state.config.operationLocation}\\n\\tOperation status: ${status}\\n\\tPolling status: ${terminalStates.includes(status) ? "Stopped" : "Running"}`);\n if (status === "succeeded") {\n const resourceLocation = getResourceLocation(response, state);\n if (resourceLocation !== undefined) {\n return {\n response: await poll(resourceLocation).catch(setStateError({ state, stateProxy, isOperationError })),\n status,\n };\n }\n }\n return { response, status };\n}\n/** Polls the long-running operation. */\nasync function operation_pollOperation(inputs) {\n const { poll, state, stateProxy, options, getOperationStatus, getResourceLocation, getOperationLocation, isOperationError, withOperationLocation, getPollingInterval, processResult, getError, updateState, setDelay, isDone, setErrorAsResult, } = inputs;\n const { operationLocation } = state.config;\n if (operationLocation !== undefined) {\n const { response, status } = await pollOperationHelper({\n poll,\n getOperationStatus,\n state,\n stateProxy,\n operationLocation,\n getResourceLocation,\n isOperationError,\n options,\n });\n processOperationStatus({\n status,\n response,\n state,\n stateProxy,\n isDone,\n processResult,\n getError,\n setErrorAsResult,\n });\n if (!terminalStates.includes(status)) {\n const intervalInMs = getPollingInterval === null || getPollingInterval === void 0 ? void 0 : getPollingInterval(response);\n if (intervalInMs)\n setDelay(intervalInMs);\n const location = getOperationLocation === null || getOperationLocation === void 0 ? void 0 : getOperationLocation(response, state);\n if (location !== undefined) {\n const isUpdated = operationLocation !== location;\n state.config.operationLocation = location;\n withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(location, isUpdated);\n }\n else\n withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(operationLocation, false);\n }\n updateState === null || updateState === void 0 ? void 0 : updateState(state, response);\n }\n}\n//# sourceMappingURL=operation.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/http/operation.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nfunction getOperationLocationPollingUrl(inputs) {\n const { azureAsyncOperation, operationLocation } = inputs;\n return operationLocation !== null && operationLocation !== void 0 ? operationLocation : azureAsyncOperation;\n}\nfunction getLocationHeader(rawResponse) {\n return rawResponse.headers["location"];\n}\nfunction getOperationLocationHeader(rawResponse) {\n return rawResponse.headers["operation-location"];\n}\nfunction getAzureAsyncOperationHeader(rawResponse) {\n return rawResponse.headers["azure-asyncoperation"];\n}\nfunction findResourceLocation(inputs) {\n var _a;\n const { location, requestMethod, requestPath, resourceLocationConfig } = inputs;\n switch (requestMethod) {\n case "PUT": {\n return requestPath;\n }\n case "DELETE": {\n return undefined;\n }\n case "PATCH": {\n return (_a = getDefault()) !== null && _a !== void 0 ? _a : requestPath;\n }\n default: {\n return getDefault();\n }\n }\n function getDefault() {\n switch (resourceLocationConfig) {\n case "azure-async-operation": {\n return undefined;\n }\n case "original-uri": {\n return requestPath;\n }\n case "location":\n default: {\n return location;\n }\n }\n }\n}\nfunction operation_inferLroMode(inputs) {\n const { rawResponse, requestMethod, requestPath, resourceLocationConfig } = inputs;\n const operationLocation = getOperationLocationHeader(rawResponse);\n const azureAsyncOperation = getAzureAsyncOperationHeader(rawResponse);\n const pollingUrl = getOperationLocationPollingUrl({ operationLocation, azureAsyncOperation });\n const location = getLocationHeader(rawResponse);\n const normalizedRequestMethod = requestMethod === null || requestMethod === void 0 ? void 0 : requestMethod.toLocaleUpperCase();\n if (pollingUrl !== undefined) {\n return {\n mode: "OperationLocation",\n operationLocation: pollingUrl,\n resourceLocation: findResourceLocation({\n requestMethod: normalizedRequestMethod,\n location,\n requestPath,\n resourceLocationConfig,\n }),\n };\n }\n else if (location !== undefined) {\n return {\n mode: "ResourceLocation",\n operationLocation: location,\n };\n }\n else if (normalizedRequestMethod === "PUT" && requestPath) {\n return {\n mode: "Body",\n operationLocation: requestPath,\n };\n }\n else {\n return undefined;\n }\n}\nfunction transformStatus(inputs) {\n const { status, statusCode } = inputs;\n if (typeof status !== "string" && status !== undefined) {\n throw new Error(`Polling was unsuccessful. Expected status to have a string value or no value but it has instead: ${status}. This doesn\'t necessarily indicate the operation has failed. Check your Azure subscription or resource status for more information.`);\n }\n switch (status === null || status === void 0 ? void 0 : status.toLocaleLowerCase()) {\n case undefined:\n return toOperationStatus(statusCode);\n case "succeeded":\n return "succeeded";\n case "failed":\n return "failed";\n case "running":\n case "accepted":\n case "started":\n case "canceling":\n case "cancelling":\n return "running";\n case "canceled":\n case "cancelled":\n return "canceled";\n default: {\n logger_logger.verbose(`LRO: unrecognized operation status: ${status}`);\n return status;\n }\n }\n}\nfunction getStatus(rawResponse) {\n var _a;\n const { status } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};\n return transformStatus({ status, statusCode: rawResponse.statusCode });\n}\nfunction getProvisioningState(rawResponse) {\n var _a, _b;\n const { properties, provisioningState } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};\n const status = (_b = properties === null || properties === void 0 ? void 0 : properties.provisioningState) !== null && _b !== void 0 ? _b : provisioningState;\n return transformStatus({ status, statusCode: rawResponse.statusCode });\n}\nfunction toOperationStatus(statusCode) {\n if (statusCode === 202) {\n return "running";\n }\n else if (statusCode < 300) {\n return "succeeded";\n }\n else {\n return "failed";\n }\n}\nfunction operation_parseRetryAfter({ rawResponse }) {\n const retryAfter = rawResponse.headers["retry-after"];\n if (retryAfter !== undefined) {\n // Retry-After header value is either in HTTP date format, or in seconds\n const retryAfterInSeconds = parseInt(retryAfter);\n return isNaN(retryAfterInSeconds)\n ? calculatePollingIntervalFromDate(new Date(retryAfter))\n : retryAfterInSeconds * 1000;\n }\n return undefined;\n}\nfunction operation_getErrorFromResponse(response) {\n const error = accessBodyProperty(response, "error");\n if (!error) {\n logger_logger.warning(`The long-running operation failed but there is no error property in the response\'s body`);\n return;\n }\n if (!error.code || !error.message) {\n logger_logger.warning(`The long-running operation failed but the error property in the response\'s body doesn\'t contain code or message`);\n return;\n }\n return error;\n}\nfunction calculatePollingIntervalFromDate(retryAfterDate) {\n const timeNow = Math.floor(new Date().getTime());\n const retryAfterTime = retryAfterDate.getTime();\n if (timeNow < retryAfterTime) {\n return retryAfterTime - timeNow;\n }\n return undefined;\n}\nfunction operation_getStatusFromInitialResponse(inputs) {\n const { response, state, operationLocation } = inputs;\n function helper() {\n var _a;\n const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];\n switch (mode) {\n case undefined:\n return toOperationStatus(response.rawResponse.statusCode);\n case "Body":\n return operation_getOperationStatus(response, state);\n default:\n return "running";\n }\n }\n const status = helper();\n return status === "running" && operationLocation === undefined ? "succeeded" : status;\n}\n/**\n * Initiates the long-running operation.\n */\nasync function initHttpOperation(inputs) {\n const { stateProxy, resourceLocationConfig, processResult, lro, setErrorAsResult } = inputs;\n return operation_initOperation({\n init: async () => {\n const response = await lro.sendInitialRequest();\n const config = operation_inferLroMode({\n rawResponse: response.rawResponse,\n requestPath: lro.requestPath,\n requestMethod: lro.requestMethod,\n resourceLocationConfig,\n });\n return Object.assign({ response, operationLocation: config === null || config === void 0 ? void 0 : config.operationLocation, resourceLocation: config === null || config === void 0 ? void 0 : config.resourceLocation }, ((config === null || config === void 0 ? void 0 : config.mode) ? { metadata: { mode: config.mode } } : {}));\n },\n stateProxy,\n processResult: processResult\n ? ({ flatResponse }, state) => processResult(flatResponse, state)\n : ({ flatResponse }) => flatResponse,\n getOperationStatus: operation_getStatusFromInitialResponse,\n setErrorAsResult,\n });\n}\nfunction operation_getOperationLocation({ rawResponse }, state) {\n var _a;\n const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];\n switch (mode) {\n case "OperationLocation": {\n return getOperationLocationPollingUrl({\n operationLocation: getOperationLocationHeader(rawResponse),\n azureAsyncOperation: getAzureAsyncOperationHeader(rawResponse),\n });\n }\n case "ResourceLocation": {\n return getLocationHeader(rawResponse);\n }\n case "Body":\n default: {\n return undefined;\n }\n }\n}\nfunction operation_getOperationStatus({ rawResponse }, state) {\n var _a;\n const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];\n switch (mode) {\n case "OperationLocation": {\n return getStatus(rawResponse);\n }\n case "ResourceLocation": {\n return toOperationStatus(rawResponse.statusCode);\n }\n case "Body": {\n return getProvisioningState(rawResponse);\n }\n default:\n throw new Error(`Internal error: Unexpected operation mode: ${mode}`);\n }\n}\nfunction accessBodyProperty({ flatResponse, rawResponse }, prop) {\n var _a, _b;\n return (_a = flatResponse === null || flatResponse === void 0 ? void 0 : flatResponse[prop]) !== null && _a !== void 0 ? _a : (_b = rawResponse.body) === null || _b === void 0 ? void 0 : _b[prop];\n}\nfunction operation_getResourceLocation(res, state) {\n const loc = accessBodyProperty(res, "resourceLocation");\n if (loc && typeof loc === "string") {\n state.config.resourceLocation = loc;\n }\n return state.config.resourceLocation;\n}\nfunction operation_isOperationError(e) {\n return e.name === "RestError";\n}\n/** Polls the long-running operation. */\nasync function pollHttpOperation(inputs) {\n const { lro, stateProxy, options, processResult, updateState, setDelay, state, setErrorAsResult, } = inputs;\n return operation_pollOperation({\n state,\n stateProxy,\n setDelay,\n processResult: processResult\n ? ({ flatResponse }, inputState) => processResult(flatResponse, inputState)\n : ({ flatResponse }) => flatResponse,\n getError: operation_getErrorFromResponse,\n updateState,\n getPollingInterval: operation_parseRetryAfter,\n getOperationLocation: operation_getOperationLocation,\n getOperationStatus: operation_getOperationStatus,\n isOperationError: operation_isOperationError,\n getResourceLocation: operation_getResourceLocation,\n options,\n /**\n * The expansion here is intentional because `lro` could be an object that\n * references an inner this, so we need to preserve a reference to it.\n */\n poll: async (location, inputOptions) => lro.sendPollRequest(location, inputOptions),\n setErrorAsResult,\n });\n}\n//# sourceMappingURL=operation.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/poller/poller.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\nconst createStateProxy = () => ({\n /**\n * The state at this point is created to be of type OperationState.\n * It will be updated later to be of type TState when the\n * customer-provided callback, `updateState`, is called during polling.\n */\n initState: (config) => ({ status: "running", config }),\n setCanceled: (state) => (state.status = "canceled"),\n setError: (state, error) => (state.error = error),\n setResult: (state, result) => (state.result = result),\n setRunning: (state) => (state.status = "running"),\n setSucceeded: (state) => (state.status = "succeeded"),\n setFailed: (state) => (state.status = "failed"),\n getError: (state) => state.error,\n getResult: (state) => state.result,\n isCanceled: (state) => state.status === "canceled",\n isFailed: (state) => state.status === "failed",\n isRunning: (state) => state.status === "running",\n isSucceeded: (state) => state.status === "succeeded",\n});\n/**\n * Returns a poller factory.\n */\nfunction poller_buildCreatePoller(inputs) {\n const { getOperationLocation, getStatusFromInitialResponse, getStatusFromPollResponse, isOperationError, getResourceLocation, getPollingInterval, getError, resolveOnUnsuccessful, } = inputs;\n return async ({ init, poll }, options) => {\n const { processResult, updateState, withOperationLocation: withOperationLocationCallback, intervalInMs = POLL_INTERVAL_IN_MS, restoreFrom, } = options || {};\n const stateProxy = createStateProxy();\n const withOperationLocation = withOperationLocationCallback\n ? (() => {\n let called = false;\n return (operationLocation, isUpdated) => {\n if (isUpdated)\n withOperationLocationCallback(operationLocation);\n else if (!called)\n withOperationLocationCallback(operationLocation);\n called = true;\n };\n })()\n : undefined;\n const state = restoreFrom\n ? deserializeState(restoreFrom)\n : await initOperation({\n init,\n stateProxy,\n processResult,\n getOperationStatus: getStatusFromInitialResponse,\n withOperationLocation,\n setErrorAsResult: !resolveOnUnsuccessful,\n });\n let resultPromise;\n const abortController = new AbortController();\n const handlers = new Map();\n const handleProgressEvents = async () => handlers.forEach((h) => h(state));\n const cancelErrMsg = "Operation was canceled";\n let currentPollIntervalInMs = intervalInMs;\n const poller = {\n getOperationState: () => state,\n getResult: () => state.result,\n isDone: () => ["succeeded", "failed", "canceled"].includes(state.status),\n isStopped: () => resultPromise === undefined,\n stopPolling: () => {\n abortController.abort();\n },\n toString: () => JSON.stringify({\n state,\n }),\n onProgress: (callback) => {\n const s = Symbol();\n handlers.set(s, callback);\n return () => handlers.delete(s);\n },\n pollUntilDone: (pollOptions) => (resultPromise !== null && resultPromise !== void 0 ? resultPromise : (resultPromise = (async () => {\n const { abortSignal: inputAbortSignal } = pollOptions || {};\n // In the future we can use AbortSignal.any() instead\n function abortListener() {\n abortController.abort();\n }\n const abortSignal = abortController.signal;\n if (inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.aborted) {\n abortController.abort();\n }\n else if (!abortSignal.aborted) {\n inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.addEventListener("abort", abortListener, { once: true });\n }\n try {\n if (!poller.isDone()) {\n await poller.poll({ abortSignal });\n while (!poller.isDone()) {\n await delay(currentPollIntervalInMs, { abortSignal });\n await poller.poll({ abortSignal });\n }\n }\n }\n finally {\n inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.removeEventListener("abort", abortListener);\n }\n if (resolveOnUnsuccessful) {\n return poller.getResult();\n }\n else {\n switch (state.status) {\n case "succeeded":\n return poller.getResult();\n case "canceled":\n throw new Error(cancelErrMsg);\n case "failed":\n throw state.error;\n case "notStarted":\n case "running":\n throw new Error(`Polling completed without succeeding or failing`);\n }\n }\n })().finally(() => {\n resultPromise = undefined;\n }))),\n async poll(pollOptions) {\n if (resolveOnUnsuccessful) {\n if (poller.isDone())\n return;\n }\n else {\n switch (state.status) {\n case "succeeded":\n return;\n case "canceled":\n throw new Error(cancelErrMsg);\n case "failed":\n throw state.error;\n }\n }\n await pollOperation({\n poll,\n state,\n stateProxy,\n getOperationLocation,\n isOperationError,\n withOperationLocation,\n getPollingInterval,\n getOperationStatus: getStatusFromPollResponse,\n getResourceLocation,\n processResult,\n getError,\n updateState,\n options: pollOptions,\n setDelay: (pollIntervalInMs) => {\n currentPollIntervalInMs = pollIntervalInMs;\n },\n setErrorAsResult: !resolveOnUnsuccessful,\n });\n await handleProgressEvents();\n if (!resolveOnUnsuccessful) {\n switch (state.status) {\n case "canceled":\n throw new Error(cancelErrMsg);\n case "failed":\n throw state.error;\n }\n }\n },\n };\n return poller;\n };\n}\n//# sourceMappingURL=poller.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/http/poller.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * Creates a poller that can be used to poll a long-running operation.\n * @param lro - Description of the long-running operation\n * @param options - options to configure the poller\n * @returns an initialized poller\n */\nasync function createHttpPoller(lro, options) {\n const { resourceLocationConfig, intervalInMs, processResult, restoreFrom, updateState, withOperationLocation, resolveOnUnsuccessful = false, } = options || {};\n return buildCreatePoller({\n getStatusFromInitialResponse,\n getStatusFromPollResponse: getOperationStatus,\n isOperationError,\n getOperationLocation,\n getResourceLocation,\n getPollingInterval: parseRetryAfter,\n getError: getErrorFromResponse,\n resolveOnUnsuccessful,\n })({\n init: async () => {\n const response = await lro.sendInitialRequest();\n const config = inferLroMode({\n rawResponse: response.rawResponse,\n requestPath: lro.requestPath,\n requestMethod: lro.requestMethod,\n resourceLocationConfig,\n });\n return Object.assign({ response, operationLocation: config === null || config === void 0 ? void 0 : config.operationLocation, resourceLocation: config === null || config === void 0 ? void 0 : config.resourceLocation }, ((config === null || config === void 0 ? void 0 : config.mode) ? { metadata: { mode: config.mode } } : {}));\n },\n poll: lro.sendPollRequest,\n }, {\n intervalInMs,\n withOperationLocation,\n restoreFrom,\n updateState,\n processResult: processResult\n ? ({ flatResponse }, state) => processResult(flatResponse, state)\n : ({ flatResponse }) => flatResponse,\n });\n}\n//# sourceMappingURL=poller.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/legacy/lroEngine/operation.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nconst operation_createStateProxy = () => ({\n initState: (config) => ({ config, isStarted: true }),\n setCanceled: (state) => (state.isCancelled = true),\n setError: (state, error) => (state.error = error),\n setResult: (state, result) => (state.result = result),\n setRunning: (state) => (state.isStarted = true),\n setSucceeded: (state) => (state.isCompleted = true),\n setFailed: () => {\n /** empty body */\n },\n getError: (state) => state.error,\n getResult: (state) => state.result,\n isCanceled: (state) => !!state.isCancelled,\n isFailed: (state) => !!state.error,\n isRunning: (state) => !!state.isStarted,\n isSucceeded: (state) => Boolean(state.isCompleted && !state.isCancelled && !state.error),\n});\nclass GenericPollOperation {\n constructor(state, lro, setErrorAsResult, lroResourceLocationConfig, processResult, updateState, isDone) {\n this.state = state;\n this.lro = lro;\n this.setErrorAsResult = setErrorAsResult;\n this.lroResourceLocationConfig = lroResourceLocationConfig;\n this.processResult = processResult;\n this.updateState = updateState;\n this.isDone = isDone;\n }\n setPollerConfig(pollerConfig) {\n this.pollerConfig = pollerConfig;\n }\n async update(options) {\n var _a;\n const stateProxy = operation_createStateProxy();\n if (!this.state.isStarted) {\n this.state = Object.assign(Object.assign({}, this.state), (await initHttpOperation({\n lro: this.lro,\n stateProxy,\n resourceLocationConfig: this.lroResourceLocationConfig,\n processResult: this.processResult,\n setErrorAsResult: this.setErrorAsResult,\n })));\n }\n const updateState = this.updateState;\n const isDone = this.isDone;\n if (!this.state.isCompleted && this.state.error === undefined) {\n await pollHttpOperation({\n lro: this.lro,\n state: this.state,\n stateProxy,\n processResult: this.processResult,\n updateState: updateState\n ? (state, { rawResponse }) => updateState(state, rawResponse)\n : undefined,\n isDone: isDone\n ? ({ flatResponse }, state) => isDone(flatResponse, state)\n : undefined,\n options,\n setDelay: (intervalInMs) => {\n this.pollerConfig.intervalInMs = intervalInMs;\n },\n setErrorAsResult: this.setErrorAsResult,\n });\n }\n (_a = options === null || options === void 0 ? void 0 : options.fireProgress) === null || _a === void 0 ? void 0 : _a.call(options, this.state);\n return this;\n }\n async cancel() {\n logger_logger.error("`cancelOperation` is deprecated because it wasn\'t implemented");\n return this;\n }\n /**\n * Serializes the Poller operation.\n */\n toString() {\n return JSON.stringify({\n state: this.state,\n });\n }\n}\n//# sourceMappingURL=operation.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/legacy/poller.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * When a poller is manually stopped through the `stopPolling` method,\n * the poller will be rejected with an instance of the PollerStoppedError.\n */\nclass PollerStoppedError extends Error {\n constructor(message) {\n super(message);\n this.name = "PollerStoppedError";\n Object.setPrototypeOf(this, PollerStoppedError.prototype);\n }\n}\n/**\n * When the operation is cancelled, the poller will be rejected with an instance\n * of the PollerCancelledError.\n */\nclass PollerCancelledError extends Error {\n constructor(message) {\n super(message);\n this.name = "PollerCancelledError";\n Object.setPrototypeOf(this, PollerCancelledError.prototype);\n }\n}\n/**\n * A class that represents the definition of a program that polls through consecutive requests\n * until it reaches a state of completion.\n *\n * A poller can be executed manually, by polling request by request by calling to the `poll()` method repeatedly, until its operation is completed.\n * It also provides a way to wait until the operation completes, by calling `pollUntilDone()` and waiting until the operation finishes.\n * Pollers can also request the cancellation of the ongoing process to whom is providing the underlying long running operation.\n *\n * ```ts\n * const poller = new MyPoller();\n *\n * // Polling just once:\n * await poller.poll();\n *\n * // We can try to cancel the request here, by calling:\n * //\n * // await poller.cancelOperation();\n * //\n *\n * // Getting the final result:\n * const result = await poller.pollUntilDone();\n * ```\n *\n * The Poller is defined by two types, a type representing the state of the poller, which\n * must include a basic set of properties from `PollOperationState`,\n * and a return type defined by `TResult`, which can be anything.\n *\n * The Poller class implements the `PollerLike` interface, which allows poller implementations to avoid having\n * to export the Poller\'s class directly, and instead only export the already instantiated poller with the PollerLike type.\n *\n * ```ts\n * class Client {\n * public async makePoller: PollerLike {\n * const poller = new MyPoller({});\n * // It might be preferred to return the poller after the first request is made,\n * // so that some information can be obtained right away.\n * await poller.poll();\n * return poller;\n * }\n * }\n *\n * const poller: PollerLike = myClient.makePoller();\n * ```\n *\n * A poller can be created through its constructor, then it can be polled until it\'s completed.\n * At any point in time, the state of the poller can be obtained without delay through the getOperationState method.\n * At any point in time, the intermediate forms of the result type can be requested without delay.\n * Once the underlying operation is marked as completed, the poller will stop and the final value will be returned.\n *\n * ```ts\n * const poller = myClient.makePoller();\n * const state: MyOperationState = poller.getOperationState();\n *\n * // The intermediate result can be obtained at any time.\n * const result: MyResult | undefined = poller.getResult();\n *\n * // The final result can only be obtained after the poller finishes.\n * const result: MyResult = await poller.pollUntilDone();\n * ```\n *\n */\n// eslint-disable-next-line no-use-before-define\nclass Poller {\n /**\n * A poller needs to be initialized by passing in at least the basic properties of the `PollOperation`.\n *\n * When writing an implementation of a Poller, this implementation needs to deal with the initialization\n * of any custom state beyond the basic definition of the poller. The basic poller assumes that the poller\'s\n * operation has already been defined, at least its basic properties. The code below shows how to approach\n * the definition of the constructor of a new custom poller.\n *\n * ```ts\n * export class MyPoller extends Poller {\n * constructor({\n * // Anything you might need outside of the basics\n * }) {\n * let state: MyOperationState = {\n * privateProperty: private,\n * publicProperty: public,\n * };\n *\n * const operation = {\n * state,\n * update,\n * cancel,\n * toString\n * }\n *\n * // Sending the operation to the parent\'s constructor.\n * super(operation);\n *\n * // You can assign more local properties here.\n * }\n * }\n * ```\n *\n * Inside of this constructor, a new promise is created. This will be used to\n * tell the user when the poller finishes (see `pollUntilDone()`). The promise\'s\n * resolve and reject methods are also used internally to control when to resolve\n * or reject anyone waiting for the poller to finish.\n *\n * The constructor of a custom implementation of a poller is where any serialized version of\n * a previous poller\'s operation should be deserialized into the operation sent to the\n * base constructor. For example:\n *\n * ```ts\n * export class MyPoller extends Poller {\n * constructor(\n * baseOperation: string | undefined\n * ) {\n * let state: MyOperationState = {};\n * if (baseOperation) {\n * state = {\n * ...JSON.parse(baseOperation).state,\n * ...state\n * };\n * }\n * const operation = {\n * state,\n * // ...\n * }\n * super(operation);\n * }\n * }\n * ```\n *\n * @param operation - Must contain the basic properties of `PollOperation`.\n */\n constructor(operation) {\n /** controls whether to throw an error if the operation failed or was canceled. */\n this.resolveOnUnsuccessful = false;\n this.stopped = true;\n this.pollProgressCallbacks = [];\n this.operation = operation;\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n // This prevents the UnhandledPromiseRejectionWarning in node.js from being thrown.\n // The above warning would get thrown if `poller.poll` is called, it returns an error,\n // and pullUntilDone did not have a .catch or await try/catch on it\'s return value.\n this.promise.catch(() => {\n /* intentionally blank */\n });\n }\n /**\n * Starts a loop that will break only if the poller is done\n * or if the poller is stopped.\n */\n async startPolling(pollOptions = {}) {\n if (this.stopped) {\n this.stopped = false;\n }\n while (!this.isStopped() && !this.isDone()) {\n await this.poll(pollOptions);\n await this.delay();\n }\n }\n /**\n * pollOnce does one polling, by calling to the update method of the underlying\n * poll operation to make any relevant change effective.\n *\n * It only optionally receives an object with an abortSignal property, from \\@azure/abort-controller\'s AbortSignalLike.\n *\n * @param options - Optional properties passed to the operation\'s update method.\n */\n async pollOnce(options = {}) {\n if (!this.isDone()) {\n this.operation = await this.operation.update({\n abortSignal: options.abortSignal,\n fireProgress: this.fireProgress.bind(this),\n });\n }\n this.processUpdatedState();\n }\n /**\n * fireProgress calls the functions passed in via onProgress the method of the poller.\n *\n * It loops over all of the callbacks received from onProgress, and executes them, sending them\n * the current operation state.\n *\n * @param state - The current operation state.\n */\n fireProgress(state) {\n for (const callback of this.pollProgressCallbacks) {\n callback(state);\n }\n }\n /**\n * Invokes the underlying operation\'s cancel method.\n */\n async cancelOnce(options = {}) {\n this.operation = await this.operation.cancel(options);\n }\n /**\n * Returns a promise that will resolve once a single polling request finishes.\n * It does this by calling the update method of the Poller\'s operation.\n *\n * It only optionally receives an object with an abortSignal property, from \\@azure/abort-controller\'s AbortSignalLike.\n *\n * @param options - Optional properties passed to the operation\'s update method.\n */\n poll(options = {}) {\n if (!this.pollOncePromise) {\n this.pollOncePromise = this.pollOnce(options);\n const clearPollOncePromise = () => {\n this.pollOncePromise = undefined;\n };\n this.pollOncePromise.then(clearPollOncePromise, clearPollOncePromise).catch(this.reject);\n }\n return this.pollOncePromise;\n }\n processUpdatedState() {\n if (this.operation.state.error) {\n this.stopped = true;\n if (!this.resolveOnUnsuccessful) {\n this.reject(this.operation.state.error);\n throw this.operation.state.error;\n }\n }\n if (this.operation.state.isCancelled) {\n this.stopped = true;\n if (!this.resolveOnUnsuccessful) {\n const error = new PollerCancelledError("Operation was canceled");\n this.reject(error);\n throw error;\n }\n }\n if (this.isDone() && this.resolve) {\n // If the poller has finished polling, this means we now have a result.\n // However, it can be the case that TResult is instantiated to void, so\n // we are not expecting a result anyway. To assert that we might not\n // have a result eventually after finishing polling, we cast the result\n // to TResult.\n this.resolve(this.getResult());\n }\n }\n /**\n * Returns a promise that will resolve once the underlying operation is completed.\n */\n async pollUntilDone(pollOptions = {}) {\n if (this.stopped) {\n this.startPolling(pollOptions).catch(this.reject);\n }\n // This is needed because the state could have been updated by\n // `cancelOperation`, e.g. the operation is canceled or an error occurred.\n this.processUpdatedState();\n return this.promise;\n }\n /**\n * Invokes the provided callback after each polling is completed,\n * sending the current state of the poller\'s operation.\n *\n * It returns a method that can be used to stop receiving updates on the given callback function.\n */\n onProgress(callback) {\n this.pollProgressCallbacks.push(callback);\n return () => {\n this.pollProgressCallbacks = this.pollProgressCallbacks.filter((c) => c !== callback);\n };\n }\n /**\n * Returns true if the poller has finished polling.\n */\n isDone() {\n const state = this.operation.state;\n return Boolean(state.isCompleted || state.isCancelled || state.error);\n }\n /**\n * Stops the poller from continuing to poll.\n */\n stopPolling() {\n if (!this.stopped) {\n this.stopped = true;\n if (this.reject) {\n this.reject(new PollerStoppedError("This poller is already stopped"));\n }\n }\n }\n /**\n * Returns true if the poller is stopped.\n */\n isStopped() {\n return this.stopped;\n }\n /**\n * Attempts to cancel the underlying operation.\n *\n * It only optionally receives an object with an abortSignal property, from \\@azure/abort-controller\'s AbortSignalLike.\n *\n * If it\'s called again before it finishes, it will throw an error.\n *\n * @param options - Optional properties passed to the operation\'s update method.\n */\n cancelOperation(options = {}) {\n if (!this.cancelPromise) {\n this.cancelPromise = this.cancelOnce(options);\n }\n else if (options.abortSignal) {\n throw new Error("A cancel request is currently pending");\n }\n return this.cancelPromise;\n }\n /**\n * Returns the state of the operation.\n *\n * Even though TState will be the same type inside any of the methods of any extension of the Poller class,\n * implementations of the pollers can customize what\'s shared with the public by writing their own\n * version of the `getOperationState` method, and by defining two types, one representing the internal state of the poller\n * and a public type representing a safe to share subset of the properties of the internal state.\n * Their definition of getOperationState can then return their public type.\n *\n * Example:\n *\n * ```ts\n * // Let\'s say we have our poller\'s operation state defined as:\n * interface MyOperationState extends PollOperationState {\n * privateProperty?: string;\n * publicProperty?: string;\n * }\n *\n * // To allow us to have a true separation of public and private state, we have to define another interface:\n * interface PublicState extends PollOperationState {\n * publicProperty?: string;\n * }\n *\n * // Then, we define our Poller as follows:\n * export class MyPoller extends Poller {\n * // ... More content is needed here ...\n *\n * public getOperationState(): PublicState {\n * const state: PublicState = this.operation.state;\n * return {\n * // Properties from PollOperationState\n * isStarted: state.isStarted,\n * isCompleted: state.isCompleted,\n * isCancelled: state.isCancelled,\n * error: state.error,\n * result: state.result,\n *\n * // The only other property needed by PublicState.\n * publicProperty: state.publicProperty\n * }\n * }\n * }\n * ```\n *\n * You can see this in the tests of this repository, go to the file:\n * `../test/utils/testPoller.ts`\n * and look for the getOperationState implementation.\n */\n getOperationState() {\n return this.operation.state;\n }\n /**\n * Returns the result value of the operation,\n * regardless of the state of the poller.\n * It can return undefined or an incomplete form of the final TResult value\n * depending on the implementation.\n */\n getResult() {\n const state = this.operation.state;\n return state.result;\n }\n /**\n * Returns a serialized version of the poller\'s operation\n * by invoking the operation\'s toString method.\n */\n toString() {\n return this.operation.toString();\n }\n}\n//# sourceMappingURL=poller.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/legacy/lroEngine/lroEngine.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n/**\n * The LRO Engine, a class that performs polling.\n */\nclass LroEngine extends Poller {\n constructor(lro, options) {\n const { intervalInMs = constants_POLL_INTERVAL_IN_MS, resumeFrom, resolveOnUnsuccessful = false, isDone, lroResourceLocationConfig, processResult, updateState, } = options || {};\n const state = resumeFrom\n ? operation_deserializeState(resumeFrom)\n : {};\n const operation = new GenericPollOperation(state, lro, !resolveOnUnsuccessful, lroResourceLocationConfig, processResult, updateState, isDone);\n super(operation);\n this.resolveOnUnsuccessful = resolveOnUnsuccessful;\n this.config = { intervalInMs: intervalInMs };\n operation.setPollerConfig(this.config);\n }\n /**\n * The method used by the poller to wait before attempting to update its operation.\n */\n delay() {\n return new Promise((resolve) => setTimeout(() => resolve(), this.config.intervalInMs));\n }\n}\n//# sourceMappingURL=lroEngine.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/legacy/lroEngine/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * This can be uncommented to expose the protocol-agnostic poller\n */\n// export {\n// BuildCreatePollerOptions,\n// Operation,\n// CreatePollerOptions,\n// OperationConfig,\n// RestorableOperationState,\n// } from "./poller/models";\n// export { buildCreatePoller } from "./poller/poller";\n/** legacy */\n\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/pollers/BlobStartCopyFromUrlPoller.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * This is the poller returned by {@link BlobClient.beginCopyFromURL}.\n * This can not be instantiated directly outside of this package.\n *\n * @hidden\n */\nclass BlobBeginCopyFromUrlPoller extends Poller {\n constructor(options) {\n const { blobClient, copySource, intervalInMs = 15000, onProgress, resumeFrom, startCopyFromURLOptions, } = options;\n let state;\n if (resumeFrom) {\n state = JSON.parse(resumeFrom).state;\n }\n const operation = makeBlobBeginCopyFromURLPollOperation(Object.assign(Object.assign({}, state), { blobClient,\n copySource,\n startCopyFromURLOptions }));\n super(operation);\n if (typeof onProgress === "function") {\n this.onProgress(onProgress);\n }\n this.intervalInMs = intervalInMs;\n }\n delay() {\n return delay_delay(this.intervalInMs);\n }\n}\n/**\n * Note: Intentionally using function expression over arrow function expression\n * so that the function can be invoked with a different context.\n * This affects what `this` refers to.\n * @hidden\n */\nconst cancel = async function cancel(options = {}) {\n const state = this.state;\n const { copyId } = state;\n if (state.isCompleted) {\n return makeBlobBeginCopyFromURLPollOperation(state);\n }\n if (!copyId) {\n state.isCancelled = true;\n return makeBlobBeginCopyFromURLPollOperation(state);\n }\n // if abortCopyFromURL throws, it will bubble up to user\'s poller.cancelOperation call\n await state.blobClient.abortCopyFromURL(copyId, {\n abortSignal: options.abortSignal,\n });\n state.isCancelled = true;\n return makeBlobBeginCopyFromURLPollOperation(state);\n};\n/**\n * Note: Intentionally using function expression over arrow function expression\n * so that the function can be invoked with a different context.\n * This affects what `this` refers to.\n * @hidden\n */\nconst update = async function update(options = {}) {\n const state = this.state;\n const { blobClient, copySource, startCopyFromURLOptions } = state;\n if (!state.isStarted) {\n state.isStarted = true;\n const result = await blobClient.startCopyFromURL(copySource, startCopyFromURLOptions);\n // copyId is needed to abort\n state.copyId = result.copyId;\n if (result.copyStatus === "success") {\n state.result = result;\n state.isCompleted = true;\n }\n }\n else if (!state.isCompleted) {\n try {\n const result = await state.blobClient.getProperties({ abortSignal: options.abortSignal });\n const { copyStatus, copyProgress } = result;\n const prevCopyProgress = state.copyProgress;\n if (copyProgress) {\n state.copyProgress = copyProgress;\n }\n if (copyStatus === "pending" &&\n copyProgress !== prevCopyProgress &&\n typeof options.fireProgress === "function") {\n // trigger in setTimeout, or swallow error?\n options.fireProgress(state);\n }\n else if (copyStatus === "success") {\n state.result = result;\n state.isCompleted = true;\n }\n else if (copyStatus === "failed") {\n state.error = new Error(`Blob copy failed with reason: "${result.copyStatusDescription || "unknown"}"`);\n state.isCompleted = true;\n }\n }\n catch (err) {\n state.error = err;\n state.isCompleted = true;\n }\n }\n return makeBlobBeginCopyFromURLPollOperation(state);\n};\n/**\n * Note: Intentionally using function expression over arrow function expression\n * so that the function can be invoked with a different context.\n * This affects what `this` refers to.\n * @hidden\n */\nconst BlobStartCopyFromUrlPoller_toString = function toString() {\n return JSON.stringify({ state: this.state }, (key, value) => {\n // remove blobClient from serialized state since a client can\'t be hydrated from this info.\n if (key === "blobClient") {\n return undefined;\n }\n return value;\n });\n};\n/**\n * Creates a poll operation given the provided state.\n * @hidden\n */\nfunction makeBlobBeginCopyFromURLPollOperation(state) {\n return {\n state: Object.assign({}, state),\n cancel,\n toString: BlobStartCopyFromUrlPoller_toString,\n update,\n };\n}\n//# sourceMappingURL=BlobStartCopyFromUrlPoller.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/Range.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Generate a range string. For example:\n *\n * "bytes=255-" or "bytes=0-511"\n *\n * @param iRange -\n */\nfunction rangeToString(iRange) {\n if (iRange.offset < 0) {\n throw new RangeError(`Range.offset cannot be smaller than 0.`);\n }\n if (iRange.count && iRange.count <= 0) {\n throw new RangeError(`Range.count must be larger than 0. Leave it undefined if you want a range from offset to the end.`);\n }\n return iRange.count\n ? `bytes=${iRange.offset}-${iRange.offset + iRange.count - 1}`\n : `bytes=${iRange.offset}-`;\n}\n//# sourceMappingURL=Range.js.map\n// EXTERNAL MODULE: external "events"\nvar external_events_ = __webpack_require__(24434);\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/Batch.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n// In browser, during webpack or browserify bundling, this module will be replaced by \'events\'\n// https://github.com/Gozala/events\n\n/**\n * States for Batch.\n */\nvar BatchStates;\n(function (BatchStates) {\n BatchStates[BatchStates["Good"] = 0] = "Good";\n BatchStates[BatchStates["Error"] = 1] = "Error";\n})(BatchStates || (BatchStates = {}));\n/**\n * Batch provides basic parallel execution with concurrency limits.\n * Will stop execute left operations when one of the executed operation throws an error.\n * But Batch cannot cancel ongoing operations, you need to cancel them by yourself.\n */\nclass Batch {\n /**\n * Creates an instance of Batch.\n * @param concurrency -\n */\n constructor(concurrency = 5) {\n /**\n * Number of active operations under execution.\n */\n this.actives = 0;\n /**\n * Number of completed operations under execution.\n */\n this.completed = 0;\n /**\n * Offset of next operation to be executed.\n */\n this.offset = 0;\n /**\n * Operation array to be executed.\n */\n this.operations = [];\n /**\n * States of Batch. When an error happens, state will turn into error.\n * Batch will stop execute left operations.\n */\n this.state = BatchStates.Good;\n if (concurrency < 1) {\n throw new RangeError("concurrency must be larger than 0");\n }\n this.concurrency = concurrency;\n this.emitter = new external_events_.EventEmitter();\n }\n /**\n * Add a operation into queue.\n *\n * @param operation -\n */\n addOperation(operation) {\n this.operations.push(async () => {\n try {\n this.actives++;\n await operation();\n this.actives--;\n this.completed++;\n this.parallelExecute();\n }\n catch (error) {\n this.emitter.emit("error", error);\n }\n });\n }\n /**\n * Start execute operations in the queue.\n *\n */\n async do() {\n if (this.operations.length === 0) {\n return Promise.resolve();\n }\n this.parallelExecute();\n return new Promise((resolve, reject) => {\n this.emitter.on("finish", resolve);\n this.emitter.on("error", (error) => {\n this.state = BatchStates.Error;\n reject(error);\n });\n });\n }\n /**\n * Get next operation to be executed. Return null when reaching ends.\n *\n */\n nextOperation() {\n if (this.offset < this.operations.length) {\n return this.operations[this.offset++];\n }\n return null;\n }\n /**\n * Start execute operations. One one the most important difference between\n * this method with do() is that do() wraps as an sync method.\n *\n */\n parallelExecute() {\n if (this.state === BatchStates.Error) {\n return;\n }\n if (this.completed >= this.operations.length) {\n this.emitter.emit("finish");\n return;\n }\n while (this.actives < this.concurrency) {\n const operation = this.nextOperation();\n if (operation) {\n operation();\n }\n else {\n return;\n }\n }\n }\n}\n//# sourceMappingURL=Batch.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-common/src/BuffersStream.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * This class generates a readable stream from the data in an array of buffers.\n */\nclass BuffersStream extends external_stream_.Readable {\n /**\n * Creates an instance of BuffersStream that will emit the data\n * contained in the array of buffers.\n *\n * @param buffers - Array of buffers containing the data\n * @param byteLength - The total length of data contained in the buffers\n */\n constructor(buffers, byteLength, options) {\n super(options);\n this.buffers = buffers;\n this.byteLength = byteLength;\n this.byteOffsetInCurrentBuffer = 0;\n this.bufferIndex = 0;\n this.pushedBytesLength = 0;\n // check byteLength is no larger than buffers[] total length\n let buffersLength = 0;\n for (const buf of this.buffers) {\n buffersLength += buf.byteLength;\n }\n if (buffersLength < this.byteLength) {\n throw new Error("Data size shouldn\'t be larger than the total length of buffers.");\n }\n }\n /**\n * Internal _read() that will be called when the stream wants to pull more data in.\n *\n * @param size - Optional. The size of data to be read\n */\n _read(size) {\n if (this.pushedBytesLength >= this.byteLength) {\n this.push(null);\n }\n if (!size) {\n size = this.readableHighWaterMark;\n }\n const outBuffers = [];\n let i = 0;\n while (i < size && this.pushedBytesLength < this.byteLength) {\n // The last buffer may be longer than the data it contains.\n const remainingDataInAllBuffers = this.byteLength - this.pushedBytesLength;\n const remainingCapacityInThisBuffer = this.buffers[this.bufferIndex].byteLength - this.byteOffsetInCurrentBuffer;\n const remaining = Math.min(remainingCapacityInThisBuffer, remainingDataInAllBuffers);\n if (remaining > size - i) {\n // chunkSize = size - i\n const end = this.byteOffsetInCurrentBuffer + size - i;\n outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));\n this.pushedBytesLength += size - i;\n this.byteOffsetInCurrentBuffer = end;\n i = size;\n break;\n }\n else {\n // chunkSize = remaining\n const end = this.byteOffsetInCurrentBuffer + remaining;\n outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));\n if (remaining === remainingCapacityInThisBuffer) {\n // this.buffers[this.bufferIndex] used up, shift to next one\n this.byteOffsetInCurrentBuffer = 0;\n this.bufferIndex++;\n }\n else {\n this.byteOffsetInCurrentBuffer = end;\n }\n this.pushedBytesLength += remaining;\n i += remaining;\n }\n }\n if (outBuffers.length > 1) {\n this.push(Buffer.concat(outBuffers));\n }\n else if (outBuffers.length === 1) {\n this.push(outBuffers[0]);\n }\n }\n}\n//# sourceMappingURL=BuffersStream.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-common/src/PooledBuffer.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * maxBufferLength is max size of each buffer in the pooled buffers.\n */\n// Can\'t use import as Typescript doesn\'t recognize "buffer".\nconst maxBufferLength = (__webpack_require__(20181).constants).MAX_LENGTH;\n/**\n * This class provides a buffer container which conceptually has no hard size limit.\n * It accepts a capacity, an array of input buffers and the total length of input data.\n * It will allocate an internal "buffer" of the capacity and fill the data in the input buffers\n * into the internal "buffer" serially with respect to the total length.\n * Then by calling PooledBuffer.getReadableStream(), you can get a readable stream\n * assembled from all the data in the internal "buffer".\n */\nclass PooledBuffer {\n constructor(capacity, buffers, totalLength) {\n /**\n * Internal buffers used to keep the data.\n * Each buffer has a length of the maxBufferLength except last one.\n */\n this.buffers = [];\n this.capacity = capacity;\n this._size = 0;\n // allocate\n const bufferNum = Math.ceil(capacity / maxBufferLength);\n for (let i = 0; i < bufferNum; i++) {\n let len = i === bufferNum - 1 ? capacity % maxBufferLength : maxBufferLength;\n if (len === 0) {\n len = maxBufferLength;\n }\n this.buffers.push(Buffer.allocUnsafe(len));\n }\n if (buffers) {\n this.fill(buffers, totalLength);\n }\n }\n /**\n * The size of the data contained in the pooled buffers.\n */\n get size() {\n return this._size;\n }\n /**\n * Fill the internal buffers with data in the input buffers serially\n * with respect to the total length and the total capacity of the internal buffers.\n * Data copied will be shift out of the input buffers.\n *\n * @param buffers - Input buffers containing the data to be filled in the pooled buffer\n * @param totalLength - Total length of the data to be filled in.\n *\n */\n fill(buffers, totalLength) {\n this._size = Math.min(this.capacity, totalLength);\n let i = 0, j = 0, targetOffset = 0, sourceOffset = 0, totalCopiedNum = 0;\n while (totalCopiedNum < this._size) {\n const source = buffers[i];\n const target = this.buffers[j];\n const copiedNum = source.copy(target, targetOffset, sourceOffset);\n totalCopiedNum += copiedNum;\n sourceOffset += copiedNum;\n targetOffset += copiedNum;\n if (sourceOffset === source.length) {\n i++;\n sourceOffset = 0;\n }\n if (targetOffset === target.length) {\n j++;\n targetOffset = 0;\n }\n }\n // clear copied from source buffers\n buffers.splice(0, i);\n if (buffers.length > 0) {\n buffers[0] = buffers[0].slice(sourceOffset);\n }\n }\n /**\n * Get the readable stream assembled from all the data in the internal buffers.\n *\n */\n getReadableStream() {\n return new BuffersStream(this.buffers, this.size);\n }\n}\n//# sourceMappingURL=PooledBuffer.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-common/src/BufferScheduler.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n/**\n * This class accepts a Node.js Readable stream as input, and keeps reading data\n * from the stream into the internal buffer structure, until it reaches maxBuffers.\n * Every available buffer will try to trigger outgoingHandler.\n *\n * The internal buffer structure includes an incoming buffer array, and a outgoing\n * buffer array. The incoming buffer array includes the "empty" buffers can be filled\n * with new incoming data. The outgoing array includes the filled buffers to be\n * handled by outgoingHandler. Every above buffer size is defined by parameter bufferSize.\n *\n * NUM_OF_ALL_BUFFERS = BUFFERS_IN_INCOMING + BUFFERS_IN_OUTGOING + BUFFERS_UNDER_HANDLING\n *\n * NUM_OF_ALL_BUFFERS lesser than or equal to maxBuffers\n *\n * PERFORMANCE IMPROVEMENT TIPS:\n * 1. Input stream highWaterMark is better to set a same value with bufferSize\n * parameter, which will avoid Buffer.concat() operations.\n * 2. concurrency should set a smaller value than maxBuffers, which is helpful to\n * reduce the possibility when a outgoing handler waits for the stream data.\n * in this situation, outgoing handlers are blocked.\n * Outgoing queue shouldn\'t be empty.\n */\nclass BufferScheduler {\n /**\n * Creates an instance of BufferScheduler.\n *\n * @param readable - A Node.js Readable stream\n * @param bufferSize - Buffer size of every maintained buffer\n * @param maxBuffers - How many buffers can be allocated\n * @param outgoingHandler - An async function scheduled to be\n * triggered when a buffer fully filled\n * with stream data\n * @param concurrency - Concurrency of executing outgoingHandlers (>0)\n * @param encoding - [Optional] Encoding of Readable stream when it\'s a string stream\n */\n constructor(readable, bufferSize, maxBuffers, outgoingHandler, concurrency, encoding) {\n /**\n * An internal event emitter.\n */\n this.emitter = new external_events_.EventEmitter();\n /**\n * An internal offset marker to track data offset in bytes of next outgoingHandler.\n */\n this.offset = 0;\n /**\n * An internal marker to track whether stream is end.\n */\n this.isStreamEnd = false;\n /**\n * An internal marker to track whether stream or outgoingHandler returns error.\n */\n this.isError = false;\n /**\n * How many handlers are executing.\n */\n this.executingOutgoingHandlers = 0;\n /**\n * How many buffers have been allocated.\n */\n this.numBuffers = 0;\n /**\n * Because this class doesn\'t know how much data every time stream pops, which\n * is defined by highWaterMarker of the stream. So BufferScheduler will cache\n * data received from the stream, when data in unresolvedDataArray exceeds the\n * blockSize defined, it will try to concat a blockSize of buffer, fill into available\n * buffers from incoming and push to outgoing array.\n */\n this.unresolvedDataArray = [];\n /**\n * How much data consisted in unresolvedDataArray.\n */\n this.unresolvedLength = 0;\n /**\n * The array includes all the available buffers can be used to fill data from stream.\n */\n this.incoming = [];\n /**\n * The array (queue) includes all the buffers filled from stream data.\n */\n this.outgoing = [];\n if (bufferSize <= 0) {\n throw new RangeError(`bufferSize must be larger than 0, current is ${bufferSize}`);\n }\n if (maxBuffers <= 0) {\n throw new RangeError(`maxBuffers must be larger than 0, current is ${maxBuffers}`);\n }\n if (concurrency <= 0) {\n throw new RangeError(`concurrency must be larger than 0, current is ${concurrency}`);\n }\n this.bufferSize = bufferSize;\n this.maxBuffers = maxBuffers;\n this.readable = readable;\n this.outgoingHandler = outgoingHandler;\n this.concurrency = concurrency;\n this.encoding = encoding;\n }\n /**\n * Start the scheduler, will return error when stream of any of the outgoingHandlers\n * returns error.\n *\n */\n async do() {\n return new Promise((resolve, reject) => {\n this.readable.on("data", (data) => {\n data = typeof data === "string" ? Buffer.from(data, this.encoding) : data;\n this.appendUnresolvedData(data);\n if (!this.resolveData()) {\n this.readable.pause();\n }\n });\n this.readable.on("error", (err) => {\n this.emitter.emit("error", err);\n });\n this.readable.on("end", () => {\n this.isStreamEnd = true;\n this.emitter.emit("checkEnd");\n });\n this.emitter.on("error", (err) => {\n this.isError = true;\n this.readable.pause();\n reject(err);\n });\n this.emitter.on("checkEnd", () => {\n if (this.outgoing.length > 0) {\n this.triggerOutgoingHandlers();\n return;\n }\n if (this.isStreamEnd && this.executingOutgoingHandlers === 0) {\n if (this.unresolvedLength > 0 && this.unresolvedLength < this.bufferSize) {\n const buffer = this.shiftBufferFromUnresolvedDataArray();\n this.outgoingHandler(() => buffer.getReadableStream(), buffer.size, this.offset)\n .then(resolve)\n .catch(reject);\n }\n else if (this.unresolvedLength >= this.bufferSize) {\n return;\n }\n else {\n resolve();\n }\n }\n });\n });\n }\n /**\n * Insert a new data into unresolved array.\n *\n * @param data -\n */\n appendUnresolvedData(data) {\n this.unresolvedDataArray.push(data);\n this.unresolvedLength += data.length;\n }\n /**\n * Try to shift a buffer with size in blockSize. The buffer returned may be less\n * than blockSize when data in unresolvedDataArray is less than bufferSize.\n *\n */\n shiftBufferFromUnresolvedDataArray(buffer) {\n if (!buffer) {\n buffer = new PooledBuffer(this.bufferSize, this.unresolvedDataArray, this.unresolvedLength);\n }\n else {\n buffer.fill(this.unresolvedDataArray, this.unresolvedLength);\n }\n this.unresolvedLength -= buffer.size;\n return buffer;\n }\n /**\n * Resolve data in unresolvedDataArray. For every buffer with size in blockSize\n * shifted, it will try to get (or allocate a buffer) from incoming, and fill it,\n * then push it into outgoing to be handled by outgoing handler.\n *\n * Return false when available buffers in incoming are not enough, else true.\n *\n * @returns Return false when buffers in incoming are not enough, else true.\n */\n resolveData() {\n while (this.unresolvedLength >= this.bufferSize) {\n let buffer;\n if (this.incoming.length > 0) {\n buffer = this.incoming.shift();\n this.shiftBufferFromUnresolvedDataArray(buffer);\n }\n else {\n if (this.numBuffers < this.maxBuffers) {\n buffer = this.shiftBufferFromUnresolvedDataArray();\n this.numBuffers++;\n }\n else {\n // No available buffer, wait for buffer returned\n return false;\n }\n }\n this.outgoing.push(buffer);\n this.triggerOutgoingHandlers();\n }\n return true;\n }\n /**\n * Try to trigger a outgoing handler for every buffer in outgoing. Stop when\n * concurrency reaches.\n */\n async triggerOutgoingHandlers() {\n let buffer;\n do {\n if (this.executingOutgoingHandlers >= this.concurrency) {\n return;\n }\n buffer = this.outgoing.shift();\n if (buffer) {\n this.triggerOutgoingHandler(buffer);\n }\n } while (buffer);\n }\n /**\n * Trigger a outgoing handler for a buffer shifted from outgoing.\n *\n * @param buffer -\n */\n async triggerOutgoingHandler(buffer) {\n const bufferLength = buffer.size;\n this.executingOutgoingHandlers++;\n this.offset += bufferLength;\n try {\n await this.outgoingHandler(() => buffer.getReadableStream(), bufferLength, this.offset - bufferLength);\n }\n catch (err) {\n this.emitter.emit("error", err);\n return;\n }\n this.executingOutgoingHandlers--;\n this.reuseBuffer(buffer);\n this.emitter.emit("checkEnd");\n }\n /**\n * Return buffer used by outgoing handler into incoming.\n *\n * @param buffer -\n */\n reuseBuffer(buffer) {\n this.incoming.push(buffer);\n if (!this.isError && this.resolveData() && !this.isStreamEnd) {\n this.readable.resume();\n }\n }\n}\n//# sourceMappingURL=BufferScheduler.js.map\n// EXTERNAL MODULE: external "fs"\nvar external_fs_ = __webpack_require__(79896);\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/utils.node.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n/**\n * Reads a readable stream into buffer. Fill the buffer from offset to end.\n *\n * @param stream - A Node.js Readable stream\n * @param buffer - Buffer to be filled, length must greater than or equal to offset\n * @param offset - From which position in the buffer to be filled, inclusive\n * @param end - To which position in the buffer to be filled, exclusive\n * @param encoding - Encoding of the Readable stream\n */\nasync function streamToBuffer(stream, buffer, offset, end, encoding) {\n let pos = 0; // Position in stream\n const count = end - offset; // Total amount of data needed in stream\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => reject(new Error(`The operation cannot be completed in timeout.`)), REQUEST_TIMEOUT);\n stream.on("readable", () => {\n if (pos >= count) {\n clearTimeout(timeout);\n resolve();\n return;\n }\n let chunk = stream.read();\n if (!chunk) {\n return;\n }\n if (typeof chunk === "string") {\n chunk = Buffer.from(chunk, encoding);\n }\n // How much data needed in this chunk\n const chunkLength = pos + chunk.length > count ? count - pos : chunk.length;\n buffer.fill(chunk.slice(0, chunkLength), offset + pos, offset + pos + chunkLength);\n pos += chunkLength;\n });\n stream.on("end", () => {\n clearTimeout(timeout);\n if (pos < count) {\n reject(new Error(`Stream drains before getting enough data needed. Data read: ${pos}, data need: ${count}`));\n }\n resolve();\n });\n stream.on("error", (msg) => {\n clearTimeout(timeout);\n reject(msg);\n });\n });\n}\n/**\n * Reads a readable stream into buffer entirely.\n *\n * @param stream - A Node.js Readable stream\n * @param buffer - Buffer to be filled, length must greater than or equal to offset\n * @param encoding - Encoding of the Readable stream\n * @returns with the count of bytes read.\n * @throws `RangeError` If buffer size is not big enough.\n */\nasync function streamToBuffer2(stream, buffer, encoding) {\n let pos = 0; // Position in stream\n const bufferSize = buffer.length;\n return new Promise((resolve, reject) => {\n stream.on("readable", () => {\n let chunk = stream.read();\n if (!chunk) {\n return;\n }\n if (typeof chunk === "string") {\n chunk = Buffer.from(chunk, encoding);\n }\n if (pos + chunk.length > bufferSize) {\n reject(new Error(`Stream exceeds buffer size. Buffer size: ${bufferSize}`));\n return;\n }\n buffer.fill(chunk, pos, pos + chunk.length);\n pos += chunk.length;\n });\n stream.on("end", () => {\n resolve(pos);\n });\n stream.on("error", reject);\n });\n}\n/**\n * Reads a readable stream into a buffer.\n *\n * @param stream - A Node.js Readable stream\n * @param encoding - Encoding of the Readable stream\n * @returns with the count of bytes read.\n */\nasync function streamToBuffer3(readableStream, encoding) {\n return new Promise((resolve, reject) => {\n const chunks = [];\n readableStream.on("data", (data) => {\n chunks.push(data instanceof Buffer ? data : Buffer.from(data, encoding));\n });\n readableStream.on("end", () => {\n resolve(Buffer.concat(chunks));\n });\n readableStream.on("error", reject);\n });\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Writes the content of a readstream to a local file. Returns a Promise which is completed after the file handle is closed.\n *\n * @param rs - The read stream.\n * @param file - Destination file path.\n */\nasync function readStreamToLocalFile(rs, file) {\n return new Promise((resolve, reject) => {\n const ws = external_fs_.createWriteStream(file);\n rs.on("error", (err) => {\n reject(err);\n });\n ws.on("error", (err) => {\n reject(err);\n });\n ws.on("close", resolve);\n rs.pipe(ws);\n });\n}\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Promisified version of fs.stat().\n */\nconst fsStat = external_util_.promisify(external_fs_.stat);\nconst fsCreateReadStream = external_fs_.createReadStream;\n//# sourceMappingURL=utils.node.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/Clients.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * A BlobClient represents a URL to an Azure Storage blob; the blob may be a block blob,\n * append blob, or page blob.\n */\nclass BlobClient extends StorageClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n options = options || {};\n let pipeline;\n let url;\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n options = blobNameOrOptions;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n // The second parameter is undefined. Use anonymous credential.\n url = urlOrConnectionString;\n if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {\n options = blobNameOrOptions;\n }\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string" &&\n blobNameOrOptions &&\n typeof blobNameOrOptions === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const blobName = blobNameOrOptions;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName and blobName parameters");\n }\n super(url, pipeline);\n ({ blobName: this._name, containerName: this._containerName } =\n this.getBlobAndContainerNamesFromUrl());\n this.blobContext = new blob_Blob(this.storageClientContext);\n this._snapshot = getURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT);\n this._versionId = getURLParameter(this.url, constants_URLConstants.Parameters.VERSIONID);\n }\n /**\n * The name of the blob.\n */\n get name() {\n return this._name;\n }\n /**\n * The name of the storage container the blob is associated with.\n */\n get containerName() {\n return this._containerName;\n }\n /**\n * Creates a new BlobClient object identical to the source but with the specified snapshot timestamp.\n * Provide "" will remove the snapshot and return a Client to the base blob.\n *\n * @param snapshot - The snapshot timestamp.\n * @returns A new BlobClient object identical to the source but with the specified snapshot timestamp\n */\n withSnapshot(snapshot) {\n return new BlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);\n }\n /**\n * Creates a new BlobClient object pointing to a version of this blob.\n * Provide "" will remove the versionId and return a Client to the base blob.\n *\n * @param versionId - The versionId.\n * @returns A new BlobClient object pointing to the version of this blob.\n */\n withVersion(versionId) {\n return new BlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.VERSIONID, versionId.length === 0 ? undefined : versionId), this.pipeline);\n }\n /**\n * Creates a AppendBlobClient object.\n *\n */\n getAppendBlobClient() {\n return new AppendBlobClient(this.url, this.pipeline);\n }\n /**\n * Creates a BlockBlobClient object.\n *\n */\n getBlockBlobClient() {\n return new BlockBlobClient(this.url, this.pipeline);\n }\n /**\n * Creates a PageBlobClient object.\n *\n */\n getPageBlobClient() {\n return new PageBlobClient(this.url, this.pipeline);\n }\n /**\n * Reads or downloads a blob from the system, including its metadata and properties.\n * You can also call Get Blob to read a snapshot.\n *\n * * In Node.js, data returns in a Readable stream readableStreamBody\n * * In browsers, data returns in a promise blobBody\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob\n *\n * @param offset - From which position of the blob to download, greater than or equal to 0\n * @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined\n * @param options - Optional options to Blob Download operation.\n *\n *\n * Example usage (Node.js):\n *\n * ```js\n * // Download and convert a blob to a string\n * const downloadBlockBlobResponse = await blobClient.download();\n * const downloaded = await streamToBuffer(downloadBlockBlobResponse.readableStreamBody);\n * console.log("Downloaded blob content:", downloaded.toString());\n *\n * async function streamToBuffer(readableStream) {\n * return new Promise((resolve, reject) => {\n * const chunks = [];\n * readableStream.on("data", (data) => {\n * chunks.push(data instanceof Buffer ? data : Buffer.from(data));\n * });\n * readableStream.on("end", () => {\n * resolve(Buffer.concat(chunks));\n * });\n * readableStream.on("error", reject);\n * });\n * }\n * ```\n *\n * Example usage (browser):\n *\n * ```js\n * // Download and convert a blob to a string\n * const downloadBlockBlobResponse = await blobClient.download();\n * const downloaded = await blobToString(await downloadBlockBlobResponse.blobBody);\n * console.log(\n * "Downloaded blob content",\n * downloaded\n * );\n *\n * async function blobToString(blob: Blob): Promise {\n * const fileReader = new FileReader();\n * return new Promise((resolve, reject) => {\n * fileReader.onloadend = (ev: any) => {\n * resolve(ev.target!.result);\n * };\n * fileReader.onerror = reject;\n * fileReader.readAsText(blob);\n * });\n * }\n * ```\n */\n async download(offset = 0, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n options.conditions = options.conditions || {};\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n const { span, updatedOptions } = tracing_createSpan("BlobClient-download", options);\n try {\n const res = await this.blobContext.download(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), requestOptions: {\n onDownloadProgress: checkEnvironment_isNode ? undefined : options.onProgress, // for Node.js, progress is reported by RetriableReadableStream\n }, range: offset === 0 && !count ? undefined : rangeToString({ offset, count }), rangeGetContentMD5: options.rangeGetContentMD5, rangeGetContentCRC64: options.rangeGetContentCrc64, snapshot: options.snapshot, cpkInfo: options.customerProvidedKey }, convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedRes = Object.assign(Object.assign({}, res), { _response: res._response, objectReplicationDestinationPolicyId: res.objectReplicationPolicyId, objectReplicationSourceProperties: parseObjectReplicationRecord(res.objectReplicationRules) });\n // Return browser response immediately\n if (!checkEnvironment_isNode) {\n return wrappedRes;\n }\n // We support retrying when download stream unexpected ends in Node.js runtime\n // Following code shouldn\'t be bundled into browser build, however some\n // bundlers may try to bundle following code and "FileReadResponse.ts".\n // In this case, "FileDownloadResponse.browser.ts" will be used as a shim of "FileDownloadResponse.ts"\n // The config is in package.json "browser" field\n if (options.maxRetryRequests === undefined || options.maxRetryRequests < 0) {\n // TODO: Default value or make it a required parameter?\n options.maxRetryRequests = DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS;\n }\n if (res.contentLength === undefined) {\n throw new RangeError(`File download response doesn\'t contain valid content length header`);\n }\n if (!res.etag) {\n throw new RangeError(`File download response doesn\'t contain valid etag header`);\n }\n return new BlobDownloadResponse(wrappedRes, async (start) => {\n var _a;\n const updatedDownloadOptions = {\n leaseAccessConditions: options.conditions,\n modifiedAccessConditions: {\n ifMatch: options.conditions.ifMatch || res.etag,\n ifModifiedSince: options.conditions.ifModifiedSince,\n ifNoneMatch: options.conditions.ifNoneMatch,\n ifUnmodifiedSince: options.conditions.ifUnmodifiedSince,\n ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions,\n },\n range: rangeToString({\n count: offset + res.contentLength - start,\n offset: start,\n }),\n rangeGetContentMD5: options.rangeGetContentMD5,\n rangeGetContentCRC64: options.rangeGetContentCrc64,\n snapshot: options.snapshot,\n cpkInfo: options.customerProvidedKey,\n };\n // Debug purpose only\n // console.log(\n // `Read from internal stream, range: ${\n // updatedOptions.range\n // }, options: ${JSON.stringify(updatedOptions)}`\n // );\n return (await this.blobContext.download(Object.assign({ abortSignal: options.abortSignal }, updatedDownloadOptions))).readableStreamBody;\n }, offset, res.contentLength, {\n maxRetryRequests: options.maxRetryRequests,\n onProgress: options.onProgress,\n });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns true if the Azure blob resource represented by this client exists; false otherwise.\n *\n * NOTE: use this function with care since an existing blob might be deleted by other clients or\n * applications. Vice versa new blobs might be added by other clients or applications after this\n * function completes.\n *\n * @param options - options to Exists operation.\n */\n async exists(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-exists", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n await this.getProperties({\n abortSignal: options.abortSignal,\n customerProvidedKey: options.customerProvidedKey,\n conditions: options.conditions,\n tracingOptions: updatedOptions.tracingOptions,\n });\n return true;\n }\n catch (e) {\n if (e.statusCode === 404) {\n // Expected exception when checking blob existence\n return false;\n }\n else if (e.statusCode === 409 &&\n (e.details.errorCode === BlobUsesCustomerSpecifiedEncryptionMsg ||\n e.details.errorCode === BlobDoesNotUseCustomerSpecifiedEncryption)) {\n // Expected exception when checking blob existence\n return true;\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns all user-defined metadata, standard HTTP properties, and system properties\n * for the blob. It does not return the content of the blob.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-properties\n *\n * WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if\n * they originally contained uppercase characters. This differs from the metadata keys returned by\n * the methods of {@link ContainerClient} that list blobs using the `includeMetadata` option, which\n * will retain their original casing.\n *\n * @param options - Optional options to Get Properties operation.\n */\n async getProperties(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-getProperties", options);\n try {\n options.conditions = options.conditions || {};\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n const res = await this.blobContext.getProperties(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey }, convertTracingToRequestOptionsBase(updatedOptions)));\n return Object.assign(Object.assign({}, res), { _response: res._response, objectReplicationDestinationPolicyId: res.objectReplicationPolicyId, objectReplicationSourceProperties: parseObjectReplicationRecord(res.objectReplicationRules) });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified blob or snapshot for deletion. The blob is later deleted\n * during garbage collection. Note that in order to delete a blob, you must delete\n * all of its snapshots. You can delete both at the same time with the Delete\n * Blob operation.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-blob\n *\n * @param options - Optional options to Blob Delete operation.\n */\n async delete(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-delete", options);\n options.conditions = options.conditions || {};\n try {\n return await this.blobContext.delete(Object.assign({ abortSignal: options.abortSignal, deleteSnapshots: options.deleteSnapshots, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified blob or snapshot for deletion if it exists. The blob is later deleted\n * during garbage collection. Note that in order to delete a blob, you must delete\n * all of its snapshots. You can delete both at the same time with the Delete\n * Blob operation.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-blob\n *\n * @param options - Optional options to Blob Delete operation.\n */\n async deleteIfExists(options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-deleteIfExists", options);\n try {\n const res = await this.delete(updatedOptions);\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "BlobNotFound") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when deleting a blob or snapshot only if it exists.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Restores the contents and metadata of soft deleted blob and any associated\n * soft deleted snapshots. Undelete Blob is supported only on version 2017-07-29\n * or later.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/undelete-blob\n *\n * @param options - Optional options to Blob Undelete operation.\n */\n async undelete(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-undelete", options);\n try {\n return await this.blobContext.undelete(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets system properties on the blob.\n *\n * If no value provided, or no value provided for the specified blob HTTP headers,\n * these blob HTTP headers without a value will be cleared.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-properties\n *\n * @param blobHTTPHeaders - If no value provided, or no value provided for\n * the specified blob HTTP headers, these blob HTTP\n * headers without a value will be cleared.\n * A common header to set is `blobContentType`\n * enabling the browser to provide functionality\n * based on file type.\n * @param options - Optional options to Blob Set HTTP Headers operation.\n */\n async setHTTPHeaders(blobHTTPHeaders, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setHTTPHeaders", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blobContext.setHttpHeaders(Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: blobHTTPHeaders, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets user-defined metadata for the specified blob as one or more name-value pairs.\n *\n * If no option provided, or no metadata defined in the parameter, the blob\n * metadata will be removed.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata\n *\n * @param metadata - Replace existing metadata with this value.\n * If no value provided the existing metadata will be removed.\n * @param options - Optional options to Set Metadata operation.\n */\n async setMetadata(metadata, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setMetadata", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blobContext.setMetadata(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets tags on the underlying blob.\n * A blob can have up to 10 tags. Tag keys must be between 1 and 128 characters. Tag values must be between 0 and 256 characters.\n * Valid tag key and value characters include lower and upper case letters, digits (0-9),\n * space (\' \'), plus (\'+\'), minus (\'-\'), period (\'.\'), foward slash (\'/\'), colon (\':\'), equals (\'=\'), and underscore (\'_\').\n *\n * @param tags -\n * @param options -\n */\n async setTags(tags, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setTags", options);\n try {\n return await this.blobContext.setTags(Object.assign(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)), { tags: toBlobTags(tags) }));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Gets the tags associated with the underlying blob.\n *\n * @param options -\n */\n async getTags(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-getTags", options);\n try {\n const response = await this.blobContext.getTags(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, tags: toTags({ blobTagSet: response.blobTagSet }) || {} });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Get a {@link BlobLeaseClient} that manages leases on the blob.\n *\n * @param proposeLeaseId - Initial proposed lease Id.\n * @returns A new BlobLeaseClient object for managing leases on the blob.\n */\n getBlobLeaseClient(proposeLeaseId) {\n return new BlobLeaseClient(this, proposeLeaseId);\n }\n /**\n * Creates a read-only snapshot of a blob.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/snapshot-blob\n *\n * @param options - Optional options to the Blob Create Snapshot operation.\n */\n async createSnapshot(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-createSnapshot", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blobContext.createSnapshot(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Asynchronously copies a blob to a destination within the storage account.\n * This method returns a long running operation poller that allows you to wait\n * indefinitely until the copy is completed.\n * You can also cancel a copy before it is completed by calling `cancelOperation` on the poller.\n * Note that the onProgress callback will not be invoked if the operation completes in the first\n * request, and attempting to cancel a completed copy will result in an error being thrown.\n *\n * In version 2012-02-12 and later, the source for a Copy Blob operation can be\n * a committed blob in any Azure storage account.\n * Beginning with version 2015-02-21, the source for a Copy Blob operation can be\n * an Azure file in any Azure storage account.\n * Only storage accounts created on or after June 7th, 2012 allow the Copy Blob\n * operation to copy from another storage account.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob\n *\n * Example using automatic polling:\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\');\n * const result = await copyPoller.pollUntilDone();\n * ```\n *\n * Example using manual polling:\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\');\n * while (!poller.isDone()) {\n * await poller.poll();\n * }\n * const result = copyPoller.getResult();\n * ```\n *\n * Example using progress updates:\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\', {\n * onProgress(state) {\n * console.log(`Progress: ${state.copyProgress}`);\n * }\n * });\n * const result = await copyPoller.pollUntilDone();\n * ```\n *\n * Example using a changing polling interval (default 15 seconds):\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\', {\n * intervalInMs: 1000 // poll blob every 1 second for copy progress\n * });\n * const result = await copyPoller.pollUntilDone();\n * ```\n *\n * Example using copy cancellation:\n *\n * ```js\n * const copyPoller = await blobClient.beginCopyFromURL(\'url\');\n * // cancel operation after starting it.\n * try {\n * await copyPoller.cancelOperation();\n * // calls to get the result now throw PollerCancelledError\n * await copyPoller.getResult();\n * } catch (err) {\n * if (err.name === \'PollerCancelledError\') {\n * console.log(\'The copy was cancelled.\');\n * }\n * }\n * ```\n *\n * @param copySource - url to the source Azure Blob/File.\n * @param options - Optional options to the Blob Start Copy From URL operation.\n */\n async beginCopyFromURL(copySource, options = {}) {\n const client = {\n abortCopyFromURL: (...args) => this.abortCopyFromURL(...args),\n getProperties: (...args) => this.getProperties(...args),\n startCopyFromURL: (...args) => this.startCopyFromURL(...args),\n };\n const poller = new BlobBeginCopyFromUrlPoller({\n blobClient: client,\n copySource,\n intervalInMs: options.intervalInMs,\n onProgress: options.onProgress,\n resumeFrom: options.resumeFrom,\n startCopyFromURLOptions: options,\n });\n // Trigger the startCopyFromURL call by calling poll.\n // Any errors from this method should be surfaced to the user.\n await poller.poll();\n return poller;\n }\n /**\n * Aborts a pending asynchronous Copy Blob operation, and leaves a destination blob with zero\n * length and full metadata. Version 2012-02-12 and newer.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob\n *\n * @param copyId - Id of the Copy From URL operation.\n * @param options - Optional options to the Blob Abort Copy From URL operation.\n */\n async abortCopyFromURL(copyId, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-abortCopyFromURL", options);\n try {\n return await this.blobContext.abortCopyFromURL(copyId, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The synchronous Copy From URL operation copies a blob or an internet resource to a new blob. It will not\n * return a response until the copy is complete.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url\n *\n * @param copySource - The source URL to copy from, Shared Access Signature(SAS) maybe needed for authentication\n * @param options -\n */\n async syncCopyFromURL(copySource, options = {}) {\n var _a, _b, _c;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-syncCopyFromURL", options);\n options.conditions = options.conditions || {};\n options.sourceConditions = options.sourceConditions || {};\n try {\n return await this.blobContext.copyFromURL(copySource, Object.assign({ abortSignal: options.abortSignal, metadata: options.metadata, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: options.sourceConditions.ifMatch,\n sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,\n sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,\n sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,\n }, sourceContentMD5: options.sourceContentMD5, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags), immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, encryptionScope: options.encryptionScope, copySourceTags: options.copySourceTags }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets the tier on a blob. The operation is allowed on a page blob in a premium\n * storage account and on a block blob in a blob storage account (locally redundant\n * storage only). A premium page blob\'s tier determines the allowed size, IOPS,\n * and bandwidth of the blob. A block blob\'s tier determines Hot/Cool/Archive\n * storage type. This operation does not update the blob\'s ETag.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tier\n *\n * @param tier - The tier to be set on the blob. Valid values are Hot, Cool, or Archive.\n * @param options - Optional options to the Blob Set Tier operation.\n */\n async setAccessTier(tier, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setAccessTier", options);\n try {\n return await this.blobContext.setTier(toAccessTier(tier), Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), rehydratePriority: options.rehydratePriority }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n async downloadToBuffer(param1, param2, param3, param4 = {}) {\n let buffer;\n let offset = 0;\n let count = 0;\n let options = param4;\n if (param1 instanceof Buffer) {\n buffer = param1;\n offset = param2 || 0;\n count = typeof param3 === "number" ? param3 : 0;\n }\n else {\n offset = typeof param1 === "number" ? param1 : 0;\n count = typeof param2 === "number" ? param2 : 0;\n options = param3 || {};\n }\n const { span, updatedOptions } = tracing_createSpan("BlobClient-downloadToBuffer", options);\n try {\n if (!options.blockSize) {\n options.blockSize = 0;\n }\n if (options.blockSize < 0) {\n throw new RangeError("blockSize option must be >= 0");\n }\n if (options.blockSize === 0) {\n options.blockSize = DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;\n }\n if (offset < 0) {\n throw new RangeError("offset option must be >= 0");\n }\n if (count && count <= 0) {\n throw new RangeError("count option must be greater than 0");\n }\n if (!options.conditions) {\n options.conditions = {};\n }\n // Customer doesn\'t specify length, get it\n if (!count) {\n const response = await this.getProperties(Object.assign(Object.assign({}, options), { tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)) }));\n count = response.contentLength - offset;\n if (count < 0) {\n throw new RangeError(`offset ${offset} shouldn\'t be larger than blob size ${response.contentLength}`);\n }\n }\n // Allocate the buffer of size = count if the buffer is not provided\n if (!buffer) {\n try {\n buffer = Buffer.alloc(count);\n }\n catch (error) {\n throw new Error(`Unable to allocate the buffer of size: ${count}(in bytes). Please try passing your own buffer to the "downloadToBuffer" method or try using other methods like "download" or "downloadToFile".\\t ${error.message}`);\n }\n }\n if (buffer.length < count) {\n throw new RangeError(`The buffer\'s size should be equal to or larger than the request count of bytes: ${count}`);\n }\n let transferProgress = 0;\n const batch = new Batch(options.concurrency);\n for (let off = offset; off < offset + count; off = off + options.blockSize) {\n batch.addOperation(async () => {\n // Exclusive chunk end position\n let chunkEnd = offset + count;\n if (off + options.blockSize < chunkEnd) {\n chunkEnd = off + options.blockSize;\n }\n const response = await this.download(off, chunkEnd - off, {\n abortSignal: options.abortSignal,\n conditions: options.conditions,\n maxRetryRequests: options.maxRetryRequestsPerBlock,\n customerProvidedKey: options.customerProvidedKey,\n tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)),\n });\n const stream = response.readableStreamBody;\n await streamToBuffer(stream, buffer, off - offset, chunkEnd - offset);\n // Update progress after block is downloaded, in case of block trying\n // Could provide finer grained progress updating inside HTTP requests,\n // only if convenience layer download try is enabled\n transferProgress += chunkEnd - off;\n if (options.onProgress) {\n options.onProgress({ loadedBytes: transferProgress });\n }\n });\n }\n await batch.do();\n return buffer;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Downloads an Azure Blob to a local file.\n * Fails if the the given file path already exits.\n * Offset and count are optional, pass 0 and undefined respectively to download the entire blob.\n *\n * @param filePath -\n * @param offset - From which position of the block blob to download.\n * @param count - How much data to be downloaded. Will download to the end when passing undefined.\n * @param options - Options to Blob download options.\n * @returns The response data for blob download operation,\n * but with readableStreamBody set to undefined since its\n * content is already read and written into a local file\n * at the specified path.\n */\n async downloadToFile(filePath, offset = 0, count, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-downloadToFile", options);\n try {\n const response = await this.download(offset, count, Object.assign(Object.assign({}, options), { tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)) }));\n if (response.readableStreamBody) {\n await readStreamToLocalFile(response.readableStreamBody, filePath);\n }\n // The stream is no longer accessible so setting it to undefined.\n response.blobDownloadStream = undefined;\n return response;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n getBlobAndContainerNamesFromUrl() {\n let containerName;\n let blobName;\n try {\n // URL may look like the following\n // "https://myaccount.blob.core.windows.net/mycontainer/blob?sasString";\n // "https://myaccount.blob.core.windows.net/mycontainer/blob";\n // "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt?sasString";\n // "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt";\n // IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername/blob`\n // http://localhost:10001/devstoreaccount1/containername/blob\n const parsedUrl = URLBuilder.parse(this.url);\n if (parsedUrl.getHost().split(".")[1] === "blob") {\n // "https://myaccount.blob.core.windows.net/containername/blob".\n // .getPath() -> /containername/blob\n const pathComponents = parsedUrl.getPath().match("/([^/]*)(/(.*))?");\n containerName = pathComponents[1];\n blobName = pathComponents[3];\n }\n else if (isIpEndpointStyle(parsedUrl)) {\n // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername/blob\n // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername/blob\n // .getPath() -> /devstoreaccount1/containername/blob\n const pathComponents = parsedUrl.getPath().match("/([^/]*)/([^/]*)(/(.*))?");\n containerName = pathComponents[2];\n blobName = pathComponents[4];\n }\n else {\n // "https://customdomain.com/containername/blob".\n // .getPath() -> /containername/blob\n const pathComponents = parsedUrl.getPath().match("/([^/]*)(/(.*))?");\n containerName = pathComponents[1];\n blobName = pathComponents[3];\n }\n // decode the encoded blobName, containerName - to get all the special characters that might be present in them\n containerName = decodeURIComponent(containerName);\n blobName = decodeURIComponent(blobName);\n // Azure Storage Server will replace "\\" with "/" in the blob names\n // doing the same in the SDK side so that the user doesn\'t have to replace "\\" instances in the blobName\n blobName = blobName.replace(/\\\\/g, "/");\n if (!containerName) {\n throw new Error("Provided containerName is invalid.");\n }\n return { blobName, containerName };\n }\n catch (error) {\n throw new Error("Unable to extract blobName and containerName with provided information.");\n }\n }\n /**\n * Asynchronously copies a blob to a destination within the storage account.\n * In version 2012-02-12 and later, the source for a Copy Blob operation can be\n * a committed blob in any Azure storage account.\n * Beginning with version 2015-02-21, the source for a Copy Blob operation can be\n * an Azure file in any Azure storage account.\n * Only storage accounts created on or after June 7th, 2012 allow the Copy Blob\n * operation to copy from another storage account.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob\n *\n * @param copySource - url to the source Azure Blob/File.\n * @param options - Optional options to the Blob Start Copy From URL operation.\n */\n async startCopyFromURL(copySource, options = {}) {\n var _a, _b, _c;\n const { span, updatedOptions } = tracing_createSpan("BlobClient-startCopyFromURL", options);\n options.conditions = options.conditions || {};\n options.sourceConditions = options.sourceConditions || {};\n try {\n return await this.blobContext.startCopyFromURL(copySource, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: options.sourceConditions.ifMatch,\n sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,\n sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,\n sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,\n sourceIfTags: options.sourceConditions.tagConditions,\n }, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, rehydratePriority: options.rehydratePriority, tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags), sealBlob: options.sealBlob }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Only available for BlobClient constructed with a shared key credential.\n *\n * Generates a Blob Service Shared Access Signature (SAS) URI based on the client properties\n * and parameters passed in. The SAS is signed by the shared key credential of the client.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas\n *\n * @param options - Optional parameters.\n * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.\n */\n generateSasUrl(options) {\n return new Promise((resolve) => {\n if (!(this.credential instanceof StorageSharedKeyCredential)) {\n throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");\n }\n const sas = generateBlobSASQueryParameters(Object.assign({ containerName: this._containerName, blobName: this._name, snapshotTime: this._snapshot, versionId: this._versionId }, options), this.credential).toString();\n resolve(appendToURLQuery(this.url, sas));\n });\n }\n /**\n * Delete the immutablility policy on the blob.\n *\n * @param options - Optional options to delete immutability policy on the blob.\n */\n async deleteImmutabilityPolicy(options) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-deleteImmutabilityPolicy", options);\n try {\n return await this.blobContext.deleteImmutabilityPolicy(Object.assign({ abortSignal: options === null || options === void 0 ? void 0 : options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Set immutablility policy on the blob.\n *\n * @param options - Optional options to set immutability policy on the blob.\n */\n async setImmutabilityPolicy(immutabilityPolicy, options) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setImmutabilityPolicy", options);\n try {\n return await this.blobContext.setImmutabilityPolicy(Object.assign({ abortSignal: options === null || options === void 0 ? void 0 : options.abortSignal, immutabilityPolicyExpiry: immutabilityPolicy.expiriesOn, immutabilityPolicyMode: immutabilityPolicy.policyMode, modifiedAccessConditions: options === null || options === void 0 ? void 0 : options.modifiedAccessCondition }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Set legal hold on the blob.\n *\n * @param options - Optional options to set legal hold on the blob.\n */\n async setLegalHold(legalHoldEnabled, options) {\n const { span, updatedOptions } = tracing_createSpan("BlobClient-setLegalHold", options);\n try {\n return await this.blobContext.setLegalHold(legalHoldEnabled, Object.assign({ abortSignal: options === null || options === void 0 ? void 0 : options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n/**\n * AppendBlobClient defines a set of operations applicable to append blobs.\n */\nclass AppendBlobClient extends BlobClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.\n // super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);\n let pipeline;\n let url;\n options = options || {};\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions) url = urlOrConnectionString;\n url = urlOrConnectionString;\n options = blobNameOrOptions;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n // The second parameter is undefined. Use anonymous credential.\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string" &&\n blobNameOrOptions &&\n typeof blobNameOrOptions === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const blobName = blobNameOrOptions;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName and blobName parameters");\n }\n super(url, pipeline);\n this.appendBlobContext = new AppendBlob(this.storageClientContext);\n }\n /**\n * Creates a new AppendBlobClient object identical to the source but with the\n * specified snapshot timestamp.\n * Provide "" will remove the snapshot and return a Client to the base blob.\n *\n * @param snapshot - The snapshot timestamp.\n * @returns A new AppendBlobClient object identical to the source but with the specified snapshot timestamp.\n */\n withSnapshot(snapshot) {\n return new AppendBlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);\n }\n /**\n * Creates a 0-length append blob. Call AppendBlock to append data to an append blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param options - Options to the Append Block Create operation.\n *\n *\n * Example usage:\n *\n * ```js\n * const appendBlobClient = containerClient.getAppendBlobClient("");\n * await appendBlobClient.create();\n * ```\n */\n async create(options = {}) {\n var _a, _b, _c;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-create", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.appendBlobContext.create(0, Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, blobTagsString: toBlobTagsString(options.tags) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a 0-length append blob. Call AppendBlock to append data to an append blob.\n * If the blob with the same name already exists, the content of the existing blob will remain unchanged.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param options -\n */\n async createIfNotExists(options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-createIfNotExists", options);\n const conditions = { ifNoneMatch: ETagAny };\n try {\n const res = await this.create(Object.assign(Object.assign({}, updatedOptions), { conditions }));\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "BlobAlreadyExists") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when creating a blob only if it does not already exist.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Seals the append blob, making it read only.\n *\n * @param options -\n */\n async seal(options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-seal", options);\n options.conditions = options.conditions || {};\n try {\n return await this.appendBlobContext.seal(Object.assign({ abortSignal: options.abortSignal, appendPositionAccessConditions: options.conditions, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Commits a new block of data to the end of the existing append blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/append-block\n *\n * @param body - Data to be appended.\n * @param contentLength - Length of the body in bytes.\n * @param options - Options to the Append Block operation.\n *\n *\n * Example usage:\n *\n * ```js\n * const content = "Hello World!";\n *\n * // Create a new append blob and append data to the blob.\n * const newAppendBlobClient = containerClient.getAppendBlobClient("");\n * await newAppendBlobClient.create();\n * await newAppendBlobClient.appendBlock(content, content.length);\n *\n * // Append data to an existing append blob.\n * const existingAppendBlobClient = containerClient.getAppendBlobClient("");\n * await existingAppendBlobClient.appendBlock(content, content.length);\n * ```\n */\n async appendBlock(body, contentLength, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-appendBlock", options);\n options.conditions = options.conditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.appendBlobContext.appendBlock(contentLength, body, Object.assign({ abortSignal: options.abortSignal, appendPositionAccessConditions: options.conditions, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), requestOptions: {\n onUploadProgress: options.onProgress,\n }, transactionalContentMD5: options.transactionalContentMD5, transactionalContentCrc64: options.transactionalContentCrc64, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Append Block operation commits a new block of data to the end of an existing append blob\n * where the contents are read from a source url.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/append-block-from-url\n *\n * @param sourceURL -\n * The url to the blob that will be the source of the copy. A source blob in the same storage account can\n * be authenticated via Shared Key. However, if the source is a blob in another account, the source blob\n * must either be public or must be authenticated via a shared access signature. If the source blob is\n * public, no authentication is required to perform the operation.\n * @param sourceOffset - Offset in source to be appended\n * @param count - Number of bytes to be appended as a block\n * @param options -\n */\n async appendBlockFromURL(sourceURL, sourceOffset, count, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("AppendBlobClient-appendBlockFromURL", options);\n options.conditions = options.conditions || {};\n options.sourceConditions = options.sourceConditions || {};\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.appendBlobContext.appendBlockFromUrl(sourceURL, 0, Object.assign({ abortSignal: options.abortSignal, sourceRange: rangeToString({ offset: sourceOffset, count }), sourceContentMD5: options.sourceContentMD5, sourceContentCrc64: options.sourceContentCrc64, leaseAccessConditions: options.conditions, appendPositionAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: options.sourceConditions.ifMatch,\n sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,\n sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,\n sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,\n }, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n/**\n * BlockBlobClient defines a set of operations applicable to block blobs.\n */\nclass BlockBlobClient extends BlobClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.\n // super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);\n let pipeline;\n let url;\n options = options || {};\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n options = blobNameOrOptions;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n // The second parameter is undefined. Use anonymous credential.\n url = urlOrConnectionString;\n if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {\n options = blobNameOrOptions;\n }\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string" &&\n blobNameOrOptions &&\n typeof blobNameOrOptions === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const blobName = blobNameOrOptions;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName and blobName parameters");\n }\n super(url, pipeline);\n this.blockBlobContext = new BlockBlob(this.storageClientContext);\n this._blobContext = new blob_Blob(this.storageClientContext);\n }\n /**\n * Creates a new BlockBlobClient object identical to the source but with the\n * specified snapshot timestamp.\n * Provide "" will remove the snapshot and return a URL to the base blob.\n *\n * @param snapshot - The snapshot timestamp.\n * @returns A new BlockBlobClient object identical to the source but with the specified snapshot timestamp.\n */\n withSnapshot(snapshot) {\n return new BlockBlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);\n }\n /**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Quick query for a JSON or CSV formatted blob.\n *\n * Example usage (Node.js):\n *\n * ```js\n * // Query and convert a blob to a string\n * const queryBlockBlobResponse = await blockBlobClient.query("select * from BlobStorage");\n * const downloaded = (await streamToBuffer(queryBlockBlobResponse.readableStreamBody)).toString();\n * console.log("Query blob content:", downloaded);\n *\n * async function streamToBuffer(readableStream) {\n * return new Promise((resolve, reject) => {\n * const chunks = [];\n * readableStream.on("data", (data) => {\n * chunks.push(data instanceof Buffer ? data : Buffer.from(data));\n * });\n * readableStream.on("end", () => {\n * resolve(Buffer.concat(chunks));\n * });\n * readableStream.on("error", reject);\n * });\n * }\n * ```\n *\n * @param query -\n * @param options -\n */\n async query(query, options = {}) {\n var _a;\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-query", options);\n try {\n if (!checkEnvironment_isNode) {\n throw new Error("This operation currently is only supported in Node.js.");\n }\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n const response = await this._blobContext.query(Object.assign({ abortSignal: options.abortSignal, queryRequest: {\n queryType: "SQL",\n expression: query,\n inputSerialization: toQuerySerialization(options.inputTextConfiguration),\n outputSerialization: toQuerySerialization(options.outputTextConfiguration),\n }, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey }, convertTracingToRequestOptionsBase(updatedOptions)));\n return new BlobQueryResponse(response, {\n abortSignal: options.abortSignal,\n onProgress: options.onProgress,\n onError: options.onError,\n });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a new block blob, or updates the content of an existing block blob.\n * Updating an existing block blob overwrites any existing metadata on the blob.\n * Partial updates are not supported; the content of the existing blob is\n * overwritten with the new content. To perform a partial update of a block blob\'s,\n * use {@link stageBlock} and {@link commitBlockList}.\n *\n * This is a non-parallel uploading method, please use {@link uploadFile},\n * {@link uploadStream} or {@link uploadBrowserData} for better performance\n * with concurrency uploading.\n *\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function\n * which returns a new Readable stream whose offset is from data source beginning.\n * @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a\n * string including non non-Base64/Hex-encoded characters.\n * @param options - Options to the Block Blob Upload operation.\n * @returns Response data for the Block Blob Upload operation.\n *\n * Example usage:\n *\n * ```js\n * const content = "Hello world!";\n * const uploadBlobResponse = await blockBlobClient.upload(content, content.length);\n * ```\n */\n async upload(body, contentLength, options = {}) {\n var _a, _b, _c;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-upload", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.upload(contentLength, body, Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), requestOptions: {\n onUploadProgress: options.onProgress,\n }, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a new Block Blob where the contents of the blob are read from a given URL.\n * This API is supported beginning with the 2020-04-08 version. Partial updates\n * are not supported with Put Blob from URL; the content of an existing blob is overwritten with\n * the content of the new blob. To perform partial updates to a block blob’s contents using a\n * source URL, use {@link stageBlockFromURL} and {@link commitBlockList}.\n *\n * @param sourceURL - Specifies the URL of the blob. The value\n * may be a URL of up to 2 KB in length that specifies a blob.\n * The value should be URL-encoded as it would appear\n * in a request URI. The source blob must either be public\n * or must be authenticated via a shared access signature.\n * If the source blob is public, no authentication is required\n * to perform the operation. Here are some examples of source object URLs:\n * - https://myaccount.blob.core.windows.net/mycontainer/myblob\n * - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=\n * @param options - Optional parameters.\n */\n async syncUploadFromURL(sourceURL, options = {}) {\n var _a, _b, _c, _d, _e;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-syncUploadFromURL", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.putBlobFromUrl(0, sourceURL, Object.assign(Object.assign(Object.assign({}, options), { blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: options.conditions.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: (_a = options.sourceConditions) === null || _a === void 0 ? void 0 : _a.ifMatch,\n sourceIfModifiedSince: (_b = options.sourceConditions) === null || _b === void 0 ? void 0 : _b.ifModifiedSince,\n sourceIfNoneMatch: (_c = options.sourceConditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch,\n sourceIfUnmodifiedSince: (_d = options.sourceConditions) === null || _d === void 0 ? void 0 : _d.ifUnmodifiedSince,\n sourceIfTags: (_e = options.sourceConditions) === null || _e === void 0 ? void 0 : _e.tagConditions,\n }, cpkInfo: options.customerProvidedKey, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags), copySourceTags: options.copySourceTags }), convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Uploads the specified block to the block blob\'s "staging area" to be later\n * committed by a call to commitBlockList.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-block\n *\n * @param blockId - A 64-byte value that is base64-encoded\n * @param body - Data to upload to the staging area.\n * @param contentLength - Number of bytes to upload.\n * @param options - Options to the Block Blob Stage Block operation.\n * @returns Response data for the Block Blob Stage Block operation.\n */\n async stageBlock(blockId, body, contentLength, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-stageBlock", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.stageBlock(blockId, contentLength, body, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, requestOptions: {\n onUploadProgress: options.onProgress,\n }, transactionalContentMD5: options.transactionalContentMD5, transactionalContentCrc64: options.transactionalContentCrc64, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Stage Block From URL operation creates a new block to be committed as part\n * of a blob where the contents are read from a URL.\n * This API is available starting in version 2018-03-28.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/put-block-from-url\n *\n * @param blockId - A 64-byte value that is base64-encoded\n * @param sourceURL - Specifies the URL of the blob. The value\n * may be a URL of up to 2 KB in length that specifies a blob.\n * The value should be URL-encoded as it would appear\n * in a request URI. The source blob must either be public\n * or must be authenticated via a shared access signature.\n * If the source blob is public, no authentication is required\n * to perform the operation. Here are some examples of source object URLs:\n * - https://myaccount.blob.core.windows.net/mycontainer/myblob\n * - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=\n * @param offset - From which position of the blob to download, greater than or equal to 0\n * @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined\n * @param options - Options to the Block Blob Stage Block From URL operation.\n * @returns Response data for the Block Blob Stage Block From URL operation.\n */\n async stageBlockFromURL(blockId, sourceURL, offset = 0, count, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-stageBlockFromURL", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.stageBlockFromURL(blockId, 0, sourceURL, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, sourceContentMD5: options.sourceContentMD5, sourceContentCrc64: options.sourceContentCrc64, sourceRange: offset === 0 && !count ? undefined : rangeToString({ offset, count }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Writes a blob by specifying the list of block IDs that make up the blob.\n * In order to be written as part of a blob, a block must have been successfully written\n * to the server in a prior {@link stageBlock} operation. You can call {@link commitBlockList} to\n * update a blob by uploading only those blocks that have changed, then committing the new and existing\n * blocks together. Any blocks not specified in the block list and permanently deleted.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-block-list\n *\n * @param blocks - Array of 64-byte value that is base64-encoded\n * @param options - Options to the Block Blob Commit Block List operation.\n * @returns Response data for the Block Blob Commit Block List operation.\n */\n async commitBlockList(blocks, options = {}) {\n var _a, _b, _c;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-commitBlockList", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.blockBlobContext.commitBlockList({ latest: blocks }, Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns the list of blocks that have been uploaded as part of a block blob\n * using the specified block list filter.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-block-list\n *\n * @param listType - Specifies whether to return the list of committed blocks,\n * the list of uncommitted blocks, or both lists together.\n * @param options - Options to the Block Blob Get Block List operation.\n * @returns Response data for the Block Blob Get Block List operation.\n */\n async getBlockList(listType, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-getBlockList", options);\n try {\n const res = await this.blockBlobContext.getBlockList(listType, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n if (!res.committedBlocks) {\n res.committedBlocks = [];\n }\n if (!res.uncommittedBlocks) {\n res.uncommittedBlocks = [];\n }\n return res;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n // High level functions\n /**\n * Uploads a Buffer(Node.js)/Blob(browsers)/ArrayBuffer/ArrayBufferView object to a BlockBlob.\n *\n * When data length is no more than the specifiled {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is\n * {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.\n * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}\n * to commit the block list.\n *\n * A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is\n * `blobContentType`, enabling the browser to provide\n * functionality based on file type.\n *\n * @param data - Buffer(Node.js), Blob, ArrayBuffer or ArrayBufferView\n * @param options -\n */\n async uploadData(data, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadData", options);\n try {\n if (checkEnvironment_isNode) {\n let buffer;\n if (data instanceof Buffer) {\n buffer = data;\n }\n else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(data);\n }\n else {\n data = data;\n buffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n }\n return this.uploadSeekableInternal((offset, size) => buffer.slice(offset, offset + size), buffer.byteLength, updatedOptions);\n }\n else {\n const browserBlob = new Blob([data]);\n return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);\n }\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * ONLY AVAILABLE IN BROWSERS.\n *\n * Uploads a browser Blob/File/ArrayBuffer/ArrayBufferView object to block blob.\n *\n * When buffer length lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.\n * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call\n * {@link commitBlockList} to commit the block list.\n *\n * A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is\n * `blobContentType`, enabling the browser to provide\n * functionality based on file type.\n *\n * @deprecated Use {@link uploadData} instead.\n *\n * @param browserData - Blob, File, ArrayBuffer or ArrayBufferView\n * @param options - Options to upload browser data.\n * @returns Response data for the Blob Upload operation.\n */\n async uploadBrowserData(browserData, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadBrowserData", options);\n try {\n const browserBlob = new Blob([browserData]);\n return await this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n *\n * Uploads data to block blob. Requires a bodyFactory as the data source,\n * which need to return a {@link HttpRequestBody} object with the offset and size provided.\n *\n * When data length is no more than the specified {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is\n * {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.\n * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}\n * to commit the block list.\n *\n * @param bodyFactory -\n * @param size - size of the data to upload.\n * @param options - Options to Upload to Block Blob operation.\n * @returns Response data for the Blob Upload operation.\n */\n async uploadSeekableInternal(bodyFactory, size, options = {}) {\n if (!options.blockSize) {\n options.blockSize = 0;\n }\n if (options.blockSize < 0 || options.blockSize > BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES) {\n throw new RangeError(`blockSize option must be >= 0 and <= ${BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES}`);\n }\n if (options.maxSingleShotSize !== 0 && !options.maxSingleShotSize) {\n options.maxSingleShotSize = BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES;\n }\n if (options.maxSingleShotSize < 0 ||\n options.maxSingleShotSize > BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES) {\n throw new RangeError(`maxSingleShotSize option must be >= 0 and <= ${BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}`);\n }\n if (options.blockSize === 0) {\n if (size > BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES * BLOCK_BLOB_MAX_BLOCKS) {\n throw new RangeError(`${size} is too larger to upload to a block blob.`);\n }\n if (size > options.maxSingleShotSize) {\n options.blockSize = Math.ceil(size / BLOCK_BLOB_MAX_BLOCKS);\n if (options.blockSize < DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES) {\n options.blockSize = DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;\n }\n }\n }\n if (!options.blobHTTPHeaders) {\n options.blobHTTPHeaders = {};\n }\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadSeekableInternal", options);\n try {\n if (size <= options.maxSingleShotSize) {\n return await this.upload(bodyFactory(0, size), size, updatedOptions);\n }\n const numBlocks = Math.floor((size - 1) / options.blockSize) + 1;\n if (numBlocks > BLOCK_BLOB_MAX_BLOCKS) {\n throw new RangeError(`The buffer\'s size is too big or the BlockSize is too small;` +\n `the number of blocks must be <= ${BLOCK_BLOB_MAX_BLOCKS}`);\n }\n const blockList = [];\n const blockIDPrefix = generateUuid();\n let transferProgress = 0;\n const batch = new Batch(options.concurrency);\n for (let i = 0; i < numBlocks; i++) {\n batch.addOperation(async () => {\n const blockID = generateBlockID(blockIDPrefix, i);\n const start = options.blockSize * i;\n const end = i === numBlocks - 1 ? size : start + options.blockSize;\n const contentLength = end - start;\n blockList.push(blockID);\n await this.stageBlock(blockID, bodyFactory(start, contentLength), contentLength, {\n abortSignal: options.abortSignal,\n conditions: options.conditions,\n encryptionScope: options.encryptionScope,\n tracingOptions: updatedOptions.tracingOptions,\n });\n // Update progress after block is successfully uploaded to server, in case of block trying\n // TODO: Hook with convenience layer progress event in finer level\n transferProgress += contentLength;\n if (options.onProgress) {\n options.onProgress({\n loadedBytes: transferProgress,\n });\n }\n });\n }\n await batch.do();\n return this.commitBlockList(blockList, updatedOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Uploads a local file in blocks to a block blob.\n *\n * When file size lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.\n * Otherwise, this method will call stageBlock to upload blocks, and finally call commitBlockList\n * to commit the block list.\n *\n * @param filePath - Full path of local file\n * @param options - Options to Upload to Block Blob operation.\n * @returns Response data for the Blob Upload operation.\n */\n async uploadFile(filePath, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadFile", options);\n try {\n const size = (await fsStat(filePath)).size;\n return await this.uploadSeekableInternal((offset, count) => {\n return () => fsCreateReadStream(filePath, {\n autoClose: true,\n end: count ? offset + count - 1 : Infinity,\n start: offset,\n });\n }, size, Object.assign(Object.assign({}, options), { tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)) }));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Uploads a Node.js Readable stream into block blob.\n *\n * PERFORMANCE IMPROVEMENT TIPS:\n * * Input stream highWaterMark is better to set a same value with bufferSize\n * parameter, which will avoid Buffer.concat() operations.\n *\n * @param stream - Node.js Readable stream\n * @param bufferSize - Size of every buffer allocated, also the block size in the uploaded block blob. Default value is 8MB\n * @param maxConcurrency - Max concurrency indicates the max number of buffers that can be allocated,\n * positive correlation with max uploading concurrency. Default value is 5\n * @param options - Options to Upload Stream to Block Blob operation.\n * @returns Response data for the Blob Upload operation.\n */\n async uploadStream(stream, bufferSize = DEFAULT_BLOCK_BUFFER_SIZE_BYTES, maxConcurrency = 5, options = {}) {\n if (!options.blobHTTPHeaders) {\n options.blobHTTPHeaders = {};\n }\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("BlockBlobClient-uploadStream", options);\n try {\n let blockNum = 0;\n const blockIDPrefix = generateUuid();\n let transferProgress = 0;\n const blockList = [];\n const scheduler = new BufferScheduler(stream, bufferSize, maxConcurrency, async (body, length) => {\n const blockID = generateBlockID(blockIDPrefix, blockNum);\n blockList.push(blockID);\n blockNum++;\n await this.stageBlock(blockID, body, length, {\n conditions: options.conditions,\n encryptionScope: options.encryptionScope,\n tracingOptions: updatedOptions.tracingOptions,\n });\n // Update progress after block is successfully uploaded to server, in case of block trying\n transferProgress += length;\n if (options.onProgress) {\n options.onProgress({ loadedBytes: transferProgress });\n }\n }, \n // concurrency should set a smaller value than maxConcurrency, which is helpful to\n // reduce the possibility when a outgoing handler waits for stream data, in\n // this situation, outgoing handlers are blocked.\n // Outgoing queue shouldn\'t be empty.\n Math.ceil((maxConcurrency / 4) * 3));\n await scheduler.do();\n return await this.commitBlockList(blockList, Object.assign(Object.assign({}, options), { tracingOptions: Object.assign(Object.assign({}, options.tracingOptions), convertTracingToRequestOptionsBase(updatedOptions)) }));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n/**\n * PageBlobClient defines a set of operations applicable to page blobs.\n */\nclass PageBlobClient extends BlobClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.\n // super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);\n let pipeline;\n let url;\n options = options || {};\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n options = blobNameOrOptions;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n // The second parameter is undefined. Use anonymous credential.\n url = urlOrConnectionString;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string" &&\n blobNameOrOptions &&\n typeof blobNameOrOptions === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const blobName = blobNameOrOptions;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName and blobName parameters");\n }\n super(url, pipeline);\n this.pageBlobContext = new PageBlob(this.storageClientContext);\n }\n /**\n * Creates a new PageBlobClient object identical to the source but with the\n * specified snapshot timestamp.\n * Provide "" will remove the snapshot and return a Client to the base blob.\n *\n * @param snapshot - The snapshot timestamp.\n * @returns A new PageBlobClient object identical to the source but with the specified snapshot timestamp.\n */\n withSnapshot(snapshot) {\n return new PageBlobClient(setURLParameter(this.url, constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);\n }\n /**\n * Creates a page blob of the specified length. Call uploadPages to upload data\n * data to a page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param size - size of the page blob.\n * @param options - Options to the Page Blob Create operation.\n * @returns Response data for the Page Blob Create operation.\n */\n async create(size, options = {}) {\n var _a, _b, _c;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-create", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.pageBlobContext.create(0, size, Object.assign({ abortSignal: options.abortSignal, blobHttpHeaders: options.blobHTTPHeaders, blobSequenceNumber: options.blobSequenceNumber, leaseAccessConditions: options.conditions, metadata: options.metadata, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === void 0 ? void 0 : _b.expiriesOn, immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === void 0 ? void 0 : _c.policyMode, legalHold: options.legalHold, tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a page blob of the specified length. Call uploadPages to upload data\n * data to a page blob. If the blob with the same name already exists, the content\n * of the existing blob will remain unchanged.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param size - size of the page blob.\n * @param options -\n */\n async createIfNotExists(size, options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-createIfNotExists", options);\n try {\n const conditions = { ifNoneMatch: ETagAny };\n const res = await this.create(size, Object.assign(Object.assign({}, options), { conditions, tracingOptions: updatedOptions.tracingOptions }));\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "BlobAlreadyExists") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when creating a blob only if it does not already exist.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Writes 1 or more pages to the page blob. The start and end offsets must be a multiple of 512.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-page\n *\n * @param body - Data to upload\n * @param offset - Offset of destination page blob\n * @param count - Content length of the body, also number of bytes to be uploaded\n * @param options - Options to the Page Blob Upload Pages operation.\n * @returns Response data for the Page Blob Upload Pages operation.\n */\n async uploadPages(body, offset, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-uploadPages", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.pageBlobContext.uploadPages(count, body, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), requestOptions: {\n onUploadProgress: options.onProgress,\n }, range: rangeToString({ offset, count }), sequenceNumberAccessConditions: options.conditions, transactionalContentMD5: options.transactionalContentMD5, transactionalContentCrc64: options.transactionalContentCrc64, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Upload Pages operation writes a range of pages to a page blob where the\n * contents are read from a URL.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/put-page-from-url\n *\n * @param sourceURL - Specify a URL to the copy source, Shared Access Signature(SAS) maybe needed for authentication\n * @param sourceOffset - The source offset to copy from. Pass 0 to copy from the beginning of source page blob\n * @param destOffset - Offset of destination page blob\n * @param count - Number of bytes to be uploaded from source page blob\n * @param options -\n */\n async uploadPagesFromURL(sourceURL, sourceOffset, destOffset, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n options.sourceConditions = options.sourceConditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-uploadPagesFromURL", options);\n try {\n ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);\n return await this.pageBlobContext.uploadPagesFromURL(sourceURL, rangeToString({ offset: sourceOffset, count }), 0, rangeToString({ offset: destOffset, count }), Object.assign({ abortSignal: options.abortSignal, sourceContentMD5: options.sourceContentMD5, sourceContentCrc64: options.sourceContentCrc64, leaseAccessConditions: options.conditions, sequenceNumberAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), sourceModifiedAccessConditions: {\n sourceIfMatch: options.sourceConditions.ifMatch,\n sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,\n sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,\n sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,\n }, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Frees the specified pages from the page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/put-page\n *\n * @param offset - Starting byte position of the pages to clear.\n * @param count - Number of bytes to clear.\n * @param options - Options to the Page Blob Clear Pages operation.\n * @returns Response data for the Page Blob Clear Pages operation.\n */\n async clearPages(offset = 0, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-clearPages", options);\n try {\n return await this.pageBlobContext.clearPages(0, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), range: rangeToString({ offset, count }), sequenceNumberAccessConditions: options.conditions, cpkInfo: options.customerProvidedKey, encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns the list of valid page ranges for a page blob or snapshot of a page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param options - Options to the Page Blob Get Ranges operation.\n * @returns Response data for the Page Blob Get Ranges operation.\n */\n async getPageRanges(offset = 0, count, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-getPageRanges", options);\n try {\n return await this.pageBlobContext\n .getPageRanges(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), range: rangeToString({ offset, count }) }, convertTracingToRequestOptionsBase(updatedOptions)))\n .then(rangeResponseFromModel);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * getPageRangesSegment returns a single segment of page ranges starting from the\n * specified Marker. Use an empty Marker to start enumeration from the beginning.\n * After getting a segment, process it, and then call getPageRangesSegment again\n * (passing the the previously-returned Marker) to get the next segment.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.\n * @param options - Options to PageBlob Get Page Ranges Segment operation.\n */\n async listPageRangesSegment(offset = 0, count, marker, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-getPageRangesSegment", options);\n try {\n return await this.pageBlobContext.getPageRanges(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), range: rangeToString({ offset, count }), marker: marker, maxPageSize: options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesResponseModel}\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param marker - A string value that identifies the portion of\n * the get of page ranges to be returned with the next getting operation. The\n * operation returns the ContinuationToken value within the response body if the\n * getting operation did not return all page ranges remaining within the current page.\n * The ContinuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of get\n * items. The marker value is opaque to the client.\n * @param options - Options to List Page Ranges operation.\n */\n listPageRangeItemSegments(offset = 0, count, marker, options = {}) {\n return __asyncGenerator(this, arguments, function* listPageRangeItemSegments_1() {\n let getPageRangeItemSegmentsResponse;\n if (!!marker || marker === undefined) {\n do {\n getPageRangeItemSegmentsResponse = yield __await(this.listPageRangesSegment(offset, count, marker, options));\n marker = getPageRangeItemSegmentsResponse.continuationToken;\n yield yield __await(yield __await(getPageRangeItemSegmentsResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator of {@link PageRangeInfo} objects\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param options - Options to List Page Ranges operation.\n */\n listPageRangeItems(offset = 0, count, options = {}) {\n return __asyncGenerator(this, arguments, function* listPageRangeItems_1() {\n var e_1, _a;\n let marker;\n try {\n for (var _b = __asyncValues(this.listPageRangeItemSegments(offset, count, marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {\n const getPageRangesSegment = _c.value;\n yield __await(yield* __asyncDelegator(__asyncValues(ExtractPageRangeInfoItems(getPageRangesSegment))));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));\n }\n finally { if (e_1) throw e_1.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list of page ranges for a page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * .byPage() returns an async iterable iterator to list of page ranges for a page blob.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * // Get the pageBlobClient before you run these snippets,\n * // Can be obtained from `blobServiceClient.getContainerClient("").getPageBlobClient("");`\n * let i = 1;\n * for await (const pageRange of pageBlobClient.listPageRanges()) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * let iter = pageBlobClient.listPageRanges();\n * let pageRangeItem = await iter.next();\n * while (!pageRangeItem.done) {\n * console.log(`Page range ${i++}: ${pageRangeItem.value.start} - ${pageRangeItem.value.end}, IsClear: ${pageRangeItem.value.isClear}`);\n * pageRangeItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of pageBlobClient.listPageRanges().byPage({ maxPageSize: 20 })) {\n * for (const pageRange of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = pageBlobClient.listPageRanges().byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 page ranges\n * for (const pageRange of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n *\n * // Passing next marker as continuationToken\n *\n * iterator = pageBlobClient.listPageRanges().byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints 10 page ranges\n * for (const blob of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * ```\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param options - Options to the Page Blob Get Ranges operation.\n * @returns An asyncIterableIterator that supports paging.\n */\n listPageRanges(offset = 0, count, options = {}) {\n options.conditions = options.conditions || {};\n // AsyncIterableIterator to iterate over blobs\n const iter = this.listPageRangeItems(offset, count, options);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listPageRangeItemSegments(offset, count, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, options));\n },\n };\n }\n /**\n * Gets the collection of page ranges that differ between a specified snapshot and this page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page blob\n * @param count - Number of bytes to get ranges diff.\n * @param prevSnapshot - Timestamp of snapshot to retrieve the difference.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n * @returns Response data for the Page Blob Get Page Range Diff operation.\n */\n async getPageRangesDiff(offset, count, prevSnapshot, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-getPageRangesDiff", options);\n try {\n return await this.pageBlobContext\n .getPageRangesDiff(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), prevsnapshot: prevSnapshot, range: rangeToString({ offset, count }) }, convertTracingToRequestOptionsBase(updatedOptions)))\n .then(rangeResponseFromModel);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * getPageRangesDiffSegment returns a single segment of page ranges starting from the\n * specified Marker for difference between previous snapshot and the target page blob.\n * Use an empty Marker to start enumeration from the beginning.\n * After getting a segment, process it, and then call getPageRangesDiffSegment again\n * (passing the the previously-returned Marker) to get the next segment.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.\n * @param marker - A string value that identifies the portion of the get to be returned with the next get operation.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n */\n async listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-getPageRangesDiffSegment", options);\n try {\n return await this.pageBlobContext.getPageRangesDiff(Object.assign({ abortSignal: options === null || options === void 0 ? void 0 : options.abortSignal, leaseAccessConditions: options === null || options === void 0 ? void 0 : options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.conditions), { ifTags: (_a = options === null || options === void 0 ? void 0 : options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), prevsnapshot: prevSnapshotOrUrl, range: rangeToString({\n offset: offset,\n count: count,\n }), marker: marker, maxPageSize: options === null || options === void 0 ? void 0 : options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesDiffResponseModel}\n *\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.\n * @param marker - A string value that identifies the portion of\n * the get of page ranges to be returned with the next getting operation. The\n * operation returns the ContinuationToken value within the response body if the\n * getting operation did not return all page ranges remaining within the current page.\n * The ContinuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of get\n * items. The marker value is opaque to the client.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n */\n listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options) {\n return __asyncGenerator(this, arguments, function* listPageRangeDiffItemSegments_1() {\n let getPageRangeItemSegmentsResponse;\n if (!!marker || marker === undefined) {\n do {\n getPageRangeItemSegmentsResponse = yield __await(this.listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options));\n marker = getPageRangeItemSegmentsResponse.continuationToken;\n yield yield __await(yield __await(getPageRangeItemSegmentsResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator of {@link PageRangeInfo} objects\n *\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n */\n listPageRangeDiffItems(offset, count, prevSnapshotOrUrl, options) {\n return __asyncGenerator(this, arguments, function* listPageRangeDiffItems_1() {\n var e_2, _a;\n let marker;\n try {\n for (var _b = __asyncValues(this.listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {\n const getPageRangesSegment = _c.value;\n yield __await(yield* __asyncDelegator(__asyncValues(ExtractPageRangeInfoItems(getPageRangesSegment))));\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));\n }\n finally { if (e_2) throw e_2.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * .byPage() returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * // Get the pageBlobClient before you run these snippets,\n * // Can be obtained from `blobServiceClient.getContainerClient("").getPageBlobClient("");`\n * let i = 1;\n * for await (const pageRange of pageBlobClient.listPageRangesDiff()) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * let iter = pageBlobClient.listPageRangesDiff();\n * let pageRangeItem = await iter.next();\n * while (!pageRangeItem.done) {\n * console.log(`Page range ${i++}: ${pageRangeItem.value.start} - ${pageRangeItem.value.end}, IsClear: ${pageRangeItem.value.isClear}`);\n * pageRangeItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of pageBlobClient.listPageRangesDiff().byPage({ maxPageSize: 20 })) {\n * for (const pageRange of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = pageBlobClient.listPageRangesDiff().byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 page ranges\n * for (const pageRange of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n *\n * // Passing next marker as continuationToken\n *\n * iterator = pageBlobClient.listPageRangesDiff().byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints 10 page ranges\n * for (const blob of response) {\n * console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);\n * }\n * ```\n * @param offset - Starting byte position of the page ranges.\n * @param count - Number of bytes to get.\n * @param prevSnapshot - Timestamp of snapshot to retrieve the difference.\n * @param options - Options to the Page Blob Get Ranges operation.\n * @returns An asyncIterableIterator that supports paging.\n */\n listPageRangesDiff(offset, count, prevSnapshot, options = {}) {\n options.conditions = options.conditions || {};\n // AsyncIterableIterator to iterate over blobs\n const iter = this.listPageRangeDiffItems(offset, count, prevSnapshot, Object.assign({}, options));\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listPageRangeDiffItemSegments(offset, count, prevSnapshot, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, options));\n },\n };\n }\n /**\n * Gets the collection of page ranges that differ between a specified snapshot and this page blob for managed disks.\n * @see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges\n *\n * @param offset - Starting byte position of the page blob\n * @param count - Number of bytes to get ranges diff.\n * @param prevSnapshotUrl - URL of snapshot to retrieve the difference.\n * @param options - Options to the Page Blob Get Page Ranges Diff operation.\n * @returns Response data for the Page Blob Get Page Range Diff operation.\n */\n async getPageRangesDiffForManagedDisks(offset, count, prevSnapshotUrl, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-GetPageRangesDiffForManagedDisks", options);\n try {\n return await this.pageBlobContext\n .getPageRangesDiff(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), prevSnapshotUrl, range: rangeToString({ offset, count }) }, convertTracingToRequestOptionsBase(updatedOptions)))\n .then(rangeResponseFromModel);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Resizes the page blob to the specified size (which must be a multiple of 512).\n * @see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties\n *\n * @param size - Target size\n * @param options - Options to the Page Blob Resize operation.\n * @returns Response data for the Page Blob Resize operation.\n */\n async resize(size, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-resize", options);\n try {\n return await this.pageBlobContext.resize(size, Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }), encryptionScope: options.encryptionScope }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets a page blob\'s sequence number.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-properties\n *\n * @param sequenceNumberAction - Indicates how the service should modify the blob\'s sequence number.\n * @param sequenceNumber - Required if sequenceNumberAction is max or update\n * @param options - Options to the Page Blob Update Sequence Number operation.\n * @returns Response data for the Page Blob Update Sequence Number operation.\n */\n async updateSequenceNumber(sequenceNumberAction, sequenceNumber, options = {}) {\n var _a;\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-updateSequenceNumber", options);\n try {\n return await this.pageBlobContext.updateSequenceNumber(sequenceNumberAction, Object.assign({ abortSignal: options.abortSignal, blobSequenceNumber: sequenceNumber, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Begins an operation to start an incremental copy from one page blob\'s snapshot to this page blob.\n * The snapshot is copied such that only the differential changes between the previously\n * copied snapshot are transferred to the destination.\n * The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual.\n * @see https://docs.microsoft.com/rest/api/storageservices/incremental-copy-blob\n * @see https://docs.microsoft.com/en-us/azure/virtual-machines/windows/incremental-snapshots\n *\n * @param copySource - Specifies the name of the source page blob snapshot. For example,\n * https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=\n * @param options - Options to the Page Blob Copy Incremental operation.\n * @returns Response data for the Page Blob Copy Incremental operation.\n */\n async startCopyIncremental(copySource, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("PageBlobClient-startCopyIncremental", options);\n try {\n return await this.pageBlobContext.copyIncremental(copySource, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === void 0 ? void 0 : _a.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n//# sourceMappingURL=Clients.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BatchUtils.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\nasync function getBodyAsText(batchResponse) {\n let buffer = Buffer.alloc(BATCH_MAX_PAYLOAD_IN_BYTES);\n const responseLength = await streamToBuffer2(batchResponse.readableStreamBody, buffer);\n // Slice the buffer to trim the empty ending.\n buffer = buffer.slice(0, responseLength);\n return buffer.toString();\n}\nfunction utf8ByteLength(str) {\n return Buffer.byteLength(str);\n}\n//# sourceMappingURL=BatchUtils.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BatchResponseParser.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\nconst HTTP_HEADER_DELIMITER = ": ";\nconst SPACE_DELIMITER = " ";\nconst NOT_FOUND = -1;\n/**\n * Util class for parsing batch response.\n */\nclass BatchResponseParser {\n constructor(batchResponse, subRequests) {\n if (!batchResponse || !batchResponse.contentType) {\n // In special case(reported), server may return invalid content-type which could not be parsed.\n throw new RangeError("batchResponse is malformed or doesn\'t contain valid content-type.");\n }\n if (!subRequests || subRequests.size === 0) {\n // This should be prevent during coding.\n throw new RangeError("Invalid state: subRequests is not provided or size is 0.");\n }\n this.batchResponse = batchResponse;\n this.subRequests = subRequests;\n this.responseBatchBoundary = this.batchResponse.contentType.split("=")[1];\n this.perResponsePrefix = `--${this.responseBatchBoundary}${HTTP_LINE_ENDING}`;\n this.batchResponseEnding = `--${this.responseBatchBoundary}--`;\n }\n // For example of response, please refer to https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch#response\n async parseBatchResponse() {\n // When logic reach here, suppose batch request has already succeeded with 202, so we can further parse\n // sub request\'s response.\n if (this.batchResponse._response.status !== HTTPURLConnection.HTTP_ACCEPTED) {\n throw new Error(`Invalid state: batch request failed with status: \'${this.batchResponse._response.status}\'.`);\n }\n const responseBodyAsText = await getBodyAsText(this.batchResponse);\n const subResponses = responseBodyAsText\n .split(this.batchResponseEnding)[0] // string after ending is useless\n .split(this.perResponsePrefix)\n .slice(1); // string before first response boundary is useless\n const subResponseCount = subResponses.length;\n // Defensive coding in case of potential error parsing.\n // Note: subResponseCount == 1 is special case where sub request is invalid.\n // We try to prevent such cases through early validation, e.g. validate sub request count >= 1.\n // While in unexpected sub request invalid case, we allow sub response to be parsed and return to user.\n if (subResponseCount !== this.subRequests.size && subResponseCount !== 1) {\n throw new Error("Invalid state: sub responses\' count is not equal to sub requests\' count.");\n }\n const deserializedSubResponses = new Array(subResponseCount);\n let subResponsesSucceededCount = 0;\n let subResponsesFailedCount = 0;\n // Parse sub subResponses.\n for (let index = 0; index < subResponseCount; index++) {\n const subResponse = subResponses[index];\n const deserializedSubResponse = {};\n deserializedSubResponse.headers = new httpHeaders_HttpHeaders();\n const responseLines = subResponse.split(`${HTTP_LINE_ENDING}`);\n let subRespHeaderStartFound = false;\n let subRespHeaderEndFound = false;\n let subRespFailed = false;\n let contentId = NOT_FOUND;\n for (const responseLine of responseLines) {\n if (!subRespHeaderStartFound) {\n // Convention line to indicate content ID\n if (responseLine.startsWith(constants_HeaderConstants.CONTENT_ID)) {\n contentId = parseInt(responseLine.split(HTTP_HEADER_DELIMITER)[1]);\n }\n // Http version line with status code indicates the start of sub request\'s response.\n // Example: HTTP/1.1 202 Accepted\n if (responseLine.startsWith(HTTP_VERSION_1_1)) {\n subRespHeaderStartFound = true;\n const tokens = responseLine.split(SPACE_DELIMITER);\n deserializedSubResponse.status = parseInt(tokens[1]);\n deserializedSubResponse.statusMessage = tokens.slice(2).join(SPACE_DELIMITER);\n }\n continue; // Skip convention headers not specifically for sub request i.e. Content-Type: application/http and Content-ID: *\n }\n if (responseLine.trim() === "") {\n // Sub response\'s header start line already found, and the first empty line indicates header end line found.\n if (!subRespHeaderEndFound) {\n subRespHeaderEndFound = true;\n }\n continue; // Skip empty line\n }\n // Note: when code reach here, it indicates subRespHeaderStartFound == true\n if (!subRespHeaderEndFound) {\n if (responseLine.indexOf(HTTP_HEADER_DELIMITER) === -1) {\n // Defensive coding to prevent from missing valuable lines.\n throw new Error(`Invalid state: find non-empty line \'${responseLine}\' without HTTP header delimiter \'${HTTP_HEADER_DELIMITER}\'.`);\n }\n // Parse headers of sub response.\n const tokens = responseLine.split(HTTP_HEADER_DELIMITER);\n deserializedSubResponse.headers.set(tokens[0], tokens[1]);\n if (tokens[0] === constants_HeaderConstants.X_MS_ERROR_CODE) {\n deserializedSubResponse.errorCode = tokens[1];\n subRespFailed = true;\n }\n }\n else {\n // Assemble body of sub response.\n if (!deserializedSubResponse.bodyAsText) {\n deserializedSubResponse.bodyAsText = "";\n }\n deserializedSubResponse.bodyAsText += responseLine;\n }\n } // Inner for end\n // The response will contain the Content-ID header for each corresponding subrequest response to use for tracking.\n // The Content-IDs are set to a valid index in the subrequests we sent. In the status code 202 path, we could expect it\n // to be 1-1 mapping from the [0, subRequests.size) to the Content-IDs returned. If not, we simply don\'t return that\n // unexpected subResponse in the parsed reponse and we can always look it up in the raw response for debugging purpose.\n if (contentId !== NOT_FOUND &&\n Number.isInteger(contentId) &&\n contentId >= 0 &&\n contentId < this.subRequests.size &&\n deserializedSubResponses[contentId] === undefined) {\n deserializedSubResponse._request = this.subRequests.get(contentId);\n deserializedSubResponses[contentId] = deserializedSubResponse;\n }\n else {\n logger.error(`subResponses[${index}] is dropped as the Content-ID is not found or invalid, Content-ID: ${contentId}`);\n }\n if (subRespFailed) {\n subResponsesFailedCount++;\n }\n else {\n subResponsesSucceededCount++;\n }\n }\n return {\n subResponses: deserializedSubResponses,\n subResponsesSucceededCount: subResponsesSucceededCount,\n subResponsesFailedCount: subResponsesFailedCount,\n };\n }\n}\n//# sourceMappingURL=BatchResponseParser.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/utils/Mutex.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nvar MutexLockStatus;\n(function (MutexLockStatus) {\n MutexLockStatus[MutexLockStatus["LOCKED"] = 0] = "LOCKED";\n MutexLockStatus[MutexLockStatus["UNLOCKED"] = 1] = "UNLOCKED";\n})(MutexLockStatus || (MutexLockStatus = {}));\n/**\n * An async mutex lock.\n */\nclass Mutex {\n /**\n * Lock for a specific key. If the lock has been acquired by another customer, then\n * will wait until getting the lock.\n *\n * @param key - lock key\n */\n static async lock(key) {\n return new Promise((resolve) => {\n if (this.keys[key] === undefined || this.keys[key] === MutexLockStatus.UNLOCKED) {\n this.keys[key] = MutexLockStatus.LOCKED;\n resolve();\n }\n else {\n this.onUnlockEvent(key, () => {\n this.keys[key] = MutexLockStatus.LOCKED;\n resolve();\n });\n }\n });\n }\n /**\n * Unlock a key.\n *\n * @param key -\n */\n static async unlock(key) {\n return new Promise((resolve) => {\n if (this.keys[key] === MutexLockStatus.LOCKED) {\n this.emitUnlockEvent(key);\n }\n delete this.keys[key];\n resolve();\n });\n }\n static onUnlockEvent(key, handler) {\n if (this.listeners[key] === undefined) {\n this.listeners[key] = [handler];\n }\n else {\n this.listeners[key].push(handler);\n }\n }\n static emitUnlockEvent(key) {\n if (this.listeners[key] !== undefined && this.listeners[key].length > 0) {\n const handler = this.listeners[key].shift();\n setImmediate(() => {\n handler.call(this);\n });\n }\n }\n}\nMutex.keys = {};\nMutex.listeners = {};\n//# sourceMappingURL=Mutex.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobBatch.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n/**\n * A BlobBatch represents an aggregated set of operations on blobs.\n * Currently, only `delete` and `setAccessTier` are supported.\n */\nclass BlobBatch {\n constructor() {\n this.batch = "batch";\n this.batchRequest = new InnerBatchRequest();\n }\n /**\n * Get the value of Content-Type for a batch request.\n * The value must be multipart/mixed with a batch boundary.\n * Example: multipart/mixed; boundary=batch_a81786c8-e301-4e42-a729-a32ca24ae252\n */\n getMultiPartContentType() {\n return this.batchRequest.getMultipartContentType();\n }\n /**\n * Get assembled HTTP request body for sub requests.\n */\n getHttpRequestBody() {\n return this.batchRequest.getHttpRequestBody();\n }\n /**\n * Get sub requests that are added into the batch request.\n */\n getSubRequests() {\n return this.batchRequest.getSubRequests();\n }\n async addSubRequestInternal(subRequest, assembleSubRequestFunc) {\n await Mutex.lock(this.batch);\n try {\n this.batchRequest.preAddSubRequest(subRequest);\n await assembleSubRequestFunc();\n this.batchRequest.postAddSubRequest(subRequest);\n }\n finally {\n await Mutex.unlock(this.batch);\n }\n }\n setBatchType(batchType) {\n if (!this.batchType) {\n this.batchType = batchType;\n }\n if (this.batchType !== batchType) {\n throw new RangeError(`BlobBatch only supports one operation type per batch and it already is being used for ${this.batchType} operations.`);\n }\n }\n async deleteBlob(urlOrBlobClient, credentialOrOptions, options) {\n let url;\n let credential;\n if (typeof urlOrBlobClient === "string" &&\n ((checkEnvironment_isNode && credentialOrOptions instanceof StorageSharedKeyCredential) ||\n credentialOrOptions instanceof AnonymousCredential ||\n isTokenCredential(credentialOrOptions))) {\n // First overload\n url = urlOrBlobClient;\n credential = credentialOrOptions;\n }\n else if (urlOrBlobClient instanceof BlobClient) {\n // Second overload\n url = urlOrBlobClient.url;\n credential = urlOrBlobClient.credential;\n options = credentialOrOptions;\n }\n else {\n throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");\n }\n if (!options) {\n options = {};\n }\n const { span, updatedOptions } = tracing_createSpan("BatchDeleteRequest-addSubRequest", options);\n try {\n this.setBatchType("delete");\n await this.addSubRequestInternal({\n url: url,\n credential: credential,\n }, async () => {\n await new BlobClient(url, this.batchRequest.createPipeline(credential)).delete(updatedOptions);\n });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n async setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options) {\n let url;\n let credential;\n let tier;\n if (typeof urlOrBlobClient === "string" &&\n ((checkEnvironment_isNode && credentialOrTier instanceof StorageSharedKeyCredential) ||\n credentialOrTier instanceof AnonymousCredential ||\n isTokenCredential(credentialOrTier))) {\n // First overload\n url = urlOrBlobClient;\n credential = credentialOrTier;\n tier = tierOrOptions;\n }\n else if (urlOrBlobClient instanceof BlobClient) {\n // Second overload\n url = urlOrBlobClient.url;\n credential = urlOrBlobClient.credential;\n tier = credentialOrTier;\n options = tierOrOptions;\n }\n else {\n throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");\n }\n if (!options) {\n options = {};\n }\n const { span, updatedOptions } = tracing_createSpan("BatchSetTierRequest-addSubRequest", options);\n try {\n this.setBatchType("setAccessTier");\n await this.addSubRequestInternal({\n url: url,\n credential: credential,\n }, async () => {\n await new BlobClient(url, this.batchRequest.createPipeline(credential)).setAccessTier(tier, updatedOptions);\n });\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n/**\n * Inner batch request class which is responsible for assembling and serializing sub requests.\n * See https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch#request-body for how requests are assembled.\n */\nclass InnerBatchRequest {\n constructor() {\n this.operationCount = 0;\n this.body = "";\n const tempGuid = generateUuid();\n // batch_{batchid}\n this.boundary = `batch_${tempGuid}`;\n // --batch_{batchid}\n // Content-Type: application/http\n // Content-Transfer-Encoding: binary\n this.subRequestPrefix = `--${this.boundary}${HTTP_LINE_ENDING}${constants_HeaderConstants.CONTENT_TYPE}: application/http${HTTP_LINE_ENDING}${constants_HeaderConstants.CONTENT_TRANSFER_ENCODING}: binary`;\n // multipart/mixed; boundary=batch_{batchid}\n this.multipartContentType = `multipart/mixed; boundary=${this.boundary}`;\n // --batch_{batchid}--\n this.batchRequestEnding = `--${this.boundary}--`;\n this.subRequests = new Map();\n }\n /**\n * Create pipeline to assemble sub requests. The idea here is to use existing\n * credential and serialization/deserialization components, with additional policies to\n * filter unnecessary headers, assemble sub requests into request\'s body\n * and intercept request from going to wire.\n * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n */\n createPipeline(credential) {\n const isAnonymousCreds = credential instanceof AnonymousCredential;\n const policyFactoryLength = 3 + (isAnonymousCreds ? 0 : 1); // [deserializationPolicy, BatchHeaderFilterPolicyFactory, (Optional)Credential, BatchRequestAssemblePolicyFactory]\n const factories = new Array(policyFactoryLength);\n factories[0] = deserializationPolicy_deserializationPolicy(); // Default deserializationPolicy is provided by protocol layer\n factories[1] = new BatchHeaderFilterPolicyFactory(); // Use batch header filter policy to exclude unnecessary headers\n if (!isAnonymousCreds) {\n factories[2] = isTokenCredential(credential)\n ? attachCredential(bearerTokenAuthenticationPolicy(credential, StorageOAuthScopes), credential)\n : credential;\n }\n factories[policyFactoryLength - 1] = new BatchRequestAssemblePolicyFactory(this); // Use batch assemble policy to assemble request and intercept request from going to wire\n return new Pipeline(factories, {});\n }\n appendSubRequestToBody(request) {\n // Start to assemble sub request\n this.body += [\n this.subRequestPrefix,\n `${constants_HeaderConstants.CONTENT_ID}: ${this.operationCount}`,\n "",\n `${request.method.toString()} ${getURLPathAndQuery(request.url)} ${HTTP_VERSION_1_1}${HTTP_LINE_ENDING}`, // sub request start line with method\n ].join(HTTP_LINE_ENDING);\n for (const header of request.headers.headersArray()) {\n this.body += `${header.name}: ${header.value}${HTTP_LINE_ENDING}`;\n }\n this.body += HTTP_LINE_ENDING; // sub request\'s headers need be ending with an empty line\n // No body to assemble for current batch request support\n // End to assemble sub request\n }\n preAddSubRequest(subRequest) {\n if (this.operationCount >= BATCH_MAX_REQUEST) {\n throw new RangeError(`Cannot exceed ${BATCH_MAX_REQUEST} sub requests in a single batch`);\n }\n // Fast fail if url for sub request is invalid\n const path = getURLPath(subRequest.url);\n if (!path || path === "") {\n throw new RangeError(`Invalid url for sub request: \'${subRequest.url}\'`);\n }\n }\n postAddSubRequest(subRequest) {\n this.subRequests.set(this.operationCount, subRequest);\n this.operationCount++;\n }\n // Return the http request body with assembling the ending line to the sub request body.\n getHttpRequestBody() {\n return `${this.body}${this.batchRequestEnding}${HTTP_LINE_ENDING}`;\n }\n getMultipartContentType() {\n return this.multipartContentType;\n }\n getSubRequests() {\n return this.subRequests;\n }\n}\nclass BatchRequestAssemblePolicy extends BaseRequestPolicy {\n constructor(batchRequest, nextPolicy, options) {\n super(nextPolicy, options);\n this.dummyResponse = {\n request: new WebResource(),\n status: 200,\n headers: new httpHeaders_HttpHeaders(),\n };\n this.batchRequest = batchRequest;\n }\n async sendRequest(request) {\n await this.batchRequest.appendSubRequestToBody(request);\n return this.dummyResponse; // Intercept request from going to wire\n }\n}\nclass BatchRequestAssemblePolicyFactory {\n constructor(batchRequest) {\n this.batchRequest = batchRequest;\n }\n create(nextPolicy, options) {\n return new BatchRequestAssemblePolicy(this.batchRequest, nextPolicy, options);\n }\n}\nclass BatchHeaderFilterPolicy extends BaseRequestPolicy {\n // The base class has a protected constructor. Adding a public one to enable constructing of this class.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/\n constructor(nextPolicy, options) {\n super(nextPolicy, options);\n }\n async sendRequest(request) {\n let xMsHeaderName = "";\n for (const header of request.headers.headersArray()) {\n if (iEqual(header.name, constants_HeaderConstants.X_MS_VERSION)) {\n xMsHeaderName = header.name;\n }\n }\n if (xMsHeaderName !== "") {\n request.headers.remove(xMsHeaderName); // The subrequests should not have the x-ms-version header.\n }\n return this._nextPolicy.sendRequest(request);\n }\n}\nclass BatchHeaderFilterPolicyFactory {\n create(nextPolicy, options) {\n return new BatchHeaderFilterPolicy(nextPolicy, options);\n }\n}\n//# sourceMappingURL=BlobBatch.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobBatchClient.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n/**\n * A BlobBatchClient allows you to make batched requests to the Azure Storage Blob service.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch\n */\nclass BlobBatchClient {\n constructor(url, credentialOrPipeline, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n let pipeline;\n if (isPipelineLike(credentialOrPipeline)) {\n pipeline = credentialOrPipeline;\n }\n else if (!credentialOrPipeline) {\n // no credential provided\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n pipeline = newPipeline(credentialOrPipeline, options);\n }\n const storageClientContext = new StorageClientContext(url, pipeline.toServiceClientOptions());\n const path = getURLPath(url);\n if (path && path !== "/") {\n // Container scoped.\n this.serviceOrContainerContext = new Container(storageClientContext);\n }\n else {\n this.serviceOrContainerContext = new Service(storageClientContext);\n }\n }\n /**\n * Creates a {@link BlobBatch}.\n * A BlobBatch represents an aggregated set of operations on blobs.\n */\n createBatch() {\n return new BlobBatch();\n }\n async deleteBlobs(urlsOrBlobClients, credentialOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n const batch = new BlobBatch();\n for (const urlOrBlobClient of urlsOrBlobClients) {\n if (typeof urlOrBlobClient === "string") {\n await batch.deleteBlob(urlOrBlobClient, credentialOrOptions, options);\n }\n else {\n await batch.deleteBlob(urlOrBlobClient, credentialOrOptions);\n }\n }\n return this.submitBatch(batch);\n }\n async setBlobsAccessTier(urlsOrBlobClients, credentialOrTier, tierOrOptions, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n const batch = new BlobBatch();\n for (const urlOrBlobClient of urlsOrBlobClients) {\n if (typeof urlOrBlobClient === "string") {\n await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options);\n }\n else {\n await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions);\n }\n }\n return this.submitBatch(batch);\n }\n /**\n * Submit batch request which consists of multiple subrequests.\n *\n * Get `blobBatchClient` and other details before running the snippets.\n * `blobServiceClient.getBlobBatchClient()` gives the `blobBatchClient`\n *\n * Example usage:\n *\n * ```js\n * let batchRequest = new BlobBatch();\n * await batchRequest.deleteBlob(urlInString0, credential0);\n * await batchRequest.deleteBlob(urlInString1, credential1, {\n * deleteSnapshots: "include"\n * });\n * const batchResp = await blobBatchClient.submitBatch(batchRequest);\n * console.log(batchResp.subResponsesSucceededCount);\n * ```\n *\n * Example using a lease:\n *\n * ```js\n * let batchRequest = new BlobBatch();\n * await batchRequest.setBlobAccessTier(blockBlobClient0, "Cool");\n * await batchRequest.setBlobAccessTier(blockBlobClient1, "Cool", {\n * conditions: { leaseId: leaseId }\n * });\n * const batchResp = await blobBatchClient.submitBatch(batchRequest);\n * console.log(batchResp.subResponsesSucceededCount);\n * ```\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch\n *\n * @param batchRequest - A set of Delete or SetTier operations.\n * @param options -\n */\n async submitBatch(batchRequest, options = {}) {\n if (!batchRequest || batchRequest.getSubRequests().size === 0) {\n throw new RangeError("Batch request should contain one or more sub requests.");\n }\n const { span, updatedOptions } = tracing_createSpan("BlobBatchClient-submitBatch", options);\n try {\n const batchRequestBody = batchRequest.getHttpRequestBody();\n // ServiceSubmitBatchResponseModel and ContainerSubmitBatchResponse are compatible for now.\n const rawBatchResponse = await this.serviceOrContainerContext.submitBatch(utf8ByteLength(batchRequestBody), batchRequest.getMultiPartContentType(), batchRequestBody, Object.assign(Object.assign({}, options), convertTracingToRequestOptionsBase(updatedOptions)));\n // Parse the sub responses result, if logic reaches here(i.e. the batch request succeeded with status code 202).\n const batchResponseParser = new BatchResponseParser(rawBatchResponse, batchRequest.getSubRequests());\n const responseSummary = await batchResponseParser.parseBatchResponse();\n const res = {\n _response: rawBatchResponse._response,\n contentType: rawBatchResponse.contentType,\n errorCode: rawBatchResponse.errorCode,\n requestId: rawBatchResponse.requestId,\n clientRequestId: rawBatchResponse.clientRequestId,\n version: rawBatchResponse.version,\n subResponses: responseSummary.subResponses,\n subResponsesSucceededCount: responseSummary.subResponsesSucceededCount,\n subResponsesFailedCount: responseSummary.subResponsesFailedCount,\n };\n return res;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n}\n//# sourceMappingURL=BlobBatchClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/ContainerClient.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * A ContainerClient represents a URL to the Azure Storage container allowing you to manipulate its blobs.\n */\nclass ContainerClient extends StorageClient {\n constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n let pipeline;\n let url;\n options = options || {};\n if (isPipelineLike(credentialOrPipelineOrContainerName)) {\n // (url: string, pipeline: Pipeline)\n url = urlOrConnectionString;\n pipeline = credentialOrPipelineOrContainerName;\n }\n else if ((checkEnvironment_isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||\n credentialOrPipelineOrContainerName instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipelineOrContainerName)) {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n url = urlOrConnectionString;\n pipeline = newPipeline(credentialOrPipelineOrContainerName, options);\n }\n else if (!credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName !== "string") {\n // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)\n // The second parameter is undefined. Use anonymous credential.\n url = urlOrConnectionString;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else if (credentialOrPipelineOrContainerName &&\n typeof credentialOrPipelineOrContainerName === "string") {\n // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)\n const containerName = credentialOrPipelineOrContainerName;\n const extractedCreds = extractConnectionStringParts(urlOrConnectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n url = appendToURLPath(extractedCreds.url, encodeURIComponent(containerName));\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n pipeline = newPipeline(sharedKeyCredential, options);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n url =\n appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)) +\n "?" +\n extractedCreds.accountSas;\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n else {\n throw new Error("Expecting non-empty strings for containerName parameter");\n }\n super(url, pipeline);\n this._containerName = this.getContainerNameFromUrl();\n this.containerContext = new Container(this.storageClientContext);\n }\n /**\n * The name of the container.\n */\n get containerName() {\n return this._containerName;\n }\n /**\n * Creates a new container under the specified account. If the container with\n * the same name already exists, the operation fails.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-container\n * Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata\n *\n * @param options - Options to Container Create operation.\n *\n *\n * Example usage:\n *\n * ```js\n * const containerClient = blobServiceClient.getContainerClient("");\n * const createContainerResponse = await containerClient.create();\n * console.log("Container was created successfully", createContainerResponse.requestId);\n * ```\n */\n async create(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-create", options);\n try {\n // Spread operator in destructuring assignments,\n // this will filter out unwanted properties from the response object into result object\n return await this.containerContext.create(Object.assign(Object.assign({}, options), convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a new container under the specified account. If the container with\n * the same name already exists, it is not changed.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-container\n * Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata\n *\n * @param options -\n */\n async createIfNotExists(options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-createIfNotExists", options);\n try {\n const res = await this.create(updatedOptions);\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "ContainerAlreadyExists") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when creating a container only if it does not already exist.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns true if the Azure container resource represented by this client exists; false otherwise.\n *\n * NOTE: use this function with care since an existing container might be deleted by other clients or\n * applications. Vice versa new containers with the same name might be added by other clients or\n * applications after this function completes.\n *\n * @param options -\n */\n async exists(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-exists", options);\n try {\n await this.getProperties({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n return true;\n }\n catch (e) {\n if (e.statusCode === 404) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when checking container existence",\n });\n return false;\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a {@link BlobClient}\n *\n * @param blobName - A blob name\n * @returns A new BlobClient object for the given blob name.\n */\n getBlobClient(blobName) {\n return new BlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline);\n }\n /**\n * Creates an {@link AppendBlobClient}\n *\n * @param blobName - An append blob name\n */\n getAppendBlobClient(blobName) {\n return new AppendBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline);\n }\n /**\n * Creates a {@link BlockBlobClient}\n *\n * @param blobName - A block blob name\n *\n *\n * Example usage:\n *\n * ```js\n * const content = "Hello world!";\n *\n * const blockBlobClient = containerClient.getBlockBlobClient("");\n * const uploadBlobResponse = await blockBlobClient.upload(content, content.length);\n * ```\n */\n getBlockBlobClient(blobName) {\n return new BlockBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline);\n }\n /**\n * Creates a {@link PageBlobClient}\n *\n * @param blobName - A page blob name\n */\n getPageBlobClient(blobName) {\n return new PageBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline);\n }\n /**\n * Returns all user-defined metadata and system properties for the specified\n * container. The data returned does not include the container\'s list of blobs.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-container-properties\n *\n * WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if\n * they originally contained uppercase characters. This differs from the metadata keys returned by\n * the `listContainers` method of {@link BlobServiceClient} using the `includeMetadata` option, which\n * will retain their original casing.\n *\n * @param options - Options to Container Get Properties operation.\n */\n async getProperties(options = {}) {\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-getProperties", options);\n try {\n return await this.containerContext.getProperties(Object.assign(Object.assign({ abortSignal: options.abortSignal }, options.conditions), convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified container for deletion. The container and any blobs\n * contained within it are later deleted during garbage collection.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-container\n *\n * @param options - Options to Container Delete operation.\n */\n async delete(options = {}) {\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-delete", options);\n try {\n return await this.containerContext.delete(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, modifiedAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified container for deletion if it exists. The container and any blobs\n * contained within it are later deleted during garbage collection.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-container\n *\n * @param options - Options to Container Delete operation.\n */\n async deleteIfExists(options = {}) {\n var _a, _b;\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-deleteIfExists", options);\n try {\n const res = await this.delete(updatedOptions);\n return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response });\n }\n catch (e) {\n if (((_a = e.details) === null || _a === void 0 ? void 0 : _a.errorCode) === "ContainerNotFound") {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: "Expected exception when deleting a container only if it exists.",\n });\n return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === void 0 ? void 0 : _b.parsedHeaders), { _response: e.response });\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets one or more user-defined name-value pairs for the specified container.\n *\n * If no option provided, or no metadata defined in the parameter, the container\n * metadata will be removed.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-container-metadata\n *\n * @param metadata - Replace existing metadata with this value.\n * If no value provided the existing metadata will be removed.\n * @param options - Options to Container Set Metadata operation.\n */\n async setMetadata(metadata, options = {}) {\n if (!options.conditions) {\n options.conditions = {};\n }\n if (options.conditions.ifUnmodifiedSince) {\n throw new RangeError("the IfUnmodifiedSince must have their default values because they are ignored by the blob service");\n }\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-setMetadata", options);\n try {\n return await this.containerContext.setMetadata(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions, metadata, modifiedAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Gets the permissions for the specified container. The permissions indicate\n * whether container data may be accessed publicly.\n *\n * WARNING: JavaScript Date will potentially lose precision when parsing startsOn and expiresOn strings.\n * For example, new Date("2018-12-31T03:44:23.8827891Z").toISOString() will get "2018-12-31T03:44:23.882Z".\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-container-acl\n *\n * @param options - Options to Container Get Access Policy operation.\n */\n async getAccessPolicy(options = {}) {\n if (!options.conditions) {\n options.conditions = {};\n }\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-getAccessPolicy", options);\n try {\n const response = await this.containerContext.getAccessPolicy(Object.assign({ abortSignal: options.abortSignal, leaseAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n const res = {\n _response: response._response,\n blobPublicAccess: response.blobPublicAccess,\n date: response.date,\n etag: response.etag,\n errorCode: response.errorCode,\n lastModified: response.lastModified,\n requestId: response.requestId,\n clientRequestId: response.clientRequestId,\n signedIdentifiers: [],\n version: response.version,\n };\n for (const identifier of response) {\n let accessPolicy = undefined;\n if (identifier.accessPolicy) {\n accessPolicy = {\n permissions: identifier.accessPolicy.permissions,\n };\n if (identifier.accessPolicy.expiresOn) {\n accessPolicy.expiresOn = new Date(identifier.accessPolicy.expiresOn);\n }\n if (identifier.accessPolicy.startsOn) {\n accessPolicy.startsOn = new Date(identifier.accessPolicy.startsOn);\n }\n }\n res.signedIdentifiers.push({\n accessPolicy,\n id: identifier.id,\n });\n }\n return res;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets the permissions for the specified container. The permissions indicate\n * whether blobs in a container may be accessed publicly.\n *\n * When you set permissions for a container, the existing permissions are replaced.\n * If no access or containerAcl provided, the existing container ACL will be\n * removed.\n *\n * When you establish a stored access policy on a container, it may take up to 30 seconds to take effect.\n * During this interval, a shared access signature that is associated with the stored access policy will\n * fail with status code 403 (Forbidden), until the access policy becomes active.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-container-acl\n *\n * @param access - The level of public access to data in the container.\n * @param containerAcl - Array of elements each having a unique Id and details of the access policy.\n * @param options - Options to Container Set Access Policy operation.\n */\n async setAccessPolicy(access, containerAcl, options = {}) {\n options.conditions = options.conditions || {};\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-setAccessPolicy", options);\n try {\n const acl = [];\n for (const identifier of containerAcl || []) {\n acl.push({\n accessPolicy: {\n expiresOn: identifier.accessPolicy.expiresOn\n ? truncatedISO8061Date(identifier.accessPolicy.expiresOn)\n : "",\n permissions: identifier.accessPolicy.permissions,\n startsOn: identifier.accessPolicy.startsOn\n ? truncatedISO8061Date(identifier.accessPolicy.startsOn)\n : "",\n },\n id: identifier.id,\n });\n }\n return await this.containerContext.setAccessPolicy(Object.assign({ abortSignal: options.abortSignal, access, containerAcl: acl, leaseAccessConditions: options.conditions, modifiedAccessConditions: options.conditions }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Get a {@link BlobLeaseClient} that manages leases on the container.\n *\n * @param proposeLeaseId - Initial proposed lease Id.\n * @returns A new BlobLeaseClient object for managing leases on the container.\n */\n getBlobLeaseClient(proposeLeaseId) {\n return new BlobLeaseClient(this, proposeLeaseId);\n }\n /**\n * Creates a new block blob, or updates the content of an existing block blob.\n *\n * Updating an existing block blob overwrites any existing metadata on the blob.\n * Partial updates are not supported; the content of the existing blob is\n * overwritten with the new content. To perform a partial update of a block blob\'s,\n * use {@link BlockBlobClient.stageBlock} and {@link BlockBlobClient.commitBlockList}.\n *\n * This is a non-parallel uploading method, please use {@link BlockBlobClient.uploadFile},\n * {@link BlockBlobClient.uploadStream} or {@link BlockBlobClient.uploadBrowserData} for better\n * performance with concurrency uploading.\n *\n * @see https://docs.microsoft.com/rest/api/storageservices/put-blob\n *\n * @param blobName - Name of the block blob to create or update.\n * @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function\n * which returns a new Readable stream whose offset is from data source beginning.\n * @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a\n * string including non non-Base64/Hex-encoded characters.\n * @param options - Options to configure the Block Blob Upload operation.\n * @returns Block Blob upload response data and the corresponding BlockBlobClient instance.\n */\n async uploadBlockBlob(blobName, body, contentLength, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-uploadBlockBlob", options);\n try {\n const blockBlobClient = this.getBlockBlobClient(blobName);\n const response = await blockBlobClient.upload(body, contentLength, updatedOptions);\n return {\n blockBlobClient,\n response,\n };\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Marks the specified blob or snapshot for deletion. The blob is later deleted\n * during garbage collection. Note that in order to delete a blob, you must delete\n * all of its snapshots. You can delete both at the same time with the Delete\n * Blob operation.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/delete-blob\n *\n * @param blobName -\n * @param options - Options to Blob Delete operation.\n * @returns Block blob deletion response data.\n */\n async deleteBlob(blobName, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-deleteBlob", options);\n try {\n let blobClient = this.getBlobClient(blobName);\n if (options.versionId) {\n blobClient = blobClient.withVersion(options.versionId);\n }\n return await blobClient.delete(updatedOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * listBlobFlatSegment returns a single segment of blobs starting from the\n * specified Marker. Use an empty Marker to start enumeration from the beginning.\n * After getting a segment, process it, and then call listBlobsFlatSegment again\n * (passing the the previously-returned Marker) to get the next segment.\n * @see https://docs.microsoft.com/rest/api/storageservices/list-blobs\n *\n * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.\n * @param options - Options to Container List Blob Flat Segment operation.\n */\n async listBlobFlatSegment(marker, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-listBlobFlatSegment", options);\n try {\n const response = await this.containerContext.listBlobFlatSegment(Object.assign(Object.assign({ marker }, options), convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: Object.assign(Object.assign({}, response._response), { parsedBody: ConvertInternalResponseOfListBlobFlat(response._response.parsedBody) }), segment: Object.assign(Object.assign({}, response.segment), { blobItems: response.segment.blobItems.map((blobItemInteral) => {\n const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name), tags: toTags(blobItemInteral.blobTags), objectReplicationSourceProperties: parseObjectReplicationRecord(blobItemInteral.objectReplicationMetadata) });\n return blobItem;\n }) }) });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * listBlobHierarchySegment returns a single segment of blobs starting from\n * the specified Marker. Use an empty Marker to start enumeration from the\n * beginning. After getting a segment, process it, and then call listBlobsHierarchicalSegment\n * again (passing the the previously-returned Marker) to get the next segment.\n * @see https://docs.microsoft.com/rest/api/storageservices/list-blobs\n *\n * @param delimiter - The character or string used to define the virtual hierarchy\n * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.\n * @param options - Options to Container List Blob Hierarchy Segment operation.\n */\n async listBlobHierarchySegment(delimiter, marker, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-listBlobHierarchySegment", options);\n try {\n const response = await this.containerContext.listBlobHierarchySegment(delimiter, Object.assign(Object.assign({ marker }, options), convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: Object.assign(Object.assign({}, response._response), { parsedBody: ConvertInternalResponseOfListBlobHierarchy(response._response.parsedBody) }), segment: Object.assign(Object.assign({}, response.segment), { blobItems: response.segment.blobItems.map((blobItemInteral) => {\n const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name), tags: toTags(blobItemInteral.blobTags), objectReplicationSourceProperties: parseObjectReplicationRecord(blobItemInteral.objectReplicationMetadata) });\n return blobItem;\n }), blobPrefixes: (_a = response.segment.blobPrefixes) === null || _a === void 0 ? void 0 : _a.map((blobPrefixInternal) => {\n const blobPrefix = Object.assign(Object.assign({}, blobPrefixInternal), { name: BlobNameToString(blobPrefixInternal.name) });\n return blobPrefix;\n }) }) });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for ContainerListBlobFlatSegmentResponse\n *\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the ContinuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The ContinuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to list blobs operation.\n */\n listSegments(marker, options = {}) {\n return __asyncGenerator(this, arguments, function* listSegments_1() {\n let listBlobsFlatSegmentResponse;\n if (!!marker || marker === undefined) {\n do {\n listBlobsFlatSegmentResponse = yield __await(this.listBlobFlatSegment(marker, options));\n marker = listBlobsFlatSegmentResponse.continuationToken;\n yield yield __await(yield __await(listBlobsFlatSegmentResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator of {@link BlobItem} objects\n *\n * @param options - Options to list blobs operation.\n */\n listItems(options = {}) {\n return __asyncGenerator(this, arguments, function* listItems_1() {\n var e_1, _a;\n let marker;\n try {\n for (var _b = __asyncValues(this.listSegments(marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {\n const listBlobsFlatSegmentResponse = _c.value;\n yield __await(yield* __asyncDelegator(__asyncValues(listBlobsFlatSegmentResponse.segment.blobItems)));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));\n }\n finally { if (e_1) throw e_1.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list all the blobs\n * under the specified account.\n *\n * .byPage() returns an async iterable iterator to list the blobs in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * // Get the containerClient before you run these snippets,\n * // Can be obtained from `blobServiceClient.getContainerClient("");`\n * let i = 1;\n * for await (const blob of containerClient.listBlobsFlat()) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * let iter = containerClient.listBlobsFlat();\n * let blobItem = await iter.next();\n * while (!blobItem.done) {\n * console.log(`Blob ${i++}: ${blobItem.value.name}`);\n * blobItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of containerClient.listBlobsFlat().byPage({ maxPageSize: 20 })) {\n * for (const blob of response.segment.blobItems) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = containerClient.listBlobsFlat().byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 blob names\n * for (const blob of response.segment.blobItems) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n *\n * // Passing next marker as continuationToken\n *\n * iterator = containerClient.listBlobsFlat().byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints 10 blob names\n * for (const blob of response.segment.blobItems) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * ```\n *\n * @param options - Options to list blobs.\n * @returns An asyncIterableIterator that supports paging.\n */\n listBlobsFlat(options = {}) {\n const include = [];\n if (options.includeCopy) {\n include.push("copy");\n }\n if (options.includeDeleted) {\n include.push("deleted");\n }\n if (options.includeMetadata) {\n include.push("metadata");\n }\n if (options.includeSnapshots) {\n include.push("snapshots");\n }\n if (options.includeVersions) {\n include.push("versions");\n }\n if (options.includeUncommitedBlobs) {\n include.push("uncommittedblobs");\n }\n if (options.includeTags) {\n include.push("tags");\n }\n if (options.includeDeletedWithVersions) {\n include.push("deletedwithversions");\n }\n if (options.includeImmutabilityPolicy) {\n include.push("immutabilitypolicy");\n }\n if (options.includeLegalHold) {\n include.push("legalhold");\n }\n if (options.prefix === "") {\n options.prefix = undefined;\n }\n const updatedOptions = Object.assign(Object.assign({}, options), (include.length > 0 ? { include: include } : {}));\n // AsyncIterableIterator to iterate over blobs\n const iter = this.listItems(updatedOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listSegments(settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, updatedOptions));\n },\n };\n }\n /**\n * Returns an AsyncIterableIterator for ContainerListBlobHierarchySegmentResponse\n *\n * @param delimiter - The character or string used to define the virtual hierarchy\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the ContinuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The ContinuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to list blobs operation.\n */\n listHierarchySegments(delimiter, marker, options = {}) {\n return __asyncGenerator(this, arguments, function* listHierarchySegments_1() {\n let listBlobsHierarchySegmentResponse;\n if (!!marker || marker === undefined) {\n do {\n listBlobsHierarchySegmentResponse = yield __await(this.listBlobHierarchySegment(delimiter, marker, options));\n marker = listBlobsHierarchySegmentResponse.continuationToken;\n yield yield __await(yield __await(listBlobsHierarchySegmentResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator for {@link BlobPrefix} and {@link BlobItem} objects.\n *\n * @param delimiter - The character or string used to define the virtual hierarchy\n * @param options - Options to list blobs operation.\n */\n listItemsByHierarchy(delimiter, options = {}) {\n return __asyncGenerator(this, arguments, function* listItemsByHierarchy_1() {\n var e_2, _a;\n let marker;\n try {\n for (var _b = __asyncValues(this.listHierarchySegments(delimiter, marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {\n const listBlobsHierarchySegmentResponse = _c.value;\n const segment = listBlobsHierarchySegmentResponse.segment;\n if (segment.blobPrefixes) {\n for (const prefix of segment.blobPrefixes) {\n yield yield __await(Object.assign({ kind: "prefix" }, prefix));\n }\n }\n for (const blob of segment.blobItems) {\n yield yield __await(Object.assign({ kind: "blob" }, blob));\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));\n }\n finally { if (e_2) throw e_2.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list all the blobs by hierarchy.\n * under the specified account.\n *\n * .byPage() returns an async iterable iterator to list the blobs by hierarchy in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * for await (const item of containerClient.listBlobsByHierarchy("/")) {\n * if (item.kind === "prefix") {\n * console.log(`\\tBlobPrefix: ${item.name}`);\n * } else {\n * console.log(`\\tBlobItem: name - ${item.name}`);\n * }\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let iter = containerClient.listBlobsByHierarchy("/", { prefix: "prefix1/" });\n * let entity = await iter.next();\n * while (!entity.done) {\n * let item = entity.value;\n * if (item.kind === "prefix") {\n * console.log(`\\tBlobPrefix: ${item.name}`);\n * } else {\n * console.log(`\\tBlobItem: name - ${item.name}`);\n * }\n * entity = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * console.log("Listing blobs by hierarchy by page");\n * for await (const response of containerClient.listBlobsByHierarchy("/").byPage()) {\n * const segment = response.segment;\n * if (segment.blobPrefixes) {\n * for (const prefix of segment.blobPrefixes) {\n * console.log(`\\tBlobPrefix: ${prefix.name}`);\n * }\n * }\n * for (const blob of response.segment.blobItems) {\n * console.log(`\\tBlobItem: name - ${blob.name}`);\n * }\n * }\n * ```\n *\n * Example using paging with a max page size:\n *\n * ```js\n * console.log("Listing blobs by hierarchy by page, specifying a prefix and a max page size");\n *\n * let i = 1;\n * for await (const response of containerClient\n * .listBlobsByHierarchy("/", { prefix: "prefix2/sub1/" })\n * .byPage({ maxPageSize: 2 })) {\n * console.log(`Page ${i++}`);\n * const segment = response.segment;\n *\n * if (segment.blobPrefixes) {\n * for (const prefix of segment.blobPrefixes) {\n * console.log(`\\tBlobPrefix: ${prefix.name}`);\n * }\n * }\n *\n * for (const blob of response.segment.blobItems) {\n * console.log(`\\tBlobItem: name - ${blob.name}`);\n * }\n * }\n * ```\n *\n * @param delimiter - The character or string used to define the virtual hierarchy\n * @param options - Options to list blobs operation.\n */\n listBlobsByHierarchy(delimiter, options = {}) {\n if (delimiter === "") {\n throw new RangeError("delimiter should contain one or more characters");\n }\n const include = [];\n if (options.includeCopy) {\n include.push("copy");\n }\n if (options.includeDeleted) {\n include.push("deleted");\n }\n if (options.includeMetadata) {\n include.push("metadata");\n }\n if (options.includeSnapshots) {\n include.push("snapshots");\n }\n if (options.includeVersions) {\n include.push("versions");\n }\n if (options.includeUncommitedBlobs) {\n include.push("uncommittedblobs");\n }\n if (options.includeTags) {\n include.push("tags");\n }\n if (options.includeDeletedWithVersions) {\n include.push("deletedwithversions");\n }\n if (options.includeImmutabilityPolicy) {\n include.push("immutabilitypolicy");\n }\n if (options.includeLegalHold) {\n include.push("legalhold");\n }\n if (options.prefix === "") {\n options.prefix = undefined;\n }\n const updatedOptions = Object.assign(Object.assign({}, options), (include.length > 0 ? { include: include } : {}));\n // AsyncIterableIterator to iterate over blob prefixes and blobs\n const iter = this.listItemsByHierarchy(delimiter, updatedOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n async next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listHierarchySegments(delimiter, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, updatedOptions));\n },\n };\n }\n /**\n * The Filter Blobs operation enables callers to list blobs in the container whose tags\n * match a given search expression.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to find blobs by tags.\n */\n async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("ContainerClient-findBlobsByTagsSegment", options);\n try {\n const response = await this.containerContext.filterBlobs(Object.assign({ abortSignal: options.abortSignal, where: tagFilterSqlExpression, marker, maxPageSize: options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, blobs: response.blobs.map((blob) => {\n var _a;\n let tagValue = "";\n if (((_a = blob.tags) === null || _a === void 0 ? void 0 : _a.blobTagSet.length) === 1) {\n tagValue = blob.tags.blobTagSet[0].value;\n }\n return Object.assign(Object.assign({}, blob), { tags: toTags(blob.tags), tagValue });\n }) });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for ContainerFindBlobsByTagsSegmentResponse.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to find blobs by tags.\n */\n findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {\n return __asyncGenerator(this, arguments, function* findBlobsByTagsSegments_1() {\n let response;\n if (!!marker || marker === undefined) {\n do {\n response = yield __await(this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options));\n response.blobs = response.blobs || [];\n marker = response.continuationToken;\n yield yield __await(response);\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator for blobs.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param options - Options to findBlobsByTagsItems.\n */\n findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {\n return __asyncGenerator(this, arguments, function* findBlobsByTagsItems_1() {\n var e_3, _a;\n let marker;\n try {\n for (var _b = __asyncValues(this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {\n const segment = _c.value;\n yield __await(yield* __asyncDelegator(__asyncValues(segment.blobs)));\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));\n }\n finally { if (e_3) throw e_3.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to find all blobs with specified tag\n * under the specified container.\n *\n * .byPage() returns an async iterable iterator to list the blobs in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * let i = 1;\n * for await (const blob of containerClient.findBlobsByTags("tagkey=\'tagvalue\'")) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * const iter = containerClient.findBlobsByTags("tagkey=\'tagvalue\'");\n * let blobItem = await iter.next();\n * while (!blobItem.done) {\n * console.log(`Blob ${i++}: ${blobItem.value.name}`);\n * blobItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of containerClient.findBlobsByTags("tagkey=\'tagvalue\'").byPage({ maxPageSize: 20 })) {\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = containerClient.findBlobsByTags("tagkey=\'tagvalue\'").byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 blob names\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n * // Passing next marker as continuationToken\n * iterator = containerClient\n * .findBlobsByTags("tagkey=\'tagvalue\'")\n * .byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints blob names\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * ```\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param options - Options to find blobs by tags.\n */\n findBlobsByTags(tagFilterSqlExpression, options = {}) {\n // AsyncIterableIterator to iterate over blobs\n const listSegmentOptions = Object.assign({}, options);\n const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions));\n },\n };\n }\n getContainerNameFromUrl() {\n let containerName;\n try {\n // URL may look like the following\n // "https://myaccount.blob.core.windows.net/mycontainer?sasString";\n // "https://myaccount.blob.core.windows.net/mycontainer";\n // IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername`\n // http://localhost:10001/devstoreaccount1/containername\n const parsedUrl = URLBuilder.parse(this.url);\n if (parsedUrl.getHost().split(".")[1] === "blob") {\n // "https://myaccount.blob.core.windows.net/containername".\n // "https://customdomain.com/containername".\n // .getPath() -> /containername\n containerName = parsedUrl.getPath().split("/")[1];\n }\n else if (isIpEndpointStyle(parsedUrl)) {\n // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername\n // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername\n // .getPath() -> /devstoreaccount1/containername\n containerName = parsedUrl.getPath().split("/")[2];\n }\n else {\n // "https://customdomain.com/containername".\n // .getPath() -> /containername\n containerName = parsedUrl.getPath().split("/")[1];\n }\n // decode the encoded containerName - to get all the special characters that might be present in it\n containerName = decodeURIComponent(containerName);\n if (!containerName) {\n throw new Error("Provided containerName is invalid.");\n }\n return containerName;\n }\n catch (error) {\n throw new Error("Unable to extract containerName with provided information.");\n }\n }\n /**\n * Only available for ContainerClient constructed with a shared key credential.\n *\n * Generates a Blob Container Service Shared Access Signature (SAS) URI based on the client properties\n * and parameters passed in. The SAS is signed by the shared key credential of the client.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas\n *\n * @param options - Optional parameters.\n * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.\n */\n generateSasUrl(options) {\n return new Promise((resolve) => {\n if (!(this.credential instanceof StorageSharedKeyCredential)) {\n throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");\n }\n const sas = generateBlobSASQueryParameters(Object.assign({ containerName: this._containerName }, options), this.credential).toString();\n resolve(appendToURLQuery(this.url, sas));\n });\n }\n /**\n * Creates a BlobBatchClient object to conduct batch operations.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch\n *\n * @returns A new BlobBatchClient object for this container.\n */\n getBlobBatchClient() {\n return new BlobBatchClient(this.url, this.pipeline);\n }\n}\n//# sourceMappingURL=ContainerClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/AccountSASPermissions.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * This is a helper class to construct a string representing the permissions granted by an AccountSAS. Setting a value\n * to true means that any SAS which uses these permissions will grant permissions for that operation. Once all the\n * values are set, this should be serialized with toString and set as the permissions field on an\n * {@link AccountSASSignatureValues} object. It is possible to construct the permissions string without this class, but\n * the order of the permissions is particular and this class guarantees correctness.\n */\nclass AccountSASPermissions {\n constructor() {\n /**\n * Permission to read resources and list queues and tables granted.\n */\n this.read = false;\n /**\n * Permission to write resources granted.\n */\n this.write = false;\n /**\n * Permission to create blobs and files granted.\n */\n this.delete = false;\n /**\n * Permission to delete versions granted.\n */\n this.deleteVersion = false;\n /**\n * Permission to list blob containers, blobs, shares, directories, and files granted.\n */\n this.list = false;\n /**\n * Permission to add messages, table entities, and append to blobs granted.\n */\n this.add = false;\n /**\n * Permission to create blobs and files granted.\n */\n this.create = false;\n /**\n * Permissions to update messages and table entities granted.\n */\n this.update = false;\n /**\n * Permission to get and delete messages granted.\n */\n this.process = false;\n /**\n * Specfies Tag access granted.\n */\n this.tag = false;\n /**\n * Permission to filter blobs.\n */\n this.filter = false;\n /**\n * Permission to set immutability policy.\n */\n this.setImmutabilityPolicy = false;\n /**\n * Specifies that Permanent Delete is permitted.\n */\n this.permanentDelete = false;\n }\n /**\n * Parse initializes the AccountSASPermissions fields from a string.\n *\n * @param permissions -\n */\n static parse(permissions) {\n const accountSASPermissions = new AccountSASPermissions();\n for (const c of permissions) {\n switch (c) {\n case "r":\n accountSASPermissions.read = true;\n break;\n case "w":\n accountSASPermissions.write = true;\n break;\n case "d":\n accountSASPermissions.delete = true;\n break;\n case "x":\n accountSASPermissions.deleteVersion = true;\n break;\n case "l":\n accountSASPermissions.list = true;\n break;\n case "a":\n accountSASPermissions.add = true;\n break;\n case "c":\n accountSASPermissions.create = true;\n break;\n case "u":\n accountSASPermissions.update = true;\n break;\n case "p":\n accountSASPermissions.process = true;\n break;\n case "t":\n accountSASPermissions.tag = true;\n break;\n case "f":\n accountSASPermissions.filter = true;\n break;\n case "i":\n accountSASPermissions.setImmutabilityPolicy = true;\n break;\n case "y":\n accountSASPermissions.permanentDelete = true;\n break;\n default:\n throw new RangeError(`Invalid permission character: ${c}`);\n }\n }\n return accountSASPermissions;\n }\n /**\n * Creates a {@link AccountSASPermissions} from a raw object which contains same keys as it\n * and boolean values for them.\n *\n * @param permissionLike -\n */\n static from(permissionLike) {\n const accountSASPermissions = new AccountSASPermissions();\n if (permissionLike.read) {\n accountSASPermissions.read = true;\n }\n if (permissionLike.write) {\n accountSASPermissions.write = true;\n }\n if (permissionLike.delete) {\n accountSASPermissions.delete = true;\n }\n if (permissionLike.deleteVersion) {\n accountSASPermissions.deleteVersion = true;\n }\n if (permissionLike.filter) {\n accountSASPermissions.filter = true;\n }\n if (permissionLike.tag) {\n accountSASPermissions.tag = true;\n }\n if (permissionLike.list) {\n accountSASPermissions.list = true;\n }\n if (permissionLike.add) {\n accountSASPermissions.add = true;\n }\n if (permissionLike.create) {\n accountSASPermissions.create = true;\n }\n if (permissionLike.update) {\n accountSASPermissions.update = true;\n }\n if (permissionLike.process) {\n accountSASPermissions.process = true;\n }\n if (permissionLike.setImmutabilityPolicy) {\n accountSASPermissions.setImmutabilityPolicy = true;\n }\n if (permissionLike.permanentDelete) {\n accountSASPermissions.permanentDelete = true;\n }\n return accountSASPermissions;\n }\n /**\n * Produces the SAS permissions string for an Azure Storage account.\n * Call this method to set AccountSASSignatureValues Permissions field.\n *\n * Using this method will guarantee the resource types are in\n * an order accepted by the service.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas\n *\n */\n toString() {\n // The order of the characters should be as specified here to ensure correctness:\n // https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas\n // Use a string array instead of string concatenating += operator for performance\n const permissions = [];\n if (this.read) {\n permissions.push("r");\n }\n if (this.write) {\n permissions.push("w");\n }\n if (this.delete) {\n permissions.push("d");\n }\n if (this.deleteVersion) {\n permissions.push("x");\n }\n if (this.filter) {\n permissions.push("f");\n }\n if (this.tag) {\n permissions.push("t");\n }\n if (this.list) {\n permissions.push("l");\n }\n if (this.add) {\n permissions.push("a");\n }\n if (this.create) {\n permissions.push("c");\n }\n if (this.update) {\n permissions.push("u");\n }\n if (this.process) {\n permissions.push("p");\n }\n if (this.setImmutabilityPolicy) {\n permissions.push("i");\n }\n if (this.permanentDelete) {\n permissions.push("y");\n }\n return permissions.join("");\n }\n}\n//# sourceMappingURL=AccountSASPermissions.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/AccountSASResourceTypes.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * This is a helper class to construct a string representing the resources accessible by an AccountSAS. Setting a value\n * to true means that any SAS which uses these permissions will grant access to that resource type. Once all the\n * values are set, this should be serialized with toString and set as the resources field on an\n * {@link AccountSASSignatureValues} object. It is possible to construct the resources string without this class, but\n * the order of the resources is particular and this class guarantees correctness.\n */\nclass AccountSASResourceTypes {\n constructor() {\n /**\n * Permission to access service level APIs granted.\n */\n this.service = false;\n /**\n * Permission to access container level APIs (Blob Containers, Tables, Queues, File Shares) granted.\n */\n this.container = false;\n /**\n * Permission to access object level APIs (Blobs, Table Entities, Queue Messages, Files) granted.\n */\n this.object = false;\n }\n /**\n * Creates an {@link AccountSASResourceTypes} from the specified resource types string. This method will throw an\n * Error if it encounters a character that does not correspond to a valid resource type.\n *\n * @param resourceTypes -\n */\n static parse(resourceTypes) {\n const accountSASResourceTypes = new AccountSASResourceTypes();\n for (const c of resourceTypes) {\n switch (c) {\n case "s":\n accountSASResourceTypes.service = true;\n break;\n case "c":\n accountSASResourceTypes.container = true;\n break;\n case "o":\n accountSASResourceTypes.object = true;\n break;\n default:\n throw new RangeError(`Invalid resource type: ${c}`);\n }\n }\n return accountSASResourceTypes;\n }\n /**\n * Converts the given resource types to a string.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas\n *\n */\n toString() {\n const resourceTypes = [];\n if (this.service) {\n resourceTypes.push("s");\n }\n if (this.container) {\n resourceTypes.push("c");\n }\n if (this.object) {\n resourceTypes.push("o");\n }\n return resourceTypes.join("");\n }\n}\n//# sourceMappingURL=AccountSASResourceTypes.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/AccountSASServices.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * This is a helper class to construct a string representing the services accessible by an AccountSAS. Setting a value\n * to true means that any SAS which uses these permissions will grant access to that service. Once all the\n * values are set, this should be serialized with toString and set as the services field on an\n * {@link AccountSASSignatureValues} object. It is possible to construct the services string without this class, but\n * the order of the services is particular and this class guarantees correctness.\n */\nclass AccountSASServices {\n constructor() {\n /**\n * Permission to access blob resources granted.\n */\n this.blob = false;\n /**\n * Permission to access file resources granted.\n */\n this.file = false;\n /**\n * Permission to access queue resources granted.\n */\n this.queue = false;\n /**\n * Permission to access table resources granted.\n */\n this.table = false;\n }\n /**\n * Creates an {@link AccountSASServices} from the specified services string. This method will throw an\n * Error if it encounters a character that does not correspond to a valid service.\n *\n * @param services -\n */\n static parse(services) {\n const accountSASServices = new AccountSASServices();\n for (const c of services) {\n switch (c) {\n case "b":\n accountSASServices.blob = true;\n break;\n case "f":\n accountSASServices.file = true;\n break;\n case "q":\n accountSASServices.queue = true;\n break;\n case "t":\n accountSASServices.table = true;\n break;\n default:\n throw new RangeError(`Invalid service character: ${c}`);\n }\n }\n return accountSASServices;\n }\n /**\n * Converts the given services to a string.\n *\n */\n toString() {\n const services = [];\n if (this.blob) {\n services.push("b");\n }\n if (this.table) {\n services.push("t");\n }\n if (this.queue) {\n services.push("q");\n }\n if (this.file) {\n services.push("f");\n }\n return services.join("");\n }\n}\n//# sourceMappingURL=AccountSASServices.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/sas/AccountSASSignatureValues.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * Generates a {@link SASQueryParameters} object which contains all SAS query parameters needed to make an actual\n * REST request.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas\n *\n * @param accountSASSignatureValues -\n * @param sharedKeyCredential -\n */\nfunction generateAccountSASQueryParameters(accountSASSignatureValues, sharedKeyCredential) {\n const version = accountSASSignatureValues.version\n ? accountSASSignatureValues.version\n : SERVICE_VERSION;\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.setImmutabilityPolicy &&\n version < "2020-08-04") {\n throw RangeError("\'version\' must be >= \'2020-08-04\' when provided \'i\' permission.");\n }\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.deleteVersion &&\n version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when provided \'x\' permission.");\n }\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.permanentDelete &&\n version < "2019-10-10") {\n throw RangeError("\'version\' must be >= \'2019-10-10\' when provided \'y\' permission.");\n }\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.tag &&\n version < "2019-12-12") {\n throw RangeError("\'version\' must be >= \'2019-12-12\' when provided \'t\' permission.");\n }\n if (accountSASSignatureValues.permissions &&\n accountSASSignatureValues.permissions.filter &&\n version < "2019-12-12") {\n throw RangeError("\'version\' must be >= \'2019-12-12\' when provided \'f\' permission.");\n }\n if (accountSASSignatureValues.encryptionScope && version < "2020-12-06") {\n throw RangeError("\'version\' must be >= \'2020-12-06\' when provided \'encryptionScope\' in SAS.");\n }\n const parsedPermissions = AccountSASPermissions.parse(accountSASSignatureValues.permissions.toString());\n const parsedServices = AccountSASServices.parse(accountSASSignatureValues.services).toString();\n const parsedResourceTypes = AccountSASResourceTypes.parse(accountSASSignatureValues.resourceTypes).toString();\n let stringToSign;\n if (version >= "2020-12-06") {\n stringToSign = [\n sharedKeyCredential.accountName,\n parsedPermissions,\n parsedServices,\n parsedResourceTypes,\n accountSASSignatureValues.startsOn\n ? truncatedISO8061Date(accountSASSignatureValues.startsOn, false)\n : "",\n truncatedISO8061Date(accountSASSignatureValues.expiresOn, false),\n accountSASSignatureValues.ipRange ? ipRangeToString(accountSASSignatureValues.ipRange) : "",\n accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",\n version,\n accountSASSignatureValues.encryptionScope ? accountSASSignatureValues.encryptionScope : "",\n "", // Account SAS requires an additional newline character\n ].join("\\n");\n }\n else {\n stringToSign = [\n sharedKeyCredential.accountName,\n parsedPermissions,\n parsedServices,\n parsedResourceTypes,\n accountSASSignatureValues.startsOn\n ? truncatedISO8061Date(accountSASSignatureValues.startsOn, false)\n : "",\n truncatedISO8061Date(accountSASSignatureValues.expiresOn, false),\n accountSASSignatureValues.ipRange ? ipRangeToString(accountSASSignatureValues.ipRange) : "",\n accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",\n version,\n "", // Account SAS requires an additional newline character\n ].join("\\n");\n }\n const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);\n return new SASQueryParameters(version, signature, parsedPermissions.toString(), parsedServices, parsedResourceTypes, accountSASSignatureValues.protocol, accountSASSignatureValues.startsOn, accountSASSignatureValues.expiresOn, accountSASSignatureValues.ipRange, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, accountSASSignatureValues.encryptionScope);\n}\n//# sourceMappingURL=AccountSASSignatureValues.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/BlobServiceClient.js\n\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * A BlobServiceClient represents a Client to the Azure Storage Blob service allowing you\n * to manipulate blob containers.\n */\nclass BlobServiceClient extends StorageClient {\n constructor(url, credentialOrPipeline, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n let pipeline;\n if (isPipelineLike(credentialOrPipeline)) {\n pipeline = credentialOrPipeline;\n }\n else if ((checkEnvironment_isNode && credentialOrPipeline instanceof StorageSharedKeyCredential) ||\n credentialOrPipeline instanceof AnonymousCredential ||\n isTokenCredential(credentialOrPipeline)) {\n pipeline = newPipeline(credentialOrPipeline, options);\n }\n else {\n // The second parameter is undefined. Use anonymous credential\n pipeline = newPipeline(new AnonymousCredential(), options);\n }\n super(url, pipeline);\n this.serviceContext = new Service(this.storageClientContext);\n }\n /**\n *\n * Creates an instance of BlobServiceClient from connection string.\n *\n * @param connectionString - Account connection string or a SAS connection string of an Azure storage account.\n * [ Note - Account connection string can only be used in NODE.JS runtime. ]\n * Account connection string example -\n * `DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=accountKey;EndpointSuffix=core.windows.net`\n * SAS connection string example -\n * `BlobEndpoint=https://myaccount.blob.core.windows.net/;QueueEndpoint=https://myaccount.queue.core.windows.net/;FileEndpoint=https://myaccount.file.core.windows.net/;TableEndpoint=https://myaccount.table.core.windows.net/;SharedAccessSignature=sasString`\n * @param options - Optional. Options to configure the HTTP pipeline.\n */\n static fromConnectionString(connectionString, \n // Legacy, no fix for eslint error without breaking. Disable it for this interface.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/\n options) {\n options = options || {};\n const extractedCreds = extractConnectionStringParts(connectionString);\n if (extractedCreds.kind === "AccountConnString") {\n if (checkEnvironment_isNode) {\n const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);\n if (!options.proxyOptions) {\n options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);\n }\n const pipeline = newPipeline(sharedKeyCredential, options);\n return new BlobServiceClient(extractedCreds.url, pipeline);\n }\n else {\n throw new Error("Account connection string is only supported in Node.js environment");\n }\n }\n else if (extractedCreds.kind === "SASConnString") {\n const pipeline = newPipeline(new AnonymousCredential(), options);\n return new BlobServiceClient(extractedCreds.url + "?" + extractedCreds.accountSas, pipeline);\n }\n else {\n throw new Error("Connection string must be either an Account connection string or a SAS connection string");\n }\n }\n /**\n * Creates a {@link ContainerClient} object\n *\n * @param containerName - A container name\n * @returns A new ContainerClient object for the given container name.\n *\n * Example usage:\n *\n * ```js\n * const containerClient = blobServiceClient.getContainerClient("");\n * ```\n */\n getContainerClient(containerName) {\n return new ContainerClient(appendToURLPath(this.url, encodeURIComponent(containerName)), this.pipeline);\n }\n /**\n * Create a Blob container. @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-container\n *\n * @param containerName - Name of the container to create.\n * @param options - Options to configure Container Create operation.\n * @returns Container creation response and the corresponding container client.\n */\n async createContainer(containerName, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-createContainer", options);\n try {\n const containerClient = this.getContainerClient(containerName);\n const containerCreateResponse = await containerClient.create(updatedOptions);\n return {\n containerClient,\n containerCreateResponse,\n };\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Deletes a Blob container.\n *\n * @param containerName - Name of the container to delete.\n * @param options - Options to configure Container Delete operation.\n * @returns Container deletion response.\n */\n async deleteContainer(containerName, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-deleteContainer", options);\n try {\n const containerClient = this.getContainerClient(containerName);\n return await containerClient.delete(updatedOptions);\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Restore a previously deleted Blob container.\n * This API is only functional if Container Soft Delete is enabled for the storage account associated with the container.\n *\n * @param deletedContainerName - Name of the previously deleted container.\n * @param deletedContainerVersion - Version of the previously deleted container, used to uniquely identify the deleted container.\n * @param options - Options to configure Container Restore operation.\n * @returns Container deletion response.\n */\n async undeleteContainer(deletedContainerName, deletedContainerVersion, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-undeleteContainer", options);\n try {\n const containerClient = this.getContainerClient(options.destinationContainerName || deletedContainerName);\n // Hack to access a protected member.\n const containerContext = new Container(containerClient["storageClientContext"]);\n const containerUndeleteResponse = await containerContext.restore(Object.assign({ deletedContainerName,\n deletedContainerVersion }, updatedOptions));\n return { containerClient, containerUndeleteResponse };\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Rename an existing Blob Container.\n *\n * @param sourceContainerName - The name of the source container.\n * @param destinationContainerName - The new name of the container.\n * @param options - Options to configure Container Rename operation.\n */\n /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */\n // @ts-ignore Need to hide this interface for now. Make it public and turn on the live tests for it when the service is ready.\n async renameContainer(sourceContainerName, destinationContainerName, options = {}) {\n var _a;\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-renameContainer", options);\n try {\n const containerClient = this.getContainerClient(destinationContainerName);\n // Hack to access a protected member.\n const containerContext = new Container(containerClient["storageClientContext"]);\n const containerRenameResponse = await containerContext.rename(sourceContainerName, Object.assign(Object.assign({}, updatedOptions), { sourceLeaseId: (_a = options.sourceCondition) === null || _a === void 0 ? void 0 : _a.leaseId }));\n return { containerClient, containerRenameResponse };\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Gets the properties of a storage account’s Blob service, including properties\n * for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-properties\n *\n * @param options - Options to the Service Get Properties operation.\n * @returns Response data for the Service Get Properties operation.\n */\n async getProperties(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-getProperties", options);\n try {\n return await this.serviceContext.getProperties(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Sets properties for a storage account’s Blob service endpoint, including properties\n * for Storage Analytics, CORS (Cross-Origin Resource Sharing) rules and soft delete settings.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-service-properties\n *\n * @param properties -\n * @param options - Options to the Service Set Properties operation.\n * @returns Response data for the Service Set Properties operation.\n */\n async setProperties(properties, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-setProperties", options);\n try {\n return await this.serviceContext.setProperties(properties, Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Retrieves statistics related to replication for the Blob service. It is only\n * available on the secondary location endpoint when read-access geo-redundant\n * replication is enabled for the storage account.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-stats\n *\n * @param options - Options to the Service Get Statistics operation.\n * @returns Response data for the Service Get Statistics operation.\n */\n async getStatistics(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-getStatistics", options);\n try {\n return await this.serviceContext.getStatistics(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Get Account Information operation returns the sku name and account kind\n * for the specified account.\n * The Get Account Information operation is available on service versions beginning\n * with version 2018-03-28.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-account-information\n *\n * @param options - Options to the Service Get Account Info operation.\n * @returns Response data for the Service Get Account Info operation.\n */\n async getAccountInfo(options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-getAccountInfo", options);\n try {\n return await this.serviceContext.getAccountInfo(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns a list of the containers under the specified account.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/list-containers2\n *\n * @param marker - A string value that identifies the portion of\n * the list of containers to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all containers remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to the Service List Container Segment operation.\n * @returns Response data for the Service List Container Segment operation.\n */\n async listContainersSegment(marker, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-listContainersSegment", options);\n try {\n return await this.serviceContext.listContainersSegment(Object.assign(Object.assign(Object.assign({ abortSignal: options.abortSignal, marker }, options), { include: typeof options.include === "string" ? [options.include] : options.include }), convertTracingToRequestOptionsBase(updatedOptions)));\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * The Filter Blobs operation enables callers to list blobs across all containers whose tags\n * match a given search expression. Filter blobs searches across all containers within a\n * storage account but can be scoped within the expression to a single container.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to find blobs by tags.\n */\n async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-findBlobsByTagsSegment", options);\n try {\n const response = await this.serviceContext.filterBlobs(Object.assign({ abortSignal: options.abortSignal, where: tagFilterSqlExpression, marker, maxPageSize: options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));\n const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, blobs: response.blobs.map((blob) => {\n var _a;\n let tagValue = "";\n if (((_a = blob.tags) === null || _a === void 0 ? void 0 : _a.blobTagSet.length) === 1) {\n tagValue = blob.tags.blobTagSet[0].value;\n }\n return Object.assign(Object.assign({}, blob), { tags: toTags(blob.tags), tagValue });\n }) });\n return wrappedResponse;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Returns an AsyncIterableIterator for ServiceFindBlobsByTagsSegmentResponse.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param marker - A string value that identifies the portion of\n * the list of blobs to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all blobs remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to find blobs by tags.\n */\n findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {\n return __asyncGenerator(this, arguments, function* findBlobsByTagsSegments_1() {\n let response;\n if (!!marker || marker === undefined) {\n do {\n response = yield __await(this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options));\n response.blobs = response.blobs || [];\n marker = response.continuationToken;\n yield yield __await(response);\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator for blobs.\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param options - Options to findBlobsByTagsItems.\n */\n findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {\n return __asyncGenerator(this, arguments, function* findBlobsByTagsItems_1() {\n var e_1, _a;\n let marker;\n try {\n for (var _b = __asyncValues(this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {\n const segment = _c.value;\n yield __await(yield* __asyncDelegator(__asyncValues(segment.blobs)));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));\n }\n finally { if (e_1) throw e_1.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to find all blobs with specified tag\n * under the specified account.\n *\n * .byPage() returns an async iterable iterator to list the blobs in pages.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-properties\n *\n * Example using `for await` syntax:\n *\n * ```js\n * let i = 1;\n * for await (const blob of blobServiceClient.findBlobsByTags("tagkey=\'tagvalue\'")) {\n * console.log(`Blob ${i++}: ${container.name}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * const iter = blobServiceClient.findBlobsByTags("tagkey=\'tagvalue\'");\n * let blobItem = await iter.next();\n * while (!blobItem.done) {\n * console.log(`Blob ${i++}: ${blobItem.value.name}`);\n * blobItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of blobServiceClient.findBlobsByTags("tagkey=\'tagvalue\'").byPage({ maxPageSize: 20 })) {\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = blobServiceClient.findBlobsByTags("tagkey=\'tagvalue\'").byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 blob names\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n * // Passing next marker as continuationToken\n * iterator = blobServiceClient\n * .findBlobsByTags("tagkey=\'tagvalue\'")\n * .byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints blob names\n * if (response.blobs) {\n * for (const blob of response.blobs) {\n * console.log(`Blob ${i++}: ${blob.name}`);\n * }\n * }\n * ```\n *\n * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.\n * The given expression must evaluate to true for a blob to be returned in the results.\n * The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;\n * however, only a subset of the OData filter syntax is supported in the Blob service.\n * @param options - Options to find blobs by tags.\n */\n findBlobsByTags(tagFilterSqlExpression, options = {}) {\n // AsyncIterableIterator to iterate over blobs\n const listSegmentOptions = Object.assign({}, options);\n const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions));\n },\n };\n }\n /**\n * Returns an AsyncIterableIterator for ServiceListContainersSegmentResponses\n *\n * @param marker - A string value that identifies the portion of\n * the list of containers to be returned with the next listing operation. The\n * operation returns the continuationToken value within the response body if the\n * listing operation did not return all containers remaining to be listed\n * with the current page. The continuationToken value can be used as the value for\n * the marker parameter in a subsequent call to request the next page of list\n * items. The marker value is opaque to the client.\n * @param options - Options to list containers operation.\n */\n listSegments(marker, options = {}) {\n return __asyncGenerator(this, arguments, function* listSegments_1() {\n let listContainersSegmentResponse;\n if (!!marker || marker === undefined) {\n do {\n listContainersSegmentResponse = yield __await(this.listContainersSegment(marker, options));\n listContainersSegmentResponse.containerItems =\n listContainersSegmentResponse.containerItems || [];\n marker = listContainersSegmentResponse.continuationToken;\n yield yield __await(yield __await(listContainersSegmentResponse));\n } while (marker);\n }\n });\n }\n /**\n * Returns an AsyncIterableIterator for Container Items\n *\n * @param options - Options to list containers operation.\n */\n listItems(options = {}) {\n return __asyncGenerator(this, arguments, function* listItems_1() {\n var e_2, _a;\n let marker;\n try {\n for (var _b = __asyncValues(this.listSegments(marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {\n const segment = _c.value;\n yield __await(yield* __asyncDelegator(__asyncValues(segment.containerItems)));\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));\n }\n finally { if (e_2) throw e_2.error; }\n }\n });\n }\n /**\n * Returns an async iterable iterator to list all the containers\n * under the specified account.\n *\n * .byPage() returns an async iterable iterator to list the containers in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * let i = 1;\n * for await (const container of blobServiceClient.listContainers()) {\n * console.log(`Container ${i++}: ${container.name}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * const iter = blobServiceClient.listContainers();\n * let containerItem = await iter.next();\n * while (!containerItem.done) {\n * console.log(`Container ${i++}: ${containerItem.value.name}`);\n * containerItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const response of blobServiceClient.listContainers().byPage({ maxPageSize: 20 })) {\n * if (response.containerItems) {\n * for (const container of response.containerItems) {\n * console.log(`Container ${i++}: ${container.name}`);\n * }\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = blobServiceClient.listContainers().byPage({ maxPageSize: 2 });\n * let response = (await iterator.next()).value;\n *\n * // Prints 2 container names\n * if (response.containerItems) {\n * for (const container of response.containerItems) {\n * console.log(`Container ${i++}: ${container.name}`);\n * }\n * }\n *\n * // Gets next marker\n * let marker = response.continuationToken;\n * // Passing next marker as continuationToken\n * iterator = blobServiceClient\n * .listContainers()\n * .byPage({ continuationToken: marker, maxPageSize: 10 });\n * response = (await iterator.next()).value;\n *\n * // Prints 10 container names\n * if (response.containerItems) {\n * for (const container of response.containerItems) {\n * console.log(`Container ${i++}: ${container.name}`);\n * }\n * }\n * ```\n *\n * @param options - Options to list containers.\n * @returns An asyncIterableIterator that supports paging.\n */\n listContainers(options = {}) {\n if (options.prefix === "") {\n options.prefix = undefined;\n }\n const include = [];\n if (options.includeDeleted) {\n include.push("deleted");\n }\n if (options.includeMetadata) {\n include.push("metadata");\n }\n if (options.includeSystem) {\n include.push("system");\n }\n // AsyncIterableIterator to iterate over containers\n const listSegmentOptions = Object.assign(Object.assign({}, options), (include.length > 0 ? { include } : {}));\n const iter = this.listItems(listSegmentOptions);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings = {}) => {\n return this.listSegments(settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions));\n },\n };\n }\n /**\n * ONLY AVAILABLE WHEN USING BEARER TOKEN AUTHENTICATION (TokenCredential).\n *\n * Retrieves a user delegation key for the Blob service. This is only a valid operation when using\n * bearer token authentication.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-user-delegation-key\n *\n * @param startsOn - The start time for the user delegation SAS. Must be within 7 days of the current time\n * @param expiresOn - The end time for the user delegation SAS. Must be within 7 days of the current time\n */\n async getUserDelegationKey(startsOn, expiresOn, options = {}) {\n const { span, updatedOptions } = tracing_createSpan("BlobServiceClient-getUserDelegationKey", options);\n try {\n const response = await this.serviceContext.getUserDelegationKey({\n startsOn: truncatedISO8061Date(startsOn, false),\n expiresOn: truncatedISO8061Date(expiresOn, false),\n }, Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));\n const userDelegationKey = {\n signedObjectId: response.signedObjectId,\n signedTenantId: response.signedTenantId,\n signedStartsOn: new Date(response.signedStartsOn),\n signedExpiresOn: new Date(response.signedExpiresOn),\n signedService: response.signedService,\n signedVersion: response.signedVersion,\n value: response.value,\n };\n const res = Object.assign({ _response: response._response, requestId: response.requestId, clientRequestId: response.clientRequestId, version: response.version, date: response.date, errorCode: response.errorCode }, userDelegationKey);\n return res;\n }\n catch (e) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: e.message,\n });\n throw e;\n }\n finally {\n span.end();\n }\n }\n /**\n * Creates a BlobBatchClient object to conduct batch operations.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch\n *\n * @returns A new BlobBatchClient object for this service.\n */\n getBlobBatchClient() {\n return new BlobBatchClient(this.url, this.pipeline);\n }\n /**\n * Only available for BlobServiceClient constructed with a shared key credential.\n *\n * Generates a Blob account Shared Access Signature (SAS) URI based on the client properties\n * and parameters passed in. The SAS is signed by the shared key credential of the client.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-account-sas\n *\n * @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.\n * @param permissions - Specifies the list of permissions to be associated with the SAS.\n * @param resourceTypes - Specifies the resource types associated with the shared access signature.\n * @param options - Optional parameters.\n * @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.\n */\n generateAccountSasUrl(expiresOn, permissions = AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {\n if (!(this.credential instanceof StorageSharedKeyCredential)) {\n throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");\n }\n if (expiresOn === undefined) {\n const now = new Date();\n expiresOn = new Date(now.getTime() + 3600 * 1000);\n }\n const sas = generateAccountSASQueryParameters(Object.assign({ permissions,\n expiresOn,\n resourceTypes, services: AccountSASServices.parse("b").toString() }, options), this.credential).toString();\n return appendToURLQuery(this.url, sas);\n }\n}\n//# sourceMappingURL=BlobServiceClient.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/generatedModels.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/** Known values of {@link EncryptionAlgorithmType} that the service accepts. */\nvar KnownEncryptionAlgorithmType;\n(function (KnownEncryptionAlgorithmType) {\n KnownEncryptionAlgorithmType["AES256"] = "AES256";\n})(KnownEncryptionAlgorithmType || (KnownEncryptionAlgorithmType = {}));\n//# sourceMappingURL=generatedModels.js.map\n;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist-esm/storage-blob/src/index.js\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg1NTEuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsNkM7Ozs7QUNWQTtBQUNBO0FBQ3dDO0FBQ1U7QUFDZDtBQUNwQyxxQ0FBcUMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEdBQUc7QUFDcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFdBQVcscUJBQU07QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxxQkFBcUI7QUFDckIsV0FBVyxXQUFXLE1BQU07QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDOztBQzdNQTtBQUNBO0FBQzBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGNBQWMsR0FBRyxzQkFBc0I7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsY0FBYyxHQUFHLGVBQWU7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsaUJBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxXQUFXO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsYUFBYTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLFdBQVc7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1QkFBdUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFVBQVU7QUFDckMseUJBQXlCLFVBQVU7QUFDbkMseUJBQXlCLFVBQVU7QUFDbkMseUJBQXlCLFVBQVU7QUFDbkMsMEJBQTBCLFVBQVU7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGlCQUFpQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLG1CQUFtQjtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCOztBQ3BsQkE7QUFDQTtBQUM4QztBQUNYO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxrQkFBa0IsdURBQXVELElBQUk7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxZQUFZLDBDQUEwQztBQUMzRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFFBQVE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EOztBQzdEQTtBQUNBO0FBQzBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsOEM7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDOztBQ2xCQTtBQUNBO0FBQzZEO0FBQ1I7QUFDeUM7QUFDaEI7QUFDcEI7QUFDMUQsaUM7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsb0RBQW9EO0FBQ3JELGdEOztBQ3hCQTtBQUNBO0FBQytEO0FBQy9EO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQyxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFFBQVE7QUFDckMsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFFBQVE7QUFDckMsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQyxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQyxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOztBQ3pnUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzREFBc0Q7QUFDdkQsaUQ7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3lEO0FBQ29LO0FBQ3ROO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsWUFBWSxxQkFBMkI7QUFDdkM7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ087QUFDUDtBQUNBLFlBQVksT0FBYTtBQUN6QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixRQUFRO0FBQzdCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFlBQVksWUFBa0I7QUFDOUI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxZQUFZLFFBQWM7QUFDMUI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxZQUFZLGVBQXFCO0FBQ2pDO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0M7O0FDemtEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUM2QztBQUNBO0FBQ007QUFDbkQ7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG9DQUE2QyxjQUFjO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLDZCQUE2QixvR0FBb0cscURBQXFEO0FBQ3pQO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asc0JBQXNCLFVBQVU7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxZQUFZLHVCQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sZUFBZSxrQkFBSztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asc0JBQXNCLFVBQVU7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QixLQUFLLFlBQVks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ekQ7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNLGtCQUFVLEdBQUcsa0JBQWtCO0FBQzVDO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDhCQUE4QjtBQUNsQztBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsS0FBSztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDOztBQ2xNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDhCQUE4QjtBQUNsQztBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwrQkFBK0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStELEtB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QTtBQUMwQztBQUNpQztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsMEJBQTBCO0FBQ2xDO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBLHNDQUFzQyx1QkFBdUI7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QSxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsYUFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLHFDOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7O0FDNVlBO0FBQ0E7QUFDc0Q7QUFDVTtBQUMxQjtBQUN1QjtBQUM3RDtBQUNBO0FBQ0E7QUFDTyx3QkFBd0IsTUFBTTtBQUNyQztBQUNBLGdCQUFnQixlQUFlLDZCQUFtQiw4R0FBOEc7QUFDaEs7QUFDQSxjQUFjLDBCQUFnQjtBQUM5QjtBQUNBLDhCQUE4QixvQkFBb0I7QUFDbEQ7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQzs7QUM1QkE7QUFDQTtBQUMyQztBQUMzQyxpQzs7QUNIQTtBQUNBO0FBQ29EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxZQUFZLG9CQUFvQjtBQUNoQztBQUM0QztBQUNUO0FBQ087QUFDMUMsaUM7O0FDbEJBO0FBQ0E7QUFDeUM7QUFDQTtBQUN6QztBQUNBLG1DQUFtQyxrQ0FBa0M7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDTyx5Q0FBeUMsTUFBTTtBQUN0RDtBQUNBLGdCQUFnQixpR0FBaUc7QUFDakg7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RkFBOEYsWUFBWTtBQUMxRztBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBLFlBQVksa0RBQWtEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSxrQ0FBa0M7QUFDcEcsb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsMENBQTBDO0FBQ3BIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxtQ0FBUTtBQUNkLDRCQUE0QixtQkFBbUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQSxzRDs7QUNqSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixjQUFjLEdBQUcsaUNBQWlDO0FBQ3JFLG1CQUFtQixjQUFjO0FBQ2pDO0FBQ0EsaUM7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtDQUFrQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNkJBQVk7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDOztBQ3pIQTtBQUNBO0FBQ2tDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNPLDRCQUE0Qix5QkFBUTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Qzs7QUNsRkE7QUFDQTtBQUNnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixzQ0FBMkI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixhQUFhO0FBQ2hDO0FBQ0E7QUFDQSx3Qzs7QUN0RkE7QUFDQTtBQUNzQztBQUNRO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw2QkFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUZBQWlGLFdBQVc7QUFDNUY7QUFDQTtBQUNBLGlGQUFpRixXQUFXO0FBQzVGO0FBQ0E7QUFDQSxrRkFBa0YsWUFBWTtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsWUFBWTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQzs7OztBQzNQQTtBQUNBO0FBQ3lCO0FBQ0k7QUFDaUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxpQkFBaUI7QUFDakIsZ0NBQWdDO0FBQ2hDO0FBQ0EsNkdBQTZHLGVBQWU7QUFDNUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0csSUFBSSxlQUFlLE1BQU07QUFDekg7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSxXQUFXO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsbUJBQW1CLDhCQUFvQjtBQUN2QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxlQUFlLHdCQUFjLENBQUMsaUJBQU87QUFDckMsMkJBQTJCLDZCQUFtQjtBQUNyRCxzQzs7QUNuSW1GO0FBQzhCO0FBQzVEO0FBQ1M7QUFDTjtBQUNnQjtBQUNjO0FBQ1k7QUFDbkM7QUFDRztBQUNUO0FBQzBCO0FBQzNDO0FBQ1E7QUFDVjtBQUNxQjtBQUN1UjtBQUNqUTtBQUM2TztBQUN0TjtBQUMxQjtBQUMxQjtBQUNwRDtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ08seUJBQXlCLGFBQWE7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGNBQWM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQU0sbURBQW1ELDBCQUEwQjtBQUNyRywyREFBMkQsbUJBQW1CO0FBQzlFLFlBQVksaUJBQWlCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixXQUFXLEtBQUssbUJBQW1CO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsNEJBQTRCO0FBQy9EO0FBQ0Esb0JBQW9CLHVCQUFNO0FBQzFCLG9EQUFvRCwwQkFBMEI7QUFDOUUsMEJBQTBCLGVBQWUsQ0FBQyxlQUFlO0FBQ3pEO0FBQ0EsK0NBQStDLHVCQUF1QjtBQUN0RTtBQUNBLCtCQUErQixXQUFXO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGVBQWUsQ0FBQyxlQUFlO0FBQ25EO0FBQ0E7QUFDQSwyQkFBMkIsV0FBVyxLQUFLLG1CQUFtQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDJEQUEyRDtBQUN0RTtBQUNBLCtCQUErQixTQUFXO0FBQzFDLHlCQUF5QixlQUFlLFdBQVcsc0JBQVk7QUFDL0QsMEJBQTBCLGVBQWUsV0FBVyxzQkFBWTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsZUFBZSxXQUFXLHNCQUFZO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixlQUFlLFdBQVcsc0JBQVk7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0EsUUFBUSxvQkFBb0I7QUFDNUIsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0Esd0VBQXdFLHFJQUFxSSx5QkFBeUIseUZBQXlGO0FBQy9ULHdDQUF3Qyx1QkFBTTtBQUM5QyxpQkFBaUIsOENBQThDLGFBQWEsR0FBRyxlQUFlLHlLQUF5SyxFQUFFLGtDQUFrQztBQUMzUyw2REFBNkQsVUFBVSxrSUFBa0ksNEJBQTRCLDhCQUE4QjtBQUNuUTtBQUNBLGlCQUFpQix1QkFBTTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsbUNBQW1DO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsMkJBQTJCLGFBQWE7QUFDeEM7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsYUFBYSwrQkFBK0I7QUFDbEU7QUFDQSx3RUFBd0Usa0NBQWtDO0FBQzFHLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxzQ0FBc0M7QUFDL0UsNENBQTRDLHlDQUF5QztBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHVCQUF1QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMsNkVBQTZFLHFJQUFxSSx5QkFBeUIseUZBQXlGLHlDQUF5QyxFQUFFLGtDQUFrQztBQUNqWixpREFBaUQsVUFBVSxrSUFBa0ksNEJBQTRCLDhCQUE4QjtBQUN2UDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQTtBQUNBLGlFQUFpRSwrS0FBK0sseUJBQXlCLHlGQUF5RixHQUFHLEVBQUUsa0NBQWtDO0FBQ3pZO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsaURBQWlELGlCQUFpQixVQUFVLDBCQUEwQjtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixjQUFjO0FBQ3hDO0FBQ0EsaUJBQWlCO0FBQ2pCLHFEQUFxRCxrQkFBa0IsOEVBQThFLHVCQUF1QjtBQUM1SztBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSxtRUFBbUUsa0NBQWtDLEVBQUUsa0NBQWtDO0FBQ3pJO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMseUVBQXlFLHVLQUF1Syx5QkFBeUIseUZBQXlGLEdBQUcsRUFBRSxrQ0FBa0M7QUFDelk7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMsc0VBQXNFLCtJQUErSSx5QkFBeUIseUZBQXlGLG1GQUFtRixFQUFFLGtDQUFrQztBQUM5YjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSxnRkFBZ0YscUlBQXFJLHlCQUF5Qix5RkFBeUYsR0FBRyxFQUFFLGtDQUFrQyxxQkFBcUIsTUFBTSxVQUFVLFFBQVE7QUFDM1o7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLDRFQUE0RSxxSUFBcUkseUJBQXlCLHlGQUF5RixHQUFHLEVBQUUsa0NBQWtDO0FBQzFXLGtFQUFrRSxlQUFlLHFDQUFxQyxNQUFNLEdBQUcsaUNBQWlDLFNBQVM7QUFDeks7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsdUJBQXVCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMseUVBQXlFLGlLQUFpSyx5QkFBeUIseUZBQXlGLG1GQUFtRixFQUFFLGtDQUFrQztBQUNuZDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG1CQUFtQjtBQUN2RDtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwwQkFBMEI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLG1GQUFtRiw2RUFBNkUsRUFBRSxrQ0FBa0M7QUFDcE07QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0E7QUFDQSxrRkFBa0YsaUtBQWlLLHlCQUF5Qix5RkFBeUY7QUFDclc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsdUVBQXVFLHlCQUF5QixxQ0FBcUMsWUFBWSxnQ0FBZ0MsZ0JBQWdCLDhWQUE4VixFQUFFLGtDQUFrQztBQUNwbEI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLGtEQUFrRCxZQUFZLHdCQUF3QixxSUFBcUkseUJBQXlCLHlGQUF5RixpREFBaUQsRUFBRSxrQ0FBa0M7QUFDbGE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxpQ0FBaUM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0ZBQXdGLGNBQWMsOENBQThDLDJCQUEyQixrQ0FBa0MsbUJBQW1CO0FBQ3BPO0FBQ0E7QUFDQSxtREFBbUQsUUFBUSxxQ0FBcUMsdUJBQXVCO0FBQ3ZIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEUsTUFBTSxvSkFBb0osY0FBYztBQUN0UDtBQUNBO0FBQ0E7QUFDQSx3SEFBd0gsTUFBTTtBQUM5SDtBQUNBO0FBQ0EsOEJBQThCLEtBQUs7QUFDbkMsbUNBQW1DLHNCQUFzQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLDJCQUEyQixrQ0FBa0M7QUFDbkkscUJBQXFCO0FBQ3JCO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QywrQkFBK0I7QUFDNUU7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEUsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsOEZBQThGLGNBQWMsOENBQThDLDJCQUEyQixrQ0FBa0MsbUJBQW1CO0FBQzFPO0FBQ0Esc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsVUFBVTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsdUZBQXVGLGlLQUFpSyx5QkFBeUIseUZBQXlGO0FBQzFXO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa1RBQWtULFlBQVksZ0NBQWdDLGdCQUFnQiw0Q0FBNEMsRUFBRSxrQ0FBa0M7QUFDL2M7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsMEJBQTBCO0FBQ3ZFO0FBQ0E7QUFDQSx3QkFBd0IsOEJBQThCLGlCQUFpQixvSEFBb0g7QUFDM0wsb0JBQW9CLGdCQUFnQjtBQUNwQyxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSxtRkFBbUYsb0ZBQW9GLEVBQUUsa0NBQWtDO0FBQzNNO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLGdGQUFnRixpVEFBaVQsRUFBRSxrQ0FBa0M7QUFDcmE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EseUZBQXlGLG9GQUFvRixFQUFFLGtDQUFrQztBQUNqTjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUFNLG1EQUFtRCwwQkFBMEI7QUFDckcsMkRBQTJELG1CQUFtQjtBQUM5RSxZQUFZLGlCQUFpQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVyxLQUFLLG1CQUFtQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDRCQUE0QjtBQUMvRDtBQUNBLG9CQUFvQix1QkFBTTtBQUMxQixvREFBb0QsMEJBQTBCO0FBQzlFLDBCQUEwQixlQUFlLENBQUMsZUFBZTtBQUN6RDtBQUNBLCtDQUErQyx1QkFBdUI7QUFDdEU7QUFDQSwrQkFBK0IsV0FBVztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixlQUFlLENBQUMsZUFBZTtBQUNuRDtBQUNBO0FBQ0EsMkJBQTJCLFdBQVcsS0FBSyxtQkFBbUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFVBQVU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsZUFBZSxXQUFXLHNCQUFZO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMsMEVBQTBFLDJNQUEyTSx5QkFBeUIseUZBQXlGLCtWQUErVixnQkFBZ0IsZ0JBQWdCLEVBQUUsa0NBQWtDO0FBQzF5QjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRCw2QkFBNkIsYUFBYSxPQUFPO0FBQ2pEO0FBQ0Esd0VBQXdFLHFCQUFxQixZQUFZO0FBQ3pHLGlEQUFpRCxpQkFBaUIsVUFBVSwwQkFBMEI7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBLGlCQUFpQjtBQUNqQixxREFBcUQsa0JBQWtCLDhFQUE4RSx1QkFBdUI7QUFDNUs7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQTtBQUNBLHFFQUFxRSx5TEFBeUwseUJBQXlCLHlGQUF5RixHQUFHLEVBQUUsa0NBQWtDO0FBQ3ZaO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMsaUdBQWlHLHlMQUF5TCx5QkFBeUIseUZBQXlGO0FBQzVZO0FBQ0EsaUJBQWlCLDBNQUEwTSxFQUFFLGtDQUFrQztBQUMvUDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDLGlHQUFpRywrQ0FBK0MsYUFBYSxHQUFHLDZCQUE2QixzUEFBc1AseUJBQXlCLHlGQUF5RjtBQUNyaUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMkJBQTJCLHlCQUF5QiwrR0FBK0csRUFBRSxrQ0FBa0M7QUFDeE47QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksY0FBYztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBTSxtREFBbUQsMEJBQTBCO0FBQ3JHLDJEQUEyRCxtQkFBbUI7QUFDOUUsWUFBWSxpQkFBaUI7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFdBQVcsS0FBSyxtQkFBbUI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyw0QkFBNEI7QUFDL0Q7QUFDQSxvQkFBb0IsdUJBQU07QUFDMUIsb0RBQW9ELDBCQUEwQjtBQUM5RSwwQkFBMEIsZUFBZSxDQUFDLGVBQWU7QUFDekQ7QUFDQSwrQ0FBK0MsdUJBQXVCO0FBQ3RFO0FBQ0EsK0JBQStCLFdBQVc7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZSxDQUFDLGVBQWU7QUFDbkQ7QUFDQTtBQUNBLDJCQUEyQixXQUFXLEtBQUssbUJBQW1CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxTQUFTO0FBQzdDLGdDQUFnQyxTQUFXO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLGVBQWUsV0FBVyxzQkFBWTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBLFFBQVEsb0JBQW9CO0FBQzVCLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLGlCQUFpQix1QkFBTTtBQUN2QjtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMsMkVBQTJFO0FBQzNFO0FBQ0E7QUFDQSx3Q0FBd0Msb0JBQW9CO0FBQzVELHlDQUF5QyxvQkFBb0I7QUFDN0QsaUJBQWlCLHFHQUFxRyx5QkFBeUIseUZBQXlGLHlDQUF5QyxFQUFFLGtDQUFrQztBQUNyVCx1QkFBdUIsaUJBQWlCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxZQUFZLGtCQUFrQixLQUFLLHNCQUFzQjtBQUN6RDtBQUNBLDREQUE0RCxpQkFBaUI7QUFDN0UsUUFBUSxvQkFBb0IsSUFBSSx5QkFBeUI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSxZQUFZLG9CQUFvQjtBQUNoQywyRkFBMkYsMk1BQTJNLHlCQUF5Qix5RkFBeUY7QUFDeFo7QUFDQSxpQkFBaUIsb1ZBQW9WLFlBQVksZ0NBQWdDLGdCQUFnQixnQkFBZ0IsRUFBRSxrQ0FBa0M7QUFDcmQ7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0Esd0JBQXdCLHlCQUF5QixLQUFLLHNCQUFzQjtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDLHdIQUF3SCxjQUFjLDZJQUE2SSx5QkFBeUIsMENBQTBDO0FBQ3RWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsaUVBQWlFLHlCQUF5QixxQ0FBcUMsWUFBWSxnQ0FBZ0MsZ0JBQWdCLHdEQUF3RCxHQUFHLGtDQUFrQztBQUN6UztBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9ELGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDLHdHQUF3RztBQUN4RztBQUNBLGlCQUFpQiwwTUFBME0sRUFBRSxrQ0FBa0M7QUFDL1A7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0VBQStFO0FBQy9FLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDLHdHQUF3RywyTkFBMk4sYUFBYSxHQUFHLGVBQWUsNEdBQTRHLHlCQUF5QiwrQkFBK0IsRUFBRSxrQ0FBa0M7QUFDMWlCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrQkFBa0IseUJBQXlCLHVCQUF1QjtBQUNuRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSxZQUFZLG9CQUFvQjtBQUNoQyxpRUFBaUUsZ0JBQWdCLGtCQUFrQiwyTUFBMk0seUJBQXlCLHlGQUF5RixxVkFBcVYsWUFBWSxnQ0FBZ0MsZ0JBQWdCLGdCQUFnQixFQUFFLGtDQUFrQztBQUNyMkI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSwyRkFBMkYscUlBQXFJLHlCQUF5Qix5RkFBeUYsR0FBRyxFQUFFLGtDQUFrQztBQUN6WDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELHdEQUF3RDtBQUNoSCxRQUFRLHVDQUF1QywyQkFBMkIsY0FBYztBQUN4Rix5Q0FBeUMsa0JBQWtCLG9DQUFvQztBQUMvRjtBQUNBO0FBQ0EsaUJBQWlCLHNEQUFzRDtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsZ0JBQWdCLHVCQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsa0JBQWtCO0FBQzNELFFBQVEsdUJBQXVCO0FBQy9CO0FBQ0EsaUJBQWlCLHNEQUFzRDtBQUN2RTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix1QkFBdUI7QUFDdEQ7QUFDQSx1REFBdUQsd0RBQXdEO0FBQy9HLFFBQVEsdUNBQXVDLDJCQUEyQixjQUFjO0FBQ3hGLHlDQUF5QyxrQkFBa0Isb0NBQW9DO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxnQ0FBZ0M7QUFDekYseUVBQXlFLGdDQUFnQyxDQUFDO0FBQzFHO0FBQ0E7QUFDQSx3Q0FBd0MsZ0NBQWdDO0FBQ3hFO0FBQ0E7QUFDQSx3Q0FBd0MsZ0NBQWdDO0FBQ3hFLGlGQUFpRixnQ0FBZ0MsQ0FBQztBQUNsSDtBQUNBO0FBQ0EsdUJBQXVCLGdDQUFnQyxHQUFHLHFCQUFxQjtBQUMvRSx3Q0FBd0MsTUFBTTtBQUM5QztBQUNBO0FBQ0EscURBQXFELHFCQUFxQjtBQUMxRSx3Q0FBd0MsaUNBQWlDO0FBQ3pFLHdDQUF3QyxpQ0FBaUM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pELGlHQUFpRztBQUNqRyx1REFBdUQscUJBQXFCLENBQUM7QUFDN0U7QUFDQTtBQUNBLGtDQUFrQyxZQUFZO0FBQzlDO0FBQ0EsOEJBQThCLEtBQUs7QUFDbkMsNEJBQTRCLGVBQWU7QUFDM0M7QUFDQSxvQ0FBb0MsZUFBZTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDO0FBQ0EsNkJBQTZCLGtCQUFrQjtBQUMvQztBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYSxzQ0FBc0MsY0FBYyw4Q0FBOEMsMkJBQTJCLGtDQUFrQyxtQkFBbUI7QUFDL0w7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsK0JBQStCLGtDQUFrQztBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQTtBQUNBLGtDQUFrQyxZQUFZO0FBQzlDO0FBQ0E7QUFDQSxrQ0FBa0MsZUFBZTtBQUNqRCxnQ0FBZ0MsZUFBZTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLCtCQUErQjtBQUN4RTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RkFBdUYsY0FBYyw4Q0FBOEMsMkJBQTJCLGtDQUFrQyxtQkFBbUI7QUFDbk87QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksY0FBYztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBTSxtREFBbUQsMEJBQTBCO0FBQ3JHLDJEQUEyRCxtQkFBbUI7QUFDOUUsWUFBWSxpQkFBaUI7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFdBQVcsS0FBSyxtQkFBbUI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyw0QkFBNEI7QUFDL0Q7QUFDQSxvQkFBb0IsdUJBQU07QUFDMUIsb0RBQW9ELDBCQUEwQjtBQUM5RSwwQkFBMEIsZUFBZSxDQUFDLGVBQWU7QUFDekQ7QUFDQSwrQ0FBK0MsdUJBQXVCO0FBQ3RFO0FBQ0EsK0JBQStCLFdBQVc7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZSxDQUFDLGVBQWU7QUFDbkQ7QUFDQTtBQUNBLDJCQUEyQixXQUFXLEtBQUssbUJBQW1CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGVBQWUsV0FBVyxzQkFBWTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMsOEVBQThFLDJQQUEyUCx5QkFBeUIseUZBQXlGLHFWQUFxVixZQUFZLGdDQUFnQyxnQkFBZ0IsZ0JBQWdCLEVBQUUsa0NBQWtDO0FBQ2g0QjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSxpQ0FBaUMsYUFBYSxPQUFPO0FBQ3JELDhFQUE4RSxjQUFjLDJEQUEyRDtBQUN2SixpREFBaUQsaUJBQWlCLFVBQVUsMEJBQTBCO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQSxpQkFBaUI7QUFDakIscURBQXFELGtCQUFrQiw4RUFBOEUsdUJBQXVCO0FBQzVLO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMsdUZBQXVGLHFJQUFxSSx5QkFBeUIseUZBQXlGO0FBQzlVO0FBQ0EsaUJBQWlCLFNBQVMsYUFBYSxHQUFHLGVBQWUsK1BBQStQLEVBQUUsa0NBQWtDO0FBQzVWO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRkFBcUY7QUFDckY7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEMsNEVBQTRFLGFBQWEsR0FBRyw2QkFBNkIsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLG1CQUFtQixxUkFBcVIseUJBQXlCLHlGQUF5RjtBQUNwa0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMkdBQTJHLHlCQUF5QiwrQkFBK0IsRUFBRSxrQ0FBa0M7QUFDeE47QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSw0RUFBNEUscUlBQXFJLHlCQUF5Qix5RkFBeUYsVUFBVSxhQUFhLEdBQUcsZUFBZSx1SUFBdUksRUFBRSxrQ0FBa0M7QUFDdmhCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQSwrQ0FBK0MscUlBQXFJLHlCQUF5Qix5RkFBeUYsVUFBVSxhQUFhLEdBQUcsZUFBZSxHQUFHLEVBQUUsa0NBQWtDO0FBQ3RYLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsNEVBQTRFLHFJQUFxSSx5QkFBeUIseUZBQXlGLFVBQVUsYUFBYSxHQUFHLGVBQWUscURBQXFELEVBQUUsa0NBQWtDO0FBQ3JjO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsT0FBTztBQUNwRTtBQUNBLGdDQUFnQyxPQUFPLE9BQU8sT0FBTztBQUNyRCxrQkFBa0I7QUFDbEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDRDQUE0QyxxQkFBcUI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RCxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsYUFBYSxzRUFBc0UsV0FBVyxPQUFPLHNCQUFzQjtBQUN6SjtBQUNBLDBCQUEwQixPQUFPLFFBQVEsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLHlCQUF5QjtBQUNqRztBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBLGtFQUFrRSxPQUFPO0FBQ3pFO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvSUFBb0k7QUFDcEk7QUFDQTtBQUNBLG1DQUFtQyxJQUFJLElBQUksaUJBQWlCLElBQUksY0FBYztBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxJQUFJLElBQUksMkJBQTJCLElBQUksd0JBQXdCLGFBQWEsNEJBQTRCO0FBQzNJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSxpQkFBaUI7QUFDOUY7QUFDQSxxQ0FBcUMsSUFBSSxJQUFJLGlCQUFpQixJQUFJLGNBQWM7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxnQkFBZ0I7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsSUFBSSxJQUFJLGlCQUFpQixJQUFJLGNBQWM7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsNENBQTRDO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLElBQUksSUFBSSxpQkFBaUIsSUFBSSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQyxpSEFBaUgsbUNBQW1DO0FBQ3BKLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsbURBQW1ELHFJQUFxSSx5QkFBeUIseUZBQXlGLHNDQUFzQyxhQUFhLEdBQUcsZUFBZSxHQUFHLEVBQUUsa0NBQWtDO0FBQ3RaLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSxnRkFBZ0YseU9BQXlPLDJFQUEyRSwySUFBMkksMkNBQTJDLGFBQWE7QUFDdmtCO0FBQ0E7QUFDQSxpQkFBaUIsdUdBQXVHLEVBQUUsa0NBQWtDO0FBQzVKO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxPQUFPO0FBQ3BFO0FBQ0EsZ0NBQWdDLE9BQU8sT0FBTyxPQUFPO0FBQ3JELGtCQUFrQjtBQUNsQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsNENBQTRDLHFCQUFxQjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixhQUFhLDZGQUE2RixXQUFXLE9BQU8sc0JBQXNCO0FBQ2hMO0FBQ0EsMEJBQTBCLE9BQU8sUUFBUSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMseUJBQXlCO0FBQ2pHO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBO0FBQ0Esa0VBQWtFLE9BQU87QUFDekU7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9JQUFvSTtBQUNwSTtBQUNBO0FBQ0EsbUNBQW1DLElBQUksSUFBSSxpQkFBaUIsSUFBSSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLElBQUksSUFBSSwyQkFBMkIsSUFBSSx3QkFBd0IsYUFBYSw0QkFBNEI7QUFDM0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUZBQWlGLGlCQUFpQjtBQUNsRztBQUNBLHFDQUFxQyxJQUFJLElBQUksaUJBQWlCLElBQUksY0FBYztBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLGdCQUFnQjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxJQUFJLElBQUksaUJBQWlCLElBQUksY0FBYztBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCw0Q0FBNEM7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsSUFBSSxJQUFJLGlCQUFpQixJQUFJLGNBQWM7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0EsOEZBQThGO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQyxtSUFBbUksbUNBQW1DO0FBQ3RLLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RkFBdUY7QUFDdkY7QUFDQTtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsbURBQW1ELHFJQUFxSSx5QkFBeUIseUZBQXlGLDJCQUEyQixhQUFhLEdBQUcsZUFBZSxHQUFHLEVBQUUsa0NBQWtDO0FBQzNZLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsMkVBQTJFLHFJQUFxSSx5QkFBeUIseUZBQXlGLDZDQUE2QyxFQUFFLGtDQUFrQztBQUNuWjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLHlHQUF5Ryx5S0FBeUsseUJBQXlCLHlGQUF5RixHQUFHLEVBQUUsa0NBQWtDO0FBQzNhO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsMEZBQTBGLDBGQUEwRix5QkFBeUIseUZBQXlGLEdBQUcsRUFBRSxrQ0FBa0M7QUFDN1U7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7QUNwc0ZBO0FBQ0E7QUFDcUQ7QUFDVTtBQUN4RDtBQUNQLDhCQUE4QiwwQkFBMEI7QUFDeEQsaUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxzQzs7QUNkQTtBQUNBO0FBQytDO0FBQzZEO0FBQy9EO0FBQ2Q7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsMkJBQTJCLEVBQUUsZ0JBQWdCLENBQUM7QUFDcEYsd0NBQXdDLDJCQUEyQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELGlCQUFpQjtBQUNyRSxpRkFBaUYsb0NBQW9DO0FBQ3JIO0FBQ0EseUNBQXlDLGFBQWE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwwQkFBMEI7QUFDdEQ7QUFDQTtBQUNBLGtEQUFrRCx1QkFBVztBQUM3RCx1REFBdUQsZ0JBQWdCLENBQUM7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QseUJBQWU7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsZ0JBQWdCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRUFBK0UsYUFBYSxtQ0FBbUMsc0JBQXNCO0FBQ3JKO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHlCQUFlO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsTUFBTSx1QkFBdUIsTUFBTSxzRUFBc0UsVUFBVTtBQUNuSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQzs7QUN2SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwQ0FBMEM7QUFDM0M7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQzs7QUNoRUE7QUFDQTtBQUNpTDtBQUM1SDtBQUNtQjtBQUNqQztBQUNEO0FBQ0E7QUFDMEQ7QUFDZ0M7QUFDMUM7QUFDekM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLEtBQUs7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSEFBMEgsZ0JBQWdCO0FBQzFJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsdUJBQU0sbUNBQW1DLDBCQUEwQjtBQUNqRiwrQ0FBK0MsbUJBQW1CO0FBQ2xFLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsVUFBVTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsMEJBQTBCLFVBQVU7QUFDcEMsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHVCQUFNLGdDQUFnQywwQkFBMEI7QUFDOUUsNENBQTRDLG1CQUFtQjtBQUMvRCxnQkFBZ0IsaUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsVUFBVTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiwwQkFBMEIsVUFBVTtBQUNwQyxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFlBQVk7QUFDckMsa0JBQWtCO0FBQ2xCLGlDQUFpQyxTQUFTO0FBQzFDLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0EscUNBQXFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLHlCQUFlLGNBQWMsb0JBQW9CLGdCQUFnQixDQUFDLEVBQUUseUJBQWUsMkJBQTJCO0FBQ3RMLDRCQUE0QixnQkFBZ0I7QUFDNUMsc0RBQXNELFdBQVcsY0FBYztBQUMvRSxvQkFBb0IsUUFBUTtBQUM1Qix1Q0FBdUMsY0FBYztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxtQkFBbUI7QUFDMUUsb0VBQW9FO0FBQ3BFO0FBQ0EsdUJBQXVCLDJDQUFxQixJQUFJO0FBQ2hELDZEQUE2RDtBQUM3RDtBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUMsa0JBQWtCLGdCQUFnQixDQUFDLCtCQUErQixhQUFhLGtCQUFrQjtBQUNqRztBQUNBO0FBQ0EsMEZBQTBGO0FBQzFGLG1CQUFtQixRQUFRLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUseUJBQWUsWUFBWSxJQUFJLG9CQUFvQjtBQUNsRTtBQUNBLGVBQWUsMkJBQTJCLEVBQUUsa0JBQWtCLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0FBQ25ILGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0EsNEJBQTRCLFlBQVksSUFBSSxhQUFhLEVBQUUsZ0JBQWdCLENBQUM7QUFDNUU7QUFDQSxxQkFBcUIsZ0JBQWdCLEVBQUU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsaUJBQWlCO0FBQ3BELGtEQUFrRCxpQkFBaUIsRUFBRTtBQUNyRTtBQUNBO0FBQ0EscUJBQXFCLFVBQVU7QUFDL0I7QUFDQSxrRUFBa0UsZUFBZTtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFVBQVUsRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsQ0FBQztBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLGlCQUFpQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsV0FBVztBQUNwQztBQUNBLHlCQUF5Qix1QkFBVztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGlCQUFpQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sY0FBYyx5QkFBZTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQzs7QUN6UkE7QUFDQTtBQUM0RDtBQUNkO0FBQ047QUFDYTtBQUM0QjtBQUNqQjtBQUNRO0FBQ0k7QUFDbkI7QUFDUDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFdBQVcsS0FBSyxtQkFBbUI7QUFDMUQ7QUFDQTtBQUNBLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0EseUNBQXlDLG9CQUFvQjtBQUM3RCxxQkFBcUIsVUFBVTtBQUMvQjtBQUNBO0FBQ0EsaURBQWlELFNBQVM7QUFDMUQ7QUFDQTtBQUNBLGlEQUFpRCxPQUFPO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixTQUFTO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsU0FBUztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLHNGQUFzRixjQUFjLDRHQUE0RyxZQUFZLGtDQUFrQztBQUM5UDtBQUNBLDRDQUE0QyxtQkFBbUI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDOztBQ3hKbUY7QUFDZ0I7QUFDOUM7QUFDbUI7QUFDYztBQUMvQjtBQUNFO0FBQ1Q7QUFDaUM7QUFDdU47QUFDMU47QUFDMUI7QUFDdUM7QUFDdkM7QUFDcEQ7QUFDQTtBQUNBO0FBQ08sOEJBQThCLGFBQWE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGNBQWM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQU0sbURBQW1ELDBCQUEwQjtBQUNyRywyREFBMkQsbUJBQW1CO0FBQzlFLFlBQVksaUJBQWlCO0FBQzdCO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVyxLQUFLLG1CQUFtQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDRCQUE0QjtBQUMvRDtBQUNBLG9CQUFvQix1QkFBTTtBQUMxQixvREFBb0QsMEJBQTBCO0FBQzlFLDBCQUEwQixlQUFlO0FBQ3pDO0FBQ0EsK0NBQStDLHVCQUF1QjtBQUN0RTtBQUNBLCtCQUErQixXQUFXO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGVBQWU7QUFDbkM7QUFDQTtBQUNBLDJCQUEyQixXQUFXLEtBQUssbUJBQW1CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFNBQVM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0E7QUFDQSxvRkFBb0YsWUFBWSxrQ0FBa0M7QUFDbEk7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0EsaURBQWlELGlCQUFpQixVQUFVLDBCQUEwQjtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixjQUFjO0FBQ3hDO0FBQ0EsaUJBQWlCO0FBQ2pCLHFEQUFxRCxrQkFBa0IsOEVBQThFLHVCQUF1QjtBQUM1SztBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RkFBdUY7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFVBQVUsQ0FBQyxlQUFlLFdBQVcsVUFBVTtBQUNsRTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQixDQUFDLGVBQWUsV0FBVyxVQUFVO0FBQ3hFO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlLENBQUMsZUFBZSxXQUFXLFVBQVU7QUFDdkU7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixjQUFjLENBQUMsZUFBZSxXQUFXLFVBQVU7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyx5QkFBeUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsMkZBQTJGLGtDQUFrQyx1QkFBdUIsa0NBQWtDO0FBQ3RMO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLHNFQUFzRSwySEFBMkgsRUFBRSxrQ0FBa0M7QUFDck87QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQTtBQUNBLGlEQUFpRCxpQkFBaUIsVUFBVSwwQkFBMEI7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBLGlCQUFpQjtBQUNqQixxREFBcUQsa0JBQWtCLDhFQUE4RSx1QkFBdUI7QUFDNUs7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsdUJBQXVCLEVBQUUsa0JBQVU7QUFDbkQ7QUFDQSwyRUFBMkUscUlBQXFJLEVBQUUsa0NBQWtDO0FBQ3BQO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EseUZBQXlGLDZFQUE2RSxFQUFFLGtDQUFrQztBQUMxTTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsb0JBQW9CO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixvQkFBb0I7QUFDbEQ7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSwrRUFBK0Usc0pBQXNKLEVBQUUsa0NBQWtDO0FBQ3pRO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyx1QkFBdUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxZQUFZLGtDQUFrQyxLQUFLLHNDQUFzQztBQUN6RjtBQUNBLDREQUE0RCxpQ0FBaUM7QUFDN0YsUUFBUSxvQ0FBb0MsSUFBSSx5Q0FBeUM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFLGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0MsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xELGdCQUFnQix1QkFBdUIsRUFBRSxrQkFBVTtBQUNuRDtBQUNBLDJHQUEyRyxRQUFRLFlBQVksa0NBQWtDO0FBQ2pLLGtFQUFrRSxlQUFlLHlDQUF5Qyx5QkFBeUIsWUFBWSxxQ0FBcUMsaUNBQWlDLDBDQUEwQyx1QkFBdUI7QUFDdFMsdUVBQXVFLHNCQUFzQixNQUFNLGdCQUFnQiw4QkFBOEIsTUFBTSwrREFBK0QsNEJBQTRCLDZDQUE2QztBQUMvUjtBQUNBLHFCQUFxQixHQUFHLEdBQUc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFO0FBQ0EsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EsMkhBQTJILFFBQVEsWUFBWSxrQ0FBa0M7QUFDakwsa0VBQWtFLGVBQWUseUNBQXlDLHlCQUF5QixZQUFZLDBDQUEwQyxpQ0FBaUMsMENBQTBDLHVCQUF1QjtBQUMzUyx1RUFBdUUsc0JBQXNCLE1BQU0sZ0JBQWdCLDhCQUE4QixNQUFNLCtEQUErRCw0QkFBNEIsNkNBQTZDO0FBQy9SO0FBQ0EscUJBQXFCO0FBQ3JCLHlFQUF5RSx5QkFBeUIsTUFBTSxnQkFBZ0IsMkJBQTJCO0FBQ25KO0FBQ0EscUJBQXFCLEdBQUcsR0FBRztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsT0FBTztBQUNoRTtBQUNBLGdDQUFnQyxPQUFPLE9BQU8sT0FBTztBQUNyRCxrQkFBa0I7QUFDbEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDRDQUE0QyxnQkFBZ0I7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixhQUFhLDBDQUEwQyxXQUFXLE9BQU8sc0JBQXNCO0FBQzdIO0FBQ0EsMEJBQTBCLE9BQU8sUUFBUSxnQkFBZ0IsQ0FBQyxhQUFhO0FBQ3ZFO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBO0FBQ0Esa0VBQWtFLE9BQU87QUFDekU7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhGQUE4RjtBQUM5RjtBQUNBO0FBQ0EsNkJBQTZCLElBQUksSUFBSSxVQUFVO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLElBQUksSUFBSSxvQkFBb0I7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFLGlCQUFpQjtBQUM5RjtBQUNBLCtCQUErQixJQUFJLElBQUksVUFBVTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStELGdCQUFnQjtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixJQUFJLElBQUksVUFBVTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRCw0Q0FBNEM7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsSUFBSSxJQUFJLFVBQVU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELG9DQUFvQyxtQkFBbUIsSUFBSTtBQUN4SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDLHFGQUFxRixtQ0FBbUM7QUFDeEgsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RCxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsT0FBTztBQUNyRTtBQUNBLGdDQUFnQyxPQUFPLE9BQU8sT0FBTztBQUNyRCxrQkFBa0I7QUFDbEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDZDQUE2QyxrQkFBa0IsS0FBSyxnQkFBZ0I7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGFBQWEsOERBQThELFdBQVcsT0FBTyxzQkFBc0I7QUFDako7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsT0FBTyxpQkFBaUIsZ0JBQWdCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxPQUFPLGlCQUFpQixjQUFjO0FBQzFFO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQSxrRUFBa0UsT0FBTztBQUN6RTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsVUFBVTtBQUNsRCxXQUFXO0FBQ1gsNkNBQTZDLFVBQVU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsb0JBQW9CO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFVBQVU7QUFDbEQsV0FBVztBQUNYLDZDQUE2QyxVQUFVO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFlBQVk7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFVBQVU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyx5QkFBeUI7QUFDL0QsbUJBQW1CLGdCQUFnQjtBQUNuQyw2QkFBNkIsSUFBSTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFVBQVU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsb0NBQW9DLG1CQUFtQixJQUFJO0FBQ3hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEMseUdBQXlHLG1DQUFtQztBQUM1SSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkU7QUFDN0UsZ0JBQWdCLHVCQUF1QixFQUFFLGtCQUFVO0FBQ25EO0FBQ0EscUZBQXFGLDJHQUEyRyxFQUFFLGtDQUFrQztBQUNwTyxrRUFBa0UsZUFBZTtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELFdBQVcsTUFBTSxNQUFNLHVCQUF1QjtBQUN2RyxpQkFBaUIsR0FBRztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFLGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QyxrQkFBa0I7QUFDbEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0QsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGFBQWEsNkVBQTZFLFdBQVcsT0FBTyxzQkFBc0I7QUFDaEs7QUFDQSwwQkFBMEIsT0FBTyxRQUFRLGdCQUFnQixDQUFDLGFBQWE7QUFDdkU7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQSxrRUFBa0UsT0FBTztBQUN6RTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsSUFBSSxJQUFJLFVBQVU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsSUFBSSxJQUFJLG9CQUFvQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrR0FBa0csaUJBQWlCO0FBQ25IO0FBQ0E7QUFDQSxpQ0FBaUMsSUFBSSxJQUFJLFVBQVU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GLGdCQUFnQjtBQUNwRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLElBQUksSUFBSSxVQUFVO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsNENBQTRDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsSUFBSSxJQUFJLFVBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEMsd0hBQXdILG1DQUFtQztBQUMzSixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsVUFBVTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaUJBQWlCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDBCQUEwQjtBQUN2RTtBQUNBO0FBQ0Esd0JBQXdCLDhCQUE4QixpQkFBaUIsb0NBQW9DO0FBQzNHLG9CQUFvQixnQkFBZ0I7QUFDcEMsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQSwyQzs7QUM1dUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGlDQUFpQztBQUNyQztBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxFQUFFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRDs7QUNsT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksaUNBQWlDO0FBQ3JDO0FBQ0E7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TEFBd0w7QUFDaE87QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELHFCQUFxQixnREFBZ0Q7QUFDeEgseUNBQXlDLDBCQUEwQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUNBQWlDLGlCQUFpQjtBQUN0RTtBQUNBLHFDQUFxQyxrQkFBa0Isd0JBQXdCO0FBQy9FLGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0E7QUFDQSw2Qzs7QUNqeEJBO0FBQ0E7QUFDQSxxQkFBcUIsK0JBQStCO0FBQzdDO0FBQ1A7QUFDQTtBQUNBLENBQUMsb0VBQW9FO0FBQ3JFLDJDOztBQ1BBO0FBQ0E7QUFDNkM7QUFDVDtBQUNWO0FBQ1E7QUFDQTtBQUNVO0FBQ0U7QUFDTDtBQUNPO0FBQ3BCO0FBQ007QUFDRjtBQUNTO0FBQ0k7QUFDQztBQUNBO0FBQ0k7QUFDVDtBQUNnQjtBQUMwRDtBQUN4RjtBQUMwQjtBQUNUO0FBQ0E7QUFDZ0I7QUFDbkI7QUFDUDtBQUNiO0FBQ1U7QUFDL0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3V0aWwvc2VyaWFsaXplci5jb21tb24uanM/M2E2OSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3V0aWwvdXRpbHMuanM/NWE5MiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3VybC5qcz8zZmY4Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvdXRpbC9zYW5pdGl6ZXIuanM/MmM4NCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3V0aWwvaW5zcGVjdC5qcz84Y2YzIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcmVzdEVycm9yLmpzPzVmMTUiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzPzRmNGYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS11dGlsL25vZGVfbW9kdWxlcy9AYXp1cmUvYWJvcnQtY29udHJvbGxlci9kaXN0L2VzbS9BYm9ydEVycm9yLmpzP2NjODEiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS11dGlsL25vZGVfbW9kdWxlcy9AYXp1cmUvYWJvcnQtY29udHJvbGxlci9kaXN0L2VzbS9pbmRleC5qcz82NzZjIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdXRpbC9kaXN0L2VzbS9jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzP2E4MmEiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS11dGlsL2Rpc3QvZXNtL2RlbGF5LmpzP2M1ODIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS11dGlsL2Rpc3QvZXNtL3NoYTI1Ni5qcz85MTkwIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdXRpbC9kaXN0L2VzbS91dWlkVXRpbHMuanM/NGEzZSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXV0aWwvZGlzdC9lc20vY2hlY2tFbnZpcm9ubWVudC5qcz9hMGFlIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdXRpbC9kaXN0L2VzbS9pbmRleC5qcz82YTVhIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtYXV0aC9kaXN0L2VzbS9rZXlDcmVkZW50aWFsLmpzPzQ3MTIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1hdXRoL2Rpc3QvZXNtL2F6dXJlTmFtZWRLZXlDcmVkZW50aWFsLmpzPzY0OTYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1hdXRoL2Rpc3QvZXNtL2F6dXJlU0FTQ3JlZGVudGlhbC5qcz81MmU2Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtYXV0aC9kaXN0L2VzbS90b2tlbkNyZWRlbnRpYWwuanM/NTM4MCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWF1dGgvZGlzdC9lc20vaW5kZXguanM/OGU5MyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL2h0dHBQaXBlbGluZUxvZ0xldmVsLmpzPzk0ZjciLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9yZXF1ZXN0UG9saWN5LmpzPzE0ZDgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy91dGlsL2NvbnN0YW50cy5qcz9jZGMzIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvcHJveHlQb2xpY3kuanM/NDliOCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcGxhdGZvcm0vbm9kZS9nbG9iYWxUaGlzLmpzPzIyZDUiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3ZlcnNpb24uanM/MGZkOSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW50ZXJuYWwvc2VtdmVyLmpzP2M1NjAiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2ludGVybmFsL2dsb2JhbC11dGlscy5qcz8xZDIwIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9jb250ZXh0L2NvbnRleHQuanM/OWZiNCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vY29udGV4dC9Ob29wQ29udGV4dE1hbmFnZXIuanM/MTc2NiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9Db21wb25lbnRMb2dnZXIuanM/NTRhYSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy90eXBlcy5qcz9iOGE4Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9kaWFnL2ludGVybmFsL2xvZ0xldmVsTG9nZ2VyLmpzP2I1MGMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS9kaWFnLmpzPzhkNzEiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS9jb250ZXh0LmpzP2ZkN2QiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL3RyYWNlX2ZsYWdzLmpzP2NhOTMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL2ludmFsaWQtc3Bhbi1jb25zdGFudHMuanM/ZDBmZSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9uUmVjb3JkaW5nU3Bhbi5qcz84NjNhIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9jb250ZXh0LXV0aWxzLmpzPzk1YzgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL3NwYW5jb250ZXh0LXV0aWxzLmpzPzNmMDkiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL05vb3BUcmFjZXIuanM/MDJhNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvUHJveHlUcmFjZXIuanM/OTIxYSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9vcFRyYWNlclByb3ZpZGVyLmpzPzg1MGMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL1Byb3h5VHJhY2VyUHJvdmlkZXIuanM/NTYwNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL3RyYWNlLmpzP2NiNjIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlLWFwaS5qcz8yYmJjIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9jb250ZXh0LWFwaS5qcz82N2E0Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdHJhY2luZy9kaXN0LWVzbS9zcmMvaW50ZXJmYWNlcy5qcz9iNTYwIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvb3BlcmF0aW9uT3B0aW9ucy5qcz8xMmIxIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvdXRpbC9iYXNlNjQuanM/YmM0NiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3NlcmlhbGl6ZXIuanM/M2Q5YyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9nZW5lcmF0ZWQvc3JjL21vZGVscy9tYXBwZXJzLmpzPzE3NjQiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9xdWVyeUNvbGxlY3Rpb25Gb3JtYXQuanM/MzQwMCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9nZW5lcmF0ZWQvc3JjL21vZGVscy9wYXJhbWV0ZXJzLmpzPzE4ZDAiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvZ2VuZXJhdGVkL3NyYy9vcGVyYXRpb25zL3NlcnZpY2UuanM/YWM4OSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnMvY29udGFpbmVyLmpzPzRkMDMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS10cmFjaW5nL2Rpc3QtZXNtL3NyYy9jcmVhdGVTcGFuLmpzPzU3OGQiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS10cmFjaW5nL2Rpc3QtZXNtL3NyYy91dGlscy90cmFjZVBhcmVudEhlYWRlci5qcz81MGRmIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6b3NcIj84MzQ3Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6cHJvY2Vzc1wiPzJhNTUiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbG9nZ2VyL2Rpc3QvZXNtL2xvZy5qcz8wZWQyIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2xvZ2dlci9kaXN0L2VzbS9kZWJ1Zy5qcz9hYmQ1Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2xvZ2dlci9kaXN0L2VzbS9pbmRleC5qcz9jODM1Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvbG9nLmpzP2RlNmQiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy90cmFjaW5nUG9saWN5LmpzP2U0MzgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9rZWVwQWxpdmVQb2xpY3kuanM/N2M2YSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL2dlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5LmpzPzNlNDAiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy91dGlsL3htbC5qcz85Y2MzIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvZGVzZXJpYWxpemF0aW9uUG9saWN5LmpzPzA1YWMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9sb2dQb2xpY3kuanM/NmNlYyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL2Rpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3kuanM/ZmVkZSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL2h0dHBIZWFkZXJzLmpzP2M3NjIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy93ZWJSZXNvdXJjZS5qcz81YjBiIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL2xvZy5qcz9mMTU1Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3V0aWxzL2NvbnN0YW50cy5qcz83ZmI4Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3V0aWxzL3V0aWxzLmNvbW1vbi5qcz80YTRlIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3BvbGljaWVzL1N0b3JhZ2VCcm93c2VyUG9saWN5LmpzP2Y1ZDQiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5LmpzPzZlMDkiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvYWJvcnQtY29udHJvbGxlci9kaXN0LWVzbS9zcmMvQWJvcnRTaWduYWwuanM/YWIxYSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9hYm9ydC1jb250cm9sbGVyL2Rpc3QtZXNtL3NyYy9BYm9ydENvbnRyb2xsZXIuanM/MjMyNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9wb2xpY2llcy9TdG9yYWdlUmV0cnlQb2xpY3kuanM/ZmQzNyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9TdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5LmpzP2MwODIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvcG9saWNpZXMvQ3JlZGVudGlhbFBvbGljeS5qcz83NjRlIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3BvbGljaWVzL0Fub255bW91c0NyZWRlbnRpYWxQb2xpY3kuanM/NTczOSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9jcmVkZW50aWFscy9DcmVkZW50aWFsLmpzP2IwZDgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvY3JlZGVudGlhbHMvQW5vbnltb3VzQ3JlZGVudGlhbC5qcz9lNWRlIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3BvbGljaWVzL1RlbGVtZXRyeVBvbGljeS5qcz8wMWZhIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL1RlbGVtZXRyeVBvbGljeUZhY3RvcnkuanM/MzFkNyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3Byb3h5QWdlbnQuanM/Nzg2YiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL25vZGVGZXRjaEh0dHBDbGllbnQuanM/ZTc5ZCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy91dGlscy9jYWNoZS5qcz8xZWU5Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3BvbGljaWVzL1N0b3JhZ2VCZWFyZXJUb2tlbkNoYWxsZW5nZUF1dGhlbnRpY2F0aW9uUG9saWN5LmpzP2E0YmIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvUGlwZWxpbmUuanM/MzE4YyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9wb2xpY2llcy9TdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeS5qcz9jY2RlIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL2NyZWRlbnRpYWxzL1N0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsLmpzPzYwZjIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9yZWRpcmVjdFBvbGljeS5qcz85NDBlIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvdXRpbC9leHBvbmVudGlhbEJhY2tvZmZTdHJhdGVneS5qcz8wNmZiIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvZXhwb25lbnRpYWxSZXRyeVBvbGljeS5qcz83ZTVkIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvb3BlcmF0aW9uUGFyYW1ldGVyLmpzP2Y0ZDQiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9vcGVyYXRpb25TcGVjLmpzP2VjZjAiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9tc1Jlc3RVc2VyQWdlbnRQb2xpY3kuanM/ODFlNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAvZGlzdC1lc20vc3JjL3BvbGljaWVzL3VzZXJBZ2VudFBvbGljeS5qcz9mOTc5Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeS5qcz80NmNiIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvaHR0cENsaWVudENhY2hlLmpzP2M2NmQiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9wb2xpY2llcy9ycFJlZ2lzdHJhdGlvblBvbGljeS5qcz9jODVmIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvc2lnbmluZ1BvbGljeS5qcz8wZGE0Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvc3lzdGVtRXJyb3JSZXRyeVBvbGljeS5qcz8yZDI3Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvdXRpbC90aHJvdHRsaW5nUmV0cnlTdHJhdGVneS5qcz9mNDg4Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC9kaXN0LWVzbS9zcmMvcG9saWNpZXMvdGhyb3R0bGluZ1JldHJ5UG9saWN5LmpzPzM3ZGEiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwL2Rpc3QtZXNtL3NyYy9zZXJ2aWNlQ2xpZW50LmpzPzVmNzMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvZ2VuZXJhdGVkL3NyYy9zdG9yYWdlQ2xpZW50Q29udGV4dC5qcz9hYzY2Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL1N0b3JhZ2VDbGllbnQuanM/OTNlNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy91dGlscy90cmFjaW5nLmpzP2U1YjgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvc2FzL0Jsb2JTQVNQZXJtaXNzaW9ucy5qcz80NTExIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3Nhcy9Db250YWluZXJTQVNQZXJtaXNzaW9ucy5qcz85M2Q3Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL2NyZWRlbnRpYWxzL1VzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC5qcz9hYjk0Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3Nhcy9TYXNJUFJhbmdlLmpzPzYxMjAiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvc2FzL1NBU1F1ZXJ5UGFyYW1ldGVycy5qcz84OGFhIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3Nhcy9CbG9iU0FTU2lnbmF0dXJlVmFsdWVzLmpzPzI2NjYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvZ2VuZXJhdGVkL3NyYy9vcGVyYXRpb25zL2Jsb2IuanM/M2M2ZCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9CbG9iTGVhc2VDbGllbnQuanM/NDM1NyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy91dGlscy9SZXRyaWFibGVSZWFkYWJsZVN0cmVhbS5qcz85ODA1Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL0Jsb2JEb3dubG9hZFJlc3BvbnNlLmpzP2U2OTAiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtaW50ZXJuYWwtYXZyby9zcmMvQXZyb0NvbnN0YW50cy5qcz80ZDkxIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWludGVybmFsLWF2cm8vc3JjL0F2cm9QYXJzZXIuanM/N2Y5YSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1pbnRlcm5hbC1hdnJvL3NyYy91dGlscy91dGlscy5jb21tb24uanM/YTQzNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1pbnRlcm5hbC1hdnJvL3NyYy9BdnJvUmVhZGVyLmpzP2RjYTgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtaW50ZXJuYWwtYXZyby9zcmMvQXZyb1JlYWRhYmxlLmpzP2RmZTYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtaW50ZXJuYWwtYXZyby9zcmMvQXZyb1JlYWRhYmxlRnJvbVN0cmVhbS5qcz82ZWU1Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3V0aWxzL0Jsb2JRdWlja1F1ZXJ5U3RyZWFtLmpzPzgwZmYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvQmxvYlF1ZXJ5UmVzcG9uc2UuanM/MDQ4YSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnMvYXBwZW5kQmxvYi5qcz9mY2I2Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL2dlbmVyYXRlZC9zcmMvb3BlcmF0aW9ucy9ibG9ja0Jsb2IuanM/ZmFlOSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnMvcGFnZUJsb2IuanM/ODU4OSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9tb2RlbHMuanM/MTI1OSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9QYWdlQmxvYlJhbmdlUmVzcG9uc2UuanM/NjVjNiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2VzbS9sb2dnZXIuanM/MmM2NiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2VzbS9wb2xsZXIvY29uc3RhbnRzLmpzPzFhNTYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9lc20vcG9sbGVyL29wZXJhdGlvbi5qcz82OWI4Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtbHJvL2Rpc3QvZXNtL2h0dHAvb3BlcmF0aW9uLmpzPzQxYmIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9lc20vcG9sbGVyL3BvbGxlci5qcz85MmU2Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtbHJvL2Rpc3QvZXNtL2h0dHAvcG9sbGVyLmpzPzEyODUiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9lc20vbGVnYWN5L2xyb0VuZ2luZS9vcGVyYXRpb24uanM/ZDZlYyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2VzbS9sZWdhY3kvcG9sbGVyLmpzPzMwMDAiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9lc20vbGVnYWN5L2xyb0VuZ2luZS9scm9FbmdpbmUuanM/YmVhNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2VzbS9sZWdhY3kvbHJvRW5naW5lL2luZGV4LmpzP2FmMDgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9lc20vaW5kZXguanM/YzVlNiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9wb2xsZXJzL0Jsb2JTdGFydENvcHlGcm9tVXJsUG9sbGVyLmpzPzBiZGMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvUmFuZ2UuanM/YWIwZiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy91dGlscy9CYXRjaC5qcz83MGFmIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWNvbW1vbi9zcmMvQnVmZmVyc1N0cmVhbS5qcz85YWMyIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWNvbW1vbi9zcmMvUG9vbGVkQnVmZmVyLmpzP2MxMTciLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtY29tbW9uL3NyYy9CdWZmZXJTY2hlZHVsZXIuanM/MDc4NiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy91dGlscy91dGlscy5ub2RlLmpzPzIzZjIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvQ2xpZW50cy5qcz8xYzc2Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL0JhdGNoVXRpbHMuanM/YzU5ZSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9CYXRjaFJlc3BvbnNlUGFyc2VyLmpzPzIyNjMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvdXRpbHMvTXV0ZXguanM/MTc4NSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9CbG9iQmF0Y2guanM/Mzc1ZSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9CbG9iQmF0Y2hDbGllbnQuanM/OGI4NCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9Db250YWluZXJDbGllbnQuanM/MzliZCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9zYXMvQWNjb3VudFNBU1Blcm1pc3Npb25zLmpzP2Q0ZDAiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvc2FzL0FjY291bnRTQVNSZXNvdXJjZVR5cGVzLmpzPzZjYzgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvc2FzL0FjY291bnRTQVNTZXJ2aWNlcy5qcz8zYjUyIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQGF6dXJlL3N0b3JhZ2UtYmxvYi9kaXN0LWVzbS9zdG9yYWdlLWJsb2Ivc3JjL3Nhcy9BY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmpzPzkyYjUiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AYXp1cmUvc3RvcmFnZS1ibG9iL2Rpc3QtZXNtL3N0b3JhZ2UtYmxvYi9zcmMvQmxvYlNlcnZpY2VDbGllbnQuanM/NmJkMSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9nZW5lcmF0ZWRNb2RlbHMuanM/ZjA5MiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC1lc20vc3RvcmFnZS1ibG9iL3NyYy9pbmRleC5qcz84ZjJlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBEZWZhdWx0IGtleSB1c2VkIHRvIGFjY2VzcyB0aGUgWE1MIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBYTUxfQVRUUktFWSA9IFwiJFwiO1xuLyoqXG4gKiBEZWZhdWx0IGtleSB1c2VkIHRvIGFjY2VzcyB0aGUgWE1MIHZhbHVlIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBYTUxfQ0hBUktFWSA9IFwiX1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VyaWFsaXplci5jb21tb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFhNTF9BVFRSS0VZIH0gZnJvbSBcIi4vc2VyaWFsaXplci5jb21tb25cIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5jb25zdCB2YWxpZFV1aWRSZWdleCA9IC9eWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JC9pO1xuLyoqXG4gKiBDaGVja3MgaWYgYSBwYXJzZWQgVVJMIGlzIEhUVFBTXG4gKlxuICogQHBhcmFtIHVybFRvQ2hlY2sgLSBUaGUgdXJsIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBVUkwgaXMgSFRUUFM7IGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybElzSFRUUFModXJsVG9DaGVjaykge1xuICAgIHJldHVybiB1cmxUb0NoZWNrLnByb3RvY29sLnRvTG93ZXJDYXNlKCkgPT09IENvbnN0YW50cy5IVFRQUztcbn1cbi8qKlxuICogRW5jb2RlcyBhbiBVUkkuXG4gKlxuICogQHBhcmFtIHVyaSAtIFRoZSBVUkkgdG8gYmUgZW5jb2RlZC5cbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIFVSSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVyaSh1cmkpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHVyaSlcbiAgICAgICAgLnJlcGxhY2UoLyEvZywgXCIlMjFcIilcbiAgICAgICAgLnJlcGxhY2UoL1wiL2csIFwiJTI3XCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXCgvZywgXCIlMjhcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcKS9nLCBcIiUyOVwiKVxuICAgICAgICAucmVwbGFjZSgvXFwqL2csIFwiJTJBXCIpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgSHR0cCBSZXNwb25zZSB3aGljaCBvbmx5IGNvbnRhaW5zIGJvZHksXG4gKiBoZWFkZXJzIGFuZCB0aGUgc3RhdHVzLlxuICpcbiAqIEBwYXJhbSByZXNwb25zZSAtIFRoZSBIdHRwIFJlc3BvbnNlXG4gKiBAcmV0dXJucyBUaGUgc3RyaXBwZWQgdmVyc2lvbiBvZiBIdHRwIFJlc3BvbnNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGNvbnN0IHN0cmlwcGVkUmVzcG9uc2UgPSB7fTtcbiAgICBzdHJpcHBlZFJlc3BvbnNlLmJvZHkgPSByZXNwb25zZS5ib2R5QXNUZXh0O1xuICAgIHN0cmlwcGVkUmVzcG9uc2UuaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgc3RyaXBwZWRSZXNwb25zZS5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgcmV0dXJuIHN0cmlwcGVkUmVzcG9uc2U7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBIdHRwIFJlcXVlc3QgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZVxuICogQXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgSHR0cCBSZXF1ZXN0IG9iamVjdFxuICogQHJldHVybnMgVGhlIHN0cmlwcGVkIHZlcnNpb24gb2YgSHR0cCBSZXF1ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICBjb25zdCBzdHJpcHBlZFJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKCk7XG4gICAgaWYgKHN0cmlwcGVkUmVxdWVzdC5oZWFkZXJzKSB7XG4gICAgICAgIHN0cmlwcGVkUmVxdWVzdC5oZWFkZXJzLnJlbW92ZShcImF1dGhvcml6YXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiBzdHJpcHBlZFJlcXVlc3Q7XG59XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gdXVpZCBhcyBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB1dWlkIC0gVGhlIHV1aWQgYXMgYSBzdHJpbmcgdGhhdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHV1aWQgaXMgdmFsaWQ7IGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRVdWlkKHV1aWQpIHtcbiAgICByZXR1cm4gdmFsaWRVdWlkUmVnZXgudGVzdCh1dWlkKTtcbn1cbi8qKlxuICogR2VuZXJhdGVkIFVVSURcbiAqXG4gKiBAcmV0dXJucyBSRkM0MTIyIHY0IFVVSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVV1aWQoKSB7XG4gICAgcmV0dXJuIHV1aWR2NCgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBhbiBhcnJheSBvZiBwcm9taXNlcyBzZXF1ZW50aWFsbHkuIEluc3BpcmF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGhlcmU6XG4gKiBodHRwczovL3BvdWNoZGIuY29tLzIwMTUvMDUvMTgvd2UtaGF2ZS1hLXByb2JsZW0td2l0aC1wcm9taXNlcy5odG1sLiBBbiBhd2Vzb21lIGJsb2cgb24gcHJvbWlzZXMhXG4gKlxuICogQHBhcmFtIHByb21pc2VGYWN0b3JpZXMgLSBBbiBhcnJheSBvZiBwcm9taXNlIGZhY3RvcmllcyhBIGZ1bmN0aW9uIHRoYXQgcmV0dXJuIGEgcHJvbWlzZSlcbiAqIEBwYXJhbSBraWNrc3RhcnQgLSBJbnB1dCB0byB0aGUgZmlyc3QgcHJvbWlzZSB0aGF0IGlzIHVzZWQgdG8ga2lja3N0YXJ0IHRoZSBwcm9taXNlIGNoYWluLlxuICogSWYgbm90IHByb3ZpZGVkIHRoZW4gdGhlIHByb21pc2UgY2hhaW4gc3RhcnRzIHdpdGggdW5kZWZpbmVkLlxuICogQHJldHVybnMgQSBjaGFpbiBvZiByZXNvbHZlZCBvciByZWplY3RlZCBwcm9taXNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVByb21pc2VzU2VxdWVudGlhbGx5KHByb21pc2VGYWN0b3JpZXMsIGtpY2tzdGFydCkge1xuICAgIGxldCByZXN1bHQgPSBQcm9taXNlLnJlc29sdmUoa2lja3N0YXJ0KTtcbiAgICBwcm9taXNlRmFjdG9yaWVzLmZvckVhY2goKHByb21pc2VGYWN0b3J5KSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50aGVuKHByb21pc2VGYWN0b3J5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIFByb21pc2UgdG8gYSBjYWxsYmFjay5cbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIFByb21pc2UgdG8gYmUgY29udmVydGVkIHRvIGEgY2FsbGJhY2tcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgY2FsbGJhY2sgYChjYjogRnVuY3Rpb24pID0+IHZvaWRgXG4gKiBAZGVwcmVjYXRlZCBnZW5lcmF0ZWQgY29kZSBzaG91bGQgaW5zdGVhZCBkZXBlbmQgb24gcmVzcG9uc2VUb0JvZHlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlVG9DYWxsYmFjayhwcm9taXNlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9taXNlLnRoZW4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgaW5wdXQgaXMgbm90IGEgUHJvbWlzZS5cIik7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2Uvbm8tY2FsbGJhY2staW4tcHJvbWlzZVxuICAgICAgICAgICAgcmV0dXJuIGNiKHVuZGVmaW5lZCwgZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2Uvbm8tY2FsbGJhY2staW4tcHJvbWlzZVxuICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBQcm9taXNlIHRvIGEgc2VydmljZSBjYWxsYmFjay5cbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIFByb21pc2Ugb2YgSHR0cE9wZXJhdGlvblJlc3BvbnNlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHNlcnZpY2UgY2FsbGJhY2tcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgc2VydmljZSBjYWxsYmFjayAoY2I6IFNlcnZpY2VDYWxsYmFjazxUPik6IHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VUb1NlcnZpY2VDYWxsYmFjayhwcm9taXNlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9taXNlLnRoZW4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgaW5wdXQgaXMgbm90IGEgUHJvbWlzZS5cIik7XG4gICAgfVxuICAgIHJldHVybiAoY2IpID0+IHtcbiAgICAgICAgcHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGNiLCB1bmRlZmluZWQsIGRhdGEucGFyc2VkQm9keSwgZGF0YS5yZXF1ZXN0LCBkYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVYTUxSb290TGlzdChvYmosIGVsZW1lbnROYW1lLCB4bWxOYW1lc3BhY2VLZXksIHhtbE5hbWVzcGFjZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IFtvYmpdO1xuICAgIH1cbiAgICBpZiAoIXhtbE5hbWVzcGFjZUtleSB8fCAheG1sTmFtZXNwYWNlKSB7XG4gICAgICAgIHJldHVybiB7IFtlbGVtZW50TmFtZV06IG9iaiB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB7IFtlbGVtZW50TmFtZV06IG9iaiB9O1xuICAgIHJlc3VsdFtYTUxfQVRUUktFWV0gPSB7IFt4bWxOYW1lc3BhY2VLZXldOiB4bWxOYW1lc3BhY2UgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBBcHBsaWVzIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBwcm90b3R5cGUgb2Ygc291cmNlQ3RvcnMgdG8gdGhlIHByb3RvdHlwZSBvZiB0YXJnZXRDdG9yXG4gKiBAcGFyYW0gdGFyZ2V0Q3RvciAtIFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBzb3VyY2VDdG9ycyAtIEFuIGFycmF5IG9mIHNvdXJjZSBvYmplY3RzIGZyb20gd2hpY2ggdGhlIHByb3BlcnRpZXMgbmVlZCB0byBiZSB0YWtlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWl4aW5zKHRhcmdldEN0b3JQYXJhbSwgc291cmNlQ3RvcnMpIHtcbiAgICBjb25zdCBjYXN0VGFyZ2V0Q3RvclBhcmFtID0gdGFyZ2V0Q3RvclBhcmFtO1xuICAgIHNvdXJjZUN0b3JzLmZvckVhY2goKHNvdXJjZUN0b3IpID0+IHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ3Rvci5wcm90b3R5cGUpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNhc3RUYXJnZXRDdG9yUGFyYW0ucHJvdG90eXBlW25hbWVdID0gc291cmNlQ3Rvci5wcm90b3R5cGVbbmFtZV07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuY29uc3QgdmFsaWRhdGVJU09EdXJhdGlvbiA9IC9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87XG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgaXMgaW4gSVNPIDg2MDEgZm9ybWF0LlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCBmb3IgSVNPIDg2MDEgZHVyYXRpb24gZm9ybWF0LlxuICogQHJldHVybnMgYHRydWVgIGlmIHZhbGlkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHVyYXRpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVJU09EdXJhdGlvbi50ZXN0KHZhbHVlKTtcbn1cbi8qKlxuICogUmVwbGFjZSBhbGwgb2YgdGhlIGluc3RhbmNlcyBvZiBzZWFyY2hWYWx1ZSBpbiB2YWx1ZSB3aXRoIHRoZSBwcm92aWRlZCByZXBsYWNlVmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VhcmNoIGFuZCByZXBsYWNlIGluLlxuICogQHBhcmFtIHNlYXJjaFZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IgaW4gdGhlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHJlcGxhY2VWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXBsYWNlIHNlYXJjaFZhbHVlIHdpdGggaW4gdGhlIHZhbHVlIGFyZ3VtZW50LlxuICogQHJldHVybnMgVGhlIHZhbHVlIHdoZXJlIGVhY2ggaW5zdGFuY2Ugb2Ygc2VhcmNoVmFsdWUgd2FzIHJlcGxhY2VkIHdpdGggcmVwbGFjZWRWYWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VBbGwodmFsdWUsIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICByZXR1cm4gIXZhbHVlIHx8ICFzZWFyY2hWYWx1ZSA/IHZhbHVlIDogdmFsdWUuc3BsaXQoc2VhcmNoVmFsdWUpLmpvaW4ocmVwbGFjZVZhbHVlIHx8IFwiXCIpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGVudGl0eSBpcyBhIGJhc2ljL3ByaW1pdGl2ZSB0eXBlXG4gKiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZCkuXG4gKiBAcGFyYW0gdmFsdWUgLSBBbnkgZW50aXR5XG4gKiBAcmV0dXJucyB0cnVlIGlzIGl0IGlzIHByaW1pdGl2ZSB0eXBlLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZVR5cGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgfHwgdmFsdWUgPT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnRWYWx1ZShuYW1lKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudltuYW1lXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvY2Vzcy5lbnZbbmFtZS50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKiBAcmV0dXJucyB0cnVlIHdoZW4gaW5wdXQgaXMgYW4gb2JqZWN0IHR5cGUgdGhhdCBpcyBub3QgbnVsbCwgQXJyYXksIFJlZ0V4cCwgb3IgRGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaW5wdXQgIT09IG51bGwgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoaW5wdXQpICYmXG4gICAgICAgICEoaW5wdXQgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgICAgICEoaW5wdXQgaW5zdGFuY2VvZiBEYXRlKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tIFwiLi91dGlsL3V0aWxzXCI7XG4vKipcbiAqIEEgY2xhc3MgdGhhdCBoYW5kbGVzIHRoZSBxdWVyeSBwb3J0aW9uIG9mIGEgVVJMQnVpbGRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFVSTFF1ZXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcmF3UXVlcnkgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHdoZXRoZXIgb3Igbm90IHRoZXJlIGFueSBxdWVyeSBwYXJhbWV0ZXJzIGluIHRoaXMgVVJMUXVlcnkuXG4gICAgICovXG4gICAgYW55KCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fcmF3UXVlcnkpLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5cyBvZiB0aGUgcXVlcnkgc3RyaW5nLlxuICAgICAqL1xuICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9yYXdRdWVyeSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIHF1ZXJ5IHBhcmFtZXRlciB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCB2YWx1ZS4gSWYgdGhlIHBhcmFtZXRlclZhbHVlIGlzIHVuZGVmaW5lZCBvclxuICAgICAqIGVtcHR5LCB0aGVuIHRoaXMgd2lsbCBhdHRlbXB0IHRvIHJlbW92ZSBhbiBleGlzdGluZyBxdWVyeSBwYXJhbWV0ZXIgd2l0aCB0aGUgcHJvdmlkZWRcbiAgICAgKiBwYXJhbWV0ZXJOYW1lLlxuICAgICAqL1xuICAgIHNldChwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJWYWx1ZSkge1xuICAgICAgICBjb25zdCBjYXNlUGFyYW1ldGVyVmFsdWUgPSBwYXJhbWV0ZXJWYWx1ZTtcbiAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUpIHtcbiAgICAgICAgICAgIGlmIChjYXNlUGFyYW1ldGVyVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjYXNlUGFyYW1ldGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IEFycmF5LmlzQXJyYXkoY2FzZVBhcmFtZXRlclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IGNhc2VQYXJhbWV0ZXJWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGNhc2VQYXJhbWV0ZXJWYWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jhd1F1ZXJ5W3BhcmFtZXRlck5hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcmF3UXVlcnlbcGFyYW1ldGVyTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuIElmIG5vIHBhcmFtZXRlciBleGlzdHMgd2l0aCB0aGVcbiAgICAgKiBwcm92aWRlZCBwYXJhbWV0ZXIgbmFtZSwgdGhlbiB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBnZXQocGFyYW1ldGVyTmFtZSkge1xuICAgICAgICByZXR1cm4gcGFyYW1ldGVyTmFtZSA/IHRoaXMuX3Jhd1F1ZXJ5W3BhcmFtZXRlck5hbWVdIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1ZXJ5LiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IHN0YXJ0IHdpdGggYSBcIj9cIi5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyTmFtZSBpbiB0aGlzLl9yYXdRdWVyeSkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIiZcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlclZhbHVlID0gdGhpcy5fcmF3UXVlcnlbcGFyYW1ldGVyTmFtZV07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJTdHJpbmdzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXJWYWx1ZUVsZW1lbnQgb2YgcGFyYW1ldGVyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3RyaW5ncy5wdXNoKGAke3BhcmFtZXRlck5hbWV9PSR7cGFyYW1ldGVyVmFsdWVFbGVtZW50fWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gcGFyYW1ldGVyU3RyaW5ncy5qb2luKFwiJlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgJHtwYXJhbWV0ZXJOYW1lfT0ke3BhcmFtZXRlclZhbHVlfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgYSBVUkxRdWVyeSBmcm9tIHRoZSBwcm92aWRlZCB0ZXh0LlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZSh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVUkxRdWVyeSgpO1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIj9cIikpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudFN0YXRlID0gXCJQYXJhbWV0ZXJOYW1lXCI7XG4gICAgICAgICAgICBsZXQgcGFyYW1ldGVyTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgcGFyYW1ldGVyVmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENoYXJhY3RlciA9IHRleHRbaV07XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBhcmFtZXRlck5hbWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudENoYXJhY3Rlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI9XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFwiUGFyYW1ldGVyVmFsdWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiZcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSArPSBjdXJyZW50Q2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUGFyYW1ldGVyVmFsdWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudENoYXJhY3Rlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCImXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBcIlBhcmFtZXRlck5hbWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUgKz0gY3VycmVudENoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBVUkxRdWVyeSBwYXJzZSBzdGF0ZTogXCIgKyBjdXJyZW50U3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT09IFwiUGFyYW1ldGVyVmFsdWVcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgaGFuZGxlcyBjcmVhdGluZywgbW9kaWZ5aW5nLCBhbmQgcGFyc2luZyBVUkxzLlxuICovXG5leHBvcnQgY2xhc3MgVVJMQnVpbGRlciB7XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzY2hlbWUvcHJvdG9jb2wgZm9yIHRoaXMgVVJMLiBJZiB0aGUgcHJvdmlkZWQgc2NoZW1lIGNvbnRhaW5zIG90aGVyIHBhcnRzIG9mIGEgVVJMXG4gICAgICogKHN1Y2ggYXMgYSBob3N0LCBwb3J0LCBwYXRoLCBvciBxdWVyeSksIHRob3NlIHBhcnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBVUkwgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBzZXRTY2hlbWUoc2NoZW1lKSB7XG4gICAgICAgIGlmICghc2NoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9zY2hlbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldChzY2hlbWUsIFwiU0NIRU1FXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2NoZW1lIHRoYXQgaGFzIGJlZW4gc2V0IGluIHRoaXMgVVJMLlxuICAgICAqL1xuICAgIGdldFNjaGVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjaGVtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBob3N0IGZvciB0aGlzIFVSTC4gSWYgdGhlIHByb3ZpZGVkIGhvc3QgY29udGFpbnMgb3RoZXIgcGFydHMgb2YgYSBVUkwgKHN1Y2ggYXMgYVxuICAgICAqIHBvcnQsIHBhdGgsIG9yIHF1ZXJ5KSwgdGhvc2UgcGFydHMgd2lsbCBiZSBhZGRlZCB0byB0aGlzIFVSTCBhcyB3ZWxsLlxuICAgICAqL1xuICAgIHNldEhvc3QoaG9zdCkge1xuICAgICAgICBpZiAoIWhvc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldChob3N0LCBcIlNDSEVNRV9PUl9IT1NUXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaG9zdCB0aGF0IGhhcyBiZWVuIHNldCBpbiB0aGlzIFVSTC5cbiAgICAgKi9cbiAgICBnZXRIb3N0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG9zdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwb3J0IGZvciB0aGlzIFVSTC4gSWYgdGhlIHByb3ZpZGVkIHBvcnQgY29udGFpbnMgb3RoZXIgcGFydHMgb2YgYSBVUkwgKHN1Y2ggYXMgYVxuICAgICAqIHBhdGggb3IgcXVlcnkpLCB0aG9zZSBwYXJ0cyB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgVVJMIGFzIHdlbGwuXG4gICAgICovXG4gICAgc2V0UG9ydChwb3J0KSB7XG4gICAgICAgIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgcG9ydCA9PT0gbnVsbCB8fCBwb3J0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXQocG9ydC50b1N0cmluZygpLCBcIlBPUlRcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb3J0IHRoYXQgaGFzIGJlZW4gc2V0IGluIHRoaXMgVVJMLlxuICAgICAqL1xuICAgIGdldFBvcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3J0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBhdGggZm9yIHRoaXMgVVJMLiBJZiB0aGUgcHJvdmlkZWQgcGF0aCBjb250YWlucyBhIHF1ZXJ5LCB0aGVuIGl0IHdpbGwgYmUgYWRkZWQgdG9cbiAgICAgKiB0aGlzIFVSTCBhcyB3ZWxsLlxuICAgICAqL1xuICAgIHNldFBhdGgocGF0aCkge1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWVJbmRleCA9IHBhdGguaW5kZXhPZihcIjovL1wiKTtcbiAgICAgICAgICAgIGlmIChzY2hlbWVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWVTdGFydCA9IHBhdGgubGFzdEluZGV4T2YoXCIvXCIsIHNjaGVtZUluZGV4KTtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gb25seSBncmFiIHRoZSBVUkwgcGFydCBvZiB0aGUgcGF0aCBiZWZvcmUgc2V0dGluZyB0aGUgc3RhdGUgYmFjayB0byBTQ0hFTUVcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgaGFuZGxlIGNhc2VzIHN1Y2ggYXMgXCIvYS9iL2MvaHR0cHM6Ly9taWNyb3NvZnQuY29tXCIgPT4gXCJodHRwczovL21pY3Jvc29mdC5jb21cIlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHNjaGVtZVN0YXJ0ID09PSAtMSA/IHBhdGggOiBwYXRoLnN1YnN0cihzY2hlbWVTdGFydCArIDEpLCBcIlNDSEVNRVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHBhdGgsIFwiUEFUSFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBlbmQgdGhlIHByb3ZpZGVkIHBhdGggdG8gdGhpcyBVUkwncyBleGlzdGluZyBwYXRoLiBJZiB0aGUgcHJvdmlkZWQgcGF0aCBjb250YWlucyBhIHF1ZXJ5LFxuICAgICAqIHRoZW4gaXQgd2lsbCBiZSBhZGRlZCB0byB0aGlzIFVSTCBhcyB3ZWxsLlxuICAgICAqL1xuICAgIGFwcGVuZFBhdGgocGF0aCkge1xuICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5nZXRQYXRoKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCArPSBcIi9cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudFBhdGggKyBwYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXQocGF0aCwgXCJQQVRIXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcGF0aCB0aGF0IGhhcyBiZWVuIHNldCBpbiB0aGlzIFVSTC5cbiAgICAgKi9cbiAgICBnZXRQYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBxdWVyeSBpbiB0aGlzIFVSTC5cbiAgICAgKi9cbiAgICBzZXRRdWVyeShxdWVyeSkge1xuICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gVVJMUXVlcnkucGFyc2UocXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIHF1ZXJ5IHBhcmFtZXRlciB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCB2YWx1ZSBpbiB0aGlzIFVSTCdzIHF1ZXJ5LiBJZiB0aGUgcHJvdmlkZWRcbiAgICAgKiBxdWVyeSBwYXJhbWV0ZXIgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIGVtcHR5LCB0aGVuIHRoZSBxdWVyeSBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGlmIGl0XG4gICAgICogZXhpc3RlZC5cbiAgICAgKi9cbiAgICBzZXRRdWVyeVBhcmFtZXRlcihxdWVyeVBhcmFtZXRlck5hbWUsIHF1ZXJ5UGFyYW1ldGVyVmFsdWUpIHtcbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyTmFtZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9xdWVyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gbmV3IFVSTFF1ZXJ5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9xdWVyeS5zZXQocXVlcnlQYXJhbWV0ZXJOYW1lLCBxdWVyeVBhcmFtZXRlclZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgd2l0aCB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVyIG5hbWUuIElmIG5vIHF1ZXJ5XG4gICAgICogcGFyYW1ldGVyIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCB0aGVuIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIGdldFF1ZXJ5UGFyYW1ldGVyVmFsdWUocXVlcnlQYXJhbWV0ZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeSA/IHRoaXMuX3F1ZXJ5LmdldChxdWVyeVBhcmFtZXRlck5hbWUpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHF1ZXJ5IGluIHRoaXMgVVJMLlxuICAgICAqL1xuICAgIGdldFF1ZXJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnkgPyB0aGlzLl9xdWVyeS50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBhcnRzIG9mIHRoaXMgVVJMIGJ5IHBhcnNpbmcgdGhlIHByb3ZpZGVkIHRleHQgdXNpbmcgdGhlIHByb3ZpZGVkIHN0YXJ0U3RhdGUuXG4gICAgICovXG4gICAgc2V0KHRleHQsIHN0YXJ0U3RhdGUpIHtcbiAgICAgICAgY29uc3QgdG9rZW5pemVyID0gbmV3IFVSTFRva2VuaXplcih0ZXh0LCBzdGFydFN0YXRlKTtcbiAgICAgICAgd2hpbGUgKHRva2VuaXplci5uZXh0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5pemVyLmN1cnJlbnQoKTtcbiAgICAgICAgICAgIGxldCB0b2tlblBhdGg7XG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNDSEVNRVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZW1lID0gdG9rZW4udGV4dCB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhPU1RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hvc3QgPSB0b2tlbi50ZXh0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUE9SVFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9ydCA9IHRva2VuLnRleHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJQQVRIXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlblBhdGggPSB0b2tlbi50ZXh0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcGF0aCB8fCB0aGlzLl9wYXRoID09PSBcIi9cIiB8fCB0b2tlblBhdGggIT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGF0aCA9IHRva2VuUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUVVFUllcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gVVJMUXVlcnkucGFyc2UodG9rZW4udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIFVSTFRva2VuVHlwZTogJHt0b2tlbi50eXBlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIHRoZSBVUkwgYXMgYSBzdHJpbmcuXG4gICAgICogQHJldHVybnMgdGhlIFVSTCBhcyBhIHN0cmluZy5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLl9zY2hlbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgJHt0aGlzLl9zY2hlbWV9Oi8vYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faG9zdCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuX2hvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BvcnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgOiR7dGhpcy5fcG9ydH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wYXRoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3BhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIvXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5fcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcXVlcnkgJiYgdGhpcy5fcXVlcnkuYW55KCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgPyR7dGhpcy5fcXVlcnkudG9TdHJpbmcoKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwcm92aWRlZCBzZWFyY2hWYWx1ZSBpcyBmb3VuZCBpbiB0aGlzIFVSTEJ1aWxkZXIsIHRoZW4gcmVwbGFjZSBpdCB3aXRoIHRoZSBwcm92aWRlZFxuICAgICAqIHJlcGxhY2VWYWx1ZS5cbiAgICAgKi9cbiAgICByZXBsYWNlQWxsKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgICAgaWYgKHNlYXJjaFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjaGVtZShyZXBsYWNlQWxsKHRoaXMuZ2V0U2NoZW1lKCksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SG9zdChyZXBsYWNlQWxsKHRoaXMuZ2V0SG9zdCgpLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLnNldFBvcnQocmVwbGFjZUFsbCh0aGlzLmdldFBvcnQoKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYXRoKHJlcGxhY2VBbGwodGhpcy5nZXRQYXRoKCksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UXVlcnkocmVwbGFjZUFsbCh0aGlzLmdldFF1ZXJ5KCksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBnaXZlbiBzdHJpbmcgVVJMIGludG8gYSBuZXcge0BsaW5rIFVSTEJ1aWxkZXJ9LlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZSh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVUkxCdWlsZGVyKCk7XG4gICAgICAgIHJlc3VsdC5zZXQodGV4dCwgXCJTQ0hFTUVfT1JfSE9TVFwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVVJMVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIHR5cGUpIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgc3RhdGljIHNjaGVtZSh0ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMVG9rZW4odGV4dCwgXCJTQ0hFTUVcIik7XG4gICAgfVxuICAgIHN0YXRpYyBob3N0KHRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkxUb2tlbih0ZXh0LCBcIkhPU1RcIik7XG4gICAgfVxuICAgIHN0YXRpYyBwb3J0KHRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkxUb2tlbih0ZXh0LCBcIlBPUlRcIik7XG4gICAgfVxuICAgIHN0YXRpYyBwYXRoKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkxUb2tlbih0ZXh0LCBcIlBBVEhcIik7XG4gICAgfVxuICAgIHN0YXRpYyBxdWVyeSh0ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMVG9rZW4odGV4dCwgXCJRVUVSWVwiKTtcbiAgICB9XG59XG4vKipcbiAqIEdldCB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgY2hhcmFjdGVyIChzaW5nbGUgY2hhcmFjdGVyIHN0cmluZykgaXMgYW4gYWxwaGFudW1lcmljIChsZXR0ZXIgb3JcbiAqIGRpZ2l0KSBjaGFyYWN0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FscGhhTnVtZXJpY0NoYXJhY3RlcihjaGFyYWN0ZXIpIHtcbiAgICBjb25zdCBjaGFyYWN0ZXJDb2RlID0gY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCk7XG4gICAgcmV0dXJuICgoNDggLyogJzAnICovIDw9IGNoYXJhY3RlckNvZGUgJiYgY2hhcmFjdGVyQ29kZSA8PSA1NykgLyogJzknICovIHx8XG4gICAgICAgICg2NSAvKiAnQScgKi8gPD0gY2hhcmFjdGVyQ29kZSAmJiBjaGFyYWN0ZXJDb2RlIDw9IDkwKSAvKiAnWicgKi8gfHxcbiAgICAgICAgKDk3IC8qICdhJyAqLyA8PSBjaGFyYWN0ZXJDb2RlICYmIGNoYXJhY3RlckNvZGUgPD0gMTIyKSAvKiAneicgKi8pO1xufVxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgdG9rZW5pemVzIFVSTCBzdHJpbmdzLlxuICovXG5leHBvcnQgY2xhc3MgVVJMVG9rZW5pemVyIHtcbiAgICBjb25zdHJ1Y3RvcihfdGV4dCwgc3RhdGUpIHtcbiAgICAgICAgdGhpcy5fdGV4dCA9IF90ZXh0O1xuICAgICAgICB0aGlzLl90ZXh0TGVuZ3RoID0gX3RleHQgPyBfdGV4dC5sZW5ndGggOiAwO1xuICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGUgPSBzdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlICE9PSBudWxsID8gc3RhdGUgOiBcIlNDSEVNRV9PUl9IT1NUXCI7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBVUkxUb2tlbiB0aGlzIFVSTFRva2VuaXplciBpcyBwb2ludGluZyBhdCwgb3IgdW5kZWZpbmVkIGlmIHRoZSBVUkxUb2tlbml6ZXJcbiAgICAgKiBoYXNuJ3Qgc3RhcnRlZCBvciBoYXMgZmluaXNoZWQgdG9rZW5pemluZy5cbiAgICAgKi9cbiAgICBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRva2VuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IFVSTFRva2VuIGFuZCByZXR1cm4gd2hldGhlciBvciBub3QgYSBVUkxUb2tlbiB3YXMgZm91bmQuXG4gICAgICovXG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKCFoYXNDdXJyZW50Q2hhcmFjdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX2N1cnJlbnRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTQ0hFTUVcIjpcbiAgICAgICAgICAgICAgICAgICAgbmV4dFNjaGVtZSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNDSEVNRV9PUl9IT1NUXCI6XG4gICAgICAgICAgICAgICAgICAgIG5leHRTY2hlbWVPckhvc3QodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJIT1NUXCI6XG4gICAgICAgICAgICAgICAgICAgIG5leHRIb3N0KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiUE9SVFwiOlxuICAgICAgICAgICAgICAgICAgICBuZXh0UG9ydCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlBBVEhcIjpcbiAgICAgICAgICAgICAgICAgICAgbmV4dFBhdGgodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJRVUVSWVwiOlxuICAgICAgICAgICAgICAgICAgICBuZXh0UXVlcnkodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIFVSTFRva2VuaXplclN0YXRlOiAke3RoaXMuX2N1cnJlbnRTdGF0ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISF0aGlzLl9jdXJyZW50VG9rZW47XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBmcm9tIHRoaXMgVG9rZW5pemVyJ3MgY2hhcmFjdGVyIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gcmVhZFJlbWFpbmluZyh0b2tlbml6ZXIpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAodG9rZW5pemVyLl9jdXJyZW50SW5kZXggPCB0b2tlbml6ZXIuX3RleHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gdG9rZW5pemVyLl90ZXh0LnN1YnN0cmluZyh0b2tlbml6ZXIuX2N1cnJlbnRJbmRleCk7XG4gICAgICAgIHRva2VuaXplci5fY3VycmVudEluZGV4ID0gdG9rZW5pemVyLl90ZXh0TGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBXaGV0aGVyIG9yIG5vdCB0aGlzIFVSTFRva2VuaXplciBoYXMgYSBjdXJyZW50IGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gaGFzQ3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpIHtcbiAgICByZXR1cm4gdG9rZW5pemVyLl9jdXJyZW50SW5kZXggPCB0b2tlbml6ZXIuX3RleHRMZW5ndGg7XG59XG4vKipcbiAqIEdldCB0aGUgY2hhcmFjdGVyIGluIHRoZSB0ZXh0IHN0cmluZyBhdCB0aGUgY3VycmVudCBpbmRleC5cbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpIHtcbiAgICByZXR1cm4gdG9rZW5pemVyLl90ZXh0W3Rva2VuaXplci5fY3VycmVudEluZGV4XTtcbn1cbi8qKlxuICogQWR2YW5jZSB0byB0aGUgY2hhcmFjdGVyIGluIHRleHQgdGhhdCBpcyBcInN0ZXBcIiBjaGFyYWN0ZXJzIGFoZWFkLiBJZiBubyBzdGVwIHZhbHVlIGlzIHByb3ZpZGVkLFxuICogdGhlbiBzdGVwIHdpbGwgZGVmYXVsdCB0byAxLlxuICovXG5mdW5jdGlvbiBuZXh0Q2hhcmFjdGVyKHRva2VuaXplciwgc3RlcCkge1xuICAgIGlmIChoYXNDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikpIHtcbiAgICAgICAgaWYgKCFzdGVwKSB7XG4gICAgICAgICAgICBzdGVwID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRJbmRleCArPSBzdGVwO1xuICAgIH1cbn1cbi8qKlxuICogU3RhcnRpbmcgd2l0aCB0aGUgY3VycmVudCBjaGFyYWN0ZXIsIHBlZWsgXCJjaGFyYWN0ZXJzVG9QZWVrXCIgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWhlYWQgaW4gdGhpc1xuICogVG9rZW5pemVyJ3Mgc3RyZWFtIG9mIGNoYXJhY3RlcnMuXG4gKi9cbmZ1bmN0aW9uIHBlZWtDaGFyYWN0ZXJzKHRva2VuaXplciwgY2hhcmFjdGVyc1RvUGVlaykge1xuICAgIGxldCBlbmRJbmRleCA9IHRva2VuaXplci5fY3VycmVudEluZGV4ICsgY2hhcmFjdGVyc1RvUGVlaztcbiAgICBpZiAodG9rZW5pemVyLl90ZXh0TGVuZ3RoIDwgZW5kSW5kZXgpIHtcbiAgICAgICAgZW5kSW5kZXggPSB0b2tlbml6ZXIuX3RleHRMZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbml6ZXIuX3RleHQuc3Vic3RyaW5nKHRva2VuaXplci5fY3VycmVudEluZGV4LCBlbmRJbmRleCk7XG59XG4vKipcbiAqIFJlYWQgY2hhcmFjdGVycyBmcm9tIHRoaXMgVG9rZW5pemVyIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB1bnRpbCB0aGUgcHJvdmlkZWQgY29uZGl0aW9uXG4gKiBpcyBmYWxzZSB3aGVuIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gcmVhZFdoaWxlKHRva2VuaXplciwgY29uZGl0aW9uKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgd2hpbGUgKGhhc0N1cnJlbnRDaGFyYWN0ZXIodG9rZW5pemVyKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q2hhcmFjdGVyID0gZ2V0Q3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpO1xuICAgICAgICBpZiAoIWNvbmRpdGlvbihjdXJyZW50Q2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gY3VycmVudENoYXJhY3RlcjtcbiAgICAgICAgICAgIG5leHRDaGFyYWN0ZXIodG9rZW5pemVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZWFkIGNoYXJhY3RlcnMgZnJvbSB0aGlzIFRva2VuaXplciB1bnRpbCBhIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyIG9yIHRoZSBlbmQgb2YgdGhlXG4gKiBjaGFyYWN0ZXIgc3RyZWFtIGlzIHJlYWNoZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRXaGlsZUxldHRlck9yRGlnaXQodG9rZW5pemVyKSB7XG4gICAgcmV0dXJuIHJlYWRXaGlsZSh0b2tlbml6ZXIsIChjaGFyYWN0ZXIpID0+IGlzQWxwaGFOdW1lcmljQ2hhcmFjdGVyKGNoYXJhY3RlcikpO1xufVxuLyoqXG4gKiBSZWFkIGNoYXJhY3RlcnMgZnJvbSB0aGlzIFRva2VuaXplciB1bnRpbCBvbmUgb2YgdGhlIHByb3ZpZGVkIHRlcm1pbmF0aW5nIGNoYXJhY3RlcnMgaXMgcmVhZCBvclxuICogdGhlIGVuZCBvZiB0aGUgY2hhcmFjdGVyIHN0cmVhbSBpcyByZWFjaGVkLlxuICovXG5mdW5jdGlvbiByZWFkVW50aWxDaGFyYWN0ZXIodG9rZW5pemVyLCAuLi50ZXJtaW5hdGluZ0NoYXJhY3RlcnMpIHtcbiAgICByZXR1cm4gcmVhZFdoaWxlKHRva2VuaXplciwgKGNoYXJhY3RlcikgPT4gdGVybWluYXRpbmdDaGFyYWN0ZXJzLmluZGV4T2YoY2hhcmFjdGVyKSA9PT0gLTEpO1xufVxuZnVuY3Rpb24gbmV4dFNjaGVtZSh0b2tlbml6ZXIpIHtcbiAgICBjb25zdCBzY2hlbWUgPSByZWFkV2hpbGVMZXR0ZXJPckRpZ2l0KHRva2VuaXplcik7XG4gICAgdG9rZW5pemVyLl9jdXJyZW50VG9rZW4gPSBVUkxUb2tlbi5zY2hlbWUoc2NoZW1lKTtcbiAgICBpZiAoIWhhc0N1cnJlbnRDaGFyYWN0ZXIodG9rZW5pemVyKSkge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiRE9ORVwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIkhPU1RcIjtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0U2NoZW1lT3JIb3N0KHRva2VuaXplcikge1xuICAgIGNvbnN0IHNjaGVtZU9ySG9zdCA9IHJlYWRVbnRpbENoYXJhY3Rlcih0b2tlbml6ZXIsIFwiOlwiLCBcIi9cIiwgXCI/XCIpO1xuICAgIGlmICghaGFzQ3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpKSB7XG4gICAgICAgIHRva2VuaXplci5fY3VycmVudFRva2VuID0gVVJMVG9rZW4uaG9zdChzY2hlbWVPckhvc3QpO1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiRE9ORVwiO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiOlwiKSB7XG4gICAgICAgIGlmIChwZWVrQ2hhcmFjdGVycyh0b2tlbml6ZXIsIDMpID09PSBcIjovL1wiKSB7XG4gICAgICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRUb2tlbiA9IFVSTFRva2VuLnNjaGVtZShzY2hlbWVPckhvc3QpO1xuICAgICAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIkhPU1RcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRva2VuaXplci5fY3VycmVudFRva2VuID0gVVJMVG9rZW4uaG9zdChzY2hlbWVPckhvc3QpO1xuICAgICAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIlBPUlRcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50VG9rZW4gPSBVUkxUb2tlbi5ob3N0KHNjaGVtZU9ySG9zdCk7XG4gICAgICAgIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiUEFUSFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIlFVRVJZXCI7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0SG9zdCh0b2tlbml6ZXIpIHtcbiAgICBpZiAocGVla0NoYXJhY3RlcnModG9rZW5pemVyLCAzKSA9PT0gXCI6Ly9cIikge1xuICAgICAgICBuZXh0Q2hhcmFjdGVyKHRva2VuaXplciwgMyk7XG4gICAgfVxuICAgIGNvbnN0IGhvc3QgPSByZWFkVW50aWxDaGFyYWN0ZXIodG9rZW5pemVyLCBcIjpcIiwgXCIvXCIsIFwiP1wiKTtcbiAgICB0b2tlbml6ZXIuX2N1cnJlbnRUb2tlbiA9IFVSTFRva2VuLmhvc3QoaG9zdCk7XG4gICAgaWYgKCFoYXNDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikpIHtcbiAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIkRPTkVcIjtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2V0Q3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpID09PSBcIjpcIikge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiUE9SVFwiO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiL1wiKSB7XG4gICAgICAgIHRva2VuaXplci5fY3VycmVudFN0YXRlID0gXCJQQVRIXCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiUVVFUllcIjtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0UG9ydCh0b2tlbml6ZXIpIHtcbiAgICBpZiAoZ2V0Q3VycmVudENoYXJhY3Rlcih0b2tlbml6ZXIpID09PSBcIjpcIikge1xuICAgICAgICBuZXh0Q2hhcmFjdGVyKHRva2VuaXplcik7XG4gICAgfVxuICAgIGNvbnN0IHBvcnQgPSByZWFkVW50aWxDaGFyYWN0ZXIodG9rZW5pemVyLCBcIi9cIiwgXCI/XCIpO1xuICAgIHRva2VuaXplci5fY3VycmVudFRva2VuID0gVVJMVG9rZW4ucG9ydChwb3J0KTtcbiAgICBpZiAoIWhhc0N1cnJlbnRDaGFyYWN0ZXIodG9rZW5pemVyKSkge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiRE9ORVwiO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiL1wiKSB7XG4gICAgICAgIHRva2VuaXplci5fY3VycmVudFN0YXRlID0gXCJQQVRIXCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiUVVFUllcIjtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0UGF0aCh0b2tlbml6ZXIpIHtcbiAgICBjb25zdCBwYXRoID0gcmVhZFVudGlsQ2hhcmFjdGVyKHRva2VuaXplciwgXCI/XCIpO1xuICAgIHRva2VuaXplci5fY3VycmVudFRva2VuID0gVVJMVG9rZW4ucGF0aChwYXRoKTtcbiAgICBpZiAoIWhhc0N1cnJlbnRDaGFyYWN0ZXIodG9rZW5pemVyKSkge1xuICAgICAgICB0b2tlbml6ZXIuX2N1cnJlbnRTdGF0ZSA9IFwiRE9ORVwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIlFVRVJZXCI7XG4gICAgfVxufVxuZnVuY3Rpb24gbmV4dFF1ZXJ5KHRva2VuaXplcikge1xuICAgIGlmIChnZXRDdXJyZW50Q2hhcmFjdGVyKHRva2VuaXplcikgPT09IFwiP1wiKSB7XG4gICAgICAgIG5leHRDaGFyYWN0ZXIodG9rZW5pemVyKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnkgPSByZWFkUmVtYWluaW5nKHRva2VuaXplcik7XG4gICAgdG9rZW5pemVyLl9jdXJyZW50VG9rZW4gPSBVUkxUb2tlbi5xdWVyeShxdWVyeSk7XG4gICAgdG9rZW5pemVyLl9jdXJyZW50U3RhdGUgPSBcIkRPTkVcIjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVybC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IFVSTEJ1aWxkZXIsIFVSTFF1ZXJ5IH0gZnJvbSBcIi4uL3VybFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuY29uc3QgUmVkYWN0ZWRTdHJpbmcgPSBcIlJFREFDVEVEXCI7XG5jb25zdCBkZWZhdWx0QWxsb3dlZEhlYWRlck5hbWVzID0gW1xuICAgIFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgIFwieC1tcy1yZXR1cm4tY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcIngtbXMtdXNlcmFnZW50XCIsXG4gICAgXCJ4LW1zLWNvcnJlbGF0aW9uLXJlcXVlc3QtaWRcIixcbiAgICBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgIFwiY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcIm1zLWN2XCIsXG4gICAgXCJyZXR1cm4tY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcInRyYWNlcGFyZW50XCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1FeHBvc2UtSGVhZGVyc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtTWF4LUFnZVwiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1IZWFkZXJzXCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZFwiLFxuICAgIFwiT3JpZ2luXCIsXG4gICAgXCJBY2NlcHRcIixcbiAgICBcIkFjY2VwdC1FbmNvZGluZ1wiLFxuICAgIFwiQ2FjaGUtQ29udHJvbFwiLFxuICAgIFwiQ29ubmVjdGlvblwiLFxuICAgIFwiQ29udGVudC1MZW5ndGhcIixcbiAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgIFwiRGF0ZVwiLFxuICAgIFwiRVRhZ1wiLFxuICAgIFwiRXhwaXJlc1wiLFxuICAgIFwiSWYtTWF0Y2hcIixcbiAgICBcIklmLU1vZGlmaWVkLVNpbmNlXCIsXG4gICAgXCJJZi1Ob25lLU1hdGNoXCIsXG4gICAgXCJJZi1Vbm1vZGlmaWVkLVNpbmNlXCIsXG4gICAgXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgXCJQcmFnbWFcIixcbiAgICBcIlJlcXVlc3QtSWRcIixcbiAgICBcIlJldHJ5LUFmdGVyXCIsXG4gICAgXCJTZXJ2ZXJcIixcbiAgICBcIlRyYW5zZmVyLUVuY29kaW5nXCIsXG4gICAgXCJVc2VyLUFnZW50XCIsXG4gICAgXCJXV1ctQXV0aGVudGljYXRlXCIsXG5dO1xuY29uc3QgZGVmYXVsdEFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBbXCJhcGktdmVyc2lvblwiXTtcbmV4cG9ydCBjbGFzcyBTYW5pdGl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKHsgYWxsb3dlZEhlYWRlck5hbWVzID0gW10sIGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBbXSB9ID0ge30pIHtcbiAgICAgICAgYWxsb3dlZEhlYWRlck5hbWVzID0gQXJyYXkuaXNBcnJheShhbGxvd2VkSGVhZGVyTmFtZXMpXG4gICAgICAgICAgICA/IGRlZmF1bHRBbGxvd2VkSGVhZGVyTmFtZXMuY29uY2F0KGFsbG93ZWRIZWFkZXJOYW1lcylcbiAgICAgICAgICAgIDogZGVmYXVsdEFsbG93ZWRIZWFkZXJOYW1lcztcbiAgICAgICAgYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyA9IEFycmF5LmlzQXJyYXkoYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycylcbiAgICAgICAgICAgID8gZGVmYXVsdEFsbG93ZWRRdWVyeVBhcmFtZXRlcnMuY29uY2F0KGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMpXG4gICAgICAgICAgICA6IGRlZmF1bHRBbGxvd2VkUXVlcnlQYXJhbWV0ZXJzO1xuICAgICAgICB0aGlzLmFsbG93ZWRIZWFkZXJOYW1lcyA9IG5ldyBTZXQoYWxsb3dlZEhlYWRlck5hbWVzLm1hcCgobikgPT4gbi50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICAgIHRoaXMuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBTZXQoYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycy5tYXAoKHApID0+IHAudG9Mb3dlckNhc2UoKSkpO1xuICAgIH1cbiAgICBzYW5pdGl6ZShvYmopIHtcbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBFcnJvcnMgaW5jbHVkZSB0aGVpciBpbnRlcmVzdGluZyBub24tZW51bWVyYWJsZSBtZW1iZXJzXG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHZhbHVlKSwgeyBuYW1lOiB2YWx1ZS5uYW1lLCBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJfaGVhZGVyc01hcFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVIZWFkZXJzKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJ1cmxcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplVXJsKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJxdWVyeVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVRdWVyeSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwiYm9keVwiKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgbG9nIHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcInJlc3BvbnNlXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBsb2cgcmVzcG9uc2UgYWdhaW5cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcIm9wZXJhdGlvblNwZWNcIikge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgc2VuZE9wZXJhdGlvblJlcXVlc3QsIHRoZSByZXF1ZXN0IGNhcnJpZXMgYSBtYXNzaXZlXG4gICAgICAgICAgICAgICAgLy8gZmllbGQgd2l0aCB0aGUgYXV0b3Jlc3Qgc3BlYy4gTm8gbmVlZCB0byBsb2cgaXQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sIDIpO1xuICAgIH1cbiAgICBzYW5pdGl6ZUhlYWRlcnModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVPYmplY3QodmFsdWUsIHRoaXMuYWxsb3dlZEhlYWRlck5hbWVzLCAodiwgaykgPT4gdltrXS52YWx1ZSk7XG4gICAgfVxuICAgIHNhbml0aXplUXVlcnkodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVPYmplY3QodmFsdWUsIHRoaXMuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycywgKHYsIGspID0+IHZba10pO1xuICAgIH1cbiAgICBzYW5pdGl6ZU9iamVjdCh2YWx1ZSwgYWxsb3dlZEtleXMsIGFjY2Vzc29yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYW5pdGl6ZWQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGFsbG93ZWRLZXlzLmhhcyhrLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkW2tdID0gYWNjZXNzb3IodmFsdWUsIGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkW2tdID0gUmVkYWN0ZWRTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbml0aXplZDtcbiAgICB9XG4gICAgc2FuaXRpemVVcmwodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBVUkxCdWlsZGVyLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSB1cmxCdWlsZGVyLmdldFF1ZXJ5KCk7XG4gICAgICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeSA9IFVSTFF1ZXJ5LnBhcnNlKHF1ZXJ5U3RyaW5nKTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIHF1ZXJ5LmtleXMoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnMuaGFzKGsudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeS5zZXQoaywgUmVkYWN0ZWRTdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVybEJ1aWxkZXIuc2V0UXVlcnkocXVlcnkudG9TdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiB1cmxCdWlsZGVyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2FuaXRpemVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5leHBvcnQgY29uc3QgY3VzdG9tID0gaW5zcGVjdC5jdXN0b207XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnNwZWN0LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgU2FuaXRpemVyIH0gZnJvbSBcIi4vdXRpbC9zYW5pdGl6ZXJcIjtcbmltcG9ydCB7IGN1c3RvbSB9IGZyb20gXCIuL3V0aWwvaW5zcGVjdFwiO1xuY29uc3QgZXJyb3JTYW5pdGl6ZXIgPSBuZXcgU2FuaXRpemVyKCk7XG4vKipcbiAqIEFuIGVycm9yIHJlc3VsdGluZyBmcm9tIGFuIEhUVFAgcmVxdWVzdCB0byBhIHNlcnZpY2UgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgY29kZSwgc3RhdHVzQ29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUmVzdEVycm9yXCI7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFJlc3RFcnJvci5wcm90b3R5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2dnaW5nIG1ldGhvZCBmb3IgdXRpbC5pbnNwZWN0IGluIE5vZGVcbiAgICAgKi9cbiAgICBbY3VzdG9tXSgpIHtcbiAgICAgICAgcmV0dXJuIGBSZXN0RXJyb3I6ICR7dGhpcy5tZXNzYWdlfSBcXG4gJHtlcnJvclNhbml0aXplci5zYW5pdGl6ZSh0aGlzKX1gO1xuICAgIH1cbn1cbi8qKlxuICogQSBjb25zdGFudCBzdHJpbmcgdG8gaWRlbnRpZnkgZXJyb3JzIHRoYXQgbWF5IGFyaXNlIHdoZW4gbWFraW5nIGFuIEhUVFAgcmVxdWVzdCB0aGF0IGluZGljYXRlcyBhbiBpc3N1ZSB3aXRoIHRoZSB0cmFuc3BvcnQgbGF5ZXIgKGUuZy4gdGhlIGhvc3RuYW1lIG9mIHRoZSBVUkwgY2Fubm90IGJlIHJlc29sdmVkIHZpYSBETlMuKVxuICovXG5SZXN0RXJyb3IuUkVRVUVTVF9TRU5EX0VSUk9SID0gXCJSRVFVRVNUX1NFTkRfRVJST1JcIjtcbi8qKlxuICogQSBjb25zdGFudCBzdHJpbmcgdG8gaWRlbnRpZnkgZXJyb3JzIHRoYXQgbWF5IGFyaXNlIGZyb20gcGFyc2luZyBhbiBpbmNvbWluZyBIVFRQIHJlc3BvbnNlLiBVc3VhbGx5IGluZGljYXRlcyBhIG1hbGZvcm1lZCBIVFRQIGJvZHksIHN1Y2ggYXMgYW4gZW5jb2RlZCBKU09OIHBheWxvYWQgdGhhdCBpcyBpbmNvbXBsZXRlLlxuICovXG5SZXN0RXJyb3IuUEFSU0VfRVJST1IgPSBcIlBBUlNFX0VSUk9SXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXN0RXJyb3IuanMubWFwIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZTtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGJlZW4gYWJvcnRlZC5cbiAqIENoZWNrIGZvciB0aGlzIGVycm9yIGJ5IHRlc3RpbmcgdGhlIGBuYW1lYCB0aGF0IHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZVxuICogZXJyb3IgbWF0Y2hlcyBgXCJBYm9ydEVycm9yXCJgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAqIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAqIHRyeSB7XG4gKiAgIGRvQXN5bmNXb3JrKGNvbnRyb2xsZXIuc2lnbmFsKVxuICogfSBjYXRjaCAoZSkge1xuICogICBpZiAoZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAqICAgICAvLyBoYW5kbGUgYWJvcnQgZXJyb3IgaGVyZS5cbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQWJvcnRFcnJvclwiO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFib3J0RXJyb3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQgeyBBYm9ydEVycm9yIH0gZnJvbSBcIi4vQWJvcnRFcnJvci5qc1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBBYm9ydEVycm9yIH0gZnJvbSBcIkBhenVyZS9hYm9ydC1jb250cm9sbGVyXCI7XG4vKipcbiAqIENyZWF0ZXMgYW4gYWJvcnRhYmxlIHByb21pc2UuXG4gKiBAcGFyYW0gYnVpbGRQcm9taXNlIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSByZXNvbHZlIGFuZCByZWplY3QgZnVuY3Rpb25zIGFzIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgYWJvcnRhYmxlIHByb21pc2UuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBjYW4gYmUgYWJvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFib3J0YWJsZVByb21pc2UoYnVpbGRQcm9taXNlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBjbGVhbnVwQmVmb3JlQWJvcnQsIGFib3J0U2lnbmFsLCBhYm9ydEVycm9yTXNnIH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBmdW5jdGlvbiByZWplY3RPbkFib3J0KCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBBYm9ydEVycm9yKGFib3J0RXJyb3JNc2cgIT09IG51bGwgJiYgYWJvcnRFcnJvck1zZyAhPT0gdm9pZCAwID8gYWJvcnRFcnJvck1zZyA6IFwiVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVycygpIHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsID09PSBudWxsIHx8IGFib3J0U2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25BYm9ydCgpIHtcbiAgICAgICAgICAgIGNsZWFudXBCZWZvcmVBYm9ydCA9PT0gbnVsbCB8fCBjbGVhbnVwQmVmb3JlQWJvcnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsZWFudXBCZWZvcmVBYm9ydCgpO1xuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICByZWplY3RPbkFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFib3J0U2lnbmFsID09PSBudWxsIHx8IGFib3J0U2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0T25BYm9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBidWlsZFByb21pc2UoKHgpID0+IHtcbiAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHgpO1xuICAgICAgICAgICAgfSwgKHgpID0+IHtcbiAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICByZWplY3QoeCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBhYm9ydFNpZ25hbCA9PT0gbnVsbCB8fCBhYm9ydFNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3JlYXRlQWJvcnRhYmxlUHJvbWlzZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGNyZWF0ZUFib3J0YWJsZVByb21pc2UgfSBmcm9tIFwiLi9jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzXCI7XG5jb25zdCBTdGFuZGFyZEFib3J0TWVzc2FnZSA9IFwiVGhlIGRlbGF5IHdhcyBhYm9ydGVkLlwiO1xuLyoqXG4gKiBBIHdyYXBwZXIgZm9yIHNldFRpbWVvdXQgdGhhdCByZXNvbHZlcyBhIHByb21pc2UgYWZ0ZXIgdGltZUluTXMgbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIHRpbWVJbk1zIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gYmUgZGVsYXllZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRlbGF5IC0gY3VycmVudGx5IGFib3J0IG9wdGlvbnNcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBhZnRlciB0aW1lSW5Nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsYXkodGltZUluTXMsIG9wdGlvbnMpIHtcbiAgICBsZXQgdG9rZW47XG4gICAgY29uc3QgeyBhYm9ydFNpZ25hbCwgYWJvcnRFcnJvck1zZyB9ID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgcmV0dXJuIGNyZWF0ZUFib3J0YWJsZVByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdG9rZW4gPSBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVJbk1zKTtcbiAgICB9LCB7XG4gICAgICAgIGNsZWFudXBCZWZvcmVBYm9ydDogKCkgPT4gY2xlYXJUaW1lb3V0KHRva2VuKSxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGFib3J0RXJyb3JNc2c6IGFib3J0RXJyb3JNc2cgIT09IG51bGwgJiYgYWJvcnRFcnJvck1zZyAhPT0gdm9pZCAwID8gYWJvcnRFcnJvck1zZyA6IFN0YW5kYXJkQWJvcnRNZXNzYWdlLFxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBjcmVhdGVIbWFjIH0gZnJvbSBcImNyeXB0b1wiO1xuLyoqXG4gKiBHZW5lcmF0ZXMgYSBTSEEtMjU2IEhNQUMgc2lnbmF0dXJlLlxuICogQHBhcmFtIGtleSAtIFRoZSBITUFDIGtleSByZXByZXNlbnRlZCBhcyBhIGJhc2U2NCBzdHJpbmcsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNyeXB0b2dyYXBoaWMgSE1BQyBoYXNoLlxuICogQHBhcmFtIHN0cmluZ1RvU2lnbiAtIFRoZSBkYXRhIHRvIGJlIHNpZ25lZC5cbiAqIEBwYXJhbSBlbmNvZGluZyAtIFRoZSB0ZXh0dWFsIGVuY29kaW5nIHRvIHVzZSBmb3IgdGhlIHJldHVybmVkIEhNQUMgZGlnZXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcHV0ZVNoYTI1NkhtYWMoa2V5LCBzdHJpbmdUb1NpZ24sIGVuY29kaW5nKSB7XG4gICAgY29uc3QgZGVjb2RlZEtleSA9IEJ1ZmZlci5mcm9tKGtleSwgXCJiYXNlNjRcIik7XG4gICAgcmV0dXJuIGNyZWF0ZUhtYWMoXCJzaGEyNTZcIiwgZGVjb2RlZEtleSkudXBkYXRlKHN0cmluZ1RvU2lnbikuZGlnZXN0KGVuY29kaW5nKTtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgU0hBLTI1NiBoYXNoLlxuICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgZGF0YSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgaGFzaC5cbiAqIEBwYXJhbSBlbmNvZGluZyAtIFRoZSB0ZXh0dWFsIGVuY29kaW5nIHRvIHVzZSBmb3IgdGhlIHJldHVybmVkIGhhc2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wdXRlU2hhMjU2SGFzaChjb250ZW50LCBlbmNvZGluZykge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoZW5jb2RpbmcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhMjU2LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxudmFyIF9hO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCBhcyB2NFJhbmRvbVVVSUQgfSBmcm9tIFwiY3J5cHRvXCI7XG4vLyBOT1RFOiBUaGlzIGlzIGEgd29ya2Fyb3VuZCB1bnRpbCB3ZSBjYW4gdXNlIGBnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21VVUlEYCBpbiBOb2RlLmpzIDE5Ky5cbmNvbnN0IHV1aWRGdW5jdGlvbiA9IHR5cGVvZiAoKF9hID0gZ2xvYmFsVGhpcyA9PT0gbnVsbCB8fCBnbG9iYWxUaGlzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnbG9iYWxUaGlzLmNyeXB0bykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJhbmRvbVVVSUQpID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IGdsb2JhbFRoaXMuY3J5cHRvLnJhbmRvbVVVSUQuYmluZChnbG9iYWxUaGlzLmNyeXB0bylcbiAgICA6IHY0UmFuZG9tVVVJRDtcbi8qKlxuICogR2VuZXJhdGVkIFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyXG4gKlxuICogQHJldHVybnMgUkZDNDEyMiB2NCBVVUlELlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tVVVJRCgpIHtcbiAgICByZXR1cm4gdXVpZEZ1bmN0aW9uKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dWlkVXRpbHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG52YXIgX2EsIF9iLCBfYywgX2Q7XG4vKipcbiAqIEEgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgdGhlIGNvZGUgaXMgcnVubmluZyBpcyBhIFdlYiBCcm93c2VyLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uby13aW5kb3dcbmV4cG9ydCBjb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCI7XG4vKipcbiAqIEEgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgdGhlIGNvZGUgaXMgcnVubmluZyBpcyBhIFdlYiBXb3JrZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1dlYldvcmtlciA9IHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiICYmXG4gICAgdHlwZW9mIChzZWxmID09PSBudWxsIHx8IHNlbGYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGYuaW1wb3J0U2NyaXB0cykgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICgoKF9hID0gc2VsZi5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hbWUpID09PSBcIkRlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlXCIgfHxcbiAgICAgICAgKChfYiA9IHNlbGYuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5uYW1lKSA9PT0gXCJTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGVcIiB8fFxuICAgICAgICAoKF9jID0gc2VsZi5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLm5hbWUpID09PSBcIlNoYXJlZFdvcmtlckdsb2JhbFNjb3BlXCIpO1xuLyoqXG4gKiBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IHRoZSBjb2RlIGlzIHJ1bm5pbmcgaXMgRGVuby5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRGVubyA9IHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgdHlwZW9mIERlbm8udmVyc2lvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBEZW5vLnZlcnNpb24uZGVubyAhPT0gXCJ1bmRlZmluZWRcIjtcbi8qKlxuICogQSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCB0aGUgY29kZSBpcyBydW5uaW5nIGlzIEJ1bi5zaC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQnVuID0gdHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgQnVuLnZlcnNpb24gIT09IFwidW5kZWZpbmVkXCI7XG4vKipcbiAqIEEgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgdGhlIGNvZGUgaXMgcnVubmluZyBpcyBhIE5vZGUuanMgY29tcGF0aWJsZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTm9kZUxpa2UgPSB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgQm9vbGVhbihnbG9iYWxUaGlzLnByb2Nlc3MudmVyc2lvbikgJiZcbiAgICBCb29sZWFuKChfZCA9IGdsb2JhbFRoaXMucHJvY2Vzcy52ZXJzaW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLm5vZGUpO1xuLyoqXG4gKiBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IHRoZSBjb2RlIGlzIHJ1bm5pbmcgaXMgYSBOb2RlLmpzIGNvbXBhdGlibGUgZW52aXJvbm1lbnQuXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGlzTm9kZUxpa2VgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc05vZGUgPSBpc05vZGVMaWtlO1xuLyoqXG4gKiBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IHRoZSBjb2RlIGlzIHJ1bm5pbmcgaXMgTm9kZS5KUy5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTm9kZVJ1bnRpbWUgPSBpc05vZGVMaWtlICYmICFpc0J1biAmJiAhaXNEZW5vO1xuLyoqXG4gKiBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IHRoZSBjb2RlIGlzIHJ1bm5pbmcgaXMgaW4gUmVhY3QtTmF0aXZlLlxuICovXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL2Jsb2IvbWFpbi9wYWNrYWdlcy9yZWFjdC1uYXRpdmUvTGlicmFyaWVzL0NvcmUvc2V0VXBOYXZpZ2F0b3IuanNcbmV4cG9ydCBjb25zdCBpc1JlYWN0TmF0aXZlID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiAobmF2aWdhdG9yID09PSBudWxsIHx8IG5hdmlnYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yLnByb2R1Y3QpID09PSBcIlJlYWN0TmF0aXZlXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGVja0Vudmlyb25tZW50LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuZXhwb3J0IHsgZGVsYXkgfSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuZXhwb3J0IHsgY2FuY2VsYWJsZVByb21pc2VSYWNlLCB9IGZyb20gXCIuL2Fib3J0ZXJVdGlscy5qc1wiO1xuZXhwb3J0IHsgY3JlYXRlQWJvcnRhYmxlUHJvbWlzZSwgfSBmcm9tIFwiLi9jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzXCI7XG5leHBvcnQgeyBnZXRSYW5kb21JbnRlZ2VySW5jbHVzaXZlIH0gZnJvbSBcIi4vcmFuZG9tLmpzXCI7XG5leHBvcnQgeyBpc09iamVjdCB9IGZyb20gXCIuL29iamVjdC5qc1wiO1xuZXhwb3J0IHsgaXNFcnJvciwgZ2V0RXJyb3JNZXNzYWdlIH0gZnJvbSBcIi4vZXJyb3IuanNcIjtcbmV4cG9ydCB7IGNvbXB1dGVTaGEyNTZIYXNoLCBjb21wdXRlU2hhMjU2SG1hYyB9IGZyb20gXCIuL3NoYTI1Ni5qc1wiO1xuZXhwb3J0IHsgaXNEZWZpbmVkLCBpc09iamVjdFdpdGhQcm9wZXJ0aWVzLCBvYmplY3RIYXNQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVHdWFyZHMuanNcIjtcbmV4cG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwiLi91dWlkVXRpbHMuanNcIjtcbmV4cG9ydCB7IGlzQnJvd3NlciwgaXNCdW4sIGlzTm9kZSwgaXNOb2RlTGlrZSwgaXNOb2RlUnVudGltZSwgaXNEZW5vLCBpc1JlYWN0TmF0aXZlLCBpc1dlYldvcmtlciwgfSBmcm9tIFwiLi9jaGVja0Vudmlyb25tZW50LmpzXCI7XG5leHBvcnQgeyB1aW50OEFycmF5VG9TdHJpbmcsIHN0cmluZ1RvVWludDhBcnJheSB9IGZyb20gXCIuL2J5dGVzRW5jb2RpbmcuanNcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaXNPYmplY3RXaXRoUHJvcGVydGllcyB9IGZyb20gXCJAYXp1cmUvY29yZS11dGlsXCI7XG4vKipcbiAqIFRlc3RzIGFuIG9iamVjdCB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpbXBsZW1lbnRzIEtleUNyZWRlbnRpYWwuXG4gKlxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgYXNzdW1lZCBLZXlDcmVkZW50aWFsIHRvIGJlIHRlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzS2V5Q3JlZGVudGlhbChjcmVkZW50aWFsKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0V2l0aFByb3BlcnRpZXMoY3JlZGVudGlhbCwgW1wia2V5XCJdKSAmJiB0eXBlb2YgY3JlZGVudGlhbC5rZXkgPT09IFwic3RyaW5nXCI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXlDcmVkZW50aWFsLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaXNPYmplY3RXaXRoUHJvcGVydGllcyB9IGZyb20gXCJAYXp1cmUvY29yZS11dGlsXCI7XG4vKipcbiAqIEEgc3RhdGljIG5hbWUva2V5LWJhc2VkIGNyZWRlbnRpYWwgdGhhdCBzdXBwb3J0cyB1cGRhdGluZ1xuICogdGhlIHVuZGVybHlpbmcgbmFtZSBhbmQga2V5IHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEF6dXJlTmFtZWRLZXlDcmVkZW50aWFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGtleSB0byBiZSB1c2VkIGluIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqL1xuICAgIGdldCBrZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9rZXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgbmFtZSB0byBiZSB1c2VkIGluIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqL1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIEF6dXJlTmFtZWRLZXlDcmVkZW50aWFsIGZvciB1c2VcbiAgICAgKiB3aXRoIGEgc2VydmljZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBuYW1lIHRvIHVzZSBpbiBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGtleSB0byB1c2UgaW4gYXV0aGVudGljYXRpb24uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSwga2V5KSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAha2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibmFtZSBhbmQga2V5IG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUga2V5LlxuICAgICAqXG4gICAgICogVXBkYXRlcyB3aWxsIHRha2UgZWZmZWN0IHVwb24gdGhlIG5leHQgcmVxdWVzdCBhZnRlclxuICAgICAqIHVwZGF0aW5nIHRoZSBrZXkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV3TmFtZSAtIFRoZSBuZXcgbmFtZSB2YWx1ZSB0byBiZSB1c2VkLlxuICAgICAqIEBwYXJhbSBuZXdLZXkgLSBUaGUgbmV3IGtleSB2YWx1ZSB0byBiZSB1c2VkLlxuICAgICAqL1xuICAgIHVwZGF0ZShuZXdOYW1lLCBuZXdLZXkpIHtcbiAgICAgICAgaWYgKCFuZXdOYW1lIHx8ICFuZXdLZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJuZXdOYW1lIGFuZCBuZXdLZXkgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5nc1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uYW1lID0gbmV3TmFtZTtcbiAgICAgICAgdGhpcy5fa2V5ID0gbmV3S2V5O1xuICAgIH1cbn1cbi8qKlxuICogVGVzdHMgYW4gb2JqZWN0IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGltcGxlbWVudHMgTmFtZWRLZXlDcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGFzc3VtZWQgTmFtZWRLZXlDcmVkZW50aWFsIHRvIGJlIHRlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmFtZWRLZXlDcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0V2l0aFByb3BlcnRpZXMoY3JlZGVudGlhbCwgW1wibmFtZVwiLCBcImtleVwiXSkgJiZcbiAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWwua2V5ID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHR5cGVvZiBjcmVkZW50aWFsLm5hbWUgPT09IFwic3RyaW5nXCIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXp1cmVOYW1lZEtleUNyZWRlbnRpYWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBpc09iamVjdFdpdGhQcm9wZXJ0aWVzIH0gZnJvbSBcIkBhenVyZS9jb3JlLXV0aWxcIjtcbi8qKlxuICogQSBzdGF0aWMtc2lnbmF0dXJlLWJhc2VkIGNyZWRlbnRpYWwgdGhhdCBzdXBwb3J0cyB1cGRhdGluZ1xuICogdGhlIHVuZGVybHlpbmcgc2lnbmF0dXJlIHZhbHVlLlxuICovXG5leHBvcnQgY2xhc3MgQXp1cmVTQVNDcmVkZW50aWFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlIHRvIGJlIHVzZWQgaW4gYXV0aGVudGljYXRpb25cbiAgICAgKi9cbiAgICBnZXQgc2lnbmF0dXJlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gQXp1cmVTQVNDcmVkZW50aWFsIGZvciB1c2VcbiAgICAgKiB3aXRoIGEgc2VydmljZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIC0gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlIHRvIHVzZSBpbiBhdXRoZW50aWNhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNpZ25hdHVyZSkge1xuICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2hhcmVkIGFjY2VzcyBzaWduYXR1cmUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBzaWduYXR1cmUuXG4gICAgICpcbiAgICAgKiBVcGRhdGVzIHdpbGwgdGFrZSBlZmZlY3QgdXBvbiB0aGUgbmV4dCByZXF1ZXN0IGFmdGVyXG4gICAgICogdXBkYXRpbmcgdGhlIHNpZ25hdHVyZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdTaWduYXR1cmUgLSBUaGUgbmV3IHNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlIHZhbHVlIHRvIGJlIHVzZWRcbiAgICAgKi9cbiAgICB1cGRhdGUobmV3U2lnbmF0dXJlKSB7XG4gICAgICAgIGlmICghbmV3U2lnbmF0dXJlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBuZXdTaWduYXR1cmU7XG4gICAgfVxufVxuLyoqXG4gKiBUZXN0cyBhbiBvYmplY3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaW1wbGVtZW50cyBTQVNDcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGFzc3VtZWQgU0FTQ3JlZGVudGlhbCB0byBiZSB0ZXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NBU0NyZWRlbnRpYWwoY3JlZGVudGlhbCkge1xuICAgIHJldHVybiAoaXNPYmplY3RXaXRoUHJvcGVydGllcyhjcmVkZW50aWFsLCBbXCJzaWduYXR1cmVcIl0pICYmIHR5cGVvZiBjcmVkZW50aWFsLnNpZ25hdHVyZSA9PT0gXCJzdHJpbmdcIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1henVyZVNBU0NyZWRlbnRpYWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIFRlc3RzIGFuIG9iamVjdCB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpbXBsZW1lbnRzIFRva2VuQ3JlZGVudGlhbC5cbiAqXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhc3N1bWVkIFRva2VuQ3JlZGVudGlhbCB0byBiZSB0ZXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGFuIG9iamVjdCB3aXRoIGEgJ2dldFRva2VuJyBmdW5jdGlvbiBhbmQgcG9zc2libHkgd2l0aFxuICAgIC8vIGEgJ3NpZ25SZXF1ZXN0JyBmdW5jdGlvbi4gIFdlIGRvIHRoaXMgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXRcbiAgICAvLyBhIFNlcnZpY2VDbGllbnRDcmVkZW50aWFscyBpbXBsZW1lbnRvciAobGlrZSBUb2tlbkNsaWVudENyZWRlbnRpYWxzXG4gICAgLy8gaW4gbXMtcmVzdC1ub2RlYXV0aCkgZG9lc24ndCBnZXQgbWlzdGFrZW4gZm9yIGEgVG9rZW5DcmVkZW50aWFsIGlmXG4gICAgLy8gaXQgZG9lc24ndCBhY3R1YWxseSBpbXBsZW1lbnQgVG9rZW5DcmVkZW50aWFsIGFsc28uXG4gICAgY29uc3QgY2FzdENyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xuICAgIHJldHVybiAoY2FzdENyZWRlbnRpYWwgJiZcbiAgICAgICAgdHlwZW9mIGNhc3RDcmVkZW50aWFsLmdldFRva2VuID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgKGNhc3RDcmVkZW50aWFsLnNpZ25SZXF1ZXN0ID09PSB1bmRlZmluZWQgfHwgY2FzdENyZWRlbnRpYWwuZ2V0VG9rZW4ubGVuZ3RoID4gMCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9rZW5DcmVkZW50aWFsLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuZXhwb3J0IHsgQXp1cmVLZXlDcmVkZW50aWFsIH0gZnJvbSBcIi4vYXp1cmVLZXlDcmVkZW50aWFsLmpzXCI7XG5leHBvcnQgeyBpc0tleUNyZWRlbnRpYWwgfSBmcm9tIFwiLi9rZXlDcmVkZW50aWFsLmpzXCI7XG5leHBvcnQgeyBBenVyZU5hbWVkS2V5Q3JlZGVudGlhbCwgaXNOYW1lZEtleUNyZWRlbnRpYWwsIH0gZnJvbSBcIi4vYXp1cmVOYW1lZEtleUNyZWRlbnRpYWwuanNcIjtcbmV4cG9ydCB7IEF6dXJlU0FTQ3JlZGVudGlhbCwgaXNTQVNDcmVkZW50aWFsIH0gZnJvbSBcIi4vYXp1cmVTQVNDcmVkZW50aWFsLmpzXCI7XG5leHBvcnQgeyBpc1Rva2VuQ3JlZGVudGlhbCwgfSBmcm9tIFwiLi90b2tlbkNyZWRlbnRpYWwuanNcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBUaGUgZGlmZmVyZW50IGxldmVscyBvZiBsb2dzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgSHR0cFBpcGVsaW5lTG9nZ2VyLlxuICovXG5leHBvcnQgdmFyIEh0dHBQaXBlbGluZUxvZ0xldmVsO1xuKGZ1bmN0aW9uIChIdHRwUGlwZWxpbmVMb2dMZXZlbCkge1xuICAgIC8qKlxuICAgICAqIEEgbG9nIGxldmVsIHRoYXQgaW5kaWNhdGVzIHRoYXQgbm8gbG9ncyB3aWxsIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBIdHRwUGlwZWxpbmVMb2dMZXZlbFtIdHRwUGlwZWxpbmVMb2dMZXZlbFtcIk9GRlwiXSA9IDBdID0gXCJPRkZcIjtcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBsb2cuXG4gICAgICovXG4gICAgSHR0cFBpcGVsaW5lTG9nTGV2ZWxbSHR0cFBpcGVsaW5lTG9nTGV2ZWxbXCJFUlJPUlwiXSA9IDFdID0gXCJFUlJPUlwiO1xuICAgIC8qKlxuICAgICAqIEEgd2FybmluZyBsb2cuXG4gICAgICovXG4gICAgSHR0cFBpcGVsaW5lTG9nTGV2ZWxbSHR0cFBpcGVsaW5lTG9nTGV2ZWxbXCJXQVJOSU5HXCJdID0gMl0gPSBcIldBUk5JTkdcIjtcbiAgICAvKipcbiAgICAgKiBBbiBpbmZvcm1hdGlvbiBsb2cuXG4gICAgICovXG4gICAgSHR0cFBpcGVsaW5lTG9nTGV2ZWxbSHR0cFBpcGVsaW5lTG9nTGV2ZWxbXCJJTkZPXCJdID0gM10gPSBcIklORk9cIjtcbn0pKEh0dHBQaXBlbGluZUxvZ0xldmVsIHx8IChIdHRwUGlwZWxpbmVMb2dMZXZlbCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odHRwUGlwZWxpbmVMb2dMZXZlbC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEh0dHBQaXBlbGluZUxvZ0xldmVsIH0gZnJvbSBcIi4uL2h0dHBQaXBlbGluZUxvZ0xldmVsXCI7XG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZyb20gd2hpY2ggYWxsIHJlcXVlc3QgcG9saWNpZXMgZGVyaXZlLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYWluIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhhdCBtYW5pcHVsYXRlcyBhIHJlcXVlc3QvcmVzcG9uc2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIG5leHQgcG9saWN5IGluIHRoZSBwaXBlbGluZS4gRWFjaCBwb2xpY3kgaXMgcmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyB0aGUgbmV4dCBvbmUgaWYgdGhlIHJlcXVlc3QgaXMgdG8gY29udGludWUgdGhyb3VnaCB0aGUgcGlwZWxpbmUuXG4gICAgICovXG4gICAgX25leHRQb2xpY3ksIFxuICAgIC8qKlxuICAgICAqIFRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBhIGdpdmVuIHJlcXVlc3QgcG9saWN5LlxuICAgICAqL1xuICAgIF9vcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX25leHRQb2xpY3kgPSBfbmV4dFBvbGljeTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgd2hldGhlciBvciBub3QgYSBsb2cgd2l0aCB0aGUgcHJvdmlkZWQgbG9nIGxldmVsIHNob3VsZCBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIGxvZ0xldmVsIC0gVGhlIGxvZyBsZXZlbCBvZiB0aGUgbG9nIHRoYXQgd2lsbCBiZSBsb2dnZWQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgYSBsb2cgd2l0aCB0aGUgcHJvdmlkZWQgbG9nIGxldmVsIHNob3VsZCBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgc2hvdWxkTG9nKGxvZ0xldmVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zLnNob3VsZExvZyhsb2dMZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gbG9nIHRoZSBwcm92aWRlZCBtZXNzYWdlIHRvIHRoZSBwcm92aWRlZCBsb2dnZXIuIElmIG5vIGxvZ2dlciB3YXMgcHJvdmlkZWQgb3IgaWZcbiAgICAgKiB0aGUgbG9nIGxldmVsIGRvZXMgbm90IG1lYXQgdGhlIGxvZ2dlcidzIHRocmVzaG9sZCwgdGhlbiBub3RoaW5nIHdpbGwgYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSBsb2dMZXZlbCAtIFRoZSBsb2cgbGV2ZWwgb2YgdGhpcyBsb2cuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSBvZiB0aGlzIGxvZy5cbiAgICAgKi9cbiAgICBsb2cobG9nTGV2ZWwsIG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5sb2cobG9nTGV2ZWwsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbi8qKlxuICogT3B0aW9uYWwgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBSZXF1ZXN0UG9saWN5LlxuICovXG5leHBvcnQgY2xhc3MgUmVxdWVzdFBvbGljeU9wdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKF9sb2dnZXIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyID0gX2xvZ2dlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHdoZXRoZXIgb3Igbm90IGEgbG9nIHdpdGggdGhlIHByb3ZpZGVkIGxvZyBsZXZlbCBzaG91bGQgYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSBsb2dMZXZlbCAtIFRoZSBsb2cgbGV2ZWwgb2YgdGhlIGxvZyB0aGF0IHdpbGwgYmUgbG9nZ2VkLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IGEgbG9nIHdpdGggdGhlIHByb3ZpZGVkIGxvZyBsZXZlbCBzaG91bGQgYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIHNob3VsZExvZyhsb2dMZXZlbCkge1xuICAgICAgICByZXR1cm4gKCEhdGhpcy5fbG9nZ2VyICYmXG4gICAgICAgICAgICBsb2dMZXZlbCAhPT0gSHR0cFBpcGVsaW5lTG9nTGV2ZWwuT0ZGICYmXG4gICAgICAgICAgICBsb2dMZXZlbCA8PSB0aGlzLl9sb2dnZXIubWluaW11bUxvZ0xldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byBsb2cgdGhlIHByb3ZpZGVkIG1lc3NhZ2UgdG8gdGhlIHByb3ZpZGVkIGxvZ2dlci4gSWYgbm8gbG9nZ2VyIHdhcyBwcm92aWRlZCBvciBpZlxuICAgICAqIHRoZSBsb2cgbGV2ZWwgZG9lcyBub3QgbWVldCB0aGUgbG9nZ2VyJ3MgdGhyZXNob2xkLCB0aGVuIG5vdGhpbmcgd2lsbCBiZSBsb2dnZWQuXG4gICAgICogQHBhcmFtIGxvZ0xldmVsIC0gVGhlIGxvZyBsZXZlbCBvZiB0aGlzIGxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIG9mIHRoaXMgbG9nLlxuICAgICAqL1xuICAgIGxvZyhsb2dMZXZlbCwgbWVzc2FnZSkge1xuICAgICAgICBpZiAodGhpcy5fbG9nZ2VyICYmIHRoaXMuc2hvdWxkTG9nKGxvZ0xldmVsKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmxvZyhsb2dMZXZlbCwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXF1ZXN0UG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBBIHNldCBvZiBjb25zdGFudHMgdXNlZCBpbnRlcm5hbGx5IHdoZW4gcHJvY2Vzc2luZyByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IENvbnN0YW50cyA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29yZS1odHRwIHZlcnNpb25cbiAgICAgKi9cbiAgICBjb3JlSHR0cFZlcnNpb246IFwiMy4wLjRcIixcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgSFRUUC5cbiAgICAgKi9cbiAgICBIVFRQOiBcImh0dHA6XCIsXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEhUVFBTLlxuICAgICAqL1xuICAgIEhUVFBTOiBcImh0dHBzOlwiLFxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBIVFRQIFByb3h5LlxuICAgICAqL1xuICAgIEhUVFBfUFJPWFk6IFwiSFRUUF9QUk9YWVwiLFxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBIVFRQUyBQcm94eS5cbiAgICAgKi9cbiAgICBIVFRQU19QUk9YWTogXCJIVFRQU19QUk9YWVwiLFxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBOTyBQcm94eS5cbiAgICAgKi9cbiAgICBOT19QUk9YWTogXCJOT19QUk9YWVwiLFxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBBTEwgUHJveHkuXG4gICAgICovXG4gICAgQUxMX1BST1hZOiBcIkFMTF9QUk9YWVwiLFxuICAgIEh0dHBDb25zdGFudHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEh0dHAgVmVyYnNcbiAgICAgICAgICovXG4gICAgICAgIEh0dHBWZXJiczoge1xuICAgICAgICAgICAgUFVUOiBcIlBVVFwiLFxuICAgICAgICAgICAgR0VUOiBcIkdFVFwiLFxuICAgICAgICAgICAgREVMRVRFOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgUE9TVDogXCJQT1NUXCIsXG4gICAgICAgICAgICBNRVJHRTogXCJNRVJHRVwiLFxuICAgICAgICAgICAgSEVBRDogXCJIRUFEXCIsXG4gICAgICAgICAgICBQQVRDSDogXCJQQVRDSFwiLFxuICAgICAgICB9LFxuICAgICAgICBTdGF0dXNDb2Rlczoge1xuICAgICAgICAgICAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gICAgICAgICAgICBTZXJ2aWNlVW5hdmFpbGFibGU6IDUwMyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERlZmluZXMgY29uc3RhbnRzIGZvciB1c2Ugd2l0aCBIVFRQIGhlYWRlcnMuXG4gICAgICovXG4gICAgSGVhZGVyQ29uc3RhbnRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gICAgICAgICAqL1xuICAgICAgICBBVVRIT1JJWkFUSU9OOiBcImF1dGhvcml6YXRpb25cIixcbiAgICAgICAgQVVUSE9SSVpBVElPTl9TQ0hFTUU6IFwiQmVhcmVyXCIsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUmV0cnktQWZ0ZXIgcmVzcG9uc2UtaGVhZGVyIGZpZWxkIGNhbiBiZSB1c2VkIHdpdGggYSA1MDMgKFNlcnZpY2VcbiAgICAgICAgICogVW5hdmFpbGFibGUpIG9yIDM0OSAoVG9vIE1hbnkgUmVxdWVzdHMpIHJlc3BvbnNlcyB0byBpbmRpY2F0ZSBob3cgbG9uZ1xuICAgICAgICAgKiB0aGUgc2VydmljZSBpcyBleHBlY3RlZCB0byBiZSB1bmF2YWlsYWJsZSB0byB0aGUgcmVxdWVzdGluZyBjbGllbnQuXG4gICAgICAgICAqL1xuICAgICAgICBSRVRSWV9BRlRFUjogXCJSZXRyeS1BZnRlclwiLFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFVzZXJBZ2VudCBoZWFkZXIuXG4gICAgICAgICAqL1xuICAgICAgICBVU0VSX0FHRU5UOiBcIlVzZXItQWdlbnRcIixcbiAgICB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi91dGlsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVVJMQnVpbGRlciB9IGZyb20gXCIuLi91cmxcIjtcbmltcG9ydCB7IGdldEVudmlyb25tZW50VmFsdWUgfSBmcm9tIFwiLi4vdXRpbC91dGlsc1wiO1xuLyoqXG4gKiBTdG9yZXMgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCBpbiBOT19QUk9YWSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2xvYmFsTm9Qcm94eUxpc3QgPSBbXTtcbmxldCBub1Byb3h5TGlzdExvYWRlZCA9IGZhbHNlO1xuLyoqIEEgY2FjaGUgb2Ygd2hldGhlciBhIGhvc3Qgc2hvdWxkIGJ5cGFzcyB0aGUgcHJveHkuICovXG5jb25zdCBnbG9iYWxCeXBhc3NlZE1hcCA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFByb3h5VmFsdWUoKSB7XG4gICAgaWYgKCFwcm9jZXNzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGh0dHBzUHJveHkgPSBnZXRFbnZpcm9ubWVudFZhbHVlKENvbnN0YW50cy5IVFRQU19QUk9YWSk7XG4gICAgY29uc3QgYWxsUHJveHkgPSBnZXRFbnZpcm9ubWVudFZhbHVlKENvbnN0YW50cy5BTExfUFJPWFkpO1xuICAgIGNvbnN0IGh0dHBQcm94eSA9IGdldEVudmlyb25tZW50VmFsdWUoQ29uc3RhbnRzLkhUVFBfUFJPWFkpO1xuICAgIHJldHVybiBodHRwc1Byb3h5IHx8IGFsbFByb3h5IHx8IGh0dHBQcm94eTtcbn1cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgaG9zdCBvZiBhIGdpdmVuIGB1cmlgIG1hdGNoZXMgYW55IHBhdHRlcm4gaW4gdGhlIG5vIHByb3h5IGxpc3QuXG4gKiBJZiB0aGVyZSdzIGEgbWF0Y2gsIGFueSByZXF1ZXN0IHNlbnQgdG8gdGhlIHNhbWUgaG9zdCBzaG91bGRuJ3QgaGF2ZSB0aGUgcHJveHkgc2V0dGluZ3Mgc2V0LlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIHBvcnQgb2YgaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2F6dXJlLXNkay1mb3ItbmV0L2Jsb2IvOGNjYTgxMTM3MTE1OWU1MjcxNTljN2ViNjU2MDI0Nzc4OTg2ODNlMi9zZGsvY29yZS9BenVyZS5Db3JlL3NyYy9QaXBlbGluZS9JbnRlcm5hbC9IdHRwRW52aXJvbm1lbnRQcm94eS5jcyNMMjEwXG4gKi9cbmZ1bmN0aW9uIGlzQnlwYXNzZWQodXJpLCBub1Byb3h5TGlzdCwgYnlwYXNzZWRNYXApIHtcbiAgICBpZiAobm9Qcm94eUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IFVSTEJ1aWxkZXIucGFyc2UodXJpKS5nZXRIb3N0KCk7XG4gICAgaWYgKGJ5cGFzc2VkTWFwID09PSBudWxsIHx8IGJ5cGFzc2VkTWFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBieXBhc3NlZE1hcC5oYXMoaG9zdCkpIHtcbiAgICAgICAgcmV0dXJuIGJ5cGFzc2VkTWFwLmdldChob3N0KTtcbiAgICB9XG4gICAgbGV0IGlzQnlwYXNzZWRGbGFnID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIG5vUHJveHlMaXN0KSB7XG4gICAgICAgIGlmIChwYXR0ZXJuWzBdID09PSBcIi5cIikge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggZWl0aGVyIGRvbWFpbiBpdCBzZWxmIG9yIGFueSBzdWJkb21haW4gb3IgaG9zdFxuICAgICAgICAgICAgLy8gLmZvby5jb20gd2lsbCBtYXRjaCBmb28uY29tIGl0IHNlbGYgb3IgKi5mb28uY29tXG4gICAgICAgICAgICBpZiAoaG9zdC5lbmRzV2l0aChwYXR0ZXJuKSkge1xuICAgICAgICAgICAgICAgIGlzQnlwYXNzZWRGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChob3N0Lmxlbmd0aCA9PT0gcGF0dGVybi5sZW5ndGggLSAxICYmIGhvc3QgPT09IHBhdHRlcm4uc2xpY2UoMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNCeXBhc3NlZEZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChob3N0ID09PSBwYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgaXNCeXBhc3NlZEZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGJ5cGFzc2VkTWFwID09PSBudWxsIHx8IGJ5cGFzc2VkTWFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBieXBhc3NlZE1hcC5zZXQoaG9zdCwgaXNCeXBhc3NlZEZsYWcpO1xuICAgIHJldHVybiBpc0J5cGFzc2VkRmxhZztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTm9Qcm94eSgpIHtcbiAgICBjb25zdCBub1Byb3h5ID0gZ2V0RW52aXJvbm1lbnRWYWx1ZShDb25zdGFudHMuTk9fUFJPWFkpO1xuICAgIG5vUHJveHlMaXN0TG9hZGVkID0gdHJ1ZTtcbiAgICBpZiAobm9Qcm94eSkge1xuICAgICAgICByZXR1cm4gbm9Qcm94eVxuICAgICAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiBVUkwgb2YgYSBwcm94eSBzZXJ2ZXIgaW50byBgUHJveHlTZXR0aW5nc2Agb3IgYXR0ZW1wdHMgdG8gcmV0cmlldmUgYFByb3h5U2V0dGluZ3NgIGZyb20gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaWYgb25lIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0gcHJveHlVcmwgLSBVUkwgb2YgdGhlIHByb3h5XG4gKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBwcm94eSBzZXR0aW5ncywgb3IgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MocHJveHlVcmwpIHtcbiAgICBpZiAoIXByb3h5VXJsKSB7XG4gICAgICAgIHByb3h5VXJsID0gbG9hZEVudmlyb25tZW50UHJveHlWYWx1ZSgpO1xuICAgICAgICBpZiAoIXByb3h5VXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkLCB1cmxXaXRob3V0QXV0aCB9ID0gZXh0cmFjdEF1dGhGcm9tVXJsKHByb3h5VXJsKTtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBVUkxCdWlsZGVyLnBhcnNlKHVybFdpdGhvdXRBdXRoKTtcbiAgICBjb25zdCBzY2hlbWEgPSBwYXJzZWRVcmwuZ2V0U2NoZW1lKCkgPyBwYXJzZWRVcmwuZ2V0U2NoZW1lKCkgKyBcIjovL1wiIDogXCJcIjtcbiAgICByZXR1cm4ge1xuICAgICAgICBob3N0OiBzY2hlbWEgKyBwYXJzZWRVcmwuZ2V0SG9zdCgpLFxuICAgICAgICBwb3J0OiBOdW1iZXIucGFyc2VJbnQocGFyc2VkVXJsLmdldFBvcnQoKSB8fCBcIjgwXCIpLFxuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmQsXG4gICAgfTtcbn1cbi8qKlxuICogQSBwb2xpY3kgdGhhdCBhbGxvd3Mgb25lIHRvIGFwcGx5IHByb3h5IHNldHRpbmdzIHRvIGFsbCByZXF1ZXN0cy5cbiAqIElmIG5vdCBwYXNzZWQgc3RhdGljIHNldHRpbmdzLCB0aGV5IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gdGhlIEhUVFBTX1BST1hZXG4gKiBvciBIVFRQX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqIEBwYXJhbSBwcm94eVNldHRpbmdzIC0gUHJveHlTZXR0aW5ncyB0byB1c2Ugb24gZWFjaCByZXF1ZXN0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBhZGRpdGlvbmFsIHNldHRpbmdzLCBmb3IgZXhhbXBsZSwgY3VzdG9tIE5PX1BST1hZIHBhdHRlcm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eVBvbGljeShwcm94eVNldHRpbmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKCFwcm94eVNldHRpbmdzKSB7XG4gICAgICAgIHByb3h5U2V0dGluZ3MgPSBnZXREZWZhdWx0UHJveHlTZXR0aW5ncygpO1xuICAgIH1cbiAgICBpZiAoIW5vUHJveHlMaXN0TG9hZGVkKSB7XG4gICAgICAgIGdsb2JhbE5vUHJveHlMaXN0LnB1c2goLi4ubG9hZE5vUHJveHkoKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIHJlcXVlc3RQb2xpY3lPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5UG9saWN5KG5leHRQb2xpY3ksIHJlcXVlc3RQb2xpY3lPcHRpb25zLCBwcm94eVNldHRpbmdzLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY3VzdG9tTm9Qcm94eUxpc3QpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5mdW5jdGlvbiBleHRyYWN0QXV0aEZyb21VcmwodXJsKSB7XG4gICAgY29uc3QgYXRJbmRleCA9IHVybC5pbmRleE9mKFwiQFwiKTtcbiAgICBpZiAoYXRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJsV2l0aG91dEF1dGg6IHVybCB9O1xuICAgIH1cbiAgICBjb25zdCBzY2hlbWVJbmRleCA9IHVybC5pbmRleE9mKFwiOi8vXCIpO1xuICAgIGNvbnN0IGF1dGhTdGFydCA9IHNjaGVtZUluZGV4ICE9PSAtMSA/IHNjaGVtZUluZGV4ICsgMyA6IDA7XG4gICAgY29uc3QgYXV0aCA9IHVybC5zdWJzdHJpbmcoYXV0aFN0YXJ0LCBhdEluZGV4KTtcbiAgICBjb25zdCBjb2xvbkluZGV4ID0gYXV0aC5pbmRleE9mKFwiOlwiKTtcbiAgICBjb25zdCBoYXNQYXNzd29yZCA9IGNvbG9uSW5kZXggIT09IC0xO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gaGFzUGFzc3dvcmQgPyBhdXRoLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KSA6IGF1dGg7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBoYXNQYXNzd29yZCA/IGF1dGguc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB1cmxXaXRob3V0QXV0aCA9IHVybC5zdWJzdHJpbmcoMCwgYXV0aFN0YXJ0KSArIHVybC5zdWJzdHJpbmcoYXRJbmRleCArIDEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgdXJsV2l0aG91dEF1dGgsXG4gICAgfTtcbn1cbmV4cG9ydCBjbGFzcyBQcm94eVBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCBwcm94eVNldHRpbmdzLCBjdXN0b21Ob1Byb3h5TGlzdCkge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5wcm94eVNldHRpbmdzID0gcHJveHlTZXR0aW5ncztcbiAgICAgICAgdGhpcy5jdXN0b21Ob1Byb3h5TGlzdCA9IGN1c3RvbU5vUHJveHlMaXN0O1xuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LnByb3h5U2V0dGluZ3MgJiZcbiAgICAgICAgICAgICFpc0J5cGFzc2VkKHJlcXVlc3QudXJsLCAoX2EgPSB0aGlzLmN1c3RvbU5vUHJveHlMaXN0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBnbG9iYWxOb1Byb3h5TGlzdCwgdGhpcy5jdXN0b21Ob1Byb3h5TGlzdCA/IHVuZGVmaW5lZCA6IGdsb2JhbEJ5cGFzc2VkTWFwKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5wcm94eVNldHRpbmdzID0gdGhpcy5wcm94eVNldHRpbmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3h5UG9saWN5LmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogb25seSBnbG9iYWxzIHRoYXQgY29tbW9uIHRvIG5vZGUgYW5kIGJyb3dzZXJzIGFyZSBhbGxvd2VkICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm9kZS9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9lcy1idWlsdGluc1xuZXhwb3J0IHZhciBfZ2xvYmFsVGhpcyA9IHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JyA/IGdsb2JhbFRoaXMgOiBnbG9iYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWxUaGlzLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyB0aGlzIGlzIGF1dG9nZW5lcmF0ZWQgZmlsZSwgc2VlIHNjcmlwdHMvdmVyc2lvbi11cGRhdGUuanNcbmV4cG9ydCB2YXIgVkVSU0lPTiA9ICcxLjguMCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi4vdmVyc2lvbic7XG52YXIgcmUgPSAvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSgtKC4rKSk/JC87XG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIHRlc3QgYW4gQVBJIHZlcnNpb24gdG8gc2VlIGlmIGl0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdmlkZWQgb3duVmVyc2lvbi5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gaGFzIHRoZSBmb2xsb3dpbmcgc2VtYW50aWNzOlxuICogLSBFeGFjdCBtYXRjaCBpcyBhbHdheXMgY29tcGF0aWJsZVxuICogLSBNYWpvciB2ZXJzaW9ucyBtdXN0IG1hdGNoIGV4YWN0bHlcbiAqICAgIC0gMS54IHBhY2thZ2UgY2Fubm90IHVzZSBnbG9iYWwgMi54IHBhY2thZ2VcbiAqICAgIC0gMi54IHBhY2thZ2UgY2Fubm90IHVzZSBnbG9iYWwgMS54IHBhY2thZ2VcbiAqIC0gVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIEFQSSBtb2R1bGUgcmVxdWVzdGluZyBhY2Nlc3MgdG8gdGhlIGdsb2JhbCBBUEkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhpcyBBUElcbiAqICAgIC0gMS4zIHBhY2thZ2UgbWF5IHVzZSAxLjQgZ2xvYmFsIGJlY2F1c2UgdGhlIGxhdGVyIGdsb2JhbCBjb250YWlucyBhbGwgZnVuY3Rpb25zIDEuMyBleHBlY3RzXG4gKiAgICAtIDEuNCBwYWNrYWdlIG1heSBOT1QgdXNlIDEuMyBnbG9iYWwgYmVjYXVzZSBpdCBtYXkgdHJ5IHRvIGNhbGwgZnVuY3Rpb25zIHdoaWNoIGRvbid0IGV4aXN0IG9uIDEuM1xuICogLSBJZiB0aGUgbWFqb3IgdmVyc2lvbiBpcyAwLCB0aGUgbWlub3IgdmVyc2lvbiBpcyB0cmVhdGVkIGFzIHRoZSBtYWpvciBhbmQgdGhlIHBhdGNoIGlzIHRyZWF0ZWQgYXMgdGhlIG1pbm9yXG4gKiAtIFBhdGNoIGFuZCBidWlsZCB0YWcgZGlmZmVyZW5jZXMgYXJlIG5vdCBjb25zaWRlcmVkIGF0IHRoaXMgdGltZVxuICpcbiAqIEBwYXJhbSBvd25WZXJzaW9uIHZlcnNpb24gd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gX21ha2VDb21wYXRpYmlsaXR5Q2hlY2sob3duVmVyc2lvbikge1xuICAgIHZhciBhY2NlcHRlZFZlcnNpb25zID0gbmV3IFNldChbb3duVmVyc2lvbl0pO1xuICAgIHZhciByZWplY3RlZFZlcnNpb25zID0gbmV3IFNldCgpO1xuICAgIHZhciBteVZlcnNpb25NYXRjaCA9IG93blZlcnNpb24ubWF0Y2gocmUpO1xuICAgIGlmICghbXlWZXJzaW9uTWF0Y2gpIHtcbiAgICAgICAgLy8gd2UgY2Fubm90IGd1YXJhbnRlZSBjb21wYXRpYmlsaXR5IHNvIHdlIGFsd2F5cyByZXR1cm4gbm9vcFxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgfVxuICAgIHZhciBvd25WZXJzaW9uUGFyc2VkID0ge1xuICAgICAgICBtYWpvcjogK215VmVyc2lvbk1hdGNoWzFdLFxuICAgICAgICBtaW5vcjogK215VmVyc2lvbk1hdGNoWzJdLFxuICAgICAgICBwYXRjaDogK215VmVyc2lvbk1hdGNoWzNdLFxuICAgICAgICBwcmVyZWxlYXNlOiBteVZlcnNpb25NYXRjaFs0XSxcbiAgICB9O1xuICAgIC8vIGlmIG93blZlcnNpb24gaGFzIGEgcHJlcmVsZWFzZSB0YWcsIHZlcnNpb25zIG11c3QgbWF0Y2ggZXhhY3RseVxuICAgIGlmIChvd25WZXJzaW9uUGFyc2VkLnByZXJlbGVhc2UgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gaXNFeGFjdG1hdGNoKGdsb2JhbFZlcnNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxWZXJzaW9uID09PSBvd25WZXJzaW9uO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBfcmVqZWN0KHYpIHtcbiAgICAgICAgcmVqZWN0ZWRWZXJzaW9ucy5hZGQodik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gX2FjY2VwdCh2KSB7XG4gICAgICAgIGFjY2VwdGVkVmVyc2lvbnMuYWRkKHYpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzQ29tcGF0aWJsZShnbG9iYWxWZXJzaW9uKSB7XG4gICAgICAgIGlmIChhY2NlcHRlZFZlcnNpb25zLmhhcyhnbG9iYWxWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlamVjdGVkVmVyc2lvbnMuaGFzKGdsb2JhbFZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdsb2JhbFZlcnNpb25NYXRjaCA9IGdsb2JhbFZlcnNpb24ubWF0Y2gocmUpO1xuICAgICAgICBpZiAoIWdsb2JhbFZlcnNpb25NYXRjaCkge1xuICAgICAgICAgICAgLy8gY2Fubm90IHBhcnNlIG90aGVyIHZlcnNpb25cbiAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBndWFyYW50ZWUgY29tcGF0aWJpbGl0eSBzbyB3ZSBhbHdheXMgbm9vcFxuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdsb2JhbFZlcnNpb25QYXJzZWQgPSB7XG4gICAgICAgICAgICBtYWpvcjogK2dsb2JhbFZlcnNpb25NYXRjaFsxXSxcbiAgICAgICAgICAgIG1pbm9yOiArZ2xvYmFsVmVyc2lvbk1hdGNoWzJdLFxuICAgICAgICAgICAgcGF0Y2g6ICtnbG9iYWxWZXJzaW9uTWF0Y2hbM10sXG4gICAgICAgICAgICBwcmVyZWxlYXNlOiBnbG9iYWxWZXJzaW9uTWF0Y2hbNF0sXG4gICAgICAgIH07XG4gICAgICAgIC8vIGlmIGdsb2JhbFZlcnNpb24gaGFzIGEgcHJlcmVsZWFzZSB0YWcsIHZlcnNpb25zIG11c3QgbWF0Y2ggZXhhY3RseVxuICAgICAgICBpZiAoZ2xvYmFsVmVyc2lvblBhcnNlZC5wcmVyZWxlYXNlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBfcmVqZWN0KGdsb2JhbFZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1ham9yIHZlcnNpb25zIG11c3QgbWF0Y2hcbiAgICAgICAgaWYgKG93blZlcnNpb25QYXJzZWQubWFqb3IgIT09IGdsb2JhbFZlcnNpb25QYXJzZWQubWFqb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBfcmVqZWN0KGdsb2JhbFZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvd25WZXJzaW9uUGFyc2VkLm1ham9yID09PSAwKSB7XG4gICAgICAgICAgICBpZiAob3duVmVyc2lvblBhcnNlZC5taW5vciA9PT0gZ2xvYmFsVmVyc2lvblBhcnNlZC5taW5vciAmJlxuICAgICAgICAgICAgICAgIG93blZlcnNpb25QYXJzZWQucGF0Y2ggPD0gZ2xvYmFsVmVyc2lvblBhcnNlZC5wYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfYWNjZXB0KGdsb2JhbFZlcnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG93blZlcnNpb25QYXJzZWQubWlub3IgPD0gZ2xvYmFsVmVyc2lvblBhcnNlZC5taW5vcikge1xuICAgICAgICAgICAgcmV0dXJuIF9hY2NlcHQoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgfTtcbn1cbi8qKlxuICogVGVzdCBhbiBBUEkgdmVyc2lvbiB0byBzZWUgaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgQVBJLlxuICpcbiAqIC0gRXhhY3QgbWF0Y2ggaXMgYWx3YXlzIGNvbXBhdGlibGVcbiAqIC0gTWFqb3IgdmVyc2lvbnMgbXVzdCBtYXRjaCBleGFjdGx5XG4gKiAgICAtIDEueCBwYWNrYWdlIGNhbm5vdCB1c2UgZ2xvYmFsIDIueCBwYWNrYWdlXG4gKiAgICAtIDIueCBwYWNrYWdlIGNhbm5vdCB1c2UgZ2xvYmFsIDEueCBwYWNrYWdlXG4gKiAtIFRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoZSBBUEkgbW9kdWxlIHJlcXVlc3RpbmcgYWNjZXNzIHRvIHRoZSBnbG9iYWwgQVBJIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoaXMgQVBJXG4gKiAgICAtIDEuMyBwYWNrYWdlIG1heSB1c2UgMS40IGdsb2JhbCBiZWNhdXNlIHRoZSBsYXRlciBnbG9iYWwgY29udGFpbnMgYWxsIGZ1bmN0aW9ucyAxLjMgZXhwZWN0c1xuICogICAgLSAxLjQgcGFja2FnZSBtYXkgTk9UIHVzZSAxLjMgZ2xvYmFsIGJlY2F1c2UgaXQgbWF5IHRyeSB0byBjYWxsIGZ1bmN0aW9ucyB3aGljaCBkb24ndCBleGlzdCBvbiAxLjNcbiAqIC0gSWYgdGhlIG1ham9yIHZlcnNpb24gaXMgMCwgdGhlIG1pbm9yIHZlcnNpb24gaXMgdHJlYXRlZCBhcyB0aGUgbWFqb3IgYW5kIHRoZSBwYXRjaCBpcyB0cmVhdGVkIGFzIHRoZSBtaW5vclxuICogLSBQYXRjaCBhbmQgYnVpbGQgdGFnIGRpZmZlcmVuY2VzIGFyZSBub3QgY29uc2lkZXJlZCBhdCB0aGlzIHRpbWVcbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiB2ZXJzaW9uIG9mIHRoZSBBUEkgcmVxdWVzdGluZyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2xvYmFsIEFQSVxuICovXG5leHBvcnQgdmFyIGlzQ29tcGF0aWJsZSA9IF9tYWtlQ29tcGF0aWJpbGl0eUNoZWNrKFZFUlNJT04pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VtdmVyLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfZ2xvYmFsVGhpcyB9IGZyb20gJy4uL3BsYXRmb3JtJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uJztcbmltcG9ydCB7IGlzQ29tcGF0aWJsZSB9IGZyb20gJy4vc2VtdmVyJztcbnZhciBtYWpvciA9IFZFUlNJT04uc3BsaXQoJy4nKVswXTtcbnZhciBHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZID0gU3ltYm9sLmZvcihcIm9wZW50ZWxlbWV0cnkuanMuYXBpLlwiICsgbWFqb3IpO1xudmFyIF9nbG9iYWwgPSBfZ2xvYmFsVGhpcztcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlckdsb2JhbCh0eXBlLCBpbnN0YW5jZSwgZGlhZywgYWxsb3dPdmVycmlkZSkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoYWxsb3dPdmVycmlkZSA9PT0gdm9pZCAwKSB7IGFsbG93T3ZlcnJpZGUgPSBmYWxzZTsgfVxuICAgIHZhciBhcGkgPSAoX2dsb2JhbFtHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZXSA9IChfYSA9IF9nbG9iYWxbR0xPQkFMX09QRU5URUxFTUVUUllfQVBJX0tFWV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHtcbiAgICAgICAgdmVyc2lvbjogVkVSU0lPTixcbiAgICB9KTtcbiAgICBpZiAoIWFsbG93T3ZlcnJpZGUgJiYgYXBpW3R5cGVdKSB7XG4gICAgICAgIC8vIGFscmVhZHkgcmVnaXN0ZXJlZCBhbiBBUEkgb2YgdGhpcyB0eXBlXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJAb3BlbnRlbGVtZXRyeS9hcGk6IEF0dGVtcHRlZCBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIEFQSTogXCIgKyB0eXBlKTtcbiAgICAgICAgZGlhZy5lcnJvcihlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhcGkudmVyc2lvbiAhPT0gVkVSU0lPTikge1xuICAgICAgICAvLyBBbGwgcmVnaXN0ZXJlZCBBUElzIG11c3QgYmUgb2YgdGhlIHNhbWUgdmVyc2lvbiBleGFjdGx5XG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJAb3BlbnRlbGVtZXRyeS9hcGk6IFJlZ2lzdHJhdGlvbiBvZiB2ZXJzaW9uIHZcIiArIGFwaS52ZXJzaW9uICsgXCIgZm9yIFwiICsgdHlwZSArIFwiIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBBUEkgdlwiICsgVkVSU0lPTik7XG4gICAgICAgIGRpYWcuZXJyb3IoZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhcGlbdHlwZV0gPSBpbnN0YW5jZTtcbiAgICBkaWFnLmRlYnVnKFwiQG9wZW50ZWxlbWV0cnkvYXBpOiBSZWdpc3RlcmVkIGEgZ2xvYmFsIGZvciBcIiArIHR5cGUgKyBcIiB2XCIgKyBWRVJTSU9OICsgXCIuXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbCh0eXBlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICB2YXIgZ2xvYmFsVmVyc2lvbiA9IChfYSA9IF9nbG9iYWxbR0xPQkFMX09QRU5URUxFTUVUUllfQVBJX0tFWV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52ZXJzaW9uO1xuICAgIGlmICghZ2xvYmFsVmVyc2lvbiB8fCAhaXNDb21wYXRpYmxlKGdsb2JhbFZlcnNpb24pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIChfYiA9IF9nbG9iYWxbR0xPQkFMX09QRU5URUxFTUVUUllfQVBJX0tFWV0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlt0eXBlXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyR2xvYmFsKHR5cGUsIGRpYWcpIHtcbiAgICBkaWFnLmRlYnVnKFwiQG9wZW50ZWxlbWV0cnkvYXBpOiBVbnJlZ2lzdGVyaW5nIGEgZ2xvYmFsIGZvciBcIiArIHR5cGUgKyBcIiB2XCIgKyBWRVJTSU9OICsgXCIuXCIpO1xuICAgIHZhciBhcGkgPSBfZ2xvYmFsW0dMT0JBTF9PUEVOVEVMRU1FVFJZX0FQSV9LRVldO1xuICAgIGlmIChhcGkpIHtcbiAgICAgICAgZGVsZXRlIGFwaVt0eXBlXTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWwtdXRpbHMuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBHZXQgYSBrZXkgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjb250ZXh0IHZhbHVlICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dEtleShkZXNjcmlwdGlvbikge1xuICAgIC8vIFRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IGZvciB0aGUgc2FtZSBpbnB1dCwgbXVsdGlwbGUgY2FsbHMgc2hvdWxkXG4gICAgLy8gcmV0dXJuIGRpZmZlcmVudCBrZXlzLiBEdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgSlMgZGVwZW5kZW5jeSBtYW5hZ2VtZW50XG4gICAgLy8gc3lzdGVtLCB0aGlzIGNyZWF0ZXMgcHJvYmxlbXMgd2hlcmUgbXVsdGlwbGUgdmVyc2lvbnMgb2Ygc29tZSBwYWNrYWdlXG4gICAgLy8gY291bGQgaG9sZCBkaWZmZXJlbnQga2V5cyBmb3IgdGhlIHNhbWUgcHJvcGVydHkuXG4gICAgLy9cbiAgICAvLyBUaGVyZWZvcmUsIHdlIHVzZSBTeW1ib2wuZm9yIHdoaWNoIHJldHVybnMgdGhlIHNhbWUga2V5IGZvciB0aGUgc2FtZSBpbnB1dC5cbiAgICByZXR1cm4gU3ltYm9sLmZvcihkZXNjcmlwdGlvbik7XG59XG52YXIgQmFzZUNvbnRleHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbmV3IGNvbnRleHQgd2hpY2ggaW5oZXJpdHMgdmFsdWVzIGZyb20gYW4gb3B0aW9uYWwgcGFyZW50IGNvbnRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBhIGNvbnRleHQgZnJvbSB3aGljaCB0byBpbmhlcml0IHZhbHVlc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJhc2VDb250ZXh0KHBhcmVudENvbnRleHQpIHtcbiAgICAgICAgLy8gZm9yIG1pbmlmaWNhdGlvblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYuX2N1cnJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dCA/IG5ldyBNYXAocGFyZW50Q29udGV4dCkgOiBuZXcgTWFwKCk7XG4gICAgICAgIHNlbGYuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBzZWxmLl9jdXJyZW50Q29udGV4dC5nZXQoa2V5KTsgfTtcbiAgICAgICAgc2VsZi5zZXRWYWx1ZSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBCYXNlQ29udGV4dChzZWxmLl9jdXJyZW50Q29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50Q29udGV4dC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5kZWxldGVWYWx1ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gbmV3IEJhc2VDb250ZXh0KHNlbGYuX2N1cnJlbnRDb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRDb250ZXh0LmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBCYXNlQ29udGV4dDtcbn0oKSk7XG4vKiogVGhlIHJvb3QgY29udGV4dCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhcmVudCBjb250ZXh0IHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbnRleHQgKi9cbmV4cG9ydCB2YXIgUk9PVF9DT05URVhUID0gbmV3IEJhc2VDb250ZXh0KCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19yZWFkID0gKHRoaXMgJiYgdGhpcy5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBST09UX0NPTlRFWFQgfSBmcm9tICcuL2NvbnRleHQnO1xudmFyIE5vb3BDb250ZXh0TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb29wQ29udGV4dE1hbmFnZXIoKSB7XG4gICAgfVxuICAgIE5vb3BDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuYWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUk9PVF9DT05URVhUO1xuICAgIH07XG4gICAgTm9vcENvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS53aXRoID0gZnVuY3Rpb24gKF9jb250ZXh0LCBmbiwgdGhpc0FyZykge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDM7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaSAtIDNdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uY2FsbC5hcHBseShmbiwgX19zcHJlYWRBcnJheShbdGhpc0FyZ10sIF9fcmVhZChhcmdzKSwgZmFsc2UpKTtcbiAgICB9O1xuICAgIE5vb3BDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChfY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbiAgICBOb29wQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBOb29wQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIE5vb3BDb250ZXh0TWFuYWdlcjtcbn0oKSk7XG5leHBvcnQgeyBOb29wQ29udGV4dE1hbmFnZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vb3BDb250ZXh0TWFuYWdlci5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCA9ICh0aGlzICYmIHRoaXMuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuaW1wb3J0IHsgZ2V0R2xvYmFsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbi8qKlxuICogQ29tcG9uZW50IExvZ2dlciB3aGljaCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIHBhcnQgb2YgYW55IGNvbXBvbmVudCB3aGljaFxuICogd2lsbCBhZGQgYXV0b21hdGljYWxseSBhZGRpdGlvbmFsIG5hbWVzcGFjZSBpbiBmcm9udCBvZiB0aGUgbG9nIG1lc3NhZ2UuXG4gKiBJdCB3aWxsIHRoZW4gZm9yd2FyZCBhbGwgbWVzc2FnZSB0byBnbG9iYWwgZGlhZyBsb2dnZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjTG9nZ2VyID0gZGlhZy5jcmVhdGVDb21wb25lbnRMb2dnZXIoeyBuYW1lc3BhY2U6ICdAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cCcgfSk7XG4gKiBjTG9nZ2VyLmRlYnVnKCd0ZXN0Jyk7XG4gKiAvLyBAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cCB0ZXN0XG4gKi9cbnZhciBEaWFnQ29tcG9uZW50TG9nZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERpYWdDb21wb25lbnRMb2dnZXIocHJvcHMpIHtcbiAgICAgICAgdGhpcy5fbmFtZXNwYWNlID0gcHJvcHMubmFtZXNwYWNlIHx8ICdEaWFnQ29tcG9uZW50TG9nZ2VyJztcbiAgICB9XG4gICAgRGlhZ0NvbXBvbmVudExvZ2dlci5wcm90b3R5cGUuZGVidWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ1Byb3h5KCdkZWJ1ZycsIHRoaXMuX25hbWVzcGFjZSwgYXJncyk7XG4gICAgfTtcbiAgICBEaWFnQ29tcG9uZW50TG9nZ2VyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nUHJveHkoJ2Vycm9yJywgdGhpcy5fbmFtZXNwYWNlLCBhcmdzKTtcbiAgICB9O1xuICAgIERpYWdDb21wb25lbnRMb2dnZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ1Byb3h5KCdpbmZvJywgdGhpcy5fbmFtZXNwYWNlLCBhcmdzKTtcbiAgICB9O1xuICAgIERpYWdDb21wb25lbnRMb2dnZXIucHJvdG90eXBlLndhcm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ1Byb3h5KCd3YXJuJywgdGhpcy5fbmFtZXNwYWNlLCBhcmdzKTtcbiAgICB9O1xuICAgIERpYWdDb21wb25lbnRMb2dnZXIucHJvdG90eXBlLnZlcmJvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ1Byb3h5KCd2ZXJib3NlJywgdGhpcy5fbmFtZXNwYWNlLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBEaWFnQ29tcG9uZW50TG9nZ2VyO1xufSgpKTtcbmV4cG9ydCB7IERpYWdDb21wb25lbnRMb2dnZXIgfTtcbmZ1bmN0aW9uIGxvZ1Byb3h5KGZ1bmNOYW1lLCBuYW1lc3BhY2UsIGFyZ3MpIHtcbiAgICB2YXIgbG9nZ2VyID0gZ2V0R2xvYmFsKCdkaWFnJyk7XG4gICAgLy8gc2hvcnRjdXQgaWYgbG9nZ2VyIG5vdCBzZXRcbiAgICBpZiAoIWxvZ2dlcikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFyZ3MudW5zaGlmdChuYW1lc3BhY2UpO1xuICAgIHJldHVybiBsb2dnZXJbZnVuY05hbWVdLmFwcGx5KGxvZ2dlciwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29tcG9uZW50TG9nZ2VyLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIERlZmluZXMgdGhlIGF2YWlsYWJsZSBpbnRlcm5hbCBsb2dnaW5nIGxldmVscyBmb3IgdGhlIGRpYWdub3N0aWMgbG9nZ2VyLCB0aGUgbnVtZXJpYyB2YWx1ZXNcbiAqIG9mIHRoZSBsZXZlbHMgYXJlIGRlZmluZWQgdG8gbWF0Y2ggdGhlIG9yaWdpbmFsIHZhbHVlcyBmcm9tIHRoZSBpbml0aWFsIExvZ0xldmVsIHRvIGF2b2lkXG4gKiBjb21wYXRpYmlsaXR5L21pZ3JhdGlvbiBpc3N1ZXMgZm9yIGFueSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFzc3VtZSB0aGUgbnVtZXJpYyBvcmRlcmluZy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnTG9nTGV2ZWw7XG4oZnVuY3Rpb24gKERpYWdMb2dMZXZlbCkge1xuICAgIC8qKiBEaWFnbm9zdGljIExvZ2dpbmcgbGV2ZWwgc2V0dGluZyB0byBkaXNhYmxlIGFsbCBsb2dnaW5nIChleGNlcHQgYW5kIGZvcmNlZCBsb2dzKSAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICAvKiogSWRlbnRpZmllcyBhbiBlcnJvciBzY2VuYXJpbyAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJFUlJPUlwiXSA9IDMwXSA9IFwiRVJST1JcIjtcbiAgICAvKiogSWRlbnRpZmllcyBhIHdhcm5pbmcgc2NlbmFyaW8gKi9cbiAgICBEaWFnTG9nTGV2ZWxbRGlhZ0xvZ0xldmVsW1wiV0FSTlwiXSA9IDUwXSA9IFwiV0FSTlwiO1xuICAgIC8qKiBHZW5lcmFsIGluZm9ybWF0aW9uYWwgbG9nIG1lc3NhZ2UgKi9cbiAgICBEaWFnTG9nTGV2ZWxbRGlhZ0xvZ0xldmVsW1wiSU5GT1wiXSA9IDYwXSA9IFwiSU5GT1wiO1xuICAgIC8qKiBHZW5lcmFsIGRlYnVnIGxvZyBtZXNzYWdlICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIkRFQlVHXCJdID0gNzBdID0gXCJERUJVR1wiO1xuICAgIC8qKlxuICAgICAqIERldGFpbGVkIHRyYWNlIGxldmVsIGxvZ2dpbmcgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnQsIHNob3VsZCBvbmx5IGJlIHNldFxuICAgICAqIGluIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuXG4gICAgICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIlZFUkJPU0VcIl0gPSA4MF0gPSBcIlZFUkJPU0VcIjtcbiAgICAvKiogVXNlZCB0byBzZXQgdGhlIGxvZ2dpbmcgbGV2ZWwgdG8gaW5jbHVkZSBhbGwgbG9nZ2luZyAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJBTExcIl0gPSA5OTk5XSA9IFwiQUxMXCI7XG59KShEaWFnTG9nTGV2ZWwgfHwgKERpYWdMb2dMZXZlbCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgRGlhZ0xvZ0xldmVsIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ0xldmVsRGlhZ0xvZ2dlcihtYXhMZXZlbCwgbG9nZ2VyKSB7XG4gICAgaWYgKG1heExldmVsIDwgRGlhZ0xvZ0xldmVsLk5PTkUpIHtcbiAgICAgICAgbWF4TGV2ZWwgPSBEaWFnTG9nTGV2ZWwuTk9ORTtcbiAgICB9XG4gICAgZWxzZSBpZiAobWF4TGV2ZWwgPiBEaWFnTG9nTGV2ZWwuQUxMKSB7XG4gICAgICAgIG1heExldmVsID0gRGlhZ0xvZ0xldmVsLkFMTDtcbiAgICB9XG4gICAgLy8gSW4gY2FzZSB0aGUgbG9nZ2VyIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgbG9nZ2VyID0gbG9nZ2VyIHx8IHt9O1xuICAgIGZ1bmN0aW9uIF9maWx0ZXJGdW5jKGZ1bmNOYW1lLCB0aGVMZXZlbCkge1xuICAgICAgICB2YXIgdGhlRnVuYyA9IGxvZ2dlcltmdW5jTmFtZV07XG4gICAgICAgIGlmICh0eXBlb2YgdGhlRnVuYyA9PT0gJ2Z1bmN0aW9uJyAmJiBtYXhMZXZlbCA+PSB0aGVMZXZlbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoZUZ1bmMuYmluZChsb2dnZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBfZmlsdGVyRnVuYygnZXJyb3InLCBEaWFnTG9nTGV2ZWwuRVJST1IpLFxuICAgICAgICB3YXJuOiBfZmlsdGVyRnVuYygnd2FybicsIERpYWdMb2dMZXZlbC5XQVJOKSxcbiAgICAgICAgaW5mbzogX2ZpbHRlckZ1bmMoJ2luZm8nLCBEaWFnTG9nTGV2ZWwuSU5GTyksXG4gICAgICAgIGRlYnVnOiBfZmlsdGVyRnVuYygnZGVidWcnLCBEaWFnTG9nTGV2ZWwuREVCVUcpLFxuICAgICAgICB2ZXJib3NlOiBfZmlsdGVyRnVuYygndmVyYm9zZScsIERpYWdMb2dMZXZlbC5WRVJCT1NFKSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nTGV2ZWxMb2dnZXIuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IERpYWdDb21wb25lbnRMb2dnZXIgfSBmcm9tICcuLi9kaWFnL0NvbXBvbmVudExvZ2dlcic7XG5pbXBvcnQgeyBjcmVhdGVMb2dMZXZlbERpYWdMb2dnZXIgfSBmcm9tICcuLi9kaWFnL2ludGVybmFsL2xvZ0xldmVsTG9nZ2VyJztcbmltcG9ydCB7IERpYWdMb2dMZXZlbCwgfSBmcm9tICcuLi9kaWFnL3R5cGVzJztcbmltcG9ydCB7IGdldEdsb2JhbCwgcmVnaXN0ZXJHbG9iYWwsIHVucmVnaXN0ZXJHbG9iYWwsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbnZhciBBUElfTkFNRSA9ICdkaWFnJztcbi8qKlxuICogU2luZ2xldG9uIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCB0byB0aGUgT3BlblRlbGVtZXRyeSBpbnRlcm5hbFxuICogZGlhZ25vc3RpYyBBUElcbiAqL1xudmFyIERpYWdBUEkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCBjb25zdHJ1Y3RvclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gRGlhZ0FQSSgpIHtcbiAgICAgICAgZnVuY3Rpb24gX2xvZ1Byb3h5KGZ1bmNOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbG9nZ2VyID0gZ2V0R2xvYmFsKCdkaWFnJyk7XG4gICAgICAgICAgICAgICAgLy8gc2hvcnRjdXQgaWYgbG9nZ2VyIG5vdCBzZXRcbiAgICAgICAgICAgICAgICBpZiAoIWxvZ2dlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXJbZnVuY05hbWVdLmFwcGx5KGxvZ2dlciwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2luZyBzZWxmIGxvY2FsIHZhcmlhYmxlIGZvciBtaW5pZmljYXRpb24gcHVycG9zZXMgYXMgJ3RoaXMnIGNhbm5vdCBiZSBtaW5pZmllZFxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vIERpYWdBUEkgc3BlY2lmaWMgZnVuY3Rpb25zXG4gICAgICAgIHZhciBzZXRMb2dnZXIgPSBmdW5jdGlvbiAobG9nZ2VyLCBvcHRpb25zT3JMb2dMZXZlbCkge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICBpZiAob3B0aW9uc09yTG9nTGV2ZWwgPT09IHZvaWQgMCkgeyBvcHRpb25zT3JMb2dMZXZlbCA9IHsgbG9nTGV2ZWw6IERpYWdMb2dMZXZlbC5JTkZPIH07IH1cbiAgICAgICAgICAgIGlmIChsb2dnZXIgPT09IHNlbGYpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpc24ndCBtdWNoIHdlIGNhbiBkbyBoZXJlLlxuICAgICAgICAgICAgICAgIC8vIExvZ2dpbmcgdG8gdGhlIGNvbnNvbGUgbWlnaHQgYnJlYWsgdGhlIHVzZXIgYXBwbGljYXRpb24uXG4gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGxvZyB0byBzZWxmLiBJZiBhIGxvZ2dlciB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkIGl0IHdpbGwgcmVjZWl2ZSB0aGUgbG9nLlxuICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgZGlhZyBhcyB0aGUgbG9nZ2VyIGZvciBpdHNlbGYuIFBsZWFzZSB1c2UgYSBEaWFnTG9nZ2VyIGltcGxlbWVudGF0aW9uIGxpa2UgQ29uc29sZURpYWdMb2dnZXIgb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24nKTtcbiAgICAgICAgICAgICAgICBzZWxmLmVycm9yKChfYSA9IGVyci5zdGFjaykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yTG9nTGV2ZWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc09yTG9nTGV2ZWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBvcHRpb25zT3JMb2dMZXZlbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG9sZExvZ2dlciA9IGdldEdsb2JhbCgnZGlhZycpO1xuICAgICAgICAgICAgdmFyIG5ld0xvZ2dlciA9IGNyZWF0ZUxvZ0xldmVsRGlhZ0xvZ2dlcigoX2IgPSBvcHRpb25zT3JMb2dMZXZlbC5sb2dMZXZlbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRGlhZ0xvZ0xldmVsLklORk8sIGxvZ2dlcik7XG4gICAgICAgICAgICAvLyBUaGVyZSBhbHJlYWR5IGlzIGFuIGxvZ2dlciByZWdpc3RlcmVkLiBXZSdsbCBsZXQgaXQga25vdyBiZWZvcmUgb3ZlcndyaXRpbmcgaXQuXG4gICAgICAgICAgICBpZiAob2xkTG9nZ2VyICYmICFvcHRpb25zT3JMb2dMZXZlbC5zdXBwcmVzc092ZXJyaWRlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IChfYyA9IG5ldyBFcnJvcigpLnN0YWNrKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAnPGZhaWxlZCB0byBnZW5lcmF0ZSBzdGFja3RyYWNlPic7XG4gICAgICAgICAgICAgICAgb2xkTG9nZ2VyLndhcm4oXCJDdXJyZW50IGxvZ2dlciB3aWxsIGJlIG92ZXJ3cml0dGVuIGZyb20gXCIgKyBzdGFjayk7XG4gICAgICAgICAgICAgICAgbmV3TG9nZ2VyLndhcm4oXCJDdXJyZW50IGxvZ2dlciB3aWxsIG92ZXJ3cml0ZSBvbmUgYWxyZWFkeSByZWdpc3RlcmVkIGZyb20gXCIgKyBzdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJHbG9iYWwoJ2RpYWcnLCBuZXdMb2dnZXIsIHNlbGYsIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBzZWxmLnNldExvZ2dlciA9IHNldExvZ2dlcjtcbiAgICAgICAgc2VsZi5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdW5yZWdpc3Rlckdsb2JhbChBUElfTkFNRSwgc2VsZik7XG4gICAgICAgIH07XG4gICAgICAgIHNlbGYuY3JlYXRlQ29tcG9uZW50TG9nZ2VyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGlhZ0NvbXBvbmVudExvZ2dlcihvcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi52ZXJib3NlID0gX2xvZ1Byb3h5KCd2ZXJib3NlJyk7XG4gICAgICAgIHNlbGYuZGVidWcgPSBfbG9nUHJveHkoJ2RlYnVnJyk7XG4gICAgICAgIHNlbGYuaW5mbyA9IF9sb2dQcm94eSgnaW5mbycpO1xuICAgICAgICBzZWxmLndhcm4gPSBfbG9nUHJveHkoJ3dhcm4nKTtcbiAgICAgICAgc2VsZi5lcnJvciA9IF9sb2dQcm94eSgnZXJyb3InKTtcbiAgICB9XG4gICAgLyoqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBEaWFnQVBJIEFQSSAqL1xuICAgIERpYWdBUEkuaW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IERpYWdBUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfTtcbiAgICByZXR1cm4gRGlhZ0FQSTtcbn0oKSk7XG5leHBvcnQgeyBEaWFnQVBJIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19yZWFkID0gKHRoaXMgJiYgdGhpcy5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBOb29wQ29udGV4dE1hbmFnZXIgfSBmcm9tICcuLi9jb250ZXh0L05vb3BDb250ZXh0TWFuYWdlcic7XG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyR2xvYmFsLCB1bnJlZ2lzdGVyR2xvYmFsLCB9IGZyb20gJy4uL2ludGVybmFsL2dsb2JhbC11dGlscyc7XG5pbXBvcnQgeyBEaWFnQVBJIH0gZnJvbSAnLi9kaWFnJztcbnZhciBBUElfTkFNRSA9ICdjb250ZXh0JztcbnZhciBOT09QX0NPTlRFWFRfTUFOQUdFUiA9IG5ldyBOb29wQ29udGV4dE1hbmFnZXIoKTtcbi8qKlxuICogU2luZ2xldG9uIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCB0byB0aGUgT3BlblRlbGVtZXRyeSBDb250ZXh0IEFQSVxuICovXG52YXIgQ29udGV4dEFQSSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogRW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBwcmV2ZW50cyBlbmQgdXNlcnMgZnJvbSBjb25zdHJ1Y3RpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFQSSAqL1xuICAgIGZ1bmN0aW9uIENvbnRleHRBUEkoKSB7XG4gICAgfVxuICAgIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgQ29udGV4dCBBUEkgKi9cbiAgICBDb250ZXh0QVBJLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBDb250ZXh0QVBJKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjdXJyZW50IGNvbnRleHQgbWFuYWdlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRleHQgbWFuYWdlciB3YXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQsIGVsc2UgZmFsc2VcbiAgICAgKi9cbiAgICBDb250ZXh0QVBJLnByb3RvdHlwZS5zZXRHbG9iYWxDb250ZXh0TWFuYWdlciA9IGZ1bmN0aW9uIChjb250ZXh0TWFuYWdlcikge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIGNvbnRleHRNYW5hZ2VyLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvbnRleHRcbiAgICAgKi9cbiAgICBDb250ZXh0QVBJLnByb3RvdHlwZS5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250ZXh0TWFuYWdlcigpLmFjdGl2ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGggYW4gYWN0aXZlIGNvbnRleHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gYmUgYWN0aXZlIGR1cmluZyBmdW5jdGlvbiBleGVjdXRpb25cbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gZXhlY3V0ZSBpbiBhIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gdGhpc0FyZyBvcHRpb25hbCByZWNlaXZlciB0byBiZSB1c2VkIGZvciBjYWxsaW5nIGZuXG4gICAgICogQHBhcmFtIGFyZ3Mgb3B0aW9uYWwgYXJndW1lbnRzIGZvcndhcmRlZCB0byBmblxuICAgICAqL1xuICAgIENvbnRleHRBUEkucHJvdG90eXBlLndpdGggPSBmdW5jdGlvbiAoY29udGV4dCwgZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDM7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaSAtIDNdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZ2V0Q29udGV4dE1hbmFnZXIoKSkud2l0aC5hcHBseShfYSwgX19zcHJlYWRBcnJheShbY29udGV4dCwgZm4sIHRoaXNBcmddLCBfX3JlYWQoYXJncyksIGZhbHNlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCaW5kIGEgY29udGV4dCB0byBhIHRhcmdldCBmdW5jdGlvbiBvciBldmVudCBlbWl0dGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHRvIGJpbmQgdG8gdGhlIGV2ZW50IGVtaXR0ZXIgb3IgZnVuY3Rpb24uIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IGZ1bmN0aW9uIG9yIGV2ZW50IGVtaXR0ZXIgdG8gYmluZFxuICAgICAqL1xuICAgIENvbnRleHRBUEkucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250ZXh0TWFuYWdlcigpLmJpbmQoY29udGV4dCwgdGFyZ2V0KTtcbiAgICB9O1xuICAgIENvbnRleHRBUEkucHJvdG90eXBlLl9nZXRDb250ZXh0TWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldEdsb2JhbChBUElfTkFNRSkgfHwgTk9PUF9DT05URVhUX01BTkFHRVI7XG4gICAgfTtcbiAgICAvKiogRGlzYWJsZSBhbmQgcmVtb3ZlIHRoZSBnbG9iYWwgY29udGV4dCBtYW5hZ2VyICovXG4gICAgQ29udGV4dEFQSS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZ2V0Q29udGV4dE1hbmFnZXIoKS5kaXNhYmxlKCk7XG4gICAgICAgIHVucmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dEFQSTtcbn0oKSk7XG5leHBvcnQgeyBDb250ZXh0QVBJIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQgdmFyIFRyYWNlRmxhZ3M7XG4oZnVuY3Rpb24gKFRyYWNlRmxhZ3MpIHtcbiAgICAvKiogUmVwcmVzZW50cyBubyBmbGFnIHNldC4gKi9cbiAgICBUcmFjZUZsYWdzW1RyYWNlRmxhZ3NbXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICAvKiogQml0IHRvIHJlcHJlc2VudCB3aGV0aGVyIHRyYWNlIGlzIHNhbXBsZWQgaW4gdHJhY2UgZmxhZ3MuICovXG4gICAgVHJhY2VGbGFnc1tUcmFjZUZsYWdzW1wiU0FNUExFRFwiXSA9IDFdID0gXCJTQU1QTEVEXCI7XG59KShUcmFjZUZsYWdzIHx8IChUcmFjZUZsYWdzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNlX2ZsYWdzLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBUcmFjZUZsYWdzIH0gZnJvbSAnLi90cmFjZV9mbGFncyc7XG5leHBvcnQgdmFyIElOVkFMSURfU1BBTklEID0gJzAwMDAwMDAwMDAwMDAwMDAnO1xuZXhwb3J0IHZhciBJTlZBTElEX1RSQUNFSUQgPSAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuZXhwb3J0IHZhciBJTlZBTElEX1NQQU5fQ09OVEVYVCA9IHtcbiAgICB0cmFjZUlkOiBJTlZBTElEX1RSQUNFSUQsXG4gICAgc3BhbklkOiBJTlZBTElEX1NQQU5JRCxcbiAgICB0cmFjZUZsYWdzOiBUcmFjZUZsYWdzLk5PTkUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW52YWxpZC1zcGFuLWNvbnN0YW50cy5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgSU5WQUxJRF9TUEFOX0NPTlRFWFQgfSBmcm9tICcuL2ludmFsaWQtc3Bhbi1jb25zdGFudHMnO1xuLyoqXG4gKiBUaGUgTm9uUmVjb3JkaW5nU3BhbiBpcyB0aGUgZGVmYXVsdCB7QGxpbmsgU3Bhbn0gdGhhdCBpcyB1c2VkIHdoZW4gbm8gU3BhblxuICogaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlLiBBbGwgb3BlcmF0aW9ucyBhcmUgbm8tb3AgaW5jbHVkaW5nIGNvbnRleHRcbiAqIHByb3BhZ2F0aW9uLlxuICovXG52YXIgTm9uUmVjb3JkaW5nU3BhbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb25SZWNvcmRpbmdTcGFuKF9zcGFuQ29udGV4dCkge1xuICAgICAgICBpZiAoX3NwYW5Db250ZXh0ID09PSB2b2lkIDApIHsgX3NwYW5Db250ZXh0ID0gSU5WQUxJRF9TUEFOX0NPTlRFWFQ7IH1cbiAgICAgICAgdGhpcy5fc3BhbkNvbnRleHQgPSBfc3BhbkNvbnRleHQ7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBTcGFuQ29udGV4dC5cbiAgICBOb25SZWNvcmRpbmdTcGFuLnByb3RvdHlwZS5zcGFuQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW5Db250ZXh0O1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBOb25SZWNvcmRpbmdTcGFuLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoX2tleSwgX3ZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBOb25SZWNvcmRpbmdTcGFuLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKF9hdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBOb25SZWNvcmRpbmdTcGFuLnByb3RvdHlwZS5hZGRFdmVudCA9IGZ1bmN0aW9uIChfbmFtZSwgX2F0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIE5vblJlY29yZGluZ1NwYW4ucHJvdG90eXBlLnNldFN0YXR1cyA9IGZ1bmN0aW9uIChfc3RhdHVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBOb25SZWNvcmRpbmdTcGFuLnByb3RvdHlwZS51cGRhdGVOYW1lID0gZnVuY3Rpb24gKF9uYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBOb25SZWNvcmRpbmdTcGFuLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoX2VuZFRpbWUpIHsgfTtcbiAgICAvLyBpc1JlY29yZGluZyBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgTm9uUmVjb3JkaW5nU3Bhbi5cbiAgICBOb25SZWNvcmRpbmdTcGFuLnByb3RvdHlwZS5pc1JlY29yZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBOb25SZWNvcmRpbmdTcGFuLnByb3RvdHlwZS5yZWNvcmRFeGNlcHRpb24gPSBmdW5jdGlvbiAoX2V4Y2VwdGlvbiwgX3RpbWUpIHsgfTtcbiAgICByZXR1cm4gTm9uUmVjb3JkaW5nU3Bhbjtcbn0oKSk7XG5leHBvcnQgeyBOb25SZWNvcmRpbmdTcGFuIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25SZWNvcmRpbmdTcGFuLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0S2V5IH0gZnJvbSAnLi4vY29udGV4dC9jb250ZXh0JztcbmltcG9ydCB7IE5vblJlY29yZGluZ1NwYW4gfSBmcm9tICcuL05vblJlY29yZGluZ1NwYW4nO1xuaW1wb3J0IHsgQ29udGV4dEFQSSB9IGZyb20gJy4uL2FwaS9jb250ZXh0Jztcbi8qKlxuICogc3BhbiBrZXlcbiAqL1xudmFyIFNQQU5fS0VZID0gY3JlYXRlQ29udGV4dEtleSgnT3BlblRlbGVtZXRyeSBDb250ZXh0IEtleSBTUEFOJyk7XG4vKipcbiAqIFJldHVybiB0aGUgc3BhbiBpZiBvbmUgZXhpc3RzXG4gKlxuICogQHBhcmFtIGNvbnRleHQgY29udGV4dCB0byBnZXQgc3BhbiBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFuKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5nZXRWYWx1ZShTUEFOX0tFWSkgfHwgdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBzcGFuIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCwgaWYgb25lIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVNwYW4oKSB7XG4gICAgcmV0dXJuIGdldFNwYW4oQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpLmFjdGl2ZSgpKTtcbn1cbi8qKlxuICogU2V0IHRoZSBzcGFuIG9uIGEgY29udGV4dFxuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gdXNlIGFzIHBhcmVudFxuICogQHBhcmFtIHNwYW4gc3BhbiB0byBzZXQgYWN0aXZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTcGFuKGNvbnRleHQsIHNwYW4pIHtcbiAgICByZXR1cm4gY29udGV4dC5zZXRWYWx1ZShTUEFOX0tFWSwgc3Bhbik7XG59XG4vKipcbiAqIFJlbW92ZSBjdXJyZW50IHNwYW4gc3RvcmVkIGluIHRoZSBjb250ZXh0XG4gKlxuICogQHBhcmFtIGNvbnRleHQgY29udGV4dCB0byBkZWxldGUgc3BhbiBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVTcGFuKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5kZWxldGVWYWx1ZShTUEFOX0tFWSk7XG59XG4vKipcbiAqIFdyYXAgc3BhbiBjb250ZXh0IGluIGEgTm9vcFNwYW4gYW5kIHNldCBhcyBzcGFuIGluIGEgbmV3XG4gKiBjb250ZXh0XG4gKlxuICogQHBhcmFtIGNvbnRleHQgY29udGV4dCB0byBzZXQgYWN0aXZlIHNwYW4gb25cbiAqIEBwYXJhbSBzcGFuQ29udGV4dCBzcGFuIGNvbnRleHQgdG8gYmUgd3JhcHBlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3BhbkNvbnRleHQoY29udGV4dCwgc3BhbkNvbnRleHQpIHtcbiAgICByZXR1cm4gc2V0U3Bhbihjb250ZXh0LCBuZXcgTm9uUmVjb3JkaW5nU3BhbihzcGFuQ29udGV4dCkpO1xufVxuLyoqXG4gKiBHZXQgdGhlIHNwYW4gY29udGV4dCBvZiB0aGUgc3BhbiBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgY29udGV4dCB0byBnZXQgdmFsdWVzIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYW5Db250ZXh0KGNvbnRleHQpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IGdldFNwYW4oY29udGV4dCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zcGFuQ29udGV4dCgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC11dGlscy5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgSU5WQUxJRF9TUEFOSUQsIElOVkFMSURfVFJBQ0VJRCB9IGZyb20gJy4vaW52YWxpZC1zcGFuLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBOb25SZWNvcmRpbmdTcGFuIH0gZnJvbSAnLi9Ob25SZWNvcmRpbmdTcGFuJztcbnZhciBWQUxJRF9UUkFDRUlEX1JFR0VYID0gL14oWzAtOWEtZl17MzJ9KSQvaTtcbnZhciBWQUxJRF9TUEFOSURfUkVHRVggPSAvXlswLTlhLWZdezE2fSQvaTtcbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHJhY2VJZCh0cmFjZUlkKSB7XG4gICAgcmV0dXJuIFZBTElEX1RSQUNFSURfUkVHRVgudGVzdCh0cmFjZUlkKSAmJiB0cmFjZUlkICE9PSBJTlZBTElEX1RSQUNFSUQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNwYW5JZChzcGFuSWQpIHtcbiAgICByZXR1cm4gVkFMSURfU1BBTklEX1JFR0VYLnRlc3Qoc3BhbklkKSAmJiBzcGFuSWQgIT09IElOVkFMSURfU1BBTklEO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB7QGxpbmsgU3BhbkNvbnRleHR9IGlzIHZhbGlkLlxuICogQHJldHVybiB0cnVlIGlmIHRoaXMge0BsaW5rIFNwYW5Db250ZXh0fSBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhbkNvbnRleHRWYWxpZChzcGFuQ29udGV4dCkge1xuICAgIHJldHVybiAoaXNWYWxpZFRyYWNlSWQoc3BhbkNvbnRleHQudHJhY2VJZCkgJiYgaXNWYWxpZFNwYW5JZChzcGFuQ29udGV4dC5zcGFuSWQpKTtcbn1cbi8qKlxuICogV3JhcCB0aGUgZ2l2ZW4ge0BsaW5rIFNwYW5Db250ZXh0fSBpbiBhIG5ldyBub24tcmVjb3JkaW5nIHtAbGluayBTcGFufVxuICpcbiAqIEBwYXJhbSBzcGFuQ29udGV4dCBzcGFuIGNvbnRleHQgdG8gYmUgd3JhcHBlZFxuICogQHJldHVybnMgYSBuZXcgbm9uLXJlY29yZGluZyB7QGxpbmsgU3Bhbn0gd2l0aCB0aGUgcHJvdmlkZWQgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcFNwYW5Db250ZXh0KHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBOb25SZWNvcmRpbmdTcGFuKHNwYW5Db250ZXh0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYW5jb250ZXh0LXV0aWxzLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBDb250ZXh0QVBJIH0gZnJvbSAnLi4vYXBpL2NvbnRleHQnO1xuaW1wb3J0IHsgZ2V0U3BhbkNvbnRleHQsIHNldFNwYW4gfSBmcm9tICcuLi90cmFjZS9jb250ZXh0LXV0aWxzJztcbmltcG9ydCB7IE5vblJlY29yZGluZ1NwYW4gfSBmcm9tICcuL05vblJlY29yZGluZ1NwYW4nO1xuaW1wb3J0IHsgaXNTcGFuQ29udGV4dFZhbGlkIH0gZnJvbSAnLi9zcGFuY29udGV4dC11dGlscyc7XG52YXIgY29udGV4dEFwaSA9IENvbnRleHRBUEkuZ2V0SW5zdGFuY2UoKTtcbi8qKlxuICogTm8tb3AgaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBUcmFjZXJ9LlxuICovXG52YXIgTm9vcFRyYWNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb29wVHJhY2VyKCkge1xuICAgIH1cbiAgICAvLyBzdGFydFNwYW4gc3RhcnRzIGEgbm9vcCBzcGFuLlxuICAgIE5vb3BUcmFjZXIucHJvdG90eXBlLnN0YXJ0U3BhbiA9IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IGNvbnRleHRBcGkuYWN0aXZlKCk7IH1cbiAgICAgICAgdmFyIHJvb3QgPSBCb29sZWFuKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yb290KTtcbiAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm9uUmVjb3JkaW5nU3BhbigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRGcm9tQ29udGV4dCA9IGNvbnRleHQgJiYgZ2V0U3BhbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGlmIChpc1NwYW5Db250ZXh0KHBhcmVudEZyb21Db250ZXh0KSAmJlxuICAgICAgICAgICAgaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudEZyb21Db250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25SZWNvcmRpbmdTcGFuKHBhcmVudEZyb21Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm9uUmVjb3JkaW5nU3BhbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOb29wVHJhY2VyLnByb3RvdHlwZS5zdGFydEFjdGl2ZVNwYW4gPSBmdW5jdGlvbiAobmFtZSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgICAgICB2YXIgb3B0cztcbiAgICAgICAgdmFyIGN0eDtcbiAgICAgICAgdmFyIGZuO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBmbiA9IGFyZzI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgb3B0cyA9IGFyZzI7XG4gICAgICAgICAgICBmbiA9IGFyZzM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGN0eCA9IGFyZzM7XG4gICAgICAgICAgICBmbiA9IGFyZzQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSBjdHggIT09IG51bGwgJiYgY3R4ICE9PSB2b2lkIDAgPyBjdHggOiBjb250ZXh0QXBpLmFjdGl2ZSgpO1xuICAgICAgICB2YXIgc3BhbiA9IHRoaXMuc3RhcnRTcGFuKG5hbWUsIG9wdHMsIHBhcmVudENvbnRleHQpO1xuICAgICAgICB2YXIgY29udGV4dFdpdGhTcGFuU2V0ID0gc2V0U3BhbihwYXJlbnRDb250ZXh0LCBzcGFuKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRBcGkud2l0aChjb250ZXh0V2l0aFNwYW5TZXQsIGZuLCB1bmRlZmluZWQsIHNwYW4pO1xuICAgIH07XG4gICAgcmV0dXJuIE5vb3BUcmFjZXI7XG59KCkpO1xuZXhwb3J0IHsgTm9vcFRyYWNlciB9O1xuZnVuY3Rpb24gaXNTcGFuQ29udGV4dChzcGFuQ29udGV4dCkge1xuICAgIHJldHVybiAodHlwZW9mIHNwYW5Db250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBlb2Ygc3BhbkNvbnRleHRbJ3NwYW5JZCddID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2Ygc3BhbkNvbnRleHRbJ3RyYWNlSWQnXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIHNwYW5Db250ZXh0Wyd0cmFjZUZsYWdzJ10gPT09ICdudW1iZXInKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vb3BUcmFjZXIuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IE5vb3BUcmFjZXIgfSBmcm9tICcuL05vb3BUcmFjZXInO1xudmFyIE5PT1BfVFJBQ0VSID0gbmV3IE5vb3BUcmFjZXIoKTtcbi8qKlxuICogUHJveHkgdHJhY2VyIHByb3ZpZGVkIGJ5IHRoZSBwcm94eSB0cmFjZXIgcHJvdmlkZXJcbiAqL1xudmFyIFByb3h5VHJhY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFByb3h5VHJhY2VyKF9wcm92aWRlciwgbmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9wcm92aWRlciA9IF9wcm92aWRlcjtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgUHJveHlUcmFjZXIucHJvdG90eXBlLnN0YXJ0U3BhbiA9IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRUcmFjZXIoKS5zdGFydFNwYW4obmFtZSwgb3B0aW9ucywgY29udGV4dCk7XG4gICAgfTtcbiAgICBQcm94eVRyYWNlci5wcm90b3R5cGUuc3RhcnRBY3RpdmVTcGFuID0gZnVuY3Rpb24gKF9uYW1lLCBfb3B0aW9ucywgX2NvbnRleHQsIF9mbikge1xuICAgICAgICB2YXIgdHJhY2VyID0gdGhpcy5fZ2V0VHJhY2VyKCk7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRyYWNlci5zdGFydEFjdGl2ZVNwYW4sIHRyYWNlciwgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRyeSB0byBnZXQgYSB0cmFjZXIgZnJvbSB0aGUgcHJveHkgdHJhY2VyIHByb3ZpZGVyLlxuICAgICAqIElmIHRoZSBwcm94eSB0cmFjZXIgcHJvdmlkZXIgaGFzIG5vIGRlbGVnYXRlLCByZXR1cm4gYSBub29wIHRyYWNlci5cbiAgICAgKi9cbiAgICBQcm94eVRyYWNlci5wcm90b3R5cGUuX2dldFRyYWNlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRyYWNlciA9IHRoaXMuX3Byb3ZpZGVyLmdldERlbGVnYXRlVHJhY2VyKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAoIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuIE5PT1BfVFJBQ0VSO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gdHJhY2VyO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgfTtcbiAgICByZXR1cm4gUHJveHlUcmFjZXI7XG59KCkpO1xuZXhwb3J0IHsgUHJveHlUcmFjZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb3h5VHJhY2VyLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBOb29wVHJhY2VyIH0gZnJvbSAnLi9Ob29wVHJhY2VyJztcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBUcmFjZXJQcm92aWRlcn0gd2hpY2ggcmV0dXJucyBhbiBpbXBvdGVudFxuICogVHJhY2VyIGZvciBhbGwgY2FsbHMgdG8gYGdldFRyYWNlcmAuXG4gKlxuICogQWxsIG9wZXJhdGlvbnMgYXJlIG5vLW9wLlxuICovXG52YXIgTm9vcFRyYWNlclByb3ZpZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vb3BUcmFjZXJQcm92aWRlcigpIHtcbiAgICB9XG4gICAgTm9vcFRyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXRUcmFjZXIgPSBmdW5jdGlvbiAoX25hbWUsIF92ZXJzaW9uLCBfb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IE5vb3BUcmFjZXIoKTtcbiAgICB9O1xuICAgIHJldHVybiBOb29wVHJhY2VyUHJvdmlkZXI7XG59KCkpO1xuZXhwb3J0IHsgTm9vcFRyYWNlclByb3ZpZGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob29wVHJhY2VyUHJvdmlkZXIuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IFByb3h5VHJhY2VyIH0gZnJvbSAnLi9Qcm94eVRyYWNlcic7XG5pbXBvcnQgeyBOb29wVHJhY2VyUHJvdmlkZXIgfSBmcm9tICcuL05vb3BUcmFjZXJQcm92aWRlcic7XG52YXIgTk9PUF9UUkFDRVJfUFJPVklERVIgPSBuZXcgTm9vcFRyYWNlclByb3ZpZGVyKCk7XG4vKipcbiAqIFRyYWNlciBwcm92aWRlciB3aGljaCBwcm92aWRlcyB7QGxpbmsgUHJveHlUcmFjZXJ9cy5cbiAqXG4gKiBCZWZvcmUgYSBkZWxlZ2F0ZSBpcyBzZXQsIHRyYWNlcnMgcHJvdmlkZWQgYXJlIE5vT3AuXG4gKiAgIFdoZW4gYSBkZWxlZ2F0ZSBpcyBzZXQsIHRyYWNlcyBhcmUgcHJvdmlkZWQgZnJvbSB0aGUgZGVsZWdhdGUuXG4gKiAgIFdoZW4gYSBkZWxlZ2F0ZSBpcyBzZXQgYWZ0ZXIgdHJhY2VycyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZCxcbiAqICAgYWxsIHRyYWNlcnMgYWxyZWFkeSBwcm92aWRlZCB3aWxsIHVzZSB0aGUgcHJvdmlkZWQgZGVsZWdhdGUgaW1wbGVtZW50YXRpb24uXG4gKi9cbnZhciBQcm94eVRyYWNlclByb3ZpZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFByb3h5VHJhY2VyUHJvdmlkZXIoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIHtAbGluayBQcm94eVRyYWNlcn1cbiAgICAgKi9cbiAgICBQcm94eVRyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXRUcmFjZXIgPSBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5nZXREZWxlZ2F0ZVRyYWNlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbmV3IFByb3h5VHJhY2VyKHRoaXMsIG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpKTtcbiAgICB9O1xuICAgIFByb3h5VHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmdldERlbGVnYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLl9kZWxlZ2F0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogTk9PUF9UUkFDRVJfUFJPVklERVI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlbGVnYXRlIHRyYWNlciBwcm92aWRlclxuICAgICAqL1xuICAgIFByb3h5VHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLnNldERlbGVnYXRlID0gZnVuY3Rpb24gKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfTtcbiAgICBQcm94eVRyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXREZWxlZ2F0ZVRyYWNlciA9IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuX2RlbGVnYXRlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0VHJhY2VyKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpO1xuICAgIH07XG4gICAgcmV0dXJuIFByb3h5VHJhY2VyUHJvdmlkZXI7XG59KCkpO1xuZXhwb3J0IHsgUHJveHlUcmFjZXJQcm92aWRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlUcmFjZXJQcm92aWRlci5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgZ2V0R2xvYmFsLCByZWdpc3Rlckdsb2JhbCwgdW5yZWdpc3Rlckdsb2JhbCwgfSBmcm9tICcuLi9pbnRlcm5hbC9nbG9iYWwtdXRpbHMnO1xuaW1wb3J0IHsgUHJveHlUcmFjZXJQcm92aWRlciB9IGZyb20gJy4uL3RyYWNlL1Byb3h5VHJhY2VyUHJvdmlkZXInO1xuaW1wb3J0IHsgaXNTcGFuQ29udGV4dFZhbGlkLCB3cmFwU3BhbkNvbnRleHQsIH0gZnJvbSAnLi4vdHJhY2Uvc3BhbmNvbnRleHQtdXRpbHMnO1xuaW1wb3J0IHsgZGVsZXRlU3BhbiwgZ2V0QWN0aXZlU3BhbiwgZ2V0U3BhbiwgZ2V0U3BhbkNvbnRleHQsIHNldFNwYW4sIHNldFNwYW5Db250ZXh0LCB9IGZyb20gJy4uL3RyYWNlL2NvbnRleHQtdXRpbHMnO1xuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4vZGlhZyc7XG52YXIgQVBJX05BTUUgPSAndHJhY2UnO1xuLyoqXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGVudHJ5IHBvaW50IHRvIHRoZSBPcGVuVGVsZW1ldHJ5IFRyYWNpbmcgQVBJXG4gKi9cbnZhciBUcmFjZUFQSSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogRW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBwcmV2ZW50cyBlbmQgdXNlcnMgZnJvbSBjb25zdHJ1Y3RpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFQSSAqL1xuICAgIGZ1bmN0aW9uIFRyYWNlQVBJKCkge1xuICAgICAgICB0aGlzLl9wcm94eVRyYWNlclByb3ZpZGVyID0gbmV3IFByb3h5VHJhY2VyUHJvdmlkZXIoKTtcbiAgICAgICAgdGhpcy53cmFwU3BhbkNvbnRleHQgPSB3cmFwU3BhbkNvbnRleHQ7XG4gICAgICAgIHRoaXMuaXNTcGFuQ29udGV4dFZhbGlkID0gaXNTcGFuQ29udGV4dFZhbGlkO1xuICAgICAgICB0aGlzLmRlbGV0ZVNwYW4gPSBkZWxldGVTcGFuO1xuICAgICAgICB0aGlzLmdldFNwYW4gPSBnZXRTcGFuO1xuICAgICAgICB0aGlzLmdldEFjdGl2ZVNwYW4gPSBnZXRBY3RpdmVTcGFuO1xuICAgICAgICB0aGlzLmdldFNwYW5Db250ZXh0ID0gZ2V0U3BhbkNvbnRleHQ7XG4gICAgICAgIHRoaXMuc2V0U3BhbiA9IHNldFNwYW47XG4gICAgICAgIHRoaXMuc2V0U3BhbkNvbnRleHQgPSBzZXRTcGFuQ29udGV4dDtcbiAgICB9XG4gICAgLyoqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBUcmFjZSBBUEkgKi9cbiAgICBUcmFjZUFQSS5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgVHJhY2VBUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgZ2xvYmFsIHRyYWNlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHRyYWNlciBwcm92aWRlciB3YXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQsIGVsc2UgZmFsc2VcbiAgICAgKi9cbiAgICBUcmFjZUFQSS5wcm90b3R5cGUuc2V0R2xvYmFsVHJhY2VyUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIHN1Y2Nlc3MgPSByZWdpc3Rlckdsb2JhbChBUElfTkFNRSwgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlciwgRGlhZ0FQSS5pbnN0YW5jZSgpKTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXIuc2V0RGVsZWdhdGUocHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIHRyYWNlciBwcm92aWRlci5cbiAgICAgKi9cbiAgICBUcmFjZUFQSS5wcm90b3R5cGUuZ2V0VHJhY2VyUHJvdmlkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRHbG9iYWwoQVBJX05BTUUpIHx8IHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgdHJhY2VyIGZyb20gdGhlIGdsb2JhbCB0cmFjZXIgcHJvdmlkZXIuXG4gICAgICovXG4gICAgVHJhY2VBUEkucHJvdG90eXBlLmdldFRyYWNlciA9IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRyYWNlclByb3ZpZGVyKCkuZ2V0VHJhY2VyKG5hbWUsIHZlcnNpb24pO1xuICAgIH07XG4gICAgLyoqIFJlbW92ZSB0aGUgZ2xvYmFsIHRyYWNlciBwcm92aWRlciAqL1xuICAgIFRyYWNlQVBJLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB1bnJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgICAgICB0aGlzLl9wcm94eVRyYWNlclByb3ZpZGVyID0gbmV3IFByb3h5VHJhY2VyUHJvdmlkZXIoKTtcbiAgICB9O1xuICAgIHJldHVybiBUcmFjZUFQSTtcbn0oKSk7XG5leHBvcnQgeyBUcmFjZUFQSSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2UuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFNwbGl0IG1vZHVsZS1sZXZlbCB2YXJpYWJsZSBkZWZpbml0aW9uIGludG8gc2VwYXJhdGUgZmlsZXMgdG8gYWxsb3dcbi8vIHRyZWUtc2hha2luZyBvbiBlYWNoIGFwaSBpbnN0YW5jZS5cbmltcG9ydCB7IFRyYWNlQVBJIH0gZnJvbSAnLi9hcGkvdHJhY2UnO1xuLyoqIEVudHJ5cG9pbnQgZm9yIHRyYWNlIEFQSSAqL1xuZXhwb3J0IHZhciB0cmFjZSA9IFRyYWNlQVBJLmdldEluc3RhbmNlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZS1hcGkuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFNwbGl0IG1vZHVsZS1sZXZlbCB2YXJpYWJsZSBkZWZpbml0aW9uIGludG8gc2VwYXJhdGUgZmlsZXMgdG8gYWxsb3dcbi8vIHRyZWUtc2hha2luZyBvbiBlYWNoIGFwaSBpbnN0YW5jZS5cbmltcG9ydCB7IENvbnRleHRBUEkgfSBmcm9tICcuL2FwaS9jb250ZXh0Jztcbi8qKiBFbnRyeXBvaW50IGZvciBjb250ZXh0IEFQSSAqL1xuZXhwb3J0IHZhciBjb250ZXh0ID0gQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC1hcGkuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBjb250ZXh0IGFzIG90Q29udGV4dCwgdHJhY2UgYXMgb3RUcmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbi8qKlxuICogVGhlIGtpbmQgb2Ygc3Bhbi5cbiAqL1xuZXhwb3J0IHZhciBTcGFuS2luZDtcbihmdW5jdGlvbiAoU3BhbktpbmQpIHtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZS4gSW5kaWNhdGVzIHRoYXQgdGhlIHNwYW4gaXMgdXNlZCBpbnRlcm5hbGx5LiAqL1xuICAgIFNwYW5LaW5kW1NwYW5LaW5kW1wiSU5URVJOQUxcIl0gPSAwXSA9IFwiSU5URVJOQUxcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBjb3ZlcnMgc2VydmVyLXNpZGUgaGFuZGxpbmcgb2YgYW4gUlBDIG9yIG90aGVyXG4gICAgICogcmVtb3RlIHJlcXVlc3QuXG4gICAgICovXG4gICAgU3BhbktpbmRbU3BhbktpbmRbXCJTRVJWRVJcIl0gPSAxXSA9IFwiU0VSVkVSXCI7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNwYW4gY292ZXJzIHRoZSBjbGllbnQtc2lkZSB3cmFwcGVyIGFyb3VuZCBhbiBSUEMgb3JcbiAgICAgKiBvdGhlciByZW1vdGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTcGFuS2luZFtTcGFuS2luZFtcIkNMSUVOVFwiXSA9IDJdID0gXCJDTElFTlRcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBkZXNjcmliZXMgcHJvZHVjZXIgc2VuZGluZyBhIG1lc3NhZ2UgdG8gYVxuICAgICAqIGJyb2tlci4gVW5saWtlIGNsaWVudCBhbmQgc2VydmVyLCB0aGVyZSBpcyBubyBkaXJlY3QgY3JpdGljYWwgcGF0aCBsYXRlbmN5XG4gICAgICogcmVsYXRpb25zaGlwIGJldHdlZW4gcHJvZHVjZXIgYW5kIGNvbnN1bWVyIHNwYW5zLlxuICAgICAqL1xuICAgIFNwYW5LaW5kW1NwYW5LaW5kW1wiUFJPRFVDRVJcIl0gPSAzXSA9IFwiUFJPRFVDRVJcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBkZXNjcmliZXMgY29uc3VtZXIgcmVjZWl2aW5nIGEgbWVzc2FnZSBmcm9tIGFcbiAgICAgKiBicm9rZXIuIFVubGlrZSBjbGllbnQgYW5kIHNlcnZlciwgdGhlcmUgaXMgbm8gZGlyZWN0IGNyaXRpY2FsIHBhdGggbGF0ZW5jeVxuICAgICAqIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHByb2R1Y2VyIGFuZCBjb25zdW1lciBzcGFucy5cbiAgICAgKi9cbiAgICBTcGFuS2luZFtTcGFuS2luZFtcIkNPTlNVTUVSXCJdID0gNF0gPSBcIkNPTlNVTUVSXCI7XG59KShTcGFuS2luZCB8fCAoU3BhbktpbmQgPSB7fSkpO1xuLyoqXG4gKiBSZXR1cm4gdGhlIHNwYW4gaWYgb25lIGV4aXN0c1xuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gY29udGV4dCB0byBnZXQgc3BhbiBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFuKGNvbnRleHQpIHtcbiAgICByZXR1cm4gb3RUcmFjZS5nZXRTcGFuKGNvbnRleHQpO1xufVxuLyoqXG4gKiBTZXQgdGhlIHNwYW4gb24gYSBjb250ZXh0XG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBjb250ZXh0IHRvIHVzZSBhcyBwYXJlbnRcbiAqIEBwYXJhbSBzcGFuIC0gc3BhbiB0byBzZXQgYWN0aXZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTcGFuKGNvbnRleHQsIHNwYW4pIHtcbiAgICByZXR1cm4gb3RUcmFjZS5zZXRTcGFuKGNvbnRleHQsIHNwYW4pO1xufVxuLyoqXG4gKiBXcmFwIHNwYW4gY29udGV4dCBpbiBhIE5vb3BTcGFuIGFuZCBzZXQgYXMgc3BhbiBpbiBhIG5ld1xuICogY29udGV4dFxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gY29udGV4dCB0byBzZXQgYWN0aXZlIHNwYW4gb25cbiAqIEBwYXJhbSBzcGFuQ29udGV4dCAtIHNwYW4gY29udGV4dCB0byBiZSB3cmFwcGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTcGFuQ29udGV4dChjb250ZXh0LCBzcGFuQ29udGV4dCkge1xuICAgIHJldHVybiBvdFRyYWNlLnNldFNwYW5Db250ZXh0KGNvbnRleHQsIHNwYW5Db250ZXh0KTtcbn1cbi8qKlxuICogR2V0IHRoZSBzcGFuIGNvbnRleHQgb2YgdGhlIHNwYW4gaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gY29udGV4dCB0byBnZXQgdmFsdWVzIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYW5Db250ZXh0KGNvbnRleHQpIHtcbiAgICByZXR1cm4gb3RUcmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIG9mIHRoZSBnaXZlbiB7QGxpbmsgU3BhbkNvbnRleHR9IGlzIHZhbGlkLlxuICogQSB2YWxpZCB7QGxpbmsgU3BhbkNvbnRleHR9IGlzIG9uZSB3aGljaCBoYXMgYSB2YWxpZCB0cmFjZSBJRCBhbmQgc3BhbiBJRCBhcyBwZXIgdGhlIHNwZWMuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSB0aGUge0BsaW5rIFNwYW5Db250ZXh0fSB0byB2YWxpZGF0ZS5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB7QGxpbmsgU3BhbkNvbnRleHR9IGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NwYW5Db250ZXh0VmFsaWQoY29udGV4dCkge1xuICAgIHJldHVybiBvdFRyYWNlLmlzU3BhbkNvbnRleHRWYWxpZChjb250ZXh0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFjZXIobmFtZSwgdmVyc2lvbikge1xuICAgIHJldHVybiBvdFRyYWNlLmdldFRyYWNlcihuYW1lIHx8IFwiYXp1cmUvY29yZS10cmFjaW5nXCIsIHZlcnNpb24pO1xufVxuLyoqIEVudHJ5cG9pbnQgZm9yIGNvbnRleHQgQVBJICovXG5leHBvcnQgY29uc3QgY29udGV4dCA9IG90Q29udGV4dDtcbi8qKiBTcGFuU3RhdHVzQ29kZSAqL1xuZXhwb3J0IHZhciBTcGFuU3RhdHVzQ29kZTtcbihmdW5jdGlvbiAoU3BhblN0YXR1c0NvZGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBzdGF0dXMuXG4gICAgICovXG4gICAgU3BhblN0YXR1c0NvZGVbU3BhblN0YXR1c0NvZGVbXCJVTlNFVFwiXSA9IDBdID0gXCJVTlNFVFwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gdmFsaWRhdGVkIGJ5IGFuIEFwcGxpY2F0aW9uIGRldmVsb3BlciBvclxuICAgICAqIE9wZXJhdG9yIHRvIGhhdmUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICAgKi9cbiAgICBTcGFuU3RhdHVzQ29kZVtTcGFuU3RhdHVzQ29kZVtcIk9LXCJdID0gMV0gPSBcIk9LXCI7XG4gICAgLyoqXG4gICAgICogVGhlIG9wZXJhdGlvbiBjb250YWlucyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBTcGFuU3RhdHVzQ29kZVtTcGFuU3RhdHVzQ29kZVtcIkVSUk9SXCJdID0gMl0gPSBcIkVSUk9SXCI7XG59KShTcGFuU3RhdHVzQ29kZSB8fCAoU3BhblN0YXR1c0NvZGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJmYWNlcy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBDb252ZXJ0cyBhbiBPcGVyYXRpb25PcHRpb25zIHRvIGEgUmVxdWVzdE9wdGlvbnNCYXNlXG4gKlxuICogQHBhcmFtIG9wdHMgLSBPcGVyYXRpb25PcHRpb25zIG9iamVjdCB0byBjb252ZXJ0IHRvIFJlcXVlc3RPcHRpb25zQmFzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdHMpIHtcbiAgICBjb25zdCB7IHJlcXVlc3RPcHRpb25zLCB0cmFjaW5nT3B0aW9ucyB9ID0gb3B0cywgYWRkaXRpb25hbE9wdGlvbnMgPSBfX3Jlc3Qob3B0cywgW1wicmVxdWVzdE9wdGlvbnNcIiwgXCJ0cmFjaW5nT3B0aW9uc1wiXSk7XG4gICAgbGV0IHJlc3VsdCA9IGFkZGl0aW9uYWxPcHRpb25zO1xuICAgIGlmIChyZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICByZXN1bHQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdCksIHJlcXVlc3RPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHRyYWNpbmdPcHRpb25zKSB7XG4gICAgICAgIHJlc3VsdC50cmFjaW5nQ29udGV4dCA9IHRyYWNpbmdPcHRpb25zLnRyYWNpbmdDb250ZXh0O1xuICAgICAgICAvLyBCeSBwYXNzaW5nIHNwYW5PcHRpb25zIGlmIHRoZXkgZXhpc3QgYXQgcnVudGltZSwgd2UncmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBAYXp1cmUvY29yZS10cmFjaW5nQHByZXZpZXcuMTMgYW5kIGVhcmxpZXIuXG4gICAgICAgIHJlc3VsdC5zcGFuT3B0aW9ucyA9IHRyYWNpbmdPcHRpb25zID09PSBudWxsIHx8IHRyYWNpbmdPcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0cmFjaW5nT3B0aW9ucy5zcGFuT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbk9wdGlvbnMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgaW4gYmFzZTY0IGZvcm1hdC5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSBpbiBiYXNlNjQgZm9ybWF0LlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIFVpbnQ4QXJheSB0byBlbmNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJ5dGVBcnJheSh2YWx1ZSkge1xuICAgIC8vIEJ1ZmZlci5mcm9tIGFjY2VwdHMgPEFycmF5QnVmZmVyPiB8IDxTaGFyZWRBcnJheUJ1ZmZlcj4tLSB0aGUgVHlwZVNjcmlwdCBkZWZpbml0aW9uIGlzIG9mZiBoZXJlXG4gICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9idWZmZXIuaHRtbCNidWZmZXJfY2xhc3NfbWV0aG9kX2J1ZmZlcl9mcm9tX2FycmF5YnVmZmVyX2J5dGVvZmZzZXRfbGVuZ3RoXG4gICAgY29uc3QgYnVmZmVyVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlciA/IHZhbHVlIDogQnVmZmVyLmZyb20odmFsdWUuYnVmZmVyKTtcbiAgICByZXR1cm4gYnVmZmVyVmFsdWUudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG4vKipcbiAqIERlY29kZXMgYSBiYXNlNjQgc3RyaW5nIGludG8gYSBieXRlIGFycmF5LlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIGJhc2U2NCBzdHJpbmcgdG8gZGVjb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsIFwiYmFzZTY0XCIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZTY0LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG5pbXBvcnQgKiBhcyBiYXNlNjQgZnJvbSBcIi4vdXRpbC9iYXNlNjRcIjtcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gXCIuL3V0aWwvdXRpbHNcIjtcbmltcG9ydCB7IFhNTF9BVFRSS0VZLCBYTUxfQ0hBUktFWSB9IGZyb20gXCIuL3V0aWwvc2VyaWFsaXplci5jb21tb25cIjtcbi8vIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXR5IGNvZGUgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBuZXR3b3JrIG9wZXJhdGlvbnMgYWNjb3JkaW5nIHRvIGBPcGVyYXRpb25TcGVjYCBvYmplY3RzIGdlbmVyYXRlZCBieSBBdXRvUmVzdC5UeXBlU2NyaXB0IGZyb20gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucy5cbi8qKlxuICogVXNlZCB0byBtYXAgcmF3IHJlc3BvbnNlIG9iamVjdHMgdG8gZmluYWwgc2hhcGVzLlxuICogSGVscHMgcGFja2luZyBhbmQgdW5wYWNraW5nIERhdGVzIGFuZCBvdGhlciBlbmNvZGVkIHR5cGVzIHRoYXQgYXJlIG5vdCBpbnRyaW5zaWMgdG8gSlNPTi5cbiAqIEFsc28gYWxsb3dzIHB1bGxpbmcgdmFsdWVzIGZyb20gaGVhZGVycywgYXMgd2VsbCBhcyBpbnNlcnRpbmcgZGVmYXVsdCB2YWx1ZXMgYW5kIGNvbnN0YW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlcmlhbGl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBwcm92aWRlZCBtb2RlbCBtYXBwZXIuXG4gICAgICovXG4gICAgbW9kZWxNYXBwZXJzID0ge30sIFxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGNvbnRlbnRzIGFyZSBYTUwgb3Igbm90LlxuICAgICAqL1xuICAgIGlzWE1MKSB7XG4gICAgICAgIHRoaXMubW9kZWxNYXBwZXJzID0gbW9kZWxNYXBwZXJzO1xuICAgICAgICB0aGlzLmlzWE1MID0gaXNYTUw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyBjb25zdHJhaW50cywgaWYgYW55LiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgaWYgdGhlIHByb3ZpZGVkIHZhbHVlIGRvZXMgbm90IHJlc3BlY3QgdGhvc2UgY29uc3RyYWludHMuXG4gICAgICogQHBhcmFtIG1hcHBlciAtIFRoZSBkZWZpbml0aW9uIG9mIGRhdGEgbW9kZWxzLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gb2JqZWN0TmFtZSAtIE5hbWUgb2YgdGhlIG9iamVjdC4gVXNlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZXMuXG4gICAgICogQGRlcHJlY2F0ZWQgUmVtb3ZpbmcgdGhlIGNvbnN0cmFpbnRzIHZhbGlkYXRpb24gb24gY2xpZW50IHNpZGUuXG4gICAgICovXG4gICAgdmFsaWRhdGVDb25zdHJhaW50cyhtYXBwZXIsIHZhbHVlLCBvYmplY3ROYW1lKSB7XG4gICAgICAgIGNvbnN0IGZhaWxWYWxpZGF0aW9uID0gKGNvbnN0cmFpbnROYW1lLCBjb25zdHJhaW50VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXCIke29iamVjdE5hbWV9XCIgd2l0aCB2YWx1ZSBcIiR7dmFsdWV9XCIgc2hvdWxkIHNhdGlzZnkgdGhlIGNvbnN0cmFpbnQgXCIke2NvbnN0cmFpbnROYW1lfVwiOiAke2NvbnN0cmFpbnRWYWx1ZX0uYCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChtYXBwZXIuY29uc3RyYWludHMgJiYgdmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFzTnVtYmVyID0gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCB7IEV4Y2x1c2l2ZU1heGltdW0sIEV4Y2x1c2l2ZU1pbmltdW0sIEluY2x1c2l2ZU1heGltdW0sIEluY2x1c2l2ZU1pbmltdW0sIE1heEl0ZW1zLCBNYXhMZW5ndGgsIE1pbkl0ZW1zLCBNaW5MZW5ndGgsIE11bHRpcGxlT2YsIFBhdHRlcm4sIFVuaXF1ZUl0ZW1zLCB9ID0gbWFwcGVyLmNvbnN0cmFpbnRzO1xuICAgICAgICAgICAgaWYgKEV4Y2x1c2l2ZU1heGltdW0gIT0gdW5kZWZpbmVkICYmIHZhbHVlQXNOdW1iZXIgPj0gRXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiRXhjbHVzaXZlTWF4aW11bVwiLCBFeGNsdXNpdmVNYXhpbXVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChFeGNsdXNpdmVNaW5pbXVtICE9IHVuZGVmaW5lZCAmJiB2YWx1ZUFzTnVtYmVyIDw9IEV4Y2x1c2l2ZU1pbmltdW0pIHtcbiAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIkV4Y2x1c2l2ZU1pbmltdW1cIiwgRXhjbHVzaXZlTWluaW11bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSW5jbHVzaXZlTWF4aW11bSAhPSB1bmRlZmluZWQgJiYgdmFsdWVBc051bWJlciA+IEluY2x1c2l2ZU1heGltdW0pIHtcbiAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIkluY2x1c2l2ZU1heGltdW1cIiwgSW5jbHVzaXZlTWF4aW11bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSW5jbHVzaXZlTWluaW11bSAhPSB1bmRlZmluZWQgJiYgdmFsdWVBc051bWJlciA8IEluY2x1c2l2ZU1pbmltdW0pIHtcbiAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIkluY2x1c2l2ZU1pbmltdW1cIiwgSW5jbHVzaXZlTWluaW11bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFzQXJyYXkgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChNYXhJdGVtcyAhPSB1bmRlZmluZWQgJiYgdmFsdWVBc0FycmF5Lmxlbmd0aCA+IE1heEl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJNYXhJdGVtc1wiLCBNYXhJdGVtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWF4TGVuZ3RoICE9IHVuZGVmaW5lZCAmJiB2YWx1ZUFzQXJyYXkubGVuZ3RoID4gTWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJNYXhMZW5ndGhcIiwgTWF4TGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNaW5JdGVtcyAhPSB1bmRlZmluZWQgJiYgdmFsdWVBc0FycmF5Lmxlbmd0aCA8IE1pbkl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJNaW5JdGVtc1wiLCBNaW5JdGVtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWluTGVuZ3RoICE9IHVuZGVmaW5lZCAmJiB2YWx1ZUFzQXJyYXkubGVuZ3RoIDwgTWluTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJNaW5MZW5ndGhcIiwgTWluTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNdWx0aXBsZU9mICE9IHVuZGVmaW5lZCAmJiB2YWx1ZUFzTnVtYmVyICUgTXVsdGlwbGVPZiAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiTXVsdGlwbGVPZlwiLCBNdWx0aXBsZU9mKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHR5cGVvZiBQYXR0ZXJuID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChQYXR0ZXJuKSA6IFBhdHRlcm47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5tYXRjaChwYXR0ZXJuKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIlBhdHRlcm5cIiwgUGF0dGVybik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFVuaXF1ZUl0ZW1zICYmXG4gICAgICAgICAgICAgICAgdmFsdWVBc0FycmF5LnNvbWUoKGl0ZW0sIGksIGFyKSA9PiBhci5pbmRleE9mKGl0ZW0pICE9PSBpKSkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiVW5pcXVlSXRlbXNcIiwgVW5pcXVlSXRlbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gb2JqZWN0IGJhc2VkIG9uIGl0cyBtZXRhZGF0YSBkZWZpbmVkIGluIHRoZSBtYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFwcGVyIC0gVGhlIG1hcHBlciB3aGljaCBkZWZpbmVzIHRoZSBtZXRhZGF0YSBvZiB0aGUgc2VyaWFsaXphYmxlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gb2JqZWN0IC0gQSB2YWxpZCBKYXZhc2NyaXB0IG9iamVjdCB0byBiZSBzZXJpYWxpemVkLlxuICAgICAqIEBwYXJhbSBvYmplY3ROYW1lIC0gTmFtZSBvZiB0aGUgc2VyaWFsaXplZCBvYmplY3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gZGVzZXJpYWxpemF0aW9uLlxuICAgICAqIEByZXR1cm5zIEEgdmFsaWQgc2VyaWFsaXplZCBKYXZhc2NyaXB0IG9iamVjdC5cbiAgICAgKi9cbiAgICBzZXJpYWxpemUobWFwcGVyLCBvYmplY3QsIG9iamVjdE5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICByb290TmFtZTogKF9hID0gb3B0aW9ucy5yb290TmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIixcbiAgICAgICAgICAgIGluY2x1ZGVSb290OiAoX2IgPSBvcHRpb25zLmluY2x1ZGVSb290KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZSxcbiAgICAgICAgICAgIHhtbENoYXJLZXk6IChfYyA9IG9wdGlvbnMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogWE1MX0NIQVJLRVksXG4gICAgICAgIH07XG4gICAgICAgIGxldCBwYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IG1hcHBlclR5cGUgPSBtYXBwZXIudHlwZS5uYW1lO1xuICAgICAgICBpZiAoIW9iamVjdE5hbWUpIHtcbiAgICAgICAgICAgIG9iamVjdE5hbWUgPSBtYXBwZXIuc2VyaWFsaXplZE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcHBlclR5cGUubWF0Y2goL15TZXF1ZW5jZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHBheWxvYWQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFwcGVyLmlzQ29uc3RhbnQpIHtcbiAgICAgICAgICAgIG9iamVjdCA9IG1hcHBlci5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyB0YWJsZSBvZiBhbGxvd2VkIHZhbHVlcyBzaG91bGQgaGVscCBleHBsYWluXG4gICAgICAgIC8vIHRoZSBtYXBwZXIucmVxdWlyZWQgYW5kIG1hcHBlci5udWxsYWJsZSBwcm9wZXJ0aWVzLlxuICAgICAgICAvLyBYIG1lYW5zIFwibmVpdGhlciB1bmRlZmluZWQgb3IgbnVsbCBhcmUgYWxsb3dlZFwiLlxuICAgICAgICAvLyAgICAgICAgICAgfHwgcmVxdWlyZWRcbiAgICAgICAgLy8gICAgICAgICAgIHx8IHRydWUgICAgICB8IGZhbHNlXG4gICAgICAgIC8vICBudWxsYWJsZSB8fCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyAgICAgIHRydWUgfHwgbnVsbCAgICAgIHwgdW5kZWZpbmVkL251bGxcbiAgICAgICAgLy8gICAgIGZhbHNlIHx8IFggICAgICAgICB8IHVuZGVmaW5lZFxuICAgICAgICAvLyB1bmRlZmluZWQgfHwgWCAgICAgICAgIHwgdW5kZWZpbmVkL251bGxcbiAgICAgICAgY29uc3QgeyByZXF1aXJlZCwgbnVsbGFibGUgfSA9IG1hcHBlcjtcbiAgICAgICAgaWYgKHJlcXVpcmVkICYmIG51bGxhYmxlICYmIG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gY2Fubm90IGJlIHVuZGVmaW5lZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWlyZWQgJiYgIW51bGxhYmxlICYmIG9iamVjdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXF1aXJlZCAmJiBudWxsYWJsZSA9PT0gZmFsc2UgJiYgb2JqZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gY2Fubm90IGJlIG51bGwuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBheWxvYWQgPSBvYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXmFueSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gb2JqZWN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXihOdW1iZXJ8U3RyaW5nfEJvb2xlYW58T2JqZWN0fFN0cmVhbXxVdWlkKSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VyaWFsaXplQmFzaWNUeXBlcyhtYXBwZXJUeXBlLCBvYmplY3ROYW1lLCBvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkVudW0kL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW51bU1hcHBlciA9IG1hcHBlcjtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VyaWFsaXplRW51bVR5cGUob2JqZWN0TmFtZSwgZW51bU1hcHBlci50eXBlLmFsbG93ZWRWYWx1ZXMsIG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eKERhdGV8RGF0ZVRpbWV8VGltZVNwYW58RGF0ZVRpbWVSZmMxMTIzfFVuaXhUaW1lKSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VyaWFsaXplRGF0ZVR5cGVzKG1hcHBlclR5cGUsIG9iamVjdCwgb2JqZWN0TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQnl0ZUFycmF5JC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVCeXRlQXJyYXlUeXBlKG9iamVjdE5hbWUsIG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQmFzZTY0VXJsJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVCYXNlNjRVcmxUeXBlKG9iamVjdE5hbWUsIG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eU2VxdWVuY2UkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNlcmlhbGl6ZVNlcXVlbmNlVHlwZSh0aGlzLCBtYXBwZXIsIG9iamVjdCwgb2JqZWN0TmFtZSwgQm9vbGVhbih0aGlzLmlzWE1MKSwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkRpY3Rpb25hcnkkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNlcmlhbGl6ZURpY3Rpb25hcnlUeXBlKHRoaXMsIG1hcHBlciwgb2JqZWN0LCBvYmplY3ROYW1lLCBCb29sZWFuKHRoaXMuaXNYTUwpLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQ29tcG9zaXRlJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVDb21wb3NpdGVUeXBlKHRoaXMsIG1hcHBlciwgb2JqZWN0LCBvYmplY3ROYW1lLCBCb29sZWFuKHRoaXMuaXNYTUwpLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIHRoZSBnaXZlbiBvYmplY3QgYmFzZWQgb24gaXRzIG1ldGFkYXRhIGRlZmluZWQgaW4gdGhlIG1hcHBlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtYXBwZXIgLSBUaGUgbWFwcGVyIHdoaWNoIGRlZmluZXMgdGhlIG1ldGFkYXRhIG9mIHRoZSBzZXJpYWxpemFibGUgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByZXNwb25zZUJvZHkgLSBBIHZhbGlkIEphdmFzY3JpcHQgZW50aXR5IHRvIGJlIGRlc2VyaWFsaXplZC5cbiAgICAgKiBAcGFyYW0gb2JqZWN0TmFtZSAtIE5hbWUgb2YgdGhlIGRlc2VyaWFsaXplZCBvYmplY3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb250cm9scyBiZWhhdmlvciBvZiBYTUwgcGFyc2VyIGFuZCBidWlsZGVyLlxuICAgICAqIEByZXR1cm5zIEEgdmFsaWQgZGVzZXJpYWxpemVkIEphdmFzY3JpcHQgb2JqZWN0LlxuICAgICAqL1xuICAgIGRlc2VyaWFsaXplKG1hcHBlciwgcmVzcG9uc2VCb2R5LCBvYmplY3ROYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0ge1xuICAgICAgICAgICAgcm9vdE5hbWU6IChfYSA9IG9wdGlvbnMucm9vdE5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCIsXG4gICAgICAgICAgICBpbmNsdWRlUm9vdDogKF9iID0gb3B0aW9ucy5pbmNsdWRlUm9vdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2UsXG4gICAgICAgICAgICB4bWxDaGFyS2V5OiAoX2MgPSBvcHRpb25zLnhtbENoYXJLZXkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFhNTF9DSEFSS0VZLFxuICAgICAgICB9O1xuICAgICAgICBpZiAocmVzcG9uc2VCb2R5ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNYTUwgJiYgbWFwcGVyLnR5cGUubmFtZSA9PT0gXCJTZXF1ZW5jZVwiICYmICFtYXBwZXIueG1sSXNXcmFwcGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRWRnZSBjYXNlIGZvciBlbXB0eSBYTUwgbm9uLXdyYXBwZWQgbGlzdHMuIHhtbDJqcyBjYW4ndCBkaXN0aW5ndWlzaFxuICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gdGhlIGxpc3QgYmVpbmcgZW1wdHkgdmVyc3VzIGJlaW5nIG1pc3NpbmcsXG4gICAgICAgICAgICAgICAgLy8gc28gbGV0J3MgZG8gdGhlIG1vcmUgdXNlci1mcmllbmRseSB0aGluZyBhbmQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5ID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzcGVjaWZpY2FsbHkgY2hlY2sgZm9yIHVuZGVmaW5lZCBhcyBkZWZhdWx0IHZhbHVlIGNhbiBiZSBhIGZhbHNleSB2YWx1ZSBgMCwgXCJcIiwgZmFsc2UsIG51bGxgXG4gICAgICAgICAgICBpZiAobWFwcGVyLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5ID0gbWFwcGVyLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBheWxvYWQ7XG4gICAgICAgIGNvbnN0IG1hcHBlclR5cGUgPSBtYXBwZXIudHlwZS5uYW1lO1xuICAgICAgICBpZiAoIW9iamVjdE5hbWUpIHtcbiAgICAgICAgICAgIG9iamVjdE5hbWUgPSBtYXBwZXIuc2VyaWFsaXplZE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcHBlclR5cGUubWF0Y2goL15Db21wb3NpdGUkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwYXlsb2FkID0gZGVzZXJpYWxpemVDb21wb3NpdGVUeXBlKHRoaXMsIG1hcHBlciwgcmVzcG9uc2VCb2R5LCBvYmplY3ROYW1lLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1hNTCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXJLZXkgPSB1cGRhdGVkT3B0aW9ucy54bWxDaGFyS2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhc3RSZXNwb25zZUJvZHkgPSByZXNwb25zZUJvZHk7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogSWYgdGhlIG1hcHBlciBzcGVjaWZpZXMgdGhpcyBhcyBhIG5vbi1jb21wb3NpdGUgdHlwZSB2YWx1ZSBidXQgdGhlIHJlc3BvbnNlQm9keSBjb250YWluc1xuICAgICAgICAgICAgICAgICAqIGJvdGggaGVhZGVyIChcIiRcIiBpLmUuLCBYTUxfQVRUUktFWSkgYW5kIGJvZHkgKFwiI1wiIGkuZS4sIFhNTF9DSEFSS0VZKSBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAqIHRoZW4ganVzdCByZWR1Y2UgdGhlIHJlc3BvbnNlQm9keSB2YWx1ZSB0byB0aGUgYm9keSAoXCIjXCIgaS5lLiwgWE1MX0NIQVJLRVkpIHByb3BlcnR5LlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChjYXN0UmVzcG9uc2VCb2R5W1hNTF9BVFRSS0VZXSAhPSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgY2FzdFJlc3BvbnNlQm9keVt4bWxDaGFyS2V5XSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5ID0gY2FzdFJlc3BvbnNlQm9keVt4bWxDaGFyS2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXk51bWJlciQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gcGFyc2VGbG9hdChyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihwYXlsb2FkKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gcmVzcG9uc2VCb2R5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15Cb29sZWFuJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUJvZHkgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZUJvZHkgPT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gcmVzcG9uc2VCb2R5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL14oU3RyaW5nfEVudW18T2JqZWN0fFN0cmVhbXxVdWlkfFRpbWVTcGFufGFueSkkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHJlc3BvbnNlQm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL14oRGF0ZXxEYXRlVGltZXxEYXRlVGltZVJmYzExMjMpJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBuZXcgRGF0ZShyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXlVuaXhUaW1lJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSB1bml4VGltZVRvRGF0ZShyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkJ5dGVBcnJheSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gYmFzZTY0LmRlY29kZVN0cmluZyhyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkJhc2U2NFVybCQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gYmFzZTY0VXJsVG9CeXRlQXJyYXkocmVzcG9uc2VCb2R5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15TZXF1ZW5jZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gZGVzZXJpYWxpemVTZXF1ZW5jZVR5cGUodGhpcywgbWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15EaWN0aW9uYXJ5JC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBkZXNlcmlhbGl6ZURpY3Rpb25hcnlUeXBlKHRoaXMsIG1hcHBlciwgcmVzcG9uc2VCb2R5LCBvYmplY3ROYW1lLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcHBlci5pc0NvbnN0YW50KSB7XG4gICAgICAgICAgICBwYXlsb2FkID0gbWFwcGVyLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmltRW5kKHN0ciwgY2gpIHtcbiAgICBsZXQgbGVuID0gc3RyLmxlbmd0aDtcbiAgICB3aGlsZSAobGVuIC0gMSA+PSAwICYmIHN0cltsZW4gLSAxXSA9PT0gY2gpIHtcbiAgICAgICAgLS1sZW47XG4gICAgfVxuICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIGxlbik7XG59XG5mdW5jdGlvbiBidWZmZXJUb0Jhc2U2NFVybChidWZmZXIpIHtcbiAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIShidWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsZWFzZSBwcm92aWRlIGFuIGlucHV0IG9mIHR5cGUgVWludDhBcnJheSBmb3IgY29udmVydGluZyB0byBCYXNlNjRVcmwuYCk7XG4gICAgfVxuICAgIC8vIFVpbnQ4QXJyYXkgdG8gQmFzZTY0LlxuICAgIGNvbnN0IHN0ciA9IGJhc2U2NC5lbmNvZGVCeXRlQXJyYXkoYnVmZmVyKTtcbiAgICAvLyBCYXNlNjQgdG8gQmFzZTY0VXJsLlxuICAgIHJldHVybiB0cmltRW5kKHN0ciwgXCI9XCIpLnJlcGxhY2UoL1xcKy9nLCBcIi1cIikucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcbn1cbmZ1bmN0aW9uIGJhc2U2NFVybFRvQnl0ZUFycmF5KHN0cikge1xuICAgIGlmICghc3RyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChzdHIgJiYgdHlwZW9mIHN0ci52YWx1ZU9mKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgYW4gaW5wdXQgb2YgdHlwZSBzdHJpbmcgZm9yIGNvbnZlcnRpbmcgdG8gVWludDhBcnJheVwiKTtcbiAgICB9XG4gICAgLy8gQmFzZTY0VXJsIHRvIEJhc2U2NC5cbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gICAgLy8gQmFzZTY0IHRvIFVpbnQ4QXJyYXkuXG4gICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVTdHJpbmcoc3RyKTtcbn1cbmZ1bmN0aW9uIHNwbGl0U2VyaWFsaXplTmFtZShwcm9wKSB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuICAgIGxldCBwYXJ0aWFsY2xhc3MgPSBcIlwiO1xuICAgIGlmIChwcm9wKSB7XG4gICAgICAgIGNvbnN0IHN1YndvcmRzID0gcHJvcC5zcGxpdChcIi5cIik7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzdWJ3b3Jkcykge1xuICAgICAgICAgICAgaWYgKGl0ZW0uY2hhckF0KGl0ZW0ubGVuZ3RoIC0gMSkgPT09IFwiXFxcXFwiKSB7XG4gICAgICAgICAgICAgICAgcGFydGlhbGNsYXNzICs9IGl0ZW0uc3Vic3RyKDAsIGl0ZW0ubGVuZ3RoIC0gMSkgKyBcIi5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcnRpYWxjbGFzcyArPSBpdGVtO1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChwYXJ0aWFsY2xhc3MpO1xuICAgICAgICAgICAgICAgIHBhcnRpYWxjbGFzcyA9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG59XG5mdW5jdGlvbiBkYXRlVG9Vbml4VGltZShkKSB7XG4gICAgaWYgKCFkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZC52YWx1ZU9mKCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5mbG9vcihkLmdldFRpbWUoKSAvIDEwMDApO1xufVxuZnVuY3Rpb24gdW5peFRpbWVUb0RhdGUobikge1xuICAgIGlmICghbikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUobiAqIDEwMDApO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplQmFzaWNUeXBlcyh0eXBlTmFtZSwgb2JqZWN0TmFtZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZU5hbWUubWF0Y2goL15OdW1iZXIkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IHdpdGggdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBvZiB0eXBlIG51bWJlci5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlTmFtZS5tYXRjaCgvXlN0cmluZyQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUudmFsdWVPZigpICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IHdpdGggdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZU5hbWUubWF0Y2goL15VdWlkJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCEodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIiAmJiB1dGlscy5pc1ZhbGlkVXVpZCh2YWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IHdpdGggdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgYW5kIGEgdmFsaWQgdXVpZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlTmFtZS5tYXRjaCgvXkJvb2xlYW4kL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSB3aXRoIHZhbHVlICR7dmFsdWV9IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eU3RyZWFtJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0VHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChvYmplY3RUeXBlICE9PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgb2JqZWN0VHlwZSAhPT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSAmJlxuICAgICAgICAgICAgICAgICFBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgISgodHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgQmxvYiA9PT0gXCJvYmplY3RcIikgJiYgdmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIGEgc3RyaW5nLCBCbG9iLCBBcnJheUJ1ZmZlciwgQXJyYXlCdWZmZXJWaWV3LCBvciBhIGZ1bmN0aW9uIHJldHVybmluZyBOb2RlSlMuUmVhZGFibGVTdHJlYW0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplRW51bVR5cGUob2JqZWN0TmFtZSwgYWxsb3dlZFZhbHVlcywgdmFsdWUpIHtcbiAgICBpZiAoIWFsbG93ZWRWYWx1ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbGVhc2UgcHJvdmlkZSBhIHNldCBvZiBhbGxvd2VkVmFsdWVzIHRvIHZhbGlkYXRlICR7b2JqZWN0TmFtZX0gYXMgYW4gRW51bSBUeXBlLmApO1xuICAgIH1cbiAgICBjb25zdCBpc1ByZXNlbnQgPSBhbGxvd2VkVmFsdWVzLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKCFpc1ByZXNlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3ZhbHVlfSBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgJHtvYmplY3ROYW1lfS4gVGhlIHZhbGlkIHZhbHVlcyBhcmU6ICR7SlNPTi5zdHJpbmdpZnkoYWxsb3dlZFZhbHVlcyl9LmApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVCeXRlQXJyYXlUeXBlKG9iamVjdE5hbWUsIHZhbHVlKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gXCJcIjtcbiAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIG9mIHR5cGUgVWludDhBcnJheS5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5WYWx1ZSA9IGJhc2U2NC5lbmNvZGVCeXRlQXJyYXkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVCYXNlNjRVcmxUeXBlKG9iamVjdE5hbWUsIHZhbHVlKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gXCJcIjtcbiAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIG9mIHR5cGUgVWludDhBcnJheS5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5WYWx1ZSA9IGJ1ZmZlclRvQmFzZTY0VXJsKHZhbHVlKSB8fCBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVEYXRlVHlwZXModHlwZU5hbWUsIHZhbHVlLCBvYmplY3ROYW1lKSB7XG4gICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZU5hbWUubWF0Y2goL15EYXRlJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mKCkgPT09IFwic3RyaW5nXCIgJiYgIWlzTmFOKERhdGUucGFyc2UodmFsdWUpKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgYW4gaW5zdGFuY2VvZiBEYXRlIG9yIGEgc3RyaW5nIGluIElTTzg2MDEgZm9ybWF0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWUgPVxuICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKHZhbHVlKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZU5hbWUubWF0Y2goL15EYXRlVGltZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2YgdmFsdWUudmFsdWVPZigpID09PSBcInN0cmluZ1wiICYmICFpc05hTihEYXRlLnBhcnNlKHZhbHVlKSkpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIGFuIGluc3RhbmNlb2YgRGF0ZSBvciBhIHN0cmluZyBpbiBJU084NjAxIGZvcm1hdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUudG9JU09TdHJpbmcoKSA6IG5ldyBEYXRlKHZhbHVlKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eRGF0ZVRpbWVSZmMxMTIzJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mKCkgPT09IFwic3RyaW5nXCIgJiYgIWlzTmFOKERhdGUucGFyc2UodmFsdWUpKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgYW4gaW5zdGFuY2VvZiBEYXRlIG9yIGEgc3RyaW5nIGluIFJGQy0xMTIzIGZvcm1hdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUudG9VVENTdHJpbmcoKSA6IG5ldyBEYXRlKHZhbHVlKS50b1VUQ1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eVW5peFRpbWUkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIiAmJiAhaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpKSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gbXVzdCBiZSBhbiBpbnN0YW5jZW9mIERhdGUgb3IgYSBzdHJpbmcgaW4gUkZDLTExMjMvSVNPODYwMSBmb3JtYXQgYCArXG4gICAgICAgICAgICAgICAgICAgIGBmb3IgaXQgdG8gYmUgc2VyaWFsaXplZCBpbiBVbml4VGltZS9FcG9jaCBmb3JtYXQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IGRhdGVUb1VuaXhUaW1lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlTmFtZS5tYXRjaCgvXlRpbWVTcGFuJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF1dGlscy5pc0R1cmF0aW9uKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIGEgc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdC4gSW5zdGVhZCB3YXMgXCIke3ZhbHVlfVwiLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZVNlcXVlbmNlVHlwZShzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdCwgb2JqZWN0TmFtZSwgaXNYbWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gbXVzdCBiZSBvZiB0eXBlIEFycmF5LmApO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IG1hcHBlci50eXBlLmVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50VHlwZSB8fCB0eXBlb2YgZWxlbWVudFR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbGVtZW50XCIgbWV0YWRhdGEgZm9yIGFuIEFycmF5IG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgYCArXG4gICAgICAgICAgICBgbWFwcGVyIGFuZCBpdCBtdXN0IG9mIHR5cGUgXCJvYmplY3RcIiBpbiAke29iamVjdE5hbWV9LmApO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wQXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShlbGVtZW50VHlwZSwgb2JqZWN0W2ldLCBvYmplY3ROYW1lLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKGlzWG1sICYmIGVsZW1lbnRUeXBlLnhtbE5hbWVzcGFjZSkge1xuICAgICAgICAgICAgY29uc3QgeG1sbnNLZXkgPSBlbGVtZW50VHlwZS54bWxOYW1lc3BhY2VQcmVmaXhcbiAgICAgICAgICAgICAgICA/IGB4bWxuczoke2VsZW1lbnRUeXBlLnhtbE5hbWVzcGFjZVByZWZpeH1gXG4gICAgICAgICAgICAgICAgOiBcInhtbG5zXCI7XG4gICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUudHlwZS5uYW1lID09PSBcIkNvbXBvc2l0ZVwiKSB7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5W2ldID0gT2JqZWN0LmFzc2lnbih7fSwgc2VyaWFsaXplZFZhbHVlKTtcbiAgICAgICAgICAgICAgICB0ZW1wQXJyYXlbaV1bWE1MX0FUVFJLRVldID0geyBbeG1sbnNLZXldOiBlbGVtZW50VHlwZS54bWxOYW1lc3BhY2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRlbXBBcnJheVtpXSA9IHt9O1xuICAgICAgICAgICAgICAgIHRlbXBBcnJheVtpXVtvcHRpb25zLnhtbENoYXJLZXldID0gc2VyaWFsaXplZFZhbHVlO1xuICAgICAgICAgICAgICAgIHRlbXBBcnJheVtpXVtYTUxfQVRUUktFWV0gPSB7IFt4bWxuc0tleV06IGVsZW1lbnRUeXBlLnhtbE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGVtcEFycmF5W2ldID0gc2VyaWFsaXplZFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZW1wQXJyYXk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVEaWN0aW9uYXJ5VHlwZShzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdCwgb2JqZWN0TmFtZSwgaXNYbWwsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9iamVjdCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gbXVzdCBiZSBvZiB0eXBlIG9iamVjdC5gKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVUeXBlID0gbWFwcGVyLnR5cGUudmFsdWU7XG4gICAgaWYgKCF2YWx1ZVR5cGUgfHwgdHlwZW9mIHZhbHVlVHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwidmFsdWVcIiBtZXRhZGF0YSBmb3IgYSBEaWN0aW9uYXJ5IG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgYCArXG4gICAgICAgICAgICBgbWFwcGVyIGFuZCBpdCBtdXN0IG9mIHR5cGUgXCJvYmplY3RcIiBpbiAke29iamVjdE5hbWV9LmApO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wRGljdGlvbmFyeSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iamVjdCkpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplci5zZXJpYWxpemUodmFsdWVUeXBlLCBvYmplY3Rba2V5XSwgb2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IG5lZWRzIGFuIFhNTCBuYW1lc3BhY2Ugd2UgbmVlZCB0byBhZGQgaXQgd2l0aGluIHRoZSAkIHByb3BlcnR5XG4gICAgICAgIHRlbXBEaWN0aW9uYXJ5W2tleV0gPSBnZXRYbWxPYmplY3RWYWx1ZSh2YWx1ZVR5cGUsIHNlcmlhbGl6ZWRWYWx1ZSwgaXNYbWwsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBBZGQgdGhlIG5hbWVzcGFjZSB0byB0aGUgcm9vdCBlbGVtZW50IGlmIG5lZWRlZFxuICAgIGlmIChpc1htbCAmJiBtYXBwZXIueG1sTmFtZXNwYWNlKSB7XG4gICAgICAgIGNvbnN0IHhtbG5zS2V5ID0gbWFwcGVyLnhtbE5hbWVzcGFjZVByZWZpeCA/IGB4bWxuczoke21hcHBlci54bWxOYW1lc3BhY2VQcmVmaXh9YCA6IFwieG1sbnNcIjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVtcERpY3Rpb25hcnk7XG4gICAgICAgIHJlc3VsdFtYTUxfQVRUUktFWV0gPSB7IFt4bWxuc0tleV06IG1hcHBlci54bWxOYW1lc3BhY2UgfTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBEaWN0aW9uYXJ5O1xufVxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWRkaXRpb25hbFByb3BlcnRpZXMgcHJvcGVydHkgZnJvbSBhIHJlZmVyZW5jZWQgbWFwcGVyLlxuICogQHBhcmFtIHNlcmlhbGl6ZXIgLSBUaGUgc2VyaWFsaXplciBjb250YWluaW5nIHRoZSBlbnRpcmUgc2V0IG9mIG1hcHBlcnMuXG4gKiBAcGFyYW0gbWFwcGVyIC0gVGhlIGNvbXBvc2l0ZSBtYXBwZXIgdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBvYmplY3ROYW1lIC0gTmFtZSBvZiB0aGUgb2JqZWN0IGJlaW5nIHNlcmlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBZGRpdGlvbmFsUHJvcGVydGllcyhzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdE5hbWUpIHtcbiAgICBjb25zdCBhZGRpdGlvbmFsUHJvcGVydGllcyA9IG1hcHBlci50eXBlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzO1xuICAgIGlmICghYWRkaXRpb25hbFByb3BlcnRpZXMgJiYgbWFwcGVyLnR5cGUuY2xhc3NOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsTWFwcGVyID0gcmVzb2x2ZVJlZmVyZW5jZWRNYXBwZXIoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3ROYW1lKTtcbiAgICAgICAgcmV0dXJuIG1vZGVsTWFwcGVyID09PSBudWxsIHx8IG1vZGVsTWFwcGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RlbE1hcHBlci50eXBlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzO1xuICAgIH1cbiAgICByZXR1cm4gYWRkaXRpb25hbFByb3BlcnRpZXM7XG59XG4vKipcbiAqIEZpbmRzIHRoZSBtYXBwZXIgcmVmZXJlbmNlZCBieSBgY2xhc3NOYW1lYC5cbiAqIEBwYXJhbSBzZXJpYWxpemVyIC0gVGhlIHNlcmlhbGl6ZXIgY29udGFpbmluZyB0aGUgZW50aXJlIHNldCBvZiBtYXBwZXJzXG4gKiBAcGFyYW0gbWFwcGVyIC0gVGhlIGNvbXBvc2l0ZSBtYXBwZXIgdG8gcmVzb2x2ZVxuICogQHBhcmFtIG9iamVjdE5hbWUgLSBOYW1lIG9mIHRoZSBvYmplY3QgYmVpbmcgc2VyaWFsaXplZFxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVmZXJlbmNlZE1hcHBlcihzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdE5hbWUpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBtYXBwZXIudHlwZS5jbGFzc05hbWU7XG4gICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBuYW1lIGZvciBtb2RlbCBcIiR7b2JqZWN0TmFtZX1cIiBpcyBub3QgcHJvdmlkZWQgaW4gdGhlIG1hcHBlciBcIiR7SlNPTi5zdHJpbmdpZnkobWFwcGVyLCB1bmRlZmluZWQsIDIpfVwiLmApO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplci5tb2RlbE1hcHBlcnNbY2xhc3NOYW1lXTtcbn1cbi8qKlxuICogUmVzb2x2ZXMgYSBjb21wb3NpdGUgbWFwcGVyJ3MgbW9kZWxQcm9wZXJ0aWVzLlxuICogQHBhcmFtIHNlcmlhbGl6ZXIgLSBUaGUgc2VyaWFsaXplciBjb250YWluaW5nIHRoZSBlbnRpcmUgc2V0IG9mIG1hcHBlcnNcbiAqIEBwYXJhbSBtYXBwZXIgLSBUaGUgY29tcG9zaXRlIG1hcHBlciB0byByZXNvbHZlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlbFByb3BlcnRpZXMoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3ROYW1lKSB7XG4gICAgbGV0IG1vZGVsUHJvcHMgPSBtYXBwZXIudHlwZS5tb2RlbFByb3BlcnRpZXM7XG4gICAgaWYgKCFtb2RlbFByb3BzKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsTWFwcGVyID0gcmVzb2x2ZVJlZmVyZW5jZWRNYXBwZXIoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3ROYW1lKTtcbiAgICAgICAgaWYgKCFtb2RlbE1hcHBlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXBwZXIoKSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQgZm9yIG1vZGVsIFwiJHttYXBwZXIudHlwZS5jbGFzc05hbWV9XCIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgbW9kZWxQcm9wcyA9IG1vZGVsTWFwcGVyID09PSBudWxsIHx8IG1vZGVsTWFwcGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RlbE1hcHBlci50eXBlLm1vZGVsUHJvcGVydGllcztcbiAgICAgICAgaWYgKCFtb2RlbFByb3BzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1vZGVsUHJvcGVydGllcyBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQgaW4gdGhlIGAgK1xuICAgICAgICAgICAgICAgIGBtYXBwZXIgXCIke0pTT04uc3RyaW5naWZ5KG1vZGVsTWFwcGVyKX1cIiBvZiB0eXBlIFwiJHttYXBwZXIudHlwZS5jbGFzc05hbWV9XCIgZm9yIG9iamVjdCBcIiR7b2JqZWN0TmFtZX1cIi5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9kZWxQcm9wcztcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUNvbXBvc2l0ZVR5cGUoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3QsIG9iamVjdE5hbWUsIGlzWG1sLCBvcHRpb25zKSB7XG4gICAgaWYgKGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclJlY3Vyc2l2ZWx5KHNlcmlhbGl6ZXIsIG1hcHBlcikpIHtcbiAgICAgICAgbWFwcGVyID0gZ2V0UG9seW1vcnBoaWNNYXBwZXIoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3QsIFwiY2xpZW50TmFtZVwiKTtcbiAgICB9XG4gICAgaWYgKG9iamVjdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCBtb2RlbFByb3BzID0gcmVzb2x2ZU1vZGVsUHJvcGVydGllcyhzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdE5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtb2RlbFByb3BzKSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlNYXBwZXIgPSBtb2RlbFByb3BzW2tleV07XG4gICAgICAgICAgICBpZiAocHJvcGVydHlNYXBwZXIucmVhZE9ubHkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwcm9wTmFtZTtcbiAgICAgICAgICAgIGxldCBwYXJlbnRPYmplY3QgPSBwYXlsb2FkO1xuICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZXIuaXNYTUwpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNYXBwZXIueG1sSXNXcmFwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lID0gcHJvcGVydHlNYXBwZXIueG1sTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lID0gcHJvcGVydHlNYXBwZXIueG1sRWxlbWVudE5hbWUgfHwgcHJvcGVydHlNYXBwZXIueG1sTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IHNwbGl0U2VyaWFsaXplTmFtZShwcm9wZXJ0eU1hcHBlci5zZXJpYWxpemVkTmFtZSk7XG4gICAgICAgICAgICAgICAgcHJvcE5hbWUgPSBwYXRocy5wb3AoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhdGhOYW1lIG9mIHBhdGhzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkT2JqZWN0ID0gcGFyZW50T2JqZWN0W3BhdGhOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkT2JqZWN0ID09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdFtrZXldICE9IHVuZGVmaW5lZCB8fCBwcm9wZXJ0eU1hcHBlci5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE9iamVjdFtwYXRoTmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRPYmplY3QgPSBwYXJlbnRPYmplY3RbcGF0aE5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJlbnRPYmplY3QgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzWG1sICYmIG1hcHBlci54bWxOYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sbnNLZXkgPSBtYXBwZXIueG1sTmFtZXNwYWNlUHJlZml4XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGB4bWxuczoke21hcHBlci54bWxOYW1lc3BhY2VQcmVmaXh9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcInhtbG5zXCI7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE9iamVjdFtYTUxfQVRUUktFWV0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmVudE9iamVjdFtYTUxfQVRUUktFWV0pLCB7IFt4bWxuc0tleV06IG1hcHBlci54bWxOYW1lc3BhY2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5T2JqZWN0TmFtZSA9IHByb3BlcnR5TWFwcGVyLnNlcmlhbGl6ZWROYW1lICE9PSBcIlwiXG4gICAgICAgICAgICAgICAgICAgID8gb2JqZWN0TmFtZSArIFwiLlwiICsgcHJvcGVydHlNYXBwZXIuc2VyaWFsaXplZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgOiBvYmplY3ROYW1lO1xuICAgICAgICAgICAgICAgIGxldCB0b1NlcmlhbGl6ZSA9IG9iamVjdFtrZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvbHltb3JwaGljRGlzY3JpbWluYXRvciA9IGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclJlY3Vyc2l2ZWx5KHNlcmlhbGl6ZXIsIG1hcHBlcik7XG4gICAgICAgICAgICAgICAgaWYgKHBvbHltb3JwaGljRGlzY3JpbWluYXRvciAmJlxuICAgICAgICAgICAgICAgICAgICBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IuY2xpZW50TmFtZSA9PT0ga2V5ICYmXG4gICAgICAgICAgICAgICAgICAgIHRvU2VyaWFsaXplID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0b1NlcmlhbGl6ZSA9IG1hcHBlci5zZXJpYWxpemVkTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplci5zZXJpYWxpemUocHJvcGVydHlNYXBwZXIsIHRvU2VyaWFsaXplLCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wTmFtZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRYbWxPYmplY3RWYWx1ZShwcm9wZXJ0eU1hcHBlciwgc2VyaWFsaXplZFZhbHVlLCBpc1htbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1htbCAmJiBwcm9wZXJ0eU1hcHBlci54bWxJc0F0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gWE1MX0FUVFJLRVksIGkuZS4sICQgaXMgdGhlIGtleSBhdHRyaWJ1dGVzIGFyZSBrZXB0IHVuZGVyIGluIHhtbDJqcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMga2VlcHMgdGhpbmdzIHNpbXBsZSB3aGlsZSBwcmV2ZW50aW5nIG5hbWUgY29sbGlzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIG5hbWVzIGluIHVzZXIgZG9jdW1lbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50T2JqZWN0W1hNTF9BVFRSS0VZXSA9IHBhcmVudE9iamVjdFtYTUxfQVRUUktFWV0gfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRPYmplY3RbWE1MX0FUVFJLRVldW3Byb3BOYW1lXSA9IHNlcmlhbGl6ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1htbCAmJiBwcm9wZXJ0eU1hcHBlci54bWxJc1dyYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE9iamVjdFtwcm9wTmFtZV0gPSB7IFtwcm9wZXJ0eU1hcHBlci54bWxFbGVtZW50TmFtZV06IHZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRPYmplY3RbcHJvcE5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFByb3BlcnRpZXNNYXBwZXIgPSByZXNvbHZlQWRkaXRpb25hbFByb3BlcnRpZXMoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3ROYW1lKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxQcm9wZXJ0aWVzTWFwcGVyKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhtb2RlbFByb3BzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2xpZW50UHJvcE5hbWUgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNBZGRpdGlvbmFsUHJvcGVydHkgPSBwcm9wTmFtZXMuZXZlcnkoKHBuKSA9PiBwbiAhPT0gY2xpZW50UHJvcE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc0FkZGl0aW9uYWxQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkW2NsaWVudFByb3BOYW1lXSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFkZGl0aW9uYWxQcm9wZXJ0aWVzTWFwcGVyLCBvYmplY3RbY2xpZW50UHJvcE5hbWVdLCBvYmplY3ROYW1lICsgJ1tcIicgKyBjbGllbnRQcm9wTmFtZSArICdcIl0nLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG59XG5mdW5jdGlvbiBnZXRYbWxPYmplY3RWYWx1ZShwcm9wZXJ0eU1hcHBlciwgc2VyaWFsaXplZFZhbHVlLCBpc1htbCwgb3B0aW9ucykge1xuICAgIGlmICghaXNYbWwgfHwgIXByb3BlcnR5TWFwcGVyLnhtbE5hbWVzcGFjZSkge1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCB4bWxuc0tleSA9IHByb3BlcnR5TWFwcGVyLnhtbE5hbWVzcGFjZVByZWZpeFxuICAgICAgICA/IGB4bWxuczoke3Byb3BlcnR5TWFwcGVyLnhtbE5hbWVzcGFjZVByZWZpeH1gXG4gICAgICAgIDogXCJ4bWxuc1wiO1xuICAgIGNvbnN0IHhtbE5hbWVzcGFjZSA9IHsgW3htbG5zS2V5XTogcHJvcGVydHlNYXBwZXIueG1sTmFtZXNwYWNlIH07XG4gICAgaWYgKFtcIkNvbXBvc2l0ZVwiXS5pbmNsdWRlcyhwcm9wZXJ0eU1hcHBlci50eXBlLm5hbWUpKSB7XG4gICAgICAgIGlmIChzZXJpYWxpemVkVmFsdWVbWE1MX0FUVFJLRVldKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgc2VyaWFsaXplZFZhbHVlKTtcbiAgICAgICAgICAgIHJlc3VsdFtYTUxfQVRUUktFWV0gPSB4bWxOYW1lc3BhY2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIHJlc3VsdFtvcHRpb25zLnhtbENoYXJLZXldID0gc2VyaWFsaXplZFZhbHVlO1xuICAgIHJlc3VsdFtYTUxfQVRUUktFWV0gPSB4bWxOYW1lc3BhY2U7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGlzU3BlY2lhbFhtbFByb3BlcnR5KHByb3BlcnR5TmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBbWE1MX0FUVFJLRVksIG9wdGlvbnMueG1sQ2hhcktleV0uaW5jbHVkZXMocHJvcGVydHlOYW1lKTtcbn1cbmZ1bmN0aW9uIGRlc2VyaWFsaXplQ29tcG9zaXRlVHlwZShzZXJpYWxpemVyLCBtYXBwZXIsIHJlc3BvbnNlQm9keSwgb2JqZWN0TmFtZSwgb3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgeG1sQ2hhcktleSA9IChfYSA9IG9wdGlvbnMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogWE1MX0NIQVJLRVk7XG4gICAgaWYgKGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclJlY3Vyc2l2ZWx5KHNlcmlhbGl6ZXIsIG1hcHBlcikpIHtcbiAgICAgICAgbWFwcGVyID0gZ2V0UG9seW1vcnBoaWNNYXBwZXIoc2VyaWFsaXplciwgbWFwcGVyLCByZXNwb25zZUJvZHksIFwic2VyaWFsaXplZE5hbWVcIik7XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsUHJvcHMgPSByZXNvbHZlTW9kZWxQcm9wZXJ0aWVzKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSk7XG4gICAgbGV0IGluc3RhbmNlID0ge307XG4gICAgY29uc3QgaGFuZGxlZFByb3BlcnR5TmFtZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtb2RlbFByb3BzKSkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU1hcHBlciA9IG1vZGVsUHJvcHNba2V5XTtcbiAgICAgICAgY29uc3QgcGF0aHMgPSBzcGxpdFNlcmlhbGl6ZU5hbWUobW9kZWxQcm9wc1trZXldLnNlcmlhbGl6ZWROYW1lKTtcbiAgICAgICAgaGFuZGxlZFByb3BlcnR5TmFtZXMucHVzaChwYXRoc1swXSk7XG4gICAgICAgIGNvbnN0IHsgc2VyaWFsaXplZE5hbWUsIHhtbE5hbWUsIHhtbEVsZW1lbnROYW1lIH0gPSBwcm9wZXJ0eU1hcHBlcjtcbiAgICAgICAgbGV0IHByb3BlcnR5T2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XG4gICAgICAgIGlmIChzZXJpYWxpemVkTmFtZSAhPT0gXCJcIiAmJiBzZXJpYWxpemVkTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eU9iamVjdE5hbWUgPSBvYmplY3ROYW1lICsgXCIuXCIgKyBzZXJpYWxpemVkTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJDb2xsZWN0aW9uUHJlZml4ID0gcHJvcGVydHlNYXBwZXIuaGVhZGVyQ29sbGVjdGlvblByZWZpeDtcbiAgICAgICAgaWYgKGhlYWRlckNvbGxlY3Rpb25QcmVmaXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyS2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlQm9keSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyS2V5LnN0YXJ0c1dpdGgoaGVhZGVyQ29sbGVjdGlvblByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVtoZWFkZXJLZXkuc3Vic3RyaW5nKGhlYWRlckNvbGxlY3Rpb25QcmVmaXgubGVuZ3RoKV0gPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHByb3BlcnR5TWFwcGVyLnR5cGUudmFsdWUsIHJlc3BvbnNlQm9keVtoZWFkZXJLZXldLCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVkUHJvcGVydHlOYW1lcy5wdXNoKGhlYWRlcktleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gZGljdGlvbmFyeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzZXJpYWxpemVyLmlzWE1MKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHlNYXBwZXIueG1sSXNBdHRyaWJ1dGUgJiYgcmVzcG9uc2VCb2R5W1hNTF9BVFRSS0VZXSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlW2tleV0gPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHByb3BlcnR5TWFwcGVyLCByZXNwb25zZUJvZHlbWE1MX0FUVFJLRVldW3htbE5hbWVdLCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlNYXBwZXIueG1sSXNNc1RleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VCb2R5W3htbENoYXJLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHJlc3BvbnNlQm9keVt4bWxDaGFyS2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHJlc3BvbnNlQm9keSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3BlY2lhbCBjYXNlIHdoZXJlIHhtbCBwYXJzZXIgcGFyc2VzIFwiPE5hbWU+Y29udGVudDwvTmFtZT5cIiBpbnRvIEpTT04gb2ZcbiAgICAgICAgICAgICAgICAgICAgLy8gICBgeyBuYW1lOiBcImNvbnRlbnRcIn1gIGluc3RlYWQgb2YgYHsgbmFtZTogeyBcIl9cIjogXCJjb250ZW50XCIgfX1gXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW2tleV0gPSByZXNwb25zZUJvZHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0geG1sRWxlbWVudE5hbWUgfHwgeG1sTmFtZSB8fCBzZXJpYWxpemVkTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNYXBwZXIueG1sSXNXcmFwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIGEgbGlzdCBvZiA8eG1sRWxlbWVudE5hbWU+IHdyYXBwZWQgYnkgPHhtbE5hbWU+XG4gICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSB4bWwgZXhhbXBsZSBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgPENvcnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxDb3JzUnVsZT4uLi48L0NvcnNSdWxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29yc1J1bGU+Li4uPC9Db3JzUnVsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQ29ycz5cbiAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzcG9uc2VCb2R5IGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yc1J1bGU6IFt7Li4ufSwgey4uLn1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB4bWxOYW1lIGlzIFwiQ29yc1wiIGFuZCB4bWxFbGVtZW50TmFtZSBpc1wiQ29yc1J1bGVcIi5cbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZCA9IHJlc3BvbnNlQm9keVt4bWxOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudExpc3QgPSAoX2IgPSB3cmFwcGVkID09PSBudWxsIHx8IHdyYXBwZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdyYXBwZWRbeG1sRWxlbWVudE5hbWVdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocHJvcGVydHlNYXBwZXIsIGVsZW1lbnRMaXN0LCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkUHJvcGVydHlOYW1lcy5wdXNoKHhtbE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSByZXNwb25zZUJvZHlbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocHJvcGVydHlNYXBwZXIsIHByb3BlcnR5LCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkUHJvcGVydHlOYW1lcy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVzZXJpYWxpemUgdGhlIHByb3BlcnR5IGlmIGl0IGlzIHByZXNlbnQgaW4gdGhlIHByb3ZpZGVkIHJlc3BvbnNlQm9keSBpbnN0YW5jZVxuICAgICAgICAgICAgbGV0IHByb3BlcnR5SW5zdGFuY2U7XG4gICAgICAgICAgICBsZXQgcmVzID0gcmVzcG9uc2VCb2R5O1xuICAgICAgICAgICAgLy8gdHJhdmVyc2luZyB0aGUgb2JqZWN0IHN0ZXAgYnkgc3RlcC5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXRocykge1xuICAgICAgICAgICAgICAgIGlmICghcmVzKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICByZXMgPSByZXNbaXRlbV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9wZXJ0eUluc3RhbmNlID0gcmVzO1xuICAgICAgICAgICAgY29uc3QgcG9seW1vcnBoaWNEaXNjcmltaW5hdG9yID0gbWFwcGVyLnR5cGUucG9seW1vcnBoaWNEaXNjcmltaW5hdG9yO1xuICAgICAgICAgICAgLy8gY2hlY2tpbmcgdGhhdCB0aGUgbW9kZWwgcHJvcGVydHkgbmFtZSAoa2V5KShleDogXCJmaXNodHlwZVwiKSBhbmQgdGhlXG4gICAgICAgICAgICAvLyBjbGllbnROYW1lIG9mIHRoZSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3Ige21ldGFkYXRhfSAoZXg6IFwiZmlzaHR5cGVcIilcbiAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHNlcmlhbGl6ZWROYW1lIG9mIHRoZSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgKGV4OiBcImZpc2gudHlwZVwiKVxuICAgICAgICAgICAgLy8gaXMgYSBiZXR0ZXIgYXBwcm9hY2guIFRoZSBnZW5lcmF0b3IgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCBlc2NhcGluZyAnXFwuJyBpbiB0aGVcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWROYW1lIG9mIHRoZSBwcm9wZXJ0eSAoZXg6IFwiZmlzaFxcLnR5cGVcIikgdGhhdCBpcyBtYXJrZWQgYXMgcG9seW1vcnBoaWMgZGlzY3JpbWluYXRvclxuICAgICAgICAgICAgLy8gYW5kIHRoZSBzZXJpYWxpemVkTmFtZSBvZiB0aGUgbWV0YWRhdGEgcG9seW1vcnBoaWNEaXNjcmltaW5hdG9yIChleDogXCJmaXNoLnR5cGVcIikuIEhvd2V2ZXIsXG4gICAgICAgICAgICAvLyB0aGUgY2xpZW50TmFtZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgcG9seW1vcnBoaWNEaXNjcmltaW5hdG9yIChleDogXCJmaXNodHlwZVwiKSBhbmRcbiAgICAgICAgICAgIC8vIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBtb2RlbCBwcm9wZXJ0eSBuYW1lIChleDogXCJmaXNodHlwZVwiKSBpcyBkb25lIGNvbnNpc3RlbnRseS5cbiAgICAgICAgICAgIC8vIEhlbmNlLCBpdCBpcyBhIHNhZmVyIGJldCB0byByZWx5IG9uIHRoZSBjbGllbnROYW1lIG9mIHRoZSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IuXG4gICAgICAgICAgICBpZiAocG9seW1vcnBoaWNEaXNjcmltaW5hdG9yICYmXG4gICAgICAgICAgICAgICAga2V5ID09PSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IuY2xpZW50TmFtZSAmJlxuICAgICAgICAgICAgICAgIHByb3BlcnR5SW5zdGFuY2UgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlJbnN0YW5jZSA9IG1hcHBlci5zZXJpYWxpemVkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzZXJpYWxpemVkVmFsdWU7XG4gICAgICAgICAgICAvLyBwYWdpbmdcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlQm9keVtrZXldKSAmJiBtb2RlbFByb3BzW2tleV0uc2VyaWFsaXplZE5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUluc3RhbmNlID0gcmVzcG9uc2VCb2R5W2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlJbnN0YW5jZSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocHJvcGVydHlNYXBwZXIsIHByb3BlcnR5SW5zdGFuY2UsIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgLy8gQ29weSBvdmVyIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgaW50byB0aGUgaW5zdGFuY2UsIHdoZXJlIHRoZXkgZG9cbiAgICAgICAgICAgICAgICAvLyBub3QgZXhpc3Qgb24gdGhlIG5ld2x5IGRlLXNlcmlhbGl6ZWQgYXJyYXlcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhpbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJyYXlJbnN0YW5jZSwgaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5SW5zdGFuY2Vba10gPSB2O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluc3RhbmNlID0gYXJyYXlJbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SW5zdGFuY2UgIT09IHVuZGVmaW5lZCB8fCBwcm9wZXJ0eU1hcHBlci5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRWYWx1ZSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocHJvcGVydHlNYXBwZXIsIHByb3BlcnR5SW5zdGFuY2UsIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHNlcmlhbGl6ZWRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhZGRpdGlvbmFsUHJvcGVydGllc01hcHBlciA9IG1hcHBlci50eXBlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzO1xuICAgIGlmIChhZGRpdGlvbmFsUHJvcGVydGllc01hcHBlcikge1xuICAgICAgICBjb25zdCBpc0FkZGl0aW9uYWxQcm9wZXJ0eSA9IChyZXNwb25zZVByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNsaWVudFByb3BOYW1lIGluIG1vZGVsUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IHNwbGl0U2VyaWFsaXplTmFtZShtb2RlbFByb3BzW2NsaWVudFByb3BOYW1lXS5zZXJpYWxpemVkTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGhzWzBdID09PSByZXNwb25zZVByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZVByb3BOYW1lIGluIHJlc3BvbnNlQm9keSkge1xuICAgICAgICAgICAgaWYgKGlzQWRkaXRpb25hbFByb3BlcnR5KHJlc3BvbnNlUHJvcE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VbcmVzcG9uc2VQcm9wTmFtZV0gPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGFkZGl0aW9uYWxQcm9wZXJ0aWVzTWFwcGVyLCByZXNwb25zZUJvZHlbcmVzcG9uc2VQcm9wTmFtZV0sIG9iamVjdE5hbWUgKyAnW1wiJyArIHJlc3BvbnNlUHJvcE5hbWUgKyAnXCJdJywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAocmVzcG9uc2VCb2R5KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlQm9keSkpIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZVtrZXldID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhaGFuZGxlZFByb3BlcnR5TmFtZXMuaW5jbHVkZXMoa2V5KSAmJlxuICAgICAgICAgICAgICAgICFpc1NwZWNpYWxYbWxQcm9wZXJ0eShrZXksIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHJlc3BvbnNlQm9keVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGRlc2VyaWFsaXplRGljdGlvbmFyeVR5cGUoc2VyaWFsaXplciwgbWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1hcHBlci50eXBlLnZhbHVlO1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJ2YWx1ZVwiIG1ldGFkYXRhIGZvciBhIERpY3Rpb25hcnkgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBgICtcbiAgICAgICAgICAgIGBtYXBwZXIgYW5kIGl0IG11c3Qgb2YgdHlwZSBcIm9iamVjdFwiIGluICR7b2JqZWN0TmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlQm9keSkge1xuICAgICAgICBjb25zdCB0ZW1wRGljdGlvbmFyeSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZXNwb25zZUJvZHkpKSB7XG4gICAgICAgICAgICB0ZW1wRGljdGlvbmFyeVtrZXldID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh2YWx1ZSwgcmVzcG9uc2VCb2R5W2tleV0sIG9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZW1wRGljdGlvbmFyeTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlQm9keTtcbn1cbmZ1bmN0aW9uIGRlc2VyaWFsaXplU2VxdWVuY2VUeXBlKHNlcmlhbGl6ZXIsIG1hcHBlciwgcmVzcG9uc2VCb2R5LCBvYmplY3ROYW1lLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG1hcHBlci50eXBlLmVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50IHx8IHR5cGVvZiBlbGVtZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZWxlbWVudFwiIG1ldGFkYXRhIGZvciBhbiBBcnJheSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGAgK1xuICAgICAgICAgICAgYG1hcHBlciBhbmQgaXQgbXVzdCBvZiB0eXBlIFwib2JqZWN0XCIgaW4gJHtvYmplY3ROYW1lfWApO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2VCb2R5KSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXNwb25zZUJvZHkpKSB7XG4gICAgICAgICAgICAvLyB4bWwyanMgd2lsbCBpbnRlcnByZXQgYSBzaW5nbGUgZWxlbWVudCBhcnJheSBhcyBqdXN0IHRoZSBlbGVtZW50LCBzbyBmb3JjZSBpdCB0byBiZSBhbiBhcnJheVxuICAgICAgICAgICAgcmVzcG9uc2VCb2R5ID0gW3Jlc3BvbnNlQm9keV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGVtcEFycmF5ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2VCb2R5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0ZW1wQXJyYXlbaV0gPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGVsZW1lbnQsIHJlc3BvbnNlQm9keVtpXSwgYCR7b2JqZWN0TmFtZX1bJHtpfV1gLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGVtcEFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VCb2R5O1xufVxuZnVuY3Rpb24gZ2V0UG9seW1vcnBoaWNNYXBwZXIoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3QsIHBvbHltb3JwaGljUHJvcGVydHlOYW1lKSB7XG4gICAgY29uc3QgcG9seW1vcnBoaWNEaXNjcmltaW5hdG9yID0gZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yUmVjdXJzaXZlbHkoc2VyaWFsaXplciwgbWFwcGVyKTtcbiAgICBpZiAocG9seW1vcnBoaWNEaXNjcmltaW5hdG9yKSB7XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JOYW1lID0gcG9seW1vcnBoaWNEaXNjcmltaW5hdG9yW3BvbHltb3JwaGljUHJvcGVydHlOYW1lXTtcbiAgICAgICAgaWYgKGRpc2NyaW1pbmF0b3JOYW1lICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvclZhbHVlID0gb2JqZWN0W2Rpc2NyaW1pbmF0b3JOYW1lXTtcbiAgICAgICAgICAgIGlmIChkaXNjcmltaW5hdG9yVmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBtYXBwZXIudHlwZS51YmVyUGFyZW50IHx8IG1hcHBlci50eXBlLmNsYXNzTmFtZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleERpc2NyaW1pbmF0b3IgPSBkaXNjcmltaW5hdG9yVmFsdWUgPT09IHR5cGVOYW1lXG4gICAgICAgICAgICAgICAgICAgID8gZGlzY3JpbWluYXRvclZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogdHlwZU5hbWUgKyBcIi5cIiArIGRpc2NyaW1pbmF0b3JWYWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2x5bW9ycGhpY01hcHBlciA9IHNlcmlhbGl6ZXIubW9kZWxNYXBwZXJzLmRpc2NyaW1pbmF0b3JzW2luZGV4RGlzY3JpbWluYXRvcl07XG4gICAgICAgICAgICAgICAgaWYgKHBvbHltb3JwaGljTWFwcGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcHBlciA9IHBvbHltb3JwaGljTWFwcGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGVyO1xufVxuZnVuY3Rpb24gZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yUmVjdXJzaXZlbHkoc2VyaWFsaXplciwgbWFwcGVyKSB7XG4gICAgcmV0dXJuIChtYXBwZXIudHlwZS5wb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgfHxcbiAgICAgICAgZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yU2FmZWx5KHNlcmlhbGl6ZXIsIG1hcHBlci50eXBlLnViZXJQYXJlbnQpIHx8XG4gICAgICAgIGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclNhZmVseShzZXJpYWxpemVyLCBtYXBwZXIudHlwZS5jbGFzc05hbWUpKTtcbn1cbmZ1bmN0aW9uIGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclNhZmVseShzZXJpYWxpemVyLCB0eXBlTmFtZSkge1xuICAgIHJldHVybiAodHlwZU5hbWUgJiZcbiAgICAgICAgc2VyaWFsaXplci5tb2RlbE1hcHBlcnNbdHlwZU5hbWVdICYmXG4gICAgICAgIHNlcmlhbGl6ZXIubW9kZWxNYXBwZXJzW3R5cGVOYW1lXS50eXBlLnBvbHltb3JwaGljRGlzY3JpbWluYXRvcik7XG59XG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGFuIG9iamVjdCB0aGF0IG1pZ2h0IGNvbnRhaW4gYmluYXJ5IGluZm9ybWF0aW9uIGludG8gYSBwbGFpbiBvYmplY3QsIGFycmF5IG9yIGEgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplT2JqZWN0KHRvU2VyaWFsaXplKSB7XG4gICAgY29uc3QgY2FzdFRvU2VyaWFsaXplID0gdG9TZXJpYWxpemU7XG4gICAgaWYgKHRvU2VyaWFsaXplID09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodG9TZXJpYWxpemUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHRvU2VyaWFsaXplID0gYmFzZTY0LmVuY29kZUJ5dGVBcnJheSh0b1NlcmlhbGl6ZSk7XG4gICAgICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9TZXJpYWxpemUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiB0b1NlcmlhbGl6ZS50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRvU2VyaWFsaXplKSkge1xuICAgICAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvU2VyaWFsaXplLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcnJheS5wdXNoKHNlcmlhbGl6ZU9iamVjdCh0b1NlcmlhbGl6ZVtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHRvU2VyaWFsaXplID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0b1NlcmlhbGl6ZSkge1xuICAgICAgICAgICAgZGljdGlvbmFyeVtwcm9wZXJ0eV0gPSBzZXJpYWxpemVPYmplY3QoY2FzdFRvU2VyaWFsaXplW3Byb3BlcnR5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnk7XG4gICAgfVxuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbn1cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgYSBLOlYgZnJvbSBhIGxpc3Qgb2Ygc3RyaW5nc1xuICovXG5mdW5jdGlvbiBzdHJFbnVtKG8pIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0ga2V5O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBTdHJpbmcgZW51bSBjb250YWluaW5nIHRoZSBzdHJpbmcgdHlwZXMgb2YgcHJvcGVydHkgbWFwcGVycy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZWRlY2xhcmVcbmV4cG9ydCBjb25zdCBNYXBwZXJUeXBlID0gc3RyRW51bShbXG4gICAgXCJCYXNlNjRVcmxcIixcbiAgICBcIkJvb2xlYW5cIixcbiAgICBcIkJ5dGVBcnJheVwiLFxuICAgIFwiQ29tcG9zaXRlXCIsXG4gICAgXCJEYXRlXCIsXG4gICAgXCJEYXRlVGltZVwiLFxuICAgIFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgXCJEaWN0aW9uYXJ5XCIsXG4gICAgXCJFbnVtXCIsXG4gICAgXCJOdW1iZXJcIixcbiAgICBcIk9iamVjdFwiLFxuICAgIFwiU2VxdWVuY2VcIixcbiAgICBcIlN0cmluZ1wiLFxuICAgIFwiU3RyZWFtXCIsXG4gICAgXCJUaW1lU3BhblwiLFxuICAgIFwiVW5peFRpbWVcIixcbl0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VyaWFsaXplci5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKlxuICogQ29kZSBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IChSKSBBdXRvUmVzdCBDb2RlIEdlbmVyYXRvci5cbiAqIENoYW5nZXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgY29uc3QgQmxvYlNlcnZpY2VQcm9wZXJ0aWVzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JTZXJ2aWNlUHJvcGVydGllc1wiLFxuICAgIHhtbE5hbWU6IFwiU3RvcmFnZVNlcnZpY2VQcm9wZXJ0aWVzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNlcnZpY2VQcm9wZXJ0aWVzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgYmxvYkFuYWx5dGljc0xvZ2dpbmc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMb2dnaW5nXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMb2dnaW5nXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiTG9nZ2luZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvdXJNZXRyaWNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSG91ck1ldHJpY3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkhvdXJNZXRyaWNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiTWV0cmljc1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1pbnV0ZU1ldHJpY3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNaW51dGVNZXRyaWNzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNaW51dGVNZXRyaWNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiTWV0cmljc1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcnM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb3JzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3JzXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkNvcnNSdWxlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJDb3JzUnVsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVmYXVsdFNlcnZpY2VWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWZhdWx0U2VydmljZVZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlUmV0ZW50aW9uUG9saWN5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlUmV0ZW50aW9uUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWxldGVSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0aWNXZWJzaXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU3RhdGljV2Vic2l0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU3RhdGljV2Vic2l0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlN0YXRpY1dlYnNpdGVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgTG9nZ2luZyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJMb2dnaW5nXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiTG9nZ2luZ1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlbGV0ZVByb3BlcnR5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWxldGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlYWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZWFkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJSZWFkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cml0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIldyaXRlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJXcml0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmV0ZW50aW9uUG9saWN5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUmV0ZW50aW9uUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUmV0ZW50aW9uUG9saWN5ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXlzOiB7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgICAgICAgICAgSW5jbHVzaXZlTWluaW11bTogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGF5c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGF5c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgTWV0cmljcyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJNZXRyaWNzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiTWV0cmljc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdWRlQVBJczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkluY2x1ZGVBUElzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJbmNsdWRlQVBJc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmV0ZW50aW9uUG9saWN5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUmV0ZW50aW9uUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29yc1J1bGUgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29yc1J1bGVcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb3JzUnVsZVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGFsbG93ZWRPcmlnaW5zOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWxsb3dlZE9yaWdpbnNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkFsbG93ZWRPcmlnaW5zXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWxsb3dlZE1ldGhvZHNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkFsbG93ZWRNZXRob2RzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFsbG93ZWRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWxsb3dlZEhlYWRlcnNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkFsbG93ZWRIZWFkZXJzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cG9zZWRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRXhwb3NlZEhlYWRlcnNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkV4cG9zZWRIZWFkZXJzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heEFnZUluU2Vjb25kczoge1xuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIEluY2x1c2l2ZU1pbmltdW06IDBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1heEFnZUluU2Vjb25kc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWF4QWdlSW5TZWNvbmRzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTdGF0aWNXZWJzaXRlID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlN0YXRpY1dlYnNpdGVcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTdGF0aWNXZWJzaXRlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluZGV4RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJbmRleERvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJbmRleERvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yRG9jdW1lbnQ0MDRQYXRoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRXJyb3JEb2N1bWVudDQwNFBhdGhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVycm9yRG9jdW1lbnQ0MDRQYXRoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHRJbmRleERvY3VtZW50UGF0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlZmF1bHRJbmRleERvY3VtZW50UGF0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVmYXVsdEluZGV4RG9jdW1lbnRQYXRoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTdG9yYWdlRXJyb3IgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU3RvcmFnZUVycm9yXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU3RvcmFnZUVycm9yXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1lc3NhZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk1lc3NhZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXJ2aWNlU3RhdGlzdGljcyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iU2VydmljZVN0YXRpc3RpY3NcIixcbiAgICB4bWxOYW1lOiBcIlN0b3JhZ2VTZXJ2aWNlU3RhdHNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2VydmljZVN0YXRpc3RpY3NcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBnZW9SZXBsaWNhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkdlb1JlcGxpY2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJHZW9SZXBsaWNhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkdlb1JlcGxpY2F0aW9uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEdlb1JlcGxpY2F0aW9uID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkdlb1JlcGxpY2F0aW9uXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiR2VvUmVwbGljYXRpb25cIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTdGF0dXNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxpdmVcIiwgXCJib290c3RyYXBcIiwgXCJ1bmF2YWlsYWJsZVwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0U3luY09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGFzdFN5bmNUaW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMYXN0U3luY1RpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IExpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlXCIsXG4gICAgeG1sTmFtZTogXCJFbnVtZXJhdGlvblJlc3VsdHNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJMaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VydmljZUVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZWZpeDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlByZWZpeFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHJlZml4XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1hcmtlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heFBhZ2VTaXplOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWF4UmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWF4UmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWluZXJJdGVtczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lckl0ZW1zXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250YWluZXJzXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkNvbnRhaW5lclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVySXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW46IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJJdGVtID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lckl0ZW1cIixcbiAgICB4bWxOYW1lOiBcIkNvbnRhaW5lclwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckl0ZW1cIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxldGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVsZXRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlByb3BlcnRpZXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlByb3BlcnRpZXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJQcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJQcm9wZXJ0aWVzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lclByb3BlcnRpZXNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJQcm9wZXJ0aWVzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRXRhZ1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxlYXNlU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMZWFzZVN0YXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZVN0YXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVhc2VkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImV4cGlyZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJlYWtpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUR1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGVhc2VEdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTGVhc2VEdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImluZmluaXRlXCIsIFwiZml4ZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHVibGljQWNjZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUHVibGljQWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQdWJsaWNBY2Nlc3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJjb250YWluZXJcIiwgXCJibG9iXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0ltbXV0YWJpbGl0eVBvbGljeToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkhhc0ltbXV0YWJpbGl0eVBvbGljeVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSGFzSW1tdXRhYmlsaXR5UG9saWN5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNMZWdhbEhvbGQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJIYXNMZWdhbEhvbGRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkhhc0xlZ2FsSG9sZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVmYXVsdEVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlZmF1bHRFbmNyeXB0aW9uU2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlZmF1bHRFbmNyeXB0aW9uU2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJldmVudEVuY3J5cHRpb25TY29wZU92ZXJyaWRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVueUVuY3J5cHRpb25TY29wZU92ZXJyaWRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZW55RW5jcnlwdGlvblNjb3BlT3ZlcnJpZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlbGV0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGV0ZWRUaW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWxldGVkVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZW1haW5pbmdSZXRlbnRpb25EYXlzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUmVtYWluaW5nUmV0ZW50aW9uRGF5c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmVtYWluaW5nUmV0ZW50aW9uRGF5c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc0ltbXV0YWJsZVN0b3JhZ2VXaXRoVmVyc2lvbmluZ0VuYWJsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJbW11dGFibGVTdG9yYWdlV2l0aFZlcnNpb25pbmdFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJbW11dGFibGVTdG9yYWdlV2l0aFZlcnNpb25pbmdFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgS2V5SW5mbyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJLZXlJbmZvXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiS2V5SW5mb1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHN0YXJ0c09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU3RhcnRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkV4cGlyeVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXhwaXJ5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBVc2VyRGVsZWdhdGlvbktleSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJVc2VyRGVsZWdhdGlvbktleVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlVzZXJEZWxlZ2F0aW9uS2V5XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc2lnbmVkT2JqZWN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRPaWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNpZ25lZE9pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduZWRUZW5hbnRJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZFRpZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkVGlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25lZFN0YXJ0c09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2lnbmVkU3RhcnRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNpZ25lZFN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25lZEV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZEV4cGlyeVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkRXhwaXJ5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25lZFNlcnZpY2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRTZXJ2aWNlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTaWduZWRTZXJ2aWNlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25lZFZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTaWduZWRWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVmFsdWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlZhbHVlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBGaWx0ZXJCbG9iU2VnbWVudCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJGaWx0ZXJCbG9iU2VnbWVudFwiLFxuICAgIHhtbE5hbWU6IFwiRW51bWVyYXRpb25SZXN1bHRzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiRmlsdGVyQmxvYlNlZ21lbnRcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlRW5kcG9pbnRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHhtbElzQXR0cmlidXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIldoZXJlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJXaGVyZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJCbG9ic1wiLFxuICAgICAgICAgICAgICAgIHhtbElzV3JhcHBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJCbG9iXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJGaWx0ZXJCbG9iSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW46IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBGaWx0ZXJCbG9iSXRlbSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJGaWx0ZXJCbG9iSXRlbVwiLFxuICAgIHhtbE5hbWU6IFwiQmxvYlwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkZpbHRlckJsb2JJdGVtXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGFpbmVyTmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lck5hbWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRhaW5lck5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFnczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlRhZ3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlRhZ3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVGFnc1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iVGFncyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iVGFnc1wiLFxuICAgIHhtbE5hbWU6IFwiVGFnc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JUYWdzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgYmxvYlRhZ1NldDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JUYWdTZXRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlRhZ1NldFwiLFxuICAgICAgICAgICAgICAgIHhtbElzV3JhcHBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJUYWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JUYWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iVGFnID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JUYWdcIixcbiAgICB4bWxOYW1lOiBcIlRhZ1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JUYWdcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJLZXlcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIktleVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlZhbHVlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJWYWx1ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgU2lnbmVkSWRlbnRpZmllciA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCIsXG4gICAgeG1sTmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2lnbmVkSWRlbnRpZmllclwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIklkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2Vzc1BvbGljeToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFjY2Vzc1BvbGljeVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWNjZXNzUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQWNjZXNzUG9saWN5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFjY2Vzc1BvbGljeSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJBY2Nlc3NQb2xpY3lcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBY2Nlc3NQb2xpY3lcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzdGFydHNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFeHBpcnlcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkV4cGlyeVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBlcm1pc3Npb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlBlcm1pc3Npb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IExpc3RCbG9ic0ZsYXRTZWdtZW50UmVzcG9uc2UgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZVwiLFxuICAgIHhtbE5hbWU6IFwiRW51bWVyYXRpb25SZXN1bHRzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VydmljZUVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250YWluZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZWZpeDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlByZWZpeFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHJlZml4XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1hcmtlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heFBhZ2VTaXplOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWF4UmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWF4UmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWdtZW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2VnbWVudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQmxvYnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iRmxhdExpc3RTZWdtZW50XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW46IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iRmxhdExpc3RTZWdtZW50ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JGbGF0TGlzdFNlZ21lbnRcIixcbiAgICB4bWxOYW1lOiBcIkJsb2JzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkZsYXRMaXN0U2VnbWVudFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGJsb2JJdGVtczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JJdGVtc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQmxvYkl0ZW1zXCIsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiQmxvYlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkl0ZW1JbnRlcm5hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JJdGVtSW50ZXJuYWwgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYkl0ZW1JbnRlcm5hbFwiLFxuICAgIHhtbE5hbWU6IFwiQmxvYlwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JJdGVtSW50ZXJuYWxcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JOYW1lXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGV0ZWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNuYXBzaG90OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU25hcHNob3RcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlZlcnNpb25JZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVmVyc2lvbklkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzQ3VycmVudFZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJc0N1cnJlbnRWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJc0N1cnJlbnRWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUHJvcGVydGllc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHJvcGVydGllc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JQcm9wZXJ0aWVzSW50ZXJuYWxcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1ldGFkYXRhXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlRhZ3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iVGFnc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVGFnc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JUYWdzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0UmVwbGljYXRpb25NZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk9iamVjdFJlcGxpY2F0aW9uTWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk9yTWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc1ZlcnNpb25zT25seToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkhhc1ZlcnNpb25zT25seVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSGFzVmVyc2lvbnNPbmx5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYk5hbWUgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYk5hbWVcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iTmFtZVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVuY29kZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmNvZGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFbmNvZGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudFwiLFxuICAgICAgICAgICAgICAgIHhtbElzTXNUZXh0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlByb3BlcnRpZXNJbnRlcm5hbCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iUHJvcGVydGllc0ludGVybmFsXCIsXG4gICAgeG1sTmFtZTogXCJQcm9wZXJ0aWVzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlByb3BlcnRpZXNJbnRlcm5hbFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNyZWF0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNyZWF0aW9uLVRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNyZWF0aW9uLVRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRXRhZ1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1MZW5ndGhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LVR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudEVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1FbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1FbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TGFuZ3VhZ2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LUxhbmd1YWdlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LUxhbmd1YWdlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LU1ENVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1NRDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1EaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1EaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDYWNoZS1Db250cm9sXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDYWNoZS1Db250cm9sXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iVHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQmxvYlR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJCbG9ja0Jsb2JcIiwgXCJQYWdlQmxvYlwiLCBcIkFwcGVuZEJsb2JcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMZWFzZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTGVhc2VTdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJsb2NrZWRcIiwgXCJ1bmxvY2tlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGVhc2VTdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTGVhc2VTdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxlYXNlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleHBpcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyZWFraW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VEdXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxlYXNlRHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxlYXNlRHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJpbmZpbml0ZVwiLCBcImZpeGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlJZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29weUlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb3B5U3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3B5U3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wicGVuZGluZ1wiLCBcInN1Y2Nlc3NcIiwgXCJhYm9ydGVkXCIsIFwiZmFpbGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb3B5U291cmNlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3B5U291cmNlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlQcm9ncmVzczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlQcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29weVByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlDb21wbGV0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlDb21wbGV0aW9uVGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29weUNvbXBsZXRpb25UaW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXNEZXNjcmlwdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlTdGF0dXNEZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29weVN0YXR1c0Rlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZlckVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VydmVyRW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNyZW1lbnRhbENvcHk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJbmNyZW1lbnRhbENvcHlcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkluY3JlbWVudGFsQ29weVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVzdGluYXRpb25TbmFwc2hvdDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlc3RpbmF0aW9uU25hcHNob3RcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlc3RpbmF0aW9uU25hcHNob3RcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlZFRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZWRUaW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlbWFpbmluZ1JldGVudGlvbkRheXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZW1haW5pbmdSZXRlbnRpb25EYXlzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJSZW1haW5pbmdSZXRlbnRpb25EYXlzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2Vzc1RpZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBY2Nlc3NUaWVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJBY2Nlc3NUaWVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJQNFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQNlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQMTBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDE1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlAyMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQMzBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDQwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlA1MFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQNjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDcwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlA4MFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJIb3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29vbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmNoaXZlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbGRcIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2Vzc1RpZXJJbmZlcnJlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFjY2Vzc1RpZXJJbmZlcnJlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWNjZXNzVGllckluZmVycmVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcmNoaXZlU3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQXJjaGl2ZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQXJjaGl2ZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicmVoeWRyYXRlLXBlbmRpbmctdG8taG90XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInJlaHlkcmF0ZS1wZW5kaW5nLXRvLWNvb2xcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicmVoeWRyYXRlLXBlbmRpbmctdG8tY29sZFwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VzdG9tZXJQcm92aWRlZEtleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkN1c3RvbWVyUHJvdmlkZWRLZXlTaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkN1c3RvbWVyUHJvdmlkZWRLZXlTaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRW5jcnlwdGlvblNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFbmNyeXB0aW9uU2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXNzVGllckNoYW5nZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFjY2Vzc1RpZXJDaGFuZ2VUaW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJBY2Nlc3NUaWVyQ2hhbmdlVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdDb3VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlRhZ0NvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJUYWdDb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFeHBpcnktVGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXhwaXJ5LVRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZWFsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTZWFsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNlYWxlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVoeWRyYXRlUHJpb3JpdHk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZWh5ZHJhdGVQcmlvcml0eVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmVoeWRyYXRlUHJpb3JpdHlcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJIaWdoXCIsIFwiU3RhbmRhcmRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdEFjY2Vzc2VkT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMYXN0QWNjZXNzVGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTGFzdEFjY2Vzc1RpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJlc09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSW1tdXRhYmlsaXR5UG9saWN5VW50aWxEYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJbW11dGFiaWxpdHlQb2xpY3lVbnRpbERhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5TW9kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkltbXV0YWJpbGl0eVBvbGljeU1vZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkltbXV0YWJpbGl0eVBvbGljeU1vZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJNdXRhYmxlXCIsIFwiVW5sb2NrZWRcIiwgXCJMb2NrZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVnYWxIb2xkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGVnYWxIb2xkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWdhbEhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBMaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2UgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiTGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlXCIsXG4gICAgeG1sTmFtZTogXCJFbnVtZXJhdGlvblJlc3VsdHNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJMaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2VcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlRW5kcG9pbnRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHhtbElzQXR0cmlidXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWluZXJOYW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyTmFtZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGFpbmVyTmFtZVwiLFxuICAgICAgICAgICAgICAgIHhtbElzQXR0cmlidXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVmaXg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJQcmVmaXhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlByZWZpeFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXJrZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXhQYWdlU2l6ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1heFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk1heFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsaW1pdGVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsaW1pdGVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWxpbWl0ZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VnbWVudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlZ21lbnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkJsb2JzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkhpZXJhcmNoeUxpc3RTZWdtZW50XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW46IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iSGllcmFyY2h5TGlzdFNlZ21lbnQgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYkhpZXJhcmNoeUxpc3RTZWdtZW50XCIsXG4gICAgeG1sTmFtZTogXCJCbG9ic1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JIaWVyYXJjaHlMaXN0U2VnbWVudFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGJsb2JQcmVmaXhlczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JQcmVmaXhlc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQmxvYlByZWZpeGVzXCIsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiQmxvYlByZWZpeFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlByZWZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYkl0ZW1zXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJCbG9iSXRlbXNcIixcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJCbG9iXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iSXRlbUludGVybmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlByZWZpeCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iUHJlZml4XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlByZWZpeFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYk5hbWVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tMb29rdXBMaXN0ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrTG9va3VwTGlzdFwiLFxuICAgIHhtbE5hbWU6IFwiQmxvY2tMaXN0XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tMb29rdXBMaXN0XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29tbWl0dGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29tbWl0dGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb21taXR0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJDb21taXR0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmNvbW1pdHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlVuY29tbWl0dGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJVbmNvbW1pdHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIlVuY29tbWl0dGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGF0ZXN0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGF0ZXN0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMYXRlc3RcIixcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJMYXRlc3RcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tMaXN0ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrTGlzdFwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrTGlzdFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNvbW1pdHRlZEJsb2Nrczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbW1pdHRlZEJsb2Nrc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29tbWl0dGVkQmxvY2tzXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkJsb2NrXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5jb21taXR0ZWRCbG9ja3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJVbmNvbW1pdHRlZEJsb2Nrc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVW5jb21taXR0ZWRCbG9ja3NcIixcbiAgICAgICAgICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiQmxvY2tcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2sgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpemU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaXplXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTaXplXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlTGlzdCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlTGlzdFwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VMaXN0XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgcGFnZVJhbmdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZVJhbmdlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQYWdlUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJQYWdlUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VSYW5nZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xlYXJSYW5nZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJDbGVhclJhbmdlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJDbGVhclJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250aW51YXRpb25Ub2tlbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VSYW5nZSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlUmFuZ2VcIixcbiAgICB4bWxOYW1lOiBcIlBhZ2VSYW5nZVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VSYW5nZVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU3RhcnRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVuZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRW5kXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDbGVhclJhbmdlID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICB4bWxOYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDbGVhclJhbmdlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU3RhcnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRW5kXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFbmRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFF1ZXJ5UmVxdWVzdCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJRdWVyeVJlcXVlc3RcIixcbiAgICB4bWxOYW1lOiBcIlF1ZXJ5UmVxdWVzdFwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlF1ZXJ5UmVxdWVzdFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHF1ZXJ5VHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlF1ZXJ5VHlwZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUXVlcnlUeXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0U2VyaWFsaXphdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIklucHV0U2VyaWFsaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSW5wdXRTZXJpYWxpemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiUXVlcnlTZXJpYWxpemF0aW9uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3V0cHV0U2VyaWFsaXphdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk91dHB1dFNlcmlhbGl6YXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk91dHB1dFNlcmlhbGl6YXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJRdWVyeVNlcmlhbGl6YXRpb25cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUXVlcnlTZXJpYWxpemF0aW9uID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlF1ZXJ5U2VyaWFsaXphdGlvblwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlF1ZXJ5U2VyaWFsaXphdGlvblwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkZvcm1hdFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiUXVlcnlGb3JtYXRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUXVlcnlGb3JtYXQgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUXVlcnlGb3JtYXRcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJRdWVyeUZvcm1hdFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiZGVsaW1pdGVkXCIsIFwianNvblwiLCBcImFycm93XCIsIFwicGFycXVldFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAganNvblRleHRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSnNvblRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJKc29uVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJKc29uVGV4dENvbmZpZ3VyYXRpb25cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcnJvd0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBcnJvd0NvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkFycm93Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkFycm93Q29uZmlndXJhdGlvblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcnF1ZXRUZXh0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhcnF1ZXRUZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUGFycXVldFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImFueVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBEZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvbiA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJEZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvblwiLFxuICAgIHhtbE5hbWU6IFwiRGVsaW1pdGVkVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJEZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNvbHVtblNlcGFyYXRvcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbHVtblNlcGFyYXRvclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29sdW1uU2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpZWxkUXVvdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJGaWVsZFF1b3RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJGaWVsZFF1b3RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlY29yZFNlcGFyYXRvcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlY29yZFNlcGFyYXRvclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmVjb3JkU2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVzY2FwZUNoYXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFc2NhcGVDaGFyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFc2NhcGVDaGFyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnNQcmVzZW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSGVhZGVyc1ByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkhhc0hlYWRlcnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBKc29uVGV4dENvbmZpZ3VyYXRpb24gPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiSnNvblRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgeG1sTmFtZTogXCJKc29uVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJKc29uVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICByZWNvcmRTZXBhcmF0b3I6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZWNvcmRTZXBhcmF0b3JcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlJlY29yZFNlcGFyYXRvclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQXJyb3dDb25maWd1cmF0aW9uID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFycm93Q29uZmlndXJhdGlvblwiLFxuICAgIHhtbE5hbWU6IFwiQXJyb3dDb25maWd1cmF0aW9uXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXJyb3dDb25maWd1cmF0aW9uXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2NoZW1hXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTY2hlbWFcIixcbiAgICAgICAgICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiRmllbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkFycm93RmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBBcnJvd0ZpZWxkID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFycm93RmllbGRcIixcbiAgICB4bWxOYW1lOiBcIkZpZWxkXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXJyb3dGaWVsZFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZWNpc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlByZWNpc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHJlY2lzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNjYWxlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2NhbGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNjYWxlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlU2V0UHJvcGVydGllc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9zZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VTZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlU2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9zZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VTZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlR2V0UHJvcGVydGllc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VHZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlR2V0U3RhdGlzdGljc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRTdGF0aXN0aWNzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VHZXRTdGF0aXN0aWNzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlR2V0U3RhdGlzdGljc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRTdGF0aXN0aWNzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VHZXRTdGF0aXN0aWNzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2xpc3RDb250YWluZXJzU2VnbWVudEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2xpc3RDb250YWluZXJzU2VnbWVudEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlR2V0VXNlckRlbGVnYXRpb25LZXlIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfZ2V0VXNlckRlbGVnYXRpb25LZXlIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldFVzZXJEZWxlZ2F0aW9uS2V5SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlR2V0VXNlckRlbGVnYXRpb25LZXlFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfZ2V0VXNlckRlbGVnYXRpb25LZXlFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldFVzZXJEZWxlZ2F0aW9uS2V5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlR2V0QWNjb3VudEluZm9IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfZ2V0QWNjb3VudEluZm9IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldEFjY291bnRJbmZvSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNrdU5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1JBR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1pSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQcmVtaXVtX0xSU1wiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjb3VudEtpbmQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2NvdW50LWtpbmRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQmxvYlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RvcmFnZVYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZpbGVTdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJsb2NrQmxvYlN0b3JhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzSGllcmFyY2hpY2FsTmFtZXNwYWNlRW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaXMtaG5zLWVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaXMtaG5zLWVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfZ2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBTZXJ2aWNlU3VibWl0QmF0Y2hIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2Vfc3VibWl0QmF0Y2hIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZVN1Ym1pdEJhdGNoSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9zdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlU3VibWl0QmF0Y2hFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VGaWx0ZXJCbG9ic0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9maWx0ZXJCbG9ic0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlRmlsdGVyQmxvYnNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VGaWx0ZXJCbG9ic0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9maWx0ZXJCbG9ic0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckNyZWF0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2NyZWF0ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJDcmVhdGVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyQ3JlYXRlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfY3JlYXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyR2V0UHJvcGVydGllc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2dldFByb3BlcnRpZXNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyR2V0UHJvcGVydGllc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRpY3Rpb25hcnlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogeyBuYW1lOiBcIlN0cmluZ1wiIH0gfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGVhZGVyQ29sbGVjdGlvblByZWZpeDogXCJ4LW1zLW1ldGEtXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlRHVyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiaW5maW5pdGVcIiwgXCJmaXhlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxlYXNlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleHBpcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyZWFraW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJsb2NrZWRcIiwgXCJ1bmxvY2tlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iUHVibGljQWNjZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXB1YmxpYy1hY2Nlc3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiY29udGFpbmVyXCIsIFwiYmxvYlwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNJbW11dGFiaWxpdHlQb2xpY3k6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWhhcy1pbW11dGFiaWxpdHktcG9saWN5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWhhcy1pbW11dGFiaWxpdHktcG9saWN5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNMZWdhbEhvbGQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWhhcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWhhcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWZhdWx0RW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZWZhdWx0LWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZGVmYXVsdC1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlbnlFbmNyeXB0aW9uU2NvcGVPdmVycmlkZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZGVueS1lbmNyeXB0aW9uLXNjb3BlLW92ZXJyaWRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlbnktZW5jcnlwdGlvbi1zY29wZS1vdmVycmlkZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNJbW11dGFibGVTdG9yYWdlV2l0aFZlcnNpb25pbmdFbmFibGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFibGUtc3RvcmFnZS13aXRoLXZlcnNpb25pbmctZW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFibGUtc3RvcmFnZS13aXRoLXZlcnNpb25pbmctZW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckRlbGV0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2RlbGV0ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJEZWxldGVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2RlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJEZWxldGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclNldE1ldGFkYXRhSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfc2V0TWV0YWRhdGFIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyU2V0TWV0YWRhdGFIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyU2V0TWV0YWRhdGFFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9zZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJTZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyR2V0QWNjZXNzUG9saWN5SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfZ2V0QWNjZXNzUG9saWN5SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckdldEFjY2Vzc1BvbGljeUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBibG9iUHVibGljQWNjZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXB1YmxpYy1hY2Nlc3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiY29udGFpbmVyXCIsIFwiYmxvYlwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJHZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyR2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJTZXRBY2Nlc3NQb2xpY3lIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9zZXRBY2Nlc3NQb2xpY3lIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyU2V0QWNjZXNzUG9saWN5SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclNldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3NldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJTZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclJlc3RvcmVIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZXN0b3JlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlc3RvcmVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclJlc3RvcmVFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZXN0b3JlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlc3RvcmVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclJlbmFtZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3JlbmFtZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJSZW5hbWVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclJlbmFtZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3JlbmFtZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJSZW5hbWVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclN1Ym1pdEJhdGNoSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfc3VibWl0QmF0Y2hIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyU3VibWl0QmF0Y2hIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclN1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfc3VibWl0QmF0Y2hFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyU3VibWl0QmF0Y2hFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckZpbHRlckJsb2JzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfZmlsdGVyQmxvYnNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyRmlsdGVyQmxvYnNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckZpbHRlckJsb2JzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfZmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckFjcXVpcmVMZWFzZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2FjcXVpcmVMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJBY3F1aXJlTGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyQWNxdWlyZUxlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfYWNxdWlyZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyUmVsZWFzZUxlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfcmVsZWFzZUxlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlbGVhc2VMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJSZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyUmVsZWFzZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJSZW5ld0xlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfcmVuZXdMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJSZW5ld0xlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lclJlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckJyZWFrTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9icmVha0xlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckJyZWFrTGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVRpbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtdGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2JyZWFrTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyQ2hhbmdlTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9jaGFuZ2VMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJDaGFuZ2VMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJDaGFuZ2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2NoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckNoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBDb250YWluZXJMaXN0QmxvYkZsYXRTZWdtZW50SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfbGlzdEJsb2JGbGF0U2VnbWVudEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJMaXN0QmxvYkZsYXRTZWdtZW50SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckxpc3RCbG9iRmxhdFNlZ21lbnRFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9saXN0QmxvYkZsYXRTZWdtZW50RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckxpc3RCbG9iRmxhdFNlZ21lbnRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IENvbnRhaW5lckxpc3RCbG9iSGllcmFyY2h5U2VnbWVudEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2xpc3RCbG9iSGllcmFyY2h5U2VnbWVudEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJMaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckxpc3RCbG9iSGllcmFyY2h5U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyR2V0QWNjb3VudEluZm9IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRBY2NvdW50SW5mb0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJHZXRBY2NvdW50SW5mb0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBza3VOYW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1za3UtbmFtZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1za3UtbmFtZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfTFJTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX0dSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9SQUdSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9aUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJlbWl1bV9MUlNcIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY291bnRLaW5kOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1hY2NvdW50LWtpbmRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYWNjb3VudC1raW5kXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJsb2JTdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0b3JhZ2VWMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGaWxlU3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJCbG9ja0Jsb2JTdG9yYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQ29udGFpbmVyR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkRvd25sb2FkSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2Rvd25sb2FkSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JEb3dubG9hZEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY3JlYXRpb24tdGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jcmVhdGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtbWV0YS1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9iamVjdFJlcGxpY2F0aW9uUG9saWN5SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW9yLXBvbGljeS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1vci1wb2xpY3ktaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0UmVwbGljYXRpb25SdWxlczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtb3JcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtb3JcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtb3ItXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudFJhbmdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1yYW5nZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1yYW5nZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRFbmNvZGluZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FjaGVDb250cm9sOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY2FjaGUtY29udHJvbFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY2FjaGUtY29udHJvbFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMYW5ndWFnZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iVHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkJsb2NrQmxvYlwiLCBcIlBhZ2VCbG9iXCIsIFwiQXBwZW5kQmxvYlwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5Q29tcGxldGVkT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktY29tcGxldGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktY29tcGxldGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXNEZXNjcmlwdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXMtZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXMtZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVByb2dyZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVNvdXJjZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJwZW5kaW5nXCIsIFwic3VjY2Vzc1wiLCBcImFib3J0ZWRcIiwgXCJmYWlsZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VEdXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJpbmZpbml0ZVwiLCBcImZpeGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVhc2VkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImV4cGlyZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJlYWtpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2Utc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzQ3VycmVudFZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlzLWN1cnJlbnQtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pcy1jdXJyZW50LXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2VwdFJhbmdlczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImFjY2VwdC1yYW5nZXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImFjY2VwdC1yYW5nZXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdDb3VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdGFnLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXRhZy1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlYWxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZWFsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZWFsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RBY2Nlc3NlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGFzdC1hY2Nlc3MtdGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sYXN0LWFjY2Vzcy10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS11bnRpbC1kYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktdW50aWwtZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS1tb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiTXV0YWJsZVwiLCBcIlVubG9ja2VkXCIsIFwiTG9ja2VkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlZ2FsSG9sZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVnYWwtaG9sZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkRvd25sb2FkRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2Rvd25sb2FkRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JEb3dubG9hZEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkdldFByb3BlcnRpZXNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZ2V0UHJvcGVydGllc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iR2V0UHJvcGVydGllc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY3JlYXRpb24tdGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jcmVhdGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtbWV0YS1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9iamVjdFJlcGxpY2F0aW9uUG9saWN5SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW9yLXBvbGljeS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1vci1wb2xpY3ktaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0UmVwbGljYXRpb25SdWxlczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtb3JcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtb3JcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtb3ItXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iVHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkJsb2NrQmxvYlwiLCBcIlBhZ2VCbG9iXCIsIFwiQXBwZW5kQmxvYlwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5Q29tcGxldGVkT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktY29tcGxldGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktY29tcGxldGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXNEZXNjcmlwdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXMtZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXMtZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVByb2dyZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVNvdXJjZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJwZW5kaW5nXCIsIFwic3VjY2Vzc1wiLCBcImFib3J0ZWRcIiwgXCJmYWlsZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNJbmNyZW1lbnRhbENvcHk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWluY3JlbWVudGFsLWNvcHlcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW5jcmVtZW50YWwtY29weVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVzdGluYXRpb25TbmFwc2hvdDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1kZXN0aW5hdGlvbi1zbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LWRlc3RpbmF0aW9uLXNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlRHVyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiaW5maW5pdGVcIiwgXCJmaXhlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxlYXNlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleHBpcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyZWFraW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJsb2NrZWRcIiwgXCJ1bmxvY2tlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50RW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudExhbmd1YWdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1sYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1sYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjYWNoZS1jb250cm9sXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjYWNoZS1jb250cm9sXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXB0UmFuZ2VzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiYWNjZXB0LXJhbmdlc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiYWNjZXB0LXJhbmdlc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29tbWl0dGVkQmxvY2tDb3VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb21taXR0ZWQtYmxvY2stY291bnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb21taXR0ZWQtYmxvY2stY291bnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2Nlc3NUaWVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1hY2Nlc3MtdGllclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2Nlc3MtdGllclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2Nlc3NUaWVySW5mZXJyZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyLWluZmVycmVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyLWluZmVycmVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcmNoaXZlU3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1hcmNoaXZlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1hcmNoaXZlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2Nlc3NUaWVyQ2hhbmdlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1hY2Nlc3MtdGllci1jaGFuZ2UtdGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2Nlc3MtdGllci1jaGFuZ2UtdGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc0N1cnJlbnRWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pcy1jdXJyZW50LXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaXMtY3VycmVudC12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdDb3VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdGFnLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXRhZy1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWV4cGlyeS10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWV4cGlyeS10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VhbGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlYWxlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlYWxlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVoeWRyYXRlUHJpb3JpdHk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlaHlkcmF0ZS1wcmlvcml0eVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZWh5ZHJhdGUtcHJpb3JpdHlcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJIaWdoXCIsIFwiU3RhbmRhcmRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdEFjY2Vzc2VkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sYXN0LWFjY2Vzcy10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxhc3QtYWNjZXNzLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJlc09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LXVudGlsLWRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS11bnRpbC1kYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktbW9kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJNdXRhYmxlXCIsIFwiVW5sb2NrZWRcIiwgXCJMb2NrZWRcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVnYWxIb2xkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9nZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iRGVsZXRlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2RlbGV0ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iRGVsZXRlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iRGVsZXRlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2RlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iRGVsZXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iVW5kZWxldGVIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfdW5kZWxldGVIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlVuZGVsZXRlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iVW5kZWxldGVFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfdW5kZWxldGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlVuZGVsZXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0RXhwaXJ5SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldEV4cGlyeUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0RXhwaXJ5SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRFeHBpcnlFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0RXhwaXJ5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRFeHBpcnlFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRIdHRwSGVhZGVyc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRIdHRwSGVhZGVyc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0SHR0cEhlYWRlcnNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0SHR0cEhlYWRlcnNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0SHR0cEhlYWRlcnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldEh0dHBIZWFkZXJzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldEltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyeToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS11bnRpbC1kYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktdW50aWwtZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS1tb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiTXV0YWJsZVwiLCBcIlVubG9ja2VkXCIsIFwiTG9ja2VkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldEltbXV0YWJpbGl0eVBvbGljeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iRGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2RlbGV0ZUltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iRGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iRGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2RlbGV0ZUltbXV0YWJpbGl0eVBvbGljeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iRGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0TGVnYWxIb2xkSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldExlZ2FsSG9sZEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0TGVnYWxIb2xkSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlZ2FsSG9sZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVnYWwtaG9sZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlNldExlZ2FsSG9sZEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRMZWdhbEhvbGRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldExlZ2FsSG9sZEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlNldE1ldGFkYXRhSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldE1ldGFkYXRhSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRNZXRhZGF0YUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0TWV0YWRhdGFFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0TWV0YWRhdGFFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iQWNxdWlyZUxlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2FjcXVpcmVMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQWNxdWlyZUxlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JBY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYWNxdWlyZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JBY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JSZWxlYXNlTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfcmVsZWFzZUxlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JSZWxlYXNlTGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9yZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlJlbmV3TGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfcmVuZXdMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUmVuZXdMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iUmVuZXdMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9yZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JSZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iQ2hhbmdlTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfY2hhbmdlTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkNoYW5nZUxlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JDaGFuZ2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9jaGFuZ2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JCcmVha0xlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2JyZWFrTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkJyZWFrTGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVRpbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtdGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkJyZWFrTGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkNyZWF0ZVNuYXBzaG90SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2NyZWF0ZVNuYXBzaG90SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JDcmVhdGVTbmFwc2hvdEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzbmFwc2hvdDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc25hcHNob3RcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtc25hcHNob3RcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JDcmVhdGVTbmFwc2hvdEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9jcmVhdGVTbmFwc2hvdEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQ3JlYXRlU25hcHNob3RFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTdGFydENvcHlGcm9tVVJMSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3N0YXJ0Q29weUZyb21VUkxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlN0YXJ0Q29weUZyb21VUkxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcInBlbmRpbmdcIiwgXCJzdWNjZXNzXCIsIFwiYWJvcnRlZFwiLCBcImZhaWxlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYlN0YXJ0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc3RhcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU3RhcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvYkNvcHlGcm9tVVJMSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2NvcHlGcm9tVVJMSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JDb3B5RnJvbVVSTEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iQ29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfY29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkNvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iQWJvcnRDb3B5RnJvbVVSTEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9hYm9ydENvcHlGcm9tVVJMSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JBYm9ydENvcHlGcm9tVVJMSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iQWJvcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9hYm9ydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JBYm9ydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0VGllckhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRUaWVySGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRUaWVySGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iU2V0VGllckV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRUaWVyRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRUaWVyRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iR2V0QWNjb3VudEluZm9IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZ2V0QWNjb3VudEluZm9IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkdldEFjY291bnRJbmZvSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNrdU5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1JBR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1pSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQcmVtaXVtX0xSU1wiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjb3VudEtpbmQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2NvdW50LWtpbmRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQmxvYlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RvcmFnZVYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZpbGVTdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJsb2NrQmxvYlN0b3JhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZ2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9iUXVlcnlIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfcXVlcnlIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlF1ZXJ5SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudExlbmd0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50VHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRSYW5nZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtcmFuZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtcmFuZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50RW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNhY2hlLWNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNhY2hlLWNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TGFuZ3VhZ2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWxhbmd1YWdlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWxhbmd1YWdlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJCbG9ja0Jsb2JcIiwgXCJQYWdlQmxvYlwiLCBcIkFwcGVuZEJsb2JcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUNvbXBsZXRpb25UaW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWNvbXBsZXRpb24tdGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LWNvbXBsZXRpb24tdGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U3RhdHVzRGVzY3JpcHRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzLWRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzLWRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlQcm9ncmVzczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1wcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wicGVuZGluZ1wiLCBcInN1Y2Nlc3NcIiwgXCJhYm9ydGVkXCIsIFwiZmFpbGVkXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlRHVyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiaW5maW5pdGVcIiwgXCJmaXhlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxlYXNlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleHBpcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyZWFraW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJsb2NrZWRcIiwgXCJ1bmxvY2tlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2NlcHRSYW5nZXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJhY2NlcHQtcmFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJhY2NlcHQtcmFuZ2VzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb21taXR0ZWRCbG9ja0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudENyYzY0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JRdWVyeUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9xdWVyeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUXVlcnlFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JHZXRUYWdzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2dldFRhZ3NIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkdldFRhZ3NIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JHZXRUYWdzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2dldFRhZ3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkdldFRhZ3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRUYWdzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldFRhZ3NIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldFRhZ3NIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2JTZXRUYWdzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldFRhZ3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldFRhZ3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iQ3JlYXRlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9jcmVhdGVIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JDcmVhdGVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfY3JlYXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iQ3JlYXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYlVwbG9hZFBhZ2VzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl91cGxvYWRQYWdlc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYlVwbG9hZFBhZ2VzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYlVwbG9hZFBhZ2VzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl91cGxvYWRQYWdlc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYlVwbG9hZFBhZ2VzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYkNsZWFyUGFnZXNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2NsZWFyUGFnZXNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JDbGVhclBhZ2VzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYkNsZWFyUGFnZXNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2NsZWFyUGFnZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JDbGVhclBhZ2VzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYlVwbG9hZFBhZ2VzRnJvbVVSTEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfdXBsb2FkUGFnZXNGcm9tVVJMSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iVXBsb2FkUGFnZXNGcm9tVVJMSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JVcGxvYWRQYWdlc0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX3VwbG9hZFBhZ2VzRnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYlVwbG9hZFBhZ2VzRnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JHZXRQYWdlUmFuZ2VzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9nZXRQYWdlUmFuZ2VzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iR2V0UGFnZVJhbmdlc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb250ZW50TGVuZ3RoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iR2V0UGFnZVJhbmdlc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfZ2V0UGFnZVJhbmdlc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYkdldFBhZ2VSYW5nZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2dldFBhZ2VSYW5nZXNEaWZmSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29udGVudExlbmd0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9nZXRQYWdlUmFuZ2VzRGlmZkV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBQYWdlQmxvYlJlc2l6ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfcmVzaXplSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iUmVzaXplSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JSZXNpemVFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX3Jlc2l6ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYlJlc2l6ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfdXBkYXRlU2VxdWVuY2VOdW1iZXJIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iVXBkYXRlU2VxdWVuY2VOdW1iZXJFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX3VwZGF0ZVNlcXVlbmNlTnVtYmVyRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iVXBkYXRlU2VxdWVuY2VOdW1iZXJFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFBhZ2VCbG9iQ29weUluY3JlbWVudGFsSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9jb3B5SW5jcmVtZW50YWxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JDb3B5SW5jcmVtZW50YWxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcInBlbmRpbmdcIiwgXCJzdWNjZXNzXCIsIFwiYWJvcnRlZFwiLCBcImZhaWxlZFwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgUGFnZUJsb2JDb3B5SW5jcmVtZW50YWxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2NvcHlJbmNyZW1lbnRhbEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQXBwZW5kQmxvYkNyZWF0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9jcmVhdGVIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkNyZWF0ZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFwcGVuZEJsb2JDcmVhdGVFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFwcGVuZEJsb2JfY3JlYXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkFwcGVuZEJsb2JDcmVhdGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFwcGVuZEJsb2JBcHBlbmRCbG9ja0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9hcHBlbmRCbG9ja0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcHBlbmRCbG9iQXBwZW5kQmxvY2tIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JBcHBlbmRPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItYXBwZW5kLW9mZnNldFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWFwcGVuZC1vZmZzZXRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBBcHBlbmRCbG9iQXBwZW5kQmxvY2tFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFwcGVuZEJsb2JfYXBwZW5kQmxvY2tFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkFwcGVuZEJsb2NrRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBBcHBlbmRCbG9iQXBwZW5kQmxvY2tGcm9tVXJsSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJBcHBlbmRCbG9iX2FwcGVuZEJsb2NrRnJvbVVybEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcHBlbmRCbG9iQXBwZW5kQmxvY2tGcm9tVXJsSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkFwcGVuZE9mZnNldDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1hcHBlbmQtb2Zmc2V0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItYXBwZW5kLW9mZnNldFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29tbWl0dGVkQmxvY2tDb3VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb21taXR0ZWQtYmxvY2stY291bnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb21taXR0ZWQtYmxvY2stY291bnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFwcGVuZEJsb2JBcHBlbmRCbG9ja0Zyb21VcmxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFwcGVuZEJsb2JfYXBwZW5kQmxvY2tGcm9tVXJsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkFwcGVuZEJsb2JBcHBlbmRCbG9ja0Zyb21VcmxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEFwcGVuZEJsb2JTZWFsSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJBcHBlbmRCbG9iX3NlYWxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYlNlYWxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlYWxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZWFsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZWFsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBBcHBlbmRCbG9iU2VhbEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9zZWFsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkFwcGVuZEJsb2JTZWFsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JVcGxvYWRIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl91cGxvYWRIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iVXBsb2FkSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iVXBsb2FkRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2JfdXBsb2FkRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYlVwbG9hZEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iUHV0QmxvYkZyb21VcmxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9wdXRCbG9iRnJvbVVybEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2NrQmxvYlB1dEJsb2JGcm9tVXJsRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2JfcHV0QmxvYkZyb21VcmxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iUHV0QmxvYkZyb21VcmxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEJsb2NrQmxvYlN0YWdlQmxvY2tIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9zdGFnZUJsb2NrSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYlN0YWdlQmxvY2tIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iU3RhZ2VCbG9ja0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3N0YWdlQmxvY2tFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iU3RhZ2VCbG9ja0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iU3RhZ2VCbG9ja0Zyb21VUkxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9zdGFnZUJsb2NrRnJvbVVSTEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JTdGFnZUJsb2NrRnJvbVVSTEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JTdGFnZUJsb2NrRnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3N0YWdlQmxvY2tGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYlN0YWdlQmxvY2tGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBCbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9jb21taXRCbG9ja0xpc3RIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iQ29tbWl0QmxvY2tMaXN0SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iQ29tbWl0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2JfY29tbWl0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYkNvbW1pdEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iR2V0QmxvY2tMaXN0SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2JfZ2V0QmxvY2tMaXN0SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYkdldEJsb2NrTGlzdEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbnRlbnRMZW5ndGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgQmxvY2tCbG9iR2V0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2JfZ2V0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYkdldEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXBwZXJzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBUaGUgZm9ybWF0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGpvaW4gYW4gYXJyYXkgb2YgdmFsdWVzIHRvZ2V0aGVyIGZvciBhIHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZS5cbiAqL1xuZXhwb3J0IHZhciBRdWVyeUNvbGxlY3Rpb25Gb3JtYXQ7XG4oZnVuY3Rpb24gKFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdCkge1xuICAgIC8qKlxuICAgICAqIENTVjogRWFjaCBwYWlyIG9mIHNlZ21lbnRzIGpvaW5lZCBieSBhIHNpbmdsZSBjb21tYS5cbiAgICAgKi9cbiAgICBRdWVyeUNvbGxlY3Rpb25Gb3JtYXRbXCJDc3ZcIl0gPSBcIixcIjtcbiAgICAvKipcbiAgICAgKiBTU1Y6IEVhY2ggcGFpciBvZiBzZWdtZW50cyBqb2luZWQgYnkgYSBzaW5nbGUgc3BhY2UgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdFtcIlNzdlwiXSA9IFwiIFwiO1xuICAgIC8qKlxuICAgICAqIFRTVjogRWFjaCBwYWlyIG9mIHNlZ21lbnRzIGpvaW5lZCBieSBhIHNpbmdsZSB0YWIgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdFtcIlRzdlwiXSA9IFwiXFx0XCI7XG4gICAgLyoqXG4gICAgICogUGlwZXM6IEVhY2ggcGFpciBvZiBzZWdtZW50cyBqb2luZWQgYnkgYSBzaW5nbGUgcGlwZSBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgUXVlcnlDb2xsZWN0aW9uRm9ybWF0W1wiUGlwZXNcIl0gPSBcInxcIjtcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHRoaXMgaXMgYW4gYXJyYXkgb2YgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyIGluIG11bHRpcGxlIGtleS92YWx1ZSBwYWlycywgZS5nLiBgP3F1ZXJ5UGFyYW09dmFsdWUxJnF1ZXJ5UGFyYW09dmFsdWUyYFxuICAgICAqL1xuICAgIFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdFtcIk11bHRpXCJdID0gXCJNdWx0aVwiO1xufSkoUXVlcnlDb2xsZWN0aW9uRm9ybWF0IHx8IChRdWVyeUNvbGxlY3Rpb25Gb3JtYXQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnlDb2xsZWN0aW9uRm9ybWF0LmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqXG4gKiBDb2RlIGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgKFIpIEF1dG9SZXN0IENvZGUgR2VuZXJhdG9yLlxuICogQ2hhbmdlcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuXG4gKi9cbmltcG9ydCB7IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdCB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBCbG9iU2VydmljZVByb3BlcnRpZXMgYXMgQmxvYlNlcnZpY2VQcm9wZXJ0aWVzTWFwcGVyLCBLZXlJbmZvIGFzIEtleUluZm9NYXBwZXIsIFF1ZXJ5UmVxdWVzdCBhcyBRdWVyeVJlcXVlc3RNYXBwZXIsIEJsb2JUYWdzIGFzIEJsb2JUYWdzTWFwcGVyLCBCbG9ja0xvb2t1cExpc3QgYXMgQmxvY2tMb29rdXBMaXN0TWFwcGVyIH0gZnJvbSBcIi4uL21vZGVscy9tYXBwZXJzXCI7XG5leHBvcnQgY29uc3QgY29udGVudFR5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNvbnRlbnRUeXBlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYXBwbGljYXRpb24veG1sXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JTZXJ2aWNlUHJvcGVydGllcyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImJsb2JTZXJ2aWNlUHJvcGVydGllc1wiLFxuICAgIG1hcHBlcjogQmxvYlNlcnZpY2VQcm9wZXJ0aWVzTWFwcGVyXG59O1xuZXhwb3J0IGNvbnN0IGFjY2VwdCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImFjY2VwdFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYXBwbGljYXRpb24veG1sXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFjY2VwdFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHVybCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInVybFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ1cmxcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwidXJsXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc2tpcEVuY29kaW5nOiB0cnVlXG59O1xuZXhwb3J0IGNvbnN0IHJlc3R5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJyZXN0eXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJzZXJ2aWNlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInJlc3R5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwicHJvcGVydGllc1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdGltZW91dEluU2Vjb25kcyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwidGltZW91dEluU2Vjb25kc1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIEluY2x1c2l2ZU1pbmltdW06IDBcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwidGltZW91dFwiLFxuICAgICAgICB4bWxOYW1lOiBcInRpbWVvdXRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwidmVyc2lvblwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiMjAyMy0xMS0wM1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByZXF1ZXN0SWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInJlcXVlc3RJZFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBhY2NlcHQxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWNjZXB0XCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhcHBsaWNhdGlvbi94bWxcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWNjZXB0XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJzdGF0c1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJsaXN0XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBwcmVmaXggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInByZWZpeFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicHJlZml4XCIsXG4gICAgICAgIHhtbE5hbWU6IFwicHJlZml4XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbWFya2VyID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJtYXJrZXJcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIm1hcmtlclwiLFxuICAgICAgICB4bWxOYW1lOiBcIm1hcmtlclwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IG1heFBhZ2VTaXplID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJtYXhQYWdlU2l6ZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIEluY2x1c2l2ZU1pbmltdW06IDFcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibWF4cmVzdWx0c1wiLFxuICAgICAgICB4bWxOYW1lOiBcIm1heHJlc3VsdHNcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpbmNsdWRlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJpbmNsdWRlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJpbmNsdWRlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiaW5jbHVkZVwiLFxuICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJMaXN0Q29udGFpbmVyc0luY2x1ZGVUeXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJtZXRhZGF0YVwiLCBcImRlbGV0ZWRcIiwgXCJzeXN0ZW1cIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNvbGxlY3Rpb25Gb3JtYXQ6IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdC5Dc3Zcbn07XG5leHBvcnQgY29uc3Qga2V5SW5mbyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImtleUluZm9cIixcbiAgICBtYXBwZXI6IEtleUluZm9NYXBwZXJcbn07XG5leHBvcnQgY29uc3QgY29tcDMgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJ1c2VyZGVsZWdhdGlvbmtleVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcmVzdHlwZTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJyZXN0eXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhY2NvdW50XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInJlc3R5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBib2R5ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYm9keVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJib2R5XCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcImJvZHlcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJlYW1cIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wNCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImJhdGNoXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb250ZW50TGVuZ3RoID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29udGVudExlbmd0aFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LUxlbmd0aFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LUxlbmd0aFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IG11bHRpcGFydENvbnRlbnRUeXBlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwibXVsdGlwYXJ0Q29udGVudFR5cGVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXA1ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYmxvYnNcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHdoZXJlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJ3aGVyZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwid2hlcmVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ3aGVyZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHJlc3R5cGUyID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwicmVzdHlwZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiY29udGFpbmVyXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInJlc3R5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwibWV0YWRhdGFcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkRpY3Rpb25hcnlcIixcbiAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH1cbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGVyQ29sbGVjdGlvblByZWZpeDogXCJ4LW1zLW1ldGEtXCJcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGFjY2VzcyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYWNjZXNzXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItcHVibGljLWFjY2Vzc1wiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiY29udGFpbmVyXCIsIFwiYmxvYlwiXVxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBkZWZhdWx0RW5jcnlwdGlvblNjb3BlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcbiAgICAgICAgXCJvcHRpb25zXCIsXG4gICAgICAgIFwiY29udGFpbmVyRW5jcnlwdGlvblNjb3BlXCIsXG4gICAgICAgIFwiZGVmYXVsdEVuY3J5cHRpb25TY29wZVwiXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZWZhdWx0LWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlZmF1bHQtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHByZXZlbnRFbmNyeXB0aW9uU2NvcGVPdmVycmlkZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcImNvbnRhaW5lckVuY3J5cHRpb25TY29wZVwiLFxuICAgICAgICBcInByZXZlbnRFbmNyeXB0aW9uU2NvcGVPdmVycmlkZVwiXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZW55LWVuY3J5cHRpb24tc2NvcGUtb3ZlcnJpZGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlbnktZW5jcnlwdGlvbi1zY29wZS1vdmVycmlkZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBsZWFzZUlkID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJsZWFzZUFjY2Vzc0NvbmRpdGlvbnNcIiwgXCJsZWFzZUlkXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGlmTW9kaWZpZWRTaW5jZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwibW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsIFwiaWZNb2RpZmllZFNpbmNlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJZi1Nb2RpZmllZC1TaW5jZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIklmLU1vZGlmaWVkLVNpbmNlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgaWZVbm1vZGlmaWVkU2luY2UgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLCBcImlmVW5tb2RpZmllZFNpbmNlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJZi1Vbm1vZGlmaWVkLVNpbmNlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiSWYtVW5tb2RpZmllZC1TaW5jZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXA2ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwibWV0YWRhdGFcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXA3ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYWNsXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb250YWluZXJBY2wgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNvbnRhaW5lckFjbFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGFpbmVyQWNsXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkSWRlbnRpZmllcnNcIixcbiAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXA4ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwidW5kZWxldGVcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGRlbGV0ZWRDb250YWluZXJOYW1lID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJkZWxldGVkQ29udGFpbmVyTmFtZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZWxldGVkLWNvbnRhaW5lci1uYW1lXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1kZWxldGVkLWNvbnRhaW5lci1uYW1lXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZGVsZXRlZENvbnRhaW5lclZlcnNpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImRlbGV0ZWRDb250YWluZXJWZXJzaW9uXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWRlbGV0ZWQtY29udGFpbmVyLXZlcnNpb25cIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlbGV0ZWQtY29udGFpbmVyLXZlcnNpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wOSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInJlbmFtZVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlQ29udGFpbmVyTmFtZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInNvdXJjZUNvbnRhaW5lck5hbWVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGFpbmVyLW5hbWVcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGFpbmVyLW5hbWVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VMZWFzZUlkID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJzb3VyY2VMZWFzZUlkXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNvdXJjZS1sZWFzZS1pZFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWxlYXNlLWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDEwID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwibGVhc2VcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGFjdGlvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImFjdGlvblwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYWNxdWlyZVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWFjdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGR1cmF0aW9uID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJkdXJhdGlvblwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBwcm9wb3NlZExlYXNlSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInByb3Bvc2VkTGVhc2VJZFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1wcm9wb3NlZC1sZWFzZS1pZFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtcHJvcG9zZWQtbGVhc2UtaWRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBhY3Rpb24xID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWN0aW9uXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJyZWxlYXNlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtYWN0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbGVhc2VJZDEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJsZWFzZUlkXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGFjdGlvbjIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJhY3Rpb25cIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInJlbmV3XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtYWN0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYWN0aW9uMyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImFjdGlvblwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYnJlYWtcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1hY3Rpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBicmVha1BlcmlvZCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYnJlYWtQZXJpb2RcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtYnJlYWstcGVyaW9kXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1icmVhay1wZXJpb2RcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBhY3Rpb240ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWN0aW9uXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJjaGFuZ2VcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1hY3Rpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBwcm9wb3NlZExlYXNlSWQxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwicHJvcG9zZWRMZWFzZUlkXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcHJvcG9zZWQtbGVhc2UtaWRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1wcm9wb3NlZC1sZWFzZS1pZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGluY2x1ZGUxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJpbmNsdWRlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJpbmNsdWRlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiaW5jbHVkZVwiLFxuICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJMaXN0QmxvYnNJbmNsdWRlSXRlbVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb3B5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlbGV0ZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic25hcHNob3RzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVuY29tbWl0dGVkYmxvYnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidmVyc2lvbnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidGFnc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpbW11dGFiaWxpdHlwb2xpY3lcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVnYWxob2xkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlbGV0ZWR3aXRodmVyc2lvbnNcIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBjb2xsZWN0aW9uRm9ybWF0OiBRdWVyeUNvbGxlY3Rpb25Gb3JtYXQuQ3N2XG59O1xuZXhwb3J0IGNvbnN0IGRlbGltaXRlciA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImRlbGltaXRlclwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkZWxpbWl0ZXJcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiZGVsaW1pdGVyXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc25hcHNob3QgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNuYXBzaG90XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJzbmFwc2hvdFwiLFxuICAgICAgICB4bWxOYW1lOiBcInNuYXBzaG90XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdmVyc2lvbklkID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJ2ZXJzaW9uSWRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInZlcnNpb25pZFwiLFxuICAgICAgICB4bWxOYW1lOiBcInZlcnNpb25pZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHJhbmdlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJyYW5nZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yYW5nZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmFuZ2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByYW5nZUdldENvbnRlbnRNRDUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInJhbmdlR2V0Q29udGVudE1ENVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yYW5nZS1nZXQtY29udGVudC1tZDVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByYW5nZUdldENvbnRlbnRDUkM2NCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicmFuZ2VHZXRDb250ZW50Q1JDNjRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJhbmdlLWdldC1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGVuY3J5cHRpb25LZXkgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNwa0luZm9cIiwgXCJlbmNyeXB0aW9uS2V5XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5XCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGVuY3J5cHRpb25LZXlTaGEyNTYgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNwa0luZm9cIiwgXCJlbmNyeXB0aW9uS2V5U2hhMjU2XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZW5jcnlwdGlvbkFsZ29yaXRobSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiY3BrSW5mb1wiLCBcImVuY3J5cHRpb25BbGdvcml0aG1cIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1hbGdvcml0aG1cIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tYWxnb3JpdGhtXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgaWZNYXRjaCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwibW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsIFwiaWZNYXRjaFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSWYtTWF0Y2hcIixcbiAgICAgICAgeG1sTmFtZTogXCJJZi1NYXRjaFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGlmTm9uZU1hdGNoID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIiwgXCJpZk5vbmVNYXRjaFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSWYtTm9uZS1NYXRjaFwiLFxuICAgICAgICB4bWxOYW1lOiBcIklmLU5vbmUtTWF0Y2hcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpZlRhZ3MgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLCBcImlmVGFnc1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pZi10YWdzXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1pZi10YWdzXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZGVsZXRlU25hcHNob3RzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJkZWxldGVTbmFwc2hvdHNcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZGVsZXRlLXNuYXBzaG90c1wiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZGVsZXRlLXNuYXBzaG90c1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImluY2x1ZGVcIiwgXCJvbmx5XCJdXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JEZWxldGVUeXBlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJibG9iRGVsZXRlVHlwZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGVsZXRldHlwZVwiLFxuICAgICAgICB4bWxOYW1lOiBcImRlbGV0ZXR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJleHBpcnlcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGV4cGlyeU9wdGlvbnMgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJleHBpcnlPcHRpb25zXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXhwaXJ5LW9wdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWV4cGlyeS1vcHRpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBleHBpcmVzT24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImV4cGlyZXNPblwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1leHBpcnktdGltZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXhwaXJ5LXRpbWVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iQ2FjaGVDb250cm9sID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJibG9iSHR0cEhlYWRlcnNcIiwgXCJibG9iQ2FjaGVDb250cm9sXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY2FjaGUtY29udHJvbFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jYWNoZS1jb250cm9sXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYkNvbnRlbnRUeXBlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJibG9iSHR0cEhlYWRlcnNcIiwgXCJibG9iQ29udGVudFR5cGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LXR5cGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC10eXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYkNvbnRlbnRNRDUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDb250ZW50TUQ1XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iQ29udGVudEVuY29kaW5nID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJibG9iSHR0cEhlYWRlcnNcIiwgXCJibG9iQ29udGVudEVuY29kaW5nXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1lbmNvZGluZ1wiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYkNvbnRlbnRMYW5ndWFnZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYmxvYkh0dHBIZWFkZXJzXCIsIFwiYmxvYkNvbnRlbnRMYW5ndWFnZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sYW5ndWFnZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JDb250ZW50RGlzcG9zaXRpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDb250ZW50RGlzcG9zaXRpb25cIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWRpc3Bvc2l0aW9uXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMTIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJpbW11dGFiaWxpdHlQb2xpY2llc1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnlcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS11bnRpbC1kYXRlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LXVudGlsLWRhdGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpbW11dGFiaWxpdHlQb2xpY3lNb2RlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJpbW11dGFiaWxpdHlQb2xpY3lNb2RlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktbW9kZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS1tb2RlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiTXV0YWJsZVwiLCBcIlVubG9ja2VkXCIsIFwiTG9ja2VkXCJdXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAxMyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImxlZ2FsaG9sZFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbGVnYWxIb2xkID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwibGVnYWxIb2xkXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVnYWwtaG9sZFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZW5jcnlwdGlvblNjb3BlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJlbmNyeXB0aW9uU2NvcGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAxNCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInNuYXBzaG90XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB0aWVyID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJ0aWVyXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2Nlc3MtdGllclwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICBcIlA0XCIsXG4gICAgICAgICAgICAgICAgXCJQNlwiLFxuICAgICAgICAgICAgICAgIFwiUDEwXCIsXG4gICAgICAgICAgICAgICAgXCJQMTVcIixcbiAgICAgICAgICAgICAgICBcIlAyMFwiLFxuICAgICAgICAgICAgICAgIFwiUDMwXCIsXG4gICAgICAgICAgICAgICAgXCJQNDBcIixcbiAgICAgICAgICAgICAgICBcIlA1MFwiLFxuICAgICAgICAgICAgICAgIFwiUDYwXCIsXG4gICAgICAgICAgICAgICAgXCJQNzBcIixcbiAgICAgICAgICAgICAgICBcIlA4MFwiLFxuICAgICAgICAgICAgICAgIFwiSG90XCIsXG4gICAgICAgICAgICAgICAgXCJDb29sXCIsXG4gICAgICAgICAgICAgICAgXCJBcmNoaXZlXCIsXG4gICAgICAgICAgICAgICAgXCJDb2xkXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcmVoeWRyYXRlUHJpb3JpdHkgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInJlaHlkcmF0ZVByaW9yaXR5XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlaHlkcmF0ZS1wcmlvcml0eVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVoeWRyYXRlLXByaW9yaXR5XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiSGlnaFwiLCBcIlN0YW5kYXJkXCJdXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNvdXJjZUlmTW9kaWZpZWRTaW5jZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcInNvdXJjZU1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLFxuICAgICAgICBcInNvdXJjZUlmTW9kaWZpZWRTaW5jZVwiXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtbW9kaWZpZWQtc2luY2VcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi1tb2RpZmllZC1zaW5jZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcbiAgICAgICAgXCJvcHRpb25zXCIsXG4gICAgICAgIFwic291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsXG4gICAgICAgIFwic291cmNlSWZVbm1vZGlmaWVkU2luY2VcIlxuICAgIF0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLWlmLXVubW9kaWZpZWQtc2luY2VcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi11bm1vZGlmaWVkLXNpbmNlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlSWZNYXRjaCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwic291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsIFwic291cmNlSWZNYXRjaFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtbWF0Y2hcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi1tYXRjaFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNvdXJjZUlmTm9uZU1hdGNoID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcbiAgICAgICAgXCJvcHRpb25zXCIsXG4gICAgICAgIFwic291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsXG4gICAgICAgIFwic291cmNlSWZOb25lTWF0Y2hcIlxuICAgIF0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLWlmLW5vbmUtbWF0Y2hcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi1ub25lLW1hdGNoXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlSWZUYWdzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIiwgXCJzb3VyY2VJZlRhZ3NcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLWlmLXRhZ3NcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi10YWdzXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29weVNvdXJjZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvcHlTb3VyY2VcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYlRhZ3NTdHJpbmcgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JUYWdzU3RyaW5nXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXRhZ3NcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXRhZ3NcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzZWFsQmxvYiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwic2VhbEJsb2JcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc2VhbC1ibG9iXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zZWFsLWJsb2JcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbGVnYWxIb2xkMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwibGVnYWxIb2xkXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgeE1zUmVxdWlyZXNTeW5jID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwieE1zUmVxdWlyZXNTeW5jXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWlyZXMtc3luY1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNvdXJjZUNvbnRlbnRNRDUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNvdXJjZUNvbnRlbnRNRDVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLWNvbnRlbnQtbWQ1XCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGVudC1tZDVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb3B5U291cmNlQXV0aG9yaXphdGlvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiY29weVNvdXJjZUF1dGhvcml6YXRpb25cIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zb3VyY2UtYXV0aG9yaXphdGlvblwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zb3VyY2UtYXV0aG9yaXphdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvcHlTb3VyY2VUYWdzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjb3B5U291cmNlVGFnc1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS10YWctb3B0aW9uXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS10YWctb3B0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiUkVQTEFDRVwiLCBcIkNPUFlcIl1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDE1ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiY29weVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29weUFjdGlvbkFib3J0Q29uc3RhbnQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb3B5QWN0aW9uQWJvcnRDb25zdGFudFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYWJvcnRcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWFjdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvcHlJZCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvcHlJZFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb3B5aWRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiY29weWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDE2ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwidGllclwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgdGllcjEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJ0aWVyXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYWNjZXNzLXRpZXJcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2Nlc3MtdGllclwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICBcIlA0XCIsXG4gICAgICAgICAgICAgICAgXCJQNlwiLFxuICAgICAgICAgICAgICAgIFwiUDEwXCIsXG4gICAgICAgICAgICAgICAgXCJQMTVcIixcbiAgICAgICAgICAgICAgICBcIlAyMFwiLFxuICAgICAgICAgICAgICAgIFwiUDMwXCIsXG4gICAgICAgICAgICAgICAgXCJQNDBcIixcbiAgICAgICAgICAgICAgICBcIlA1MFwiLFxuICAgICAgICAgICAgICAgIFwiUDYwXCIsXG4gICAgICAgICAgICAgICAgXCJQNzBcIixcbiAgICAgICAgICAgICAgICBcIlA4MFwiLFxuICAgICAgICAgICAgICAgIFwiSG90XCIsXG4gICAgICAgICAgICAgICAgXCJDb29sXCIsXG4gICAgICAgICAgICAgICAgXCJBcmNoaXZlXCIsXG4gICAgICAgICAgICAgICAgXCJDb2xkXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcXVlcnlSZXF1ZXN0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJxdWVyeVJlcXVlc3RcIl0sXG4gICAgbWFwcGVyOiBRdWVyeVJlcXVlc3RNYXBwZXJcbn07XG5leHBvcnQgY29uc3QgY29tcDE3ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwicXVlcnlcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAxOCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInRhZ3NcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHRhZ3MgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInRhZ3NcIl0sXG4gICAgbWFwcGVyOiBCbG9iVGFnc01hcHBlclxufTtcbmV4cG9ydCBjb25zdCB0cmFuc2FjdGlvbmFsQ29udGVudE1ENSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwidHJhbnNhY3Rpb25hbENvbnRlbnRNRDVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRlbnQtTUQ1XCIsXG4gICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1NRDVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJ0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iVHlwZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImJsb2JUeXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJQYWdlQmxvYlwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JDb250ZW50TGVuZ3RoID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYmxvYkNvbnRlbnRMZW5ndGhcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxlbmd0aFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2JTZXF1ZW5jZU51bWJlciA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYmxvYlNlcXVlbmNlTnVtYmVyXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbnRlbnRUeXBlMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiY29udGVudFR5cGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYm9keTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJib2R5XCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImJvZHlcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiYm9keVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmVhbVwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGFjY2VwdDIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJhY2NlcHRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBY2NlcHRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMTkgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJwYWdlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBwYWdlV3JpdGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJwYWdlV3JpdGVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInVwZGF0ZVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXBhZ2Utd3JpdGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5PckVxdWFsVG8gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJzZXF1ZW5jZU51bWJlckFjY2Vzc0NvbmRpdGlvbnNcIixcbiAgICAgICAgXCJpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5PckVxdWFsVG9cIlxuICAgIF0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWxlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItbGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW4gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJzZXF1ZW5jZU51bWJlckFjY2Vzc0NvbmRpdGlvbnNcIixcbiAgICAgICAgXCJpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5cIlxuICAgIF0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWx0XCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItbHRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBpZlNlcXVlbmNlTnVtYmVyRXF1YWxUbyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcInNlcXVlbmNlTnVtYmVyQWNjZXNzQ29uZGl0aW9uc1wiLFxuICAgICAgICBcImlmU2VxdWVuY2VOdW1iZXJFcXVhbFRvXCJcbiAgICBdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1lcVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWVxXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcGFnZVdyaXRlMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInBhZ2VXcml0ZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiY2xlYXJcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1wYWdlLXdyaXRlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc291cmNlVXJsID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwic291cmNlVXJsXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNvdXJjZVJhbmdlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwic291cmNlUmFuZ2VcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtcmFuZ2VcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtcmFuZ2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VDb250ZW50Q3JjNjQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNvdXJjZUNvbnRlbnRDcmM2NFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGVudC1jcmM2NFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByYW5nZTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJyYW5nZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJhbmdlXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmFuZ2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMjAgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJwYWdlbGlzdFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcHJldnNuYXBzaG90ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJwcmV2c25hcHNob3RcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInByZXZzbmFwc2hvdFwiLFxuICAgICAgICB4bWxOYW1lOiBcInByZXZzbmFwc2hvdFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHByZXZTbmFwc2hvdFVybCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicHJldlNuYXBzaG90VXJsXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXByZXZpb3VzLXNuYXBzaG90LXVybFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtcHJldmlvdXMtc25hcHNob3QtdXJsXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3Qgc2VxdWVuY2VOdW1iZXJBY3Rpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJzZXF1ZW5jZU51bWJlckFjdGlvblwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNlcXVlbmNlLW51bWJlci1hY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zZXF1ZW5jZS1udW1iZXItYWN0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wibWF4XCIsIFwidXBkYXRlXCIsIFwiaW5jcmVtZW50XCJdXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGNvbXAyMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImluY3JlbWVudGFsY29weVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYmxvYlR5cGUxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYmxvYlR5cGVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcIkFwcGVuZEJsb2JcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMjIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhcHBlbmRibG9ja1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbWF4U2l6ZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYXBwZW5kUG9zaXRpb25BY2Nlc3NDb25kaXRpb25zXCIsIFwibWF4U2l6ZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbmRpdGlvbi1tYXhzaXplXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbmRpdGlvbi1tYXhzaXplXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgYXBwZW5kUG9zaXRpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJhcHBlbmRQb3NpdGlvbkFjY2Vzc0NvbmRpdGlvbnNcIixcbiAgICAgICAgXCJhcHBlbmRQb3NpdGlvblwiXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbmRpdGlvbi1hcHBlbmRwb3NcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29uZGl0aW9uLWFwcGVuZHBvc1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHNvdXJjZVJhbmdlMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwic291cmNlUmFuZ2VcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLXJhbmdlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtcmFuZ2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBjb21wMjMgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJzZWFsXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBibG9iVHlwZTIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJibG9iVHlwZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiQmxvY2tCbG9iXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29weVNvdXJjZUJsb2JQcm9wZXJ0aWVzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjb3B5U291cmNlQmxvYlByb3BlcnRpZXNcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zb3VyY2UtYmxvYi1wcm9wZXJ0aWVzXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS1ibG9iLXByb3BlcnRpZXNcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgY29tcDI0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYmxvY2tcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2NrSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJibG9ja0lkXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImJsb2NraWRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiYmxvY2tpZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGJsb2NrcyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImJsb2Nrc1wiLFxuICAgIG1hcHBlcjogQmxvY2tMb29rdXBMaXN0TWFwcGVyXG59O1xuZXhwb3J0IGNvbnN0IGNvbXAyNSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImJsb2NrbGlzdFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG5leHBvcnQgY29uc3QgbGlzdFR5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJsaXN0VHlwZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiY29tbWl0dGVkXCIsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImJsb2NrbGlzdHR5cGVcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiYmxvY2tsaXN0dHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImNvbW1pdHRlZFwiLCBcInVuY29tbWl0dGVkXCIsIFwiYWxsXCJdXG4gICAgICAgIH1cbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyYW1ldGVycy5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKlxuICogQ29kZSBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IChSKSBBdXRvUmVzdCBDb2RlIEdlbmVyYXRvci5cbiAqIENoYW5nZXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLlxuICovXG5pbXBvcnQgKiBhcyBjb3JlSHR0cCBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0ICogYXMgTWFwcGVycyBmcm9tIFwiLi4vbW9kZWxzL21hcHBlcnNcIjtcbmltcG9ydCAqIGFzIFBhcmFtZXRlcnMgZnJvbSBcIi4uL21vZGVscy9wYXJhbWV0ZXJzXCI7XG4vKiogQ2xhc3MgcmVwcmVzZW50aW5nIGEgU2VydmljZS4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBTZXJ2aWNlIGNsYXNzLlxuICAgICAqIEBwYXJhbSBjbGllbnQgUmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlIGNsaWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBwcm9wZXJ0aWVzIGZvciBhIHN0b3JhZ2UgYWNjb3VudCdzIEJsb2Igc2VydmljZSBlbmRwb2ludCwgaW5jbHVkaW5nIHByb3BlcnRpZXMgZm9yIFN0b3JhZ2VcbiAgICAgKiBBbmFseXRpY3MgYW5kIENPUlMgKENyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nKSBydWxlc1xuICAgICAqIEBwYXJhbSBibG9iU2VydmljZVByb3BlcnRpZXMgVGhlIFN0b3JhZ2VTZXJ2aWNlIHByb3BlcnRpZXMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZXRQcm9wZXJ0aWVzKGJsb2JTZXJ2aWNlUHJvcGVydGllcywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBibG9iU2VydmljZVByb3BlcnRpZXMsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc2V0UHJvcGVydGllc09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBnZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc3RvcmFnZSBhY2NvdW50J3MgQmxvYiBzZXJ2aWNlLCBpbmNsdWRpbmcgcHJvcGVydGllcyBmb3IgU3RvcmFnZSBBbmFseXRpY3NcbiAgICAgKiBhbmQgQ09SUyAoQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcpIHJ1bGVzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0UHJvcGVydGllcyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBnZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gcmVwbGljYXRpb24gZm9yIHRoZSBCbG9iIHNlcnZpY2UuIEl0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIHRoZVxuICAgICAqIHNlY29uZGFyeSBsb2NhdGlvbiBlbmRwb2ludCB3aGVuIHJlYWQtYWNjZXNzIGdlby1yZWR1bmRhbnQgcmVwbGljYXRpb24gaXMgZW5hYmxlZCBmb3IgdGhlIHN0b3JhZ2VcbiAgICAgKiBhY2NvdW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBnZXRTdGF0aXN0aWNzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBMaXN0IENvbnRhaW5lcnMgU2VnbWVudCBvcGVyYXRpb24gcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGNvbnRhaW5lcnMgdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50XG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBsaXN0Q29udGFpbmVyc1NlZ21lbnQob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgbGlzdENvbnRhaW5lcnNTZWdtZW50T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhIHVzZXIgZGVsZWdhdGlvbiBrZXkgZm9yIHRoZSBCbG9iIHNlcnZpY2UuIFRoaXMgaXMgb25seSBhIHZhbGlkIG9wZXJhdGlvbiB3aGVuIHVzaW5nXG4gICAgICogYmVhcmVyIHRva2VuIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqIEBwYXJhbSBrZXlJbmZvIEtleSBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0VXNlckRlbGVnYXRpb25LZXkoa2V5SW5mbywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBrZXlJbmZvLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldFVzZXJEZWxlZ2F0aW9uS2V5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNrdSBuYW1lIGFuZCBhY2NvdW50IGtpbmRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldEFjY291bnRJbmZvKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldEFjY291bnRJbmZvT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBCYXRjaCBvcGVyYXRpb24gYWxsb3dzIG11bHRpcGxlIEFQSSBjYWxscyB0byBiZSBlbWJlZGRlZCBpbnRvIGEgc2luZ2xlIEhUVFAgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBtdWx0aXBhcnRDb250ZW50VHlwZSBSZXF1aXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgYmUgbXVsdGlwYXJ0L21peGVkIHdpdGggYSBiYXRjaFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeS4gRXhhbXBsZSBoZWFkZXIgdmFsdWU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9YmF0Y2hfPEdVSUQ+XG4gICAgICogQHBhcmFtIGJvZHkgSW5pdGlhbCBkYXRhXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdWJtaXRCYXRjaChjb250ZW50TGVuZ3RoLCBtdWx0aXBhcnRDb250ZW50VHlwZSwgYm9keSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgbXVsdGlwYXJ0Q29udGVudFR5cGUsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHN1Ym1pdEJhdGNoT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBGaWx0ZXIgQmxvYnMgb3BlcmF0aW9uIGVuYWJsZXMgY2FsbGVycyB0byBsaXN0IGJsb2JzIGFjcm9zcyBhbGwgY29udGFpbmVycyB3aG9zZSB0YWdzIG1hdGNoIGFcbiAgICAgKiBnaXZlbiBzZWFyY2ggZXhwcmVzc2lvbi4gIEZpbHRlciBibG9icyBzZWFyY2hlcyBhY3Jvc3MgYWxsIGNvbnRhaW5lcnMgd2l0aGluIGEgc3RvcmFnZSBhY2NvdW50IGJ1dFxuICAgICAqIGNhbiBiZSBzY29wZWQgd2l0aGluIHRoZSBleHByZXNzaW9uIHRvIGEgc2luZ2xlIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGZpbHRlckJsb2JzKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGZpbHRlckJsb2JzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxufVxuLy8gT3BlcmF0aW9uIFNwZWNpZmljYXRpb25zXG5jb25zdCB4bWxTZXJpYWxpemVyID0gbmV3IGNvcmVIdHRwLlNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gdHJ1ZSk7XG5jb25zdCBzZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi9cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZVNldFByb3BlcnRpZXNIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlU2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMuYmxvYlNlcnZpY2VQcm9wZXJ0aWVzLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcCxcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQsXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWRcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJ4bWxcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZ2V0UHJvcGVydGllc09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLkJsb2JTZXJ2aWNlUHJvcGVydGllcyxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUdldFByb3BlcnRpZXNIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wLFxuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHNcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRTdGF0aXN0aWNzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi9cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuQmxvYlNlcnZpY2VTdGF0aXN0aWNzLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5TZXJ2aWNlR2V0U3RhdGlzdGljc0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VHZXRTdGF0aXN0aWNzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDFcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBsaXN0Q29udGFpbmVyc1NlZ21lbnRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5MaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUxpc3RDb250YWluZXJzU2VnbWVudEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VMaXN0Q29udGFpbmVyc1NlZ21lbnRFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDIsXG4gICAgICAgIFBhcmFtZXRlcnMucHJlZml4LFxuICAgICAgICBQYXJhbWV0ZXJzLm1hcmtlcixcbiAgICAgICAgUGFyYW1ldGVycy5tYXhQYWdlU2l6ZSxcbiAgICAgICAgUGFyYW1ldGVycy5pbmNsdWRlXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZ2V0VXNlckRlbGVnYXRpb25LZXlPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiUE9TVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuVXNlckRlbGVnYXRpb25LZXksXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMua2V5SW5mbyxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDNcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRBY2NvdW50SW5mb09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VHZXRBY2NvdW50SW5mb0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlNlcnZpY2VHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy5jb21wLCBQYXJhbWV0ZXJzLnJlc3R5cGUxXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnZlcnNpb24sIFBhcmFtZXRlcnMuYWNjZXB0MV0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHN1Ym1pdEJhdGNoT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi9cIixcbiAgICBodHRwTWV0aG9kOiBcIlBPU1RcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogeyBuYW1lOiBcIlN0cmVhbVwiIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicGFyc2VkUmVzcG9uc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZVN1Ym1pdEJhdGNoSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZVN1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogUGFyYW1ldGVycy5ib2R5LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wNF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudFR5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0LFxuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIFBhcmFtZXRlcnMubXVsdGlwYXJ0Q29udGVudFR5cGVcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJ4bWxcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZmlsdGVyQmxvYnNPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5GaWx0ZXJCbG9iU2VnbWVudCxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUZpbHRlckJsb2JzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuU2VydmljZUZpbHRlckJsb2JzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLm1hcmtlcixcbiAgICAgICAgUGFyYW1ldGVycy5tYXhQYWdlU2l6ZSxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wNSxcbiAgICAgICAgUGFyYW1ldGVycy53aGVyZVxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcnZpY2UuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuaW1wb3J0ICogYXMgY29yZUh0dHAgZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCAqIGFzIE1hcHBlcnMgZnJvbSBcIi4uL21vZGVscy9tYXBwZXJzXCI7XG5pbXBvcnQgKiBhcyBQYXJhbWV0ZXJzIGZyb20gXCIuLi9tb2RlbHMvcGFyYW1ldGVyc1wiO1xuLyoqIENsYXNzIHJlcHJlc2VudGluZyBhIENvbnRhaW5lci4gKi9cbmV4cG9ydCBjbGFzcyBDb250YWluZXIge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIENvbnRhaW5lciBjbGFzcy5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFJlZmVyZW5jZSB0byB0aGUgc2VydmljZSBjbGllbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHVuZGVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudC4gSWYgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeVxuICAgICAqIGV4aXN0cywgdGhlIG9wZXJhdGlvbiBmYWlsc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY3JlYXRlKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGNyZWF0ZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIGFsbCB1c2VyLWRlZmluZWQgbWV0YWRhdGEgYW5kIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4gVGhlIGRhdGFcbiAgICAgKiByZXR1cm5lZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjb250YWluZXIncyBsaXN0IG9mIGJsb2JzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRQcm9wZXJ0aWVzKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldFByb3BlcnRpZXNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogb3BlcmF0aW9uIG1hcmtzIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIGZvciBkZWxldGlvbi4gVGhlIGNvbnRhaW5lciBhbmQgYW55IGJsb2JzIGNvbnRhaW5lZCB3aXRoaW5cbiAgICAgKiBpdCBhcmUgbGF0ZXIgZGVsZXRlZCBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBkZWxldGUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZGVsZXRlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIG9wZXJhdGlvbiBzZXRzIG9uZSBvciBtb3JlIHVzZXItZGVmaW5lZCBuYW1lLXZhbHVlIHBhaXJzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldE1ldGFkYXRhKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHNldE1ldGFkYXRhT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGdldHMgdGhlIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4gVGhlIHBlcm1pc3Npb25zIGluZGljYXRlIHdoZXRoZXIgY29udGFpbmVyIGRhdGFcbiAgICAgKiBtYXkgYmUgYWNjZXNzZWQgcHVibGljbHkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRBY2Nlc3NQb2xpY3kob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0QWNjZXNzUG9saWN5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHNldHMgdGhlIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4gVGhlIHBlcm1pc3Npb25zIGluZGljYXRlIHdoZXRoZXIgYmxvYnMgaW4gYVxuICAgICAqIGNvbnRhaW5lciBtYXkgYmUgYWNjZXNzZWQgcHVibGljbHkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZXRBY2Nlc3NQb2xpY3kob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc2V0QWNjZXNzUG9saWN5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIGEgcHJldmlvdXNseS1kZWxldGVkIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlc3RvcmUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgcmVzdG9yZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW5hbWVzIGFuIGV4aXN0aW5nIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gc291cmNlQ29udGFpbmVyTmFtZSBSZXF1aXJlZC4gIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIHJlbmFtZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlbmFtZShzb3VyY2VDb250YWluZXJOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgcmVuYW1lT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBCYXRjaCBvcGVyYXRpb24gYWxsb3dzIG11bHRpcGxlIEFQSSBjYWxscyB0byBiZSBlbWJlZGRlZCBpbnRvIGEgc2luZ2xlIEhUVFAgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBtdWx0aXBhcnRDb250ZW50VHlwZSBSZXF1aXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgYmUgbXVsdGlwYXJ0L21peGVkIHdpdGggYSBiYXRjaFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeS4gRXhhbXBsZSBoZWFkZXIgdmFsdWU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9YmF0Y2hfPEdVSUQ+XG4gICAgICogQHBhcmFtIGJvZHkgSW5pdGlhbCBkYXRhXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdWJtaXRCYXRjaChjb250ZW50TGVuZ3RoLCBtdWx0aXBhcnRDb250ZW50VHlwZSwgYm9keSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgbXVsdGlwYXJ0Q29udGVudFR5cGUsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHN1Ym1pdEJhdGNoT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBGaWx0ZXIgQmxvYnMgb3BlcmF0aW9uIGVuYWJsZXMgY2FsbGVycyB0byBsaXN0IGJsb2JzIGluIGEgY29udGFpbmVyIHdob3NlIHRhZ3MgbWF0Y2ggYSBnaXZlblxuICAgICAqIHNlYXJjaCBleHByZXNzaW9uLiAgRmlsdGVyIGJsb2JzIHNlYXJjaGVzIHdpdGhpbiB0aGUgZ2l2ZW4gY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZmlsdGVyQmxvYnMob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZmlsdGVyQmxvYnNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gZXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgY29udGFpbmVyIGZvciBkZWxldGUgb3BlcmF0aW9ucy4gVGhlIGxvY2sgZHVyYXRpb24gY2FuXG4gICAgICogYmUgMTUgdG8gNjAgc2Vjb25kcywgb3IgY2FuIGJlIGluZmluaXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBhY3F1aXJlTGVhc2Uob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgYWNxdWlyZUxlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIGVzdGFibGlzaGVzIGFuZCBtYW5hZ2VzIGEgbG9jayBvbiBhIGNvbnRhaW5lciBmb3IgZGVsZXRlIG9wZXJhdGlvbnMuIFRoZSBsb2NrIGR1cmF0aW9uIGNhblxuICAgICAqIGJlIDE1IHRvIDYwIHNlY29uZHMsIG9yIGNhbiBiZSBpbmZpbml0ZVxuICAgICAqIEBwYXJhbSBsZWFzZUlkIFNwZWNpZmllcyB0aGUgY3VycmVudCBsZWFzZSBJRCBvbiB0aGUgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICByZWxlYXNlTGVhc2UobGVhc2VJZCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBsZWFzZUlkLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHJlbGVhc2VMZWFzZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBjb250YWluZXIgZm9yIGRlbGV0ZSBvcGVyYXRpb25zLiBUaGUgbG9jayBkdXJhdGlvbiBjYW5cbiAgICAgKiBiZSAxNSB0byA2MCBzZWNvbmRzLCBvciBjYW4gYmUgaW5maW5pdGVcbiAgICAgKiBAcGFyYW0gbGVhc2VJZCBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgbGVhc2UgSUQgb24gdGhlIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcmVuZXdMZWFzZShsZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGxlYXNlSWQsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgcmVuZXdMZWFzZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBjb250YWluZXIgZm9yIGRlbGV0ZSBvcGVyYXRpb25zLiBUaGUgbG9jayBkdXJhdGlvbiBjYW5cbiAgICAgKiBiZSAxNSB0byA2MCBzZWNvbmRzLCBvciBjYW4gYmUgaW5maW5pdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGJyZWFrTGVhc2Uob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgYnJlYWtMZWFzZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBjb250YWluZXIgZm9yIGRlbGV0ZSBvcGVyYXRpb25zLiBUaGUgbG9jayBkdXJhdGlvbiBjYW5cbiAgICAgKiBiZSAxNSB0byA2MCBzZWNvbmRzLCBvciBjYW4gYmUgaW5maW5pdGVcbiAgICAgKiBAcGFyYW0gbGVhc2VJZCBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgbGVhc2UgSUQgb24gdGhlIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSBwcm9wb3NlZExlYXNlSWQgUHJvcG9zZWQgbGVhc2UgSUQsIGluIGEgR1VJRCBzdHJpbmcgZm9ybWF0LiBUaGUgQmxvYiBzZXJ2aWNlIHJldHVybnMgNDAwXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAoSW52YWxpZCByZXF1ZXN0KSBpZiB0aGUgcHJvcG9zZWQgbGVhc2UgSUQgaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdC4gU2VlIEd1aWQgQ29uc3RydWN0b3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZvciBhIGxpc3Qgb2YgdmFsaWQgR1VJRCBzdHJpbmcgZm9ybWF0cy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNoYW5nZUxlYXNlKGxlYXNlSWQsIHByb3Bvc2VkTGVhc2VJZCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBsZWFzZUlkLFxuICAgICAgICAgICAgcHJvcG9zZWRMZWFzZUlkLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGNoYW5nZUxlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMaXN0IEJsb2JzIG9wZXJhdGlvbiByZXR1cm5zIGEgbGlzdCBvZiB0aGUgYmxvYnMgdW5kZXIgdGhlIHNwZWNpZmllZCBjb250YWluZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGxpc3RCbG9iRmxhdFNlZ21lbnQob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgbGlzdEJsb2JGbGF0U2VnbWVudE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBUaGUgTGlzdCBCbG9icyBvcGVyYXRpb24gcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGJsb2JzIHVuZGVyIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyXG4gICAgICogQHBhcmFtIGRlbGltaXRlciBXaGVuIHRoZSByZXF1ZXN0IGluY2x1ZGVzIHRoaXMgcGFyYW1ldGVyLCB0aGUgb3BlcmF0aW9uIHJldHVybnMgYSBCbG9iUHJlZml4XG4gICAgICogICAgICAgICAgICAgICAgICBlbGVtZW50IGluIHRoZSByZXNwb25zZSBib2R5IHRoYXQgYWN0cyBhcyBhIHBsYWNlaG9sZGVyIGZvciBhbGwgYmxvYnMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHNhbWUgc3Vic3RyaW5nIHVwIHRvIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyLiBUaGUgZGVsaW1pdGVyIG1heSBiZSBhIHNpbmdsZVxuICAgICAqICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIG9yIGEgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50KGRlbGltaXRlciwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBkZWxpbWl0ZXIsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNrdSBuYW1lIGFuZCBhY2NvdW50IGtpbmRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldEFjY291bnRJbmZvKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldEFjY291bnRJbmZvT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxufVxuLy8gT3BlcmF0aW9uIFNwZWNpZmljYXRpb25zXG5jb25zdCB4bWxTZXJpYWxpemVyID0gbmV3IGNvcmVIdHRwLlNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gdHJ1ZSk7XG5jb25zdCBjcmVhdGVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJDcmVhdGVIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJDcmVhdGVFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5yZXN0eXBlMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5hY2Nlc3MsXG4gICAgICAgIFBhcmFtZXRlcnMuZGVmYXVsdEVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy5wcmV2ZW50RW5jcnlwdGlvblNjb3BlT3ZlcnJpZGVcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyR2V0UHJvcGVydGllc0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5yZXN0eXBlMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZGVsZXRlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIkRFTEVURVwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyRGVsZXRlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyRGVsZXRlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMucmVzdHlwZTJdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2VcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBzZXRNZXRhZGF0YU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclNldE1ldGFkYXRhSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyU2V0TWV0YWRhdGFFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDZcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubWV0YWRhdGEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2VcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRBY2Nlc3NQb2xpY3lPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7IG5hbWU6IFwiQ29tcG9zaXRlXCIsIGNsYXNzTmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCIgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRJZGVudGlmaWVyc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkSWRlbnRpZmllcnNcIixcbiAgICAgICAgICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiU2lnbmVkSWRlbnRpZmllclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJHZXRBY2Nlc3NQb2xpY3lIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJHZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDdcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHNldEFjY2Vzc1BvbGljeU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclNldEFjY2Vzc1BvbGljeUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclNldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMuY29udGFpbmVyQWNsLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDdcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2Nlc3MsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2VcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJ4bWxcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgcmVzdG9yZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclJlc3RvcmVIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJSZXN0b3JlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUyLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXA4XG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmRlbGV0ZWRDb250YWluZXJOYW1lLFxuICAgICAgICBQYXJhbWV0ZXJzLmRlbGV0ZWRDb250YWluZXJWZXJzaW9uXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgcmVuYW1lT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyUmVuYW1lSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyUmVuYW1lRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUyLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXA5XG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUNvbnRhaW5lck5hbWUsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlTGVhc2VJZFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHN1Ym1pdEJhdGNoT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBPU1RcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogeyBuYW1lOiBcIlN0cmVhbVwiIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicGFyc2VkUmVzcG9uc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyU3VibWl0QmF0Y2hIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMuYm9keSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXA0LFxuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUyXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQsXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5tdWx0aXBhcnRDb250ZW50VHlwZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBmaWx0ZXJCbG9ic09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLkZpbHRlckJsb2JTZWdtZW50LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJGaWx0ZXJCbG9ic0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckZpbHRlckJsb2JzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLm1hcmtlcixcbiAgICAgICAgUGFyYW1ldGVycy5tYXhQYWdlU2l6ZSxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wNSxcbiAgICAgICAgUGFyYW1ldGVycy53aGVyZSxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMlxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGFjcXVpcmVMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckFjcXVpcmVMZWFzZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMTBcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5kdXJhdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5wcm9wb3NlZExlYXNlSWRcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCByZWxlYXNlTGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJSZWxlYXNlTGVhc2VIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJSZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDEwXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5hY3Rpb24xLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgcmVuZXdMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lclJlbmV3TGVhc2VIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJSZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlc3R5cGUyLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAxMFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZDEsXG4gICAgICAgIFBhcmFtZXRlcnMuYWN0aW9uMlxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGJyZWFrTGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJCcmVha0xlYXNlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMTBcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjdGlvbjMsXG4gICAgICAgIFBhcmFtZXRlcnMuYnJlYWtQZXJpb2RcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBjaGFuZ2VMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckNoYW5nZUxlYXNlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDEwXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkMSxcbiAgICAgICAgUGFyYW1ldGVycy5hY3Rpb240LFxuICAgICAgICBQYXJhbWV0ZXJzLnByb3Bvc2VkTGVhc2VJZDFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBsaXN0QmxvYkZsYXRTZWdtZW50T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckxpc3RCbG9iRmxhdFNlZ21lbnRFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDIsXG4gICAgICAgIFBhcmFtZXRlcnMucHJlZml4LFxuICAgICAgICBQYXJhbWV0ZXJzLm1hcmtlcixcbiAgICAgICAgUGFyYW1ldGVycy5tYXhQYWdlU2l6ZSxcbiAgICAgICAgUGFyYW1ldGVycy5yZXN0eXBlMixcbiAgICAgICAgUGFyYW1ldGVycy5pbmNsdWRlMVxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGxpc3RCbG9iSGllcmFyY2h5U2VnbWVudE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLkxpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAyLFxuICAgICAgICBQYXJhbWV0ZXJzLnByZWZpeCxcbiAgICAgICAgUGFyYW1ldGVycy5tYXJrZXIsXG4gICAgICAgIFBhcmFtZXRlcnMubWF4UGFnZVNpemUsXG4gICAgICAgIFBhcmFtZXRlcnMucmVzdHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuaW5jbHVkZTEsXG4gICAgICAgIFBhcmFtZXRlcnMuZGVsaW1pdGVyXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZ2V0QWNjb3VudEluZm9PcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5Db250YWluZXJHZXRBY2NvdW50SW5mb0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkNvbnRhaW5lckdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLmNvbXAsIFBhcmFtZXRlcnMucmVzdHlwZTFdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudmVyc2lvbiwgUGFyYW1ldGVycy5hY2NlcHQxXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGFpbmVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgU3BhbktpbmQsIHNldFNwYW4sIGNvbnRleHQgYXMgb3RDb250ZXh0LCBnZXRUcmFjZXIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyB0cmFjZSwgSU5WQUxJRF9TUEFOX0NPTlRFWFQgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNUcmFjaW5nRGlzYWJsZWQoKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZm9yIG5vdyB3aXRob3V0IHBvbHlmaWxsc1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGF6dXJlVHJhY2luZ0Rpc2FibGVkVmFsdWUgPSAoX2EgPSBwcm9jZXNzLmVudi5BWlVSRV9UUkFDSU5HX0RJU0FCTEVEKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoYXp1cmVUcmFjaW5nRGlzYWJsZWRWYWx1ZSA9PT0gXCJmYWxzZVwiIHx8IGF6dXJlVHJhY2luZ0Rpc2FibGVkVmFsdWUgPT09IFwiMFwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIEJvb2xlYW4oYXp1cmVUcmFjaW5nRGlzYWJsZWRWYWx1ZSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBzcGFucyB1c2luZyB0aGUgZ2xvYmFsIHRyYWNlci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBvbmNlXG4gKiBjb25zdCBjcmVhdGVTcGFuID0gY3JlYXRlU3BhbkZ1bmN0aW9uKHsgcGFja2FnZVByZWZpeDogXCJBenVyZS5EYXRhLkFwcENvbmZpZ3VyYXRpb25cIiwgbmFtZXNwYWNlOiBcIk1pY3Jvc29mdC5BcHBDb25maWd1cmF0aW9uXCIgfSk7XG4gKlxuICogLy8gaW4gZWFjaCBvcGVyYXRpb25cbiAqIGNvbnN0IHNwYW4gPSBjcmVhdGVTcGFuKFwiZGVsZXRlQ29uZmlndXJhdGlvblNldHRpbmdcIiwgb3BlcmF0aW9uT3B0aW9ucyk7XG4gKiAgICAvLyBjb2RlLi4uXG4gKiBzcGFuLmVuZCgpO1xuICogYGBgXG4gKlxuICogQGhpZGRlblxuICogQHBhcmFtIGFyZ3MgLSBhbGxvd3MgY29uZmlndXJhdGlvbiBvZiB0aGUgcHJlZml4IGZvciBlYWNoIHNwYW4gYXMgd2VsbCBhcyB0aGUgYXoubmFtZXNwYWNlIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3BhbkZ1bmN0aW9uKGFyZ3MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9wZXJhdGlvbk5hbWUsIG9wZXJhdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdHJhY2VyID0gZ2V0VHJhY2VyKCk7XG4gICAgICAgIGNvbnN0IHRyYWNpbmdPcHRpb25zID0gKG9wZXJhdGlvbk9wdGlvbnMgPT09IG51bGwgfHwgb3BlcmF0aW9uT3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3BlcmF0aW9uT3B0aW9ucy50cmFjaW5nT3B0aW9ucykgfHwge307XG4gICAgICAgIGNvbnN0IHNwYW5PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGtpbmQ6IFNwYW5LaW5kLklOVEVSTkFMIH0sIHRyYWNpbmdPcHRpb25zLnNwYW5PcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3Bhbk5hbWUgPSBhcmdzLnBhY2thZ2VQcmVmaXggPyBgJHthcmdzLnBhY2thZ2VQcmVmaXh9LiR7b3BlcmF0aW9uTmFtZX1gIDogb3BlcmF0aW9uTmFtZTtcbiAgICAgICAgbGV0IHNwYW47XG4gICAgICAgIGlmIChpc1RyYWNpbmdEaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICBzcGFuID0gdHJhY2Uud3JhcFNwYW5Db250ZXh0KElOVkFMSURfU1BBTl9DT05URVhUKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNwYW4gPSB0cmFjZXIuc3RhcnRTcGFuKHNwYW5OYW1lLCBzcGFuT3B0aW9ucywgdHJhY2luZ09wdGlvbnMudHJhY2luZ0NvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmdzLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJhei5uYW1lc3BhY2VcIiwgYXJncy5uYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdTcGFuT3B0aW9ucyA9IHRyYWNpbmdPcHRpb25zLnNwYW5PcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoc3Bhbi5pc1JlY29yZGluZygpICYmIGFyZ3MubmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBuZXdTcGFuT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdHJhY2luZ09wdGlvbnMuc3Bhbk9wdGlvbnMpLCB7IGF0dHJpYnV0ZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3Bhbk9wdGlvbnMuYXR0cmlidXRlcyksIHsgXCJhei5uYW1lc3BhY2VcIjogYXJncy5uYW1lc3BhY2UgfSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VHJhY2luZ09wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRyYWNpbmdPcHRpb25zKSwgeyBzcGFuT3B0aW9uczogbmV3U3Bhbk9wdGlvbnMsIHRyYWNpbmdDb250ZXh0OiBzZXRTcGFuKHRyYWNpbmdPcHRpb25zLnRyYWNpbmdDb250ZXh0IHx8IG90Q29udGV4dC5hY3RpdmUoKSwgc3BhbikgfSk7XG4gICAgICAgIGNvbnN0IG5ld09wZXJhdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wZXJhdGlvbk9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiBuZXdUcmFjaW5nT3B0aW9ucyB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwYW4sXG4gICAgICAgICAgICB1cGRhdGVkT3B0aW9uczogbmV3T3BlcmF0aW9uT3B0aW9uc1xuICAgICAgICB9O1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVTcGFuLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuY29uc3QgVkVSU0lPTiA9IFwiMDBcIjtcbi8qKlxuICogR2VuZXJhdGVzIGEgYFNwYW5Db250ZXh0YCBnaXZlbiBhIGB0cmFjZXBhcmVudGAgaGVhZGVyIHZhbHVlLlxuICogQHBhcmFtIHRyYWNlUGFyZW50IC0gU2VyaWFsaXplZCBzcGFuIGNvbnRleHQgZGF0YSBhcyBhIGB0cmFjZXBhcmVudGAgaGVhZGVyIHZhbHVlLlxuICogQHJldHVybnMgVGhlIGBTcGFuQ29udGV4dGAgZ2VuZXJhdGVkIGZyb20gdGhlIGB0cmFjZXBhcmVudGAgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U3BhbkNvbnRleHRGcm9tVHJhY2VQYXJlbnRIZWFkZXIodHJhY2VQYXJlbnRIZWFkZXIpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHRyYWNlUGFyZW50SGVhZGVyLnNwbGl0KFwiLVwiKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSA0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3ZlcnNpb24sIHRyYWNlSWQsIHNwYW5JZCwgdHJhY2VPcHRpb25zXSA9IHBhcnRzO1xuICAgIGlmICh2ZXJzaW9uICE9PSBWRVJTSU9OKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdHJhY2VGbGFncyA9IHBhcnNlSW50KHRyYWNlT3B0aW9ucywgMTYpO1xuICAgIGNvbnN0IHNwYW5Db250ZXh0ID0ge1xuICAgICAgICBzcGFuSWQsXG4gICAgICAgIHRyYWNlSWQsXG4gICAgICAgIHRyYWNlRmxhZ3NcbiAgICB9O1xuICAgIHJldHVybiBzcGFuQ29udGV4dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgYHRyYWNlcGFyZW50YCB2YWx1ZSBnaXZlbiBhIHNwYW4gY29udGV4dC5cbiAqIEBwYXJhbSBzcGFuQ29udGV4dCAtIENvbnRhaW5zIGNvbnRleHQgZm9yIGEgc3BlY2lmaWMgc3Bhbi5cbiAqIEByZXR1cm5zIFRoZSBgc3BhbkNvbnRleHRgIHJlcHJlc2VudGVkIGFzIGEgYHRyYWNlcGFyZW50YCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYWNlUGFyZW50SGVhZGVyKHNwYW5Db250ZXh0KSB7XG4gICAgY29uc3QgbWlzc2luZ0ZpZWxkcyA9IFtdO1xuICAgIGlmICghc3BhbkNvbnRleHQudHJhY2VJZCkge1xuICAgICAgICBtaXNzaW5nRmllbGRzLnB1c2goXCJ0cmFjZUlkXCIpO1xuICAgIH1cbiAgICBpZiAoIXNwYW5Db250ZXh0LnNwYW5JZCkge1xuICAgICAgICBtaXNzaW5nRmllbGRzLnB1c2goXCJzcGFuSWRcIik7XG4gICAgfVxuICAgIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZsYWdzID0gc3BhbkNvbnRleHQudHJhY2VGbGFncyB8fCAwIC8qIE5PTkUgKi87XG4gICAgY29uc3QgaGV4RmxhZ3MgPSBmbGFncy50b1N0cmluZygxNik7XG4gICAgY29uc3QgdHJhY2VGbGFncyA9IGhleEZsYWdzLmxlbmd0aCA9PT0gMSA/IGAwJHtoZXhGbGFnc31gIDogaGV4RmxhZ3M7XG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3RyYWNlLWNvbnRleHQvI3RyYWNlcGFyZW50LWhlYWRlci1maWVsZC12YWx1ZXNcbiAgICByZXR1cm4gYCR7VkVSU0lPTn0tJHtzcGFuQ29udGV4dC50cmFjZUlkfS0ke3NwYW5Db250ZXh0LnNwYW5JZH0tJHt0cmFjZUZsYWdzfWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZVBhcmVudEhlYWRlci5qcy5tYXAiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcIm5vZGU6b3NcIik7IiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHJlcXVpcmUoXCJub2RlOnByb2Nlc3NcIik7IiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBFT0wgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHV0aWwgZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0ICogYXMgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5leHBvcnQgZnVuY3Rpb24gbG9nKG1lc3NhZ2UsIC4uLmFyZ3MpIHtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHt1dGlsLmZvcm1hdChtZXNzYWdlLCAuLi5hcmdzKX0ke0VPTH1gKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGxvZyB9IGZyb20gXCIuL2xvZy5qc1wiO1xuY29uc3QgZGVidWdFbnZWYXJpYWJsZSA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5ERUJVRykgfHwgdW5kZWZpbmVkO1xubGV0IGVuYWJsZWRTdHJpbmc7XG5sZXQgZW5hYmxlZE5hbWVzcGFjZXMgPSBbXTtcbmxldCBza2lwcGVkTmFtZXNwYWNlcyA9IFtdO1xuY29uc3QgZGVidWdnZXJzID0gW107XG5pZiAoZGVidWdFbnZWYXJpYWJsZSkge1xuICAgIGVuYWJsZShkZWJ1Z0VudlZhcmlhYmxlKTtcbn1cbmNvbnN0IGRlYnVnT2JqID0gT2JqZWN0LmFzc2lnbigobmFtZXNwYWNlKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZURlYnVnZ2VyKG5hbWVzcGFjZSk7XG59LCB7XG4gICAgZW5hYmxlLFxuICAgIGVuYWJsZWQsXG4gICAgZGlzYWJsZSxcbiAgICBsb2csXG59KTtcbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gICAgZW5hYmxlZFN0cmluZyA9IG5hbWVzcGFjZXM7XG4gICAgZW5hYmxlZE5hbWVzcGFjZXMgPSBbXTtcbiAgICBza2lwcGVkTmFtZXNwYWNlcyA9IFtdO1xuICAgIGNvbnN0IHdpbGRjYXJkID0gL1xcKi9nO1xuICAgIGNvbnN0IG5hbWVzcGFjZUxpc3QgPSBuYW1lc3BhY2VzLnNwbGl0KFwiLFwiKS5tYXAoKG5zKSA9PiBucy50cmltKCkucmVwbGFjZSh3aWxkY2FyZCwgXCIuKj9cIikpO1xuICAgIGZvciAoY29uc3QgbnMgb2YgbmFtZXNwYWNlTGlzdCkge1xuICAgICAgICBpZiAobnMuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNraXBwZWROYW1lc3BhY2VzLnB1c2gobmV3IFJlZ0V4cChgXiR7bnMuc3Vic3RyKDEpfSRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmFibGVkTmFtZXNwYWNlcy5wdXNoKG5ldyBSZWdFeHAoYF4ke25zfSRgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBkZWJ1Z2dlcnMpIHtcbiAgICAgICAgaW5zdGFuY2UuZW5hYmxlZCA9IGVuYWJsZWQoaW5zdGFuY2UubmFtZXNwYWNlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbmFibGVkKG5hbWVzcGFjZSkge1xuICAgIGlmIChuYW1lc3BhY2UuZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNraXBwZWQgb2Ygc2tpcHBlZE5hbWVzcGFjZXMpIHtcbiAgICAgICAgaWYgKHNraXBwZWQudGVzdChuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBlbmFibGVkTmFtZXNwYWNlIG9mIGVuYWJsZWROYW1lc3BhY2VzKSB7XG4gICAgICAgIGlmIChlbmFibGVkTmFtZXNwYWNlLnRlc3QobmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBlbmFibGVkU3RyaW5nIHx8IFwiXCI7XG4gICAgZW5hYmxlKFwiXCIpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjcmVhdGVEZWJ1Z2dlcihuYW1lc3BhY2UpIHtcbiAgICBjb25zdCBuZXdEZWJ1Z2dlciA9IE9iamVjdC5hc3NpZ24oZGVidWcsIHtcbiAgICAgICAgZW5hYmxlZDogZW5hYmxlZChuYW1lc3BhY2UpLFxuICAgICAgICBkZXN0cm95LFxuICAgICAgICBsb2c6IGRlYnVnT2JqLmxvZyxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBleHRlbmQsXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuICAgICAgICBpZiAoIW5ld0RlYnVnZ2VyLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhcmdzWzBdID0gYCR7bmFtZXNwYWNlfSAke2FyZ3NbMF19YDtcbiAgICAgICAgfVxuICAgICAgICBuZXdEZWJ1Z2dlci5sb2coLi4uYXJncyk7XG4gICAgfVxuICAgIGRlYnVnZ2Vycy5wdXNoKG5ld0RlYnVnZ2VyKTtcbiAgICByZXR1cm4gbmV3RGVidWdnZXI7XG59XG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGNvbnN0IGluZGV4ID0gZGVidWdnZXJzLmluZGV4T2YodGhpcyk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgZGVidWdnZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlKSB7XG4gICAgY29uc3QgbmV3RGVidWdnZXIgPSBjcmVhdGVEZWJ1Z2dlcihgJHt0aGlzLm5hbWVzcGFjZX06JHtuYW1lc3BhY2V9YCk7XG4gICAgbmV3RGVidWdnZXIubG9nID0gdGhpcy5sb2c7XG4gICAgcmV0dXJuIG5ld0RlYnVnZ2VyO1xufVxuZXhwb3J0IGRlZmF1bHQgZGVidWdPYmo7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJ1Zy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCBkZWJ1ZyBmcm9tIFwiLi9kZWJ1Zy5qc1wiO1xuY29uc3QgcmVnaXN0ZXJlZExvZ2dlcnMgPSBuZXcgU2V0KCk7XG5jb25zdCBsb2dMZXZlbEZyb21FbnYgPSAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuQVpVUkVfTE9HX0xFVkVMKSB8fCB1bmRlZmluZWQ7XG5sZXQgYXp1cmVMb2dMZXZlbDtcbi8qKlxuICogVGhlIEF6dXJlTG9nZ2VyIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBvdmVycmlkaW5nIHdoZXJlIGxvZ3MgYXJlIG91dHB1dCB0by5cbiAqIEJ5IGRlZmF1bHQsIGxvZ3MgYXJlIHNlbnQgdG8gc3RkZXJyLlxuICogT3ZlcnJpZGUgdGhlIGBsb2dgIG1ldGhvZCB0byByZWRpcmVjdCBsb2dzIHRvIGFub3RoZXIgbG9jYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBBenVyZUxvZ2dlciA9IGRlYnVnKFwiYXp1cmVcIik7XG5BenVyZUxvZ2dlci5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIGRlYnVnLmxvZyguLi5hcmdzKTtcbn07XG5jb25zdCBBWlVSRV9MT0dfTEVWRUxTID0gW1widmVyYm9zZVwiLCBcImluZm9cIiwgXCJ3YXJuaW5nXCIsIFwiZXJyb3JcIl07XG5pZiAobG9nTGV2ZWxGcm9tRW52KSB7XG4gICAgLy8gYXZvaWQgY2FsbGluZyBzZXRMb2dMZXZlbCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYSBtaXMtc2V0IGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGNyYXNoXG4gICAgaWYgKGlzQXp1cmVMb2dMZXZlbChsb2dMZXZlbEZyb21FbnYpKSB7XG4gICAgICAgIHNldExvZ0xldmVsKGxvZ0xldmVsRnJvbUVudik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBBWlVSRV9MT0dfTEVWRUwgc2V0IHRvIHVua25vd24gbG9nIGxldmVsICcke2xvZ0xldmVsRnJvbUVudn0nOyBsb2dnaW5nIGlzIG5vdCBlbmFibGVkLiBBY2NlcHRhYmxlIHZhbHVlczogJHtBWlVSRV9MT0dfTEVWRUxTLmpvaW4oXCIsIFwiKX0uYCk7XG4gICAgfVxufVxuLyoqXG4gKiBJbW1lZGlhdGVseSBlbmFibGVzIGxvZ2dpbmcgYXQgdGhlIHNwZWNpZmllZCBsb2cgbGV2ZWwuIElmIG5vIGxldmVsIGlzIHNwZWNpZmllZCwgbG9nZ2luZyBpcyBkaXNhYmxlZC5cbiAqIEBwYXJhbSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgdG8gZW5hYmxlIGZvciBsb2dnaW5nLlxuICogT3B0aW9ucyBmcm9tIG1vc3QgdmVyYm9zZSB0byBsZWFzdCB2ZXJib3NlIGFyZTpcbiAqIC0gdmVyYm9zZVxuICogLSBpbmZvXG4gKiAtIHdhcm5pbmdcbiAqIC0gZXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsKSB7XG4gICAgaWYgKGxldmVsICYmICFpc0F6dXJlTG9nTGV2ZWwobGV2ZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsb2cgbGV2ZWwgJyR7bGV2ZWx9Jy4gQWNjZXB0YWJsZSB2YWx1ZXM6ICR7QVpVUkVfTE9HX0xFVkVMUy5qb2luKFwiLFwiKX1gKTtcbiAgICB9XG4gICAgYXp1cmVMb2dMZXZlbCA9IGxldmVsO1xuICAgIGNvbnN0IGVuYWJsZWROYW1lc3BhY2VzID0gW107XG4gICAgZm9yIChjb25zdCBsb2dnZXIgb2YgcmVnaXN0ZXJlZExvZ2dlcnMpIHtcbiAgICAgICAgaWYgKHNob3VsZEVuYWJsZShsb2dnZXIpKSB7XG4gICAgICAgICAgICBlbmFibGVkTmFtZXNwYWNlcy5wdXNoKGxvZ2dlci5uYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlYnVnLmVuYWJsZShlbmFibGVkTmFtZXNwYWNlcy5qb2luKFwiLFwiKSk7XG59XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IHNwZWNpZmllZCBsb2cgbGV2ZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dMZXZlbCgpIHtcbiAgICByZXR1cm4gYXp1cmVMb2dMZXZlbDtcbn1cbmNvbnN0IGxldmVsTWFwID0ge1xuICAgIHZlcmJvc2U6IDQwMCxcbiAgICBpbmZvOiAzMDAsXG4gICAgd2FybmluZzogMjAwLFxuICAgIGVycm9yOiAxMDAsXG59O1xuLyoqXG4gKiBDcmVhdGVzIGEgbG9nZ2VyIGZvciB1c2UgYnkgdGhlIEF6dXJlIFNES3MgdGhhdCBpbmhlcml0cyBmcm9tIGBBenVyZUxvZ2dlcmAuXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWUgb2YgdGhlIFNESyBwYWNrYWdlLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xpZW50TG9nZ2VyKG5hbWVzcGFjZSkge1xuICAgIGNvbnN0IGNsaWVudFJvb3RMb2dnZXIgPSBBenVyZUxvZ2dlci5leHRlbmQobmFtZXNwYWNlKTtcbiAgICBwYXRjaExvZ01ldGhvZChBenVyZUxvZ2dlciwgY2xpZW50Um9vdExvZ2dlcik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IGNyZWF0ZUxvZ2dlcihjbGllbnRSb290TG9nZ2VyLCBcImVycm9yXCIpLFxuICAgICAgICB3YXJuaW5nOiBjcmVhdGVMb2dnZXIoY2xpZW50Um9vdExvZ2dlciwgXCJ3YXJuaW5nXCIpLFxuICAgICAgICBpbmZvOiBjcmVhdGVMb2dnZXIoY2xpZW50Um9vdExvZ2dlciwgXCJpbmZvXCIpLFxuICAgICAgICB2ZXJib3NlOiBjcmVhdGVMb2dnZXIoY2xpZW50Um9vdExvZ2dlciwgXCJ2ZXJib3NlXCIpLFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXRjaExvZ01ldGhvZChwYXJlbnQsIGNoaWxkKSB7XG4gICAgY2hpbGQubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcGFyZW50LmxvZyguLi5hcmdzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKHBhcmVudCwgbGV2ZWwpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBPYmplY3QuYXNzaWduKHBhcmVudC5leHRlbmQobGV2ZWwpLCB7XG4gICAgICAgIGxldmVsLFxuICAgIH0pO1xuICAgIHBhdGNoTG9nTWV0aG9kKHBhcmVudCwgbG9nZ2VyKTtcbiAgICBpZiAoc2hvdWxkRW5hYmxlKGxvZ2dlcikpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlZE5hbWVzcGFjZXMgPSBkZWJ1Zy5kaXNhYmxlKCk7XG4gICAgICAgIGRlYnVnLmVuYWJsZShlbmFibGVkTmFtZXNwYWNlcyArIFwiLFwiICsgbG9nZ2VyLm5hbWVzcGFjZSk7XG4gICAgfVxuICAgIHJlZ2lzdGVyZWRMb2dnZXJzLmFkZChsb2dnZXIpO1xuICAgIHJldHVybiBsb2dnZXI7XG59XG5mdW5jdGlvbiBzaG91bGRFbmFibGUobG9nZ2VyKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oYXp1cmVMb2dMZXZlbCAmJiBsZXZlbE1hcFtsb2dnZXIubGV2ZWxdIDw9IGxldmVsTWFwW2F6dXJlTG9nTGV2ZWxdKTtcbn1cbmZ1bmN0aW9uIGlzQXp1cmVMb2dMZXZlbChsb2dMZXZlbCkge1xuICAgIHJldHVybiBBWlVSRV9MT0dfTEVWRUxTLmluY2x1ZGVzKGxvZ0xldmVsKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgY3JlYXRlQ2xpZW50TG9nZ2VyIH0gZnJvbSBcIkBhenVyZS9sb2dnZXJcIjtcbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBjcmVhdGVDbGllbnRMb2dnZXIoXCJjb3JlLWh0dHBcIik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiLi9yZXF1ZXN0UG9saWN5XCI7XG5pbXBvcnQgeyBTcGFuS2luZCwgU3BhblN0YXR1c0NvZGUsIGNyZWF0ZVNwYW5GdW5jdGlvbiwgZ2V0VHJhY2VQYXJlbnRIZWFkZXIsIGlzU3BhbkNvbnRleHRWYWxpZCwgfSBmcm9tIFwiQGF6dXJlL2NvcmUtdHJhY2luZ1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ1wiO1xuY29uc3QgY3JlYXRlU3BhbiA9IGNyZWF0ZVNwYW5GdW5jdGlvbih7XG4gICAgcGFja2FnZVByZWZpeDogXCJcIixcbiAgICBuYW1lc3BhY2U6IFwiXCIsXG59KTtcbi8qKlxuICogQ3JlYXRlcyBhIHBvbGljeSB0aGF0IHdyYXBzIG91dGdvaW5nIHJlcXVlc3RzIHdpdGggYSB0cmFjaW5nIHNwYW4uXG4gKiBAcGFyYW0gdHJhY2luZ09wdGlvbnMgLSBUcmFjaW5nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIFRyYWNpbmdQb2xpY3l9IGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhY2luZ1BvbGljeSh0cmFjaW5nT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHJhY2luZ1BvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCB0cmFjaW5nT3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogQSBwb2xpY3kgdGhhdCB3cmFwcyBvdXRnb2luZyByZXF1ZXN0cyB3aXRoIGEgdHJhY2luZyBzcGFuLlxuICovXG5leHBvcnQgY2xhc3MgVHJhY2luZ1BvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCB0cmFjaW5nT3B0aW9ucykge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy51c2VyQWdlbnQgPSB0cmFjaW5nT3B0aW9ucy51c2VyQWdlbnQ7XG4gICAgfVxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LnRyYWNpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzcGFuID0gdGhpcy50cnlDcmVhdGVTcGFuKHJlcXVlc3QpO1xuICAgICAgICBpZiAoIXNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICB0aGlzLnRyeVByb2Nlc3NSZXNwb25zZShzcGFuLCByZXNwb25zZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy50cnlQcm9jZXNzRXJyb3Ioc3BhbiwgZXJyKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnlDcmVhdGVTcGFuKHJlcXVlc3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUGFzc2luZyBzcGFuT3B0aW9ucyBhcyBwYXJ0IG9mIHRyYWNpbmdPcHRpb25zIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgQGF6dXJlL2NvcmUtdHJhY2luZ0BwcmV2aWV3LjEzIGFuZCBlYXJsaWVyLlxuICAgICAgICAgICAgLy8gV2UgY2FuIHBhc3MgdGhpcyBhcyBhIHNlcGFyYXRlIHBhcmFtZXRlciBvbmNlIHdlIHVwZ3JhZGUgdG8gdGhlIGxhdGVzdCBjb3JlLXRyYWNpbmcuXG4gICAgICAgICAgICBjb25zdCB7IHNwYW4gfSA9IGNyZWF0ZVNwYW4oYEhUVFAgJHtyZXF1ZXN0Lm1ldGhvZH1gLCB7XG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbk9wdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVxdWVzdC5zcGFuT3B0aW9ucyksIHsga2luZDogU3BhbktpbmQuQ0xJRU5UIH0pLFxuICAgICAgICAgICAgICAgICAgICB0cmFjaW5nQ29udGV4dDogcmVxdWVzdC50cmFjaW5nQ29udGV4dCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3BhbiBpcyBub3QgcmVjb3JkaW5nLCBkb24ndCBkbyBhbnkgbW9yZSB3b3JrLlxuICAgICAgICAgICAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lc3BhY2VGcm9tQ29udGV4dCA9IChfYSA9IHJlcXVlc3QudHJhY2luZ0NvbnRleHQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRWYWx1ZShTeW1ib2wuZm9yKFwiYXoubmFtZXNwYWNlXCIpKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlRnJvbUNvbnRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShcImF6Lm5hbWVzcGFjZVwiLCBuYW1lc3BhY2VGcm9tQ29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIFwiaHR0cC5tZXRob2RcIjogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICAgICAgXCJodHRwLnVybFwiOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3QucmVxdWVzdElkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VyQWdlbnQpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShcImh0dHAudXNlcl9hZ2VudFwiLCB0aGlzLnVzZXJBZ2VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzZXQgaGVhZGVyc1xuICAgICAgICAgICAgY29uc3Qgc3BhbkNvbnRleHQgPSBzcGFuLnNwYW5Db250ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB0cmFjZVBhcmVudEhlYWRlciA9IGdldFRyYWNlUGFyZW50SGVhZGVyKHNwYW5Db250ZXh0KTtcbiAgICAgICAgICAgIGlmICh0cmFjZVBhcmVudEhlYWRlciAmJiBpc1NwYW5Db250ZXh0VmFsaWQoc3BhbkNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChcInRyYWNlcGFyZW50XCIsIHRyYWNlUGFyZW50SGVhZGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFjZVN0YXRlID0gc3BhbkNvbnRleHQudHJhY2VTdGF0ZSAmJiBzcGFuQ29udGV4dC50cmFjZVN0YXRlLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRyYWNlc3RhdGUgaXMgc2V0LCB0cmFjZXBhcmVudCBNVVNUIGJlIHNldCwgc28gb25seSBzZXQgdHJhY2VzdGF0ZSBhZnRlciB0cmFjZXBhcmVudFxuICAgICAgICAgICAgICAgIGlmICh0cmFjZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoXCJ0cmFjZXN0YXRlXCIsIHRyYWNlU3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzcGFuO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoYFNraXBwaW5nIGNyZWF0aW5nIGEgdHJhY2luZyBzcGFuIGR1ZSB0byBhbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnlQcm9jZXNzRXJyb3Ioc3BhbiwgZXJyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiaHR0cC5zdGF0dXNfY29kZVwiLCBlcnIuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoYFNraXBwaW5nIHRyYWNpbmcgc3BhbiBwcm9jZXNzaW5nIGR1ZSB0byBhbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRyeVByb2Nlc3NSZXNwb25zZShzcGFuLCByZXNwb25zZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJodHRwLnN0YXR1c19jb2RlXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlUmVxdWVzdElkID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LW1zLXJlcXVlc3QtaWRcIik7XG4gICAgICAgICAgICBpZiAoc2VydmljZVJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwic2VydmljZVJlcXVlc3RJZFwiLCBzZXJ2aWNlUmVxdWVzdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGBTa2lwcGluZyB0cmFjaW5nIHNwYW4gcHJvY2Vzc2luZyBkdWUgdG8gYW4gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNpbmdQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiLi9yZXF1ZXN0UG9saWN5XCI7XG4vKipcbiAqIEJ5IGRlZmF1bHQsIEhUVFAgY29ubmVjdGlvbnMgYXJlIG1haW50YWluZWQgZm9yIGZ1dHVyZSByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRLZWVwQWxpdmVPcHRpb25zID0ge1xuICAgIGVuYWJsZTogdHJ1ZSxcbn07XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xpY3kgdGhhdCBjb250cm9scyB3aGV0aGVyIEhUVFAgY29ubmVjdGlvbnMgYXJlIG1haW50YWluZWQgb24gZnV0dXJlIHJlcXVlc3RzLlxuICogQHBhcmFtIGtlZXBBbGl2ZU9wdGlvbnMgLSBLZWVwIGFsaXZlIG9wdGlvbnMuIEJ5IGRlZmF1bHQsIEhUVFAgY29ubmVjdGlvbnMgYXJlIG1haW50YWluZWQgZm9yIGZ1dHVyZSByZXF1ZXN0cy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgS2VlcEFsaXZlUG9saWN5fVxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcEFsaXZlUG9saWN5KGtlZXBBbGl2ZU9wdGlvbnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IChuZXh0UG9saWN5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEtlZXBBbGl2ZVBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCBrZWVwQWxpdmVPcHRpb25zIHx8IERlZmF1bHRLZWVwQWxpdmVPcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBLZWVwQWxpdmVQb2xpY3kgaXMgYSBwb2xpY3kgdXNlZCB0byBjb250cm9sIGtlZXAgYWxpdmUgc2V0dGluZ3MgZm9yIGV2ZXJ5IHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZWVwQWxpdmVQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBLZWVwQWxpdmVQb2xpY3kuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqIEBwYXJhbSBrZWVwQWxpdmVPcHRpb25zIC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCBrZWVwQWxpdmVPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmtlZXBBbGl2ZU9wdGlvbnMgPSBrZWVwQWxpdmVPcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBvdXQgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmVxdWVzdC5rZWVwQWxpdmUgPSB0aGlzLmtlZXBBbGl2ZU9wdGlvbnMuZW5hYmxlO1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZWVwQWxpdmVQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiLi9yZXF1ZXN0UG9saWN5XCI7XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xpY3kgdGhhdCBhc3NpZ25zIGEgdW5pcXVlIHJlcXVlc3QgaWQgdG8gb3V0Z29pbmcgcmVxdWVzdHMuXG4gKiBAcGFyYW0gcmVxdWVzdElkSGVhZGVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgdG8gdXNlIHdoZW4gYXNzaWduaW5nIHRoZSB1bmlxdWUgaWQgdG8gdGhlIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNsaWVudFJlcXVlc3RJZFBvbGljeShyZXF1ZXN0SWRIZWFkZXJOYW1lID0gXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IChuZXh0UG9saWN5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMsIHJlcXVlc3RJZEhlYWRlck5hbWUpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnQgY2xhc3MgR2VuZXJhdGVDbGllbnRSZXF1ZXN0SWRQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgX3JlcXVlc3RJZEhlYWRlck5hbWUpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RJZEhlYWRlck5hbWUgPSBfcmVxdWVzdElkSGVhZGVyTmFtZTtcbiAgICB9XG4gICAgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVycy5jb250YWlucyh0aGlzLl9yZXF1ZXN0SWRIZWFkZXJOYW1lKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldCh0aGlzLl9yZXF1ZXN0SWRIZWFkZXJOYW1lLCByZXF1ZXN0LnJlcXVlc3RJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2VuZXJhdGVDbGllbnRSZXF1ZXN0SWRQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgKiBhcyB4bWwyanMgZnJvbSBcInhtbDJqc1wiO1xuaW1wb3J0IHsgWE1MX0FUVFJLRVksIFhNTF9DSEFSS0VZIH0gZnJvbSBcIi4vc2VyaWFsaXplci5jb21tb25cIjtcbi8vIE5vdGU6IFRoZSByZWFzb24gd2UgcmUtZGVmaW5lIGFsbCBvZiB0aGUgeG1sMmpzIGRlZmF1bHQgc2V0dGluZ3MgKHZlcnNpb24gMi4wKSBoZXJlIGlzIGJlY2F1c2UgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgb2JqZWN0IGV4cG9zZWRcbi8vIGJ5IHRoZSB4bTJqcyBsaWJyYXJ5IGlzIG11dGFibGUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTGVvbmlkYXMtZnJvbS1YSVYvbm9kZS14bWwyanMvaXNzdWVzLzUzNlxuLy8gQnkgY3JlYXRpbmcgYSBuZXcgY29weSBvZiB0aGUgc2V0dGluZ3MgZWFjaCB0aW1lIHdlIGluc3RhbnRpYXRlIHRoZSBwYXJzZXIsXG4vLyB3ZSBhcmUgc2FmZWd1YXJkaW5nIGFnYWluc3QgdGhlIHBvc3NpYmlsaXR5IG9mIHRoZSBkZWZhdWx0IHNldHRpbmdzIGJlaW5nIG11dGF0ZWQgZWxzZXdoZXJlIHVuaW50ZW50aW9uYWxseS5cbmNvbnN0IHhtbDJqc0RlZmF1bHRPcHRpb25zVjIgPSB7XG4gICAgZXhwbGljaXRDaGFya2V5OiBmYWxzZSxcbiAgICB0cmltOiBmYWxzZSxcbiAgICBub3JtYWxpemU6IGZhbHNlLFxuICAgIG5vcm1hbGl6ZVRhZ3M6IGZhbHNlLFxuICAgIGF0dHJrZXk6IFhNTF9BVFRSS0VZLFxuICAgIGV4cGxpY2l0QXJyYXk6IHRydWUsXG4gICAgaWdub3JlQXR0cnM6IGZhbHNlLFxuICAgIG1lcmdlQXR0cnM6IGZhbHNlLFxuICAgIGV4cGxpY2l0Um9vdDogdHJ1ZSxcbiAgICB2YWxpZGF0b3I6IHVuZGVmaW5lZCxcbiAgICB4bWxuczogZmFsc2UsXG4gICAgZXhwbGljaXRDaGlsZHJlbjogZmFsc2UsXG4gICAgcHJlc2VydmVDaGlsZHJlbk9yZGVyOiBmYWxzZSxcbiAgICBjaGlsZGtleTogXCIkJFwiLFxuICAgIGNoYXJzQXNDaGlsZHJlbjogZmFsc2UsXG4gICAgaW5jbHVkZVdoaXRlQ2hhcnM6IGZhbHNlLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgYXR0ck5hbWVQcm9jZXNzb3JzOiB1bmRlZmluZWQsXG4gICAgYXR0clZhbHVlUHJvY2Vzc29yczogdW5kZWZpbmVkLFxuICAgIHRhZ05hbWVQcm9jZXNzb3JzOiB1bmRlZmluZWQsXG4gICAgdmFsdWVQcm9jZXNzb3JzOiB1bmRlZmluZWQsXG4gICAgcm9vdE5hbWU6IFwicm9vdFwiLFxuICAgIHhtbGRlYzoge1xuICAgICAgICB2ZXJzaW9uOiBcIjEuMFwiLFxuICAgICAgICBlbmNvZGluZzogXCJVVEYtOFwiLFxuICAgICAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIH0sXG4gICAgZG9jdHlwZTogdW5kZWZpbmVkLFxuICAgIHJlbmRlck9wdHM6IHtcbiAgICAgICAgcHJldHR5OiB0cnVlLFxuICAgICAgICBpbmRlbnQ6IFwiICBcIixcbiAgICAgICAgbmV3bGluZTogXCJcXG5cIixcbiAgICB9LFxuICAgIGhlYWRsZXNzOiBmYWxzZSxcbiAgICBjaHVua1NpemU6IDEwMDAwLFxuICAgIGVtcHR5VGFnOiBcIlwiLFxuICAgIGNkYXRhOiBmYWxzZSxcbn07XG4vLyBUaGUgeG1sMmpzIHNldHRpbmdzIGZvciBnZW5lcmFsIFhNTCBwYXJzaW5nIG9wZXJhdGlvbnMuXG5jb25zdCB4bWwyanNQYXJzZXJTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHhtbDJqc0RlZmF1bHRPcHRpb25zVjIpO1xueG1sMmpzUGFyc2VyU2V0dGluZ3MuZXhwbGljaXRBcnJheSA9IGZhbHNlO1xuLy8gVGhlIHhtbDJqcyBzZXR0aW5ncyBmb3IgZ2VuZXJhbCBYTUwgYnVpbGRpbmcgb3BlcmF0aW9ucy5cbmNvbnN0IHhtbDJqc0J1aWxkZXJTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHhtbDJqc0RlZmF1bHRPcHRpb25zVjIpO1xueG1sMmpzQnVpbGRlclNldHRpbmdzLmV4cGxpY2l0QXJyYXkgPSBmYWxzZTtcbnhtbDJqc0J1aWxkZXJTZXR0aW5ncy5yZW5kZXJPcHRzID0ge1xuICAgIHByZXR0eTogZmFsc2UsXG59O1xuLyoqXG4gKiBDb252ZXJ0cyBnaXZlbiBKU09OIG9iamVjdCB0byBYTUwgc3RyaW5nXG4gKiBAcGFyYW0gb2JqIC0gSlNPTiBvYmplY3QgdG8gYmUgY29udmVydGVkIGludG8gWE1MIHN0cmluZ1xuICogQHBhcmFtIG9wdHMgLSBPcHRpb25zIHRoYXQgZ292ZXJuIHRoZSBwYXJzaW5nIG9mIGdpdmVuIEpTT04gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlYTUwob2JqLCBvcHRzID0ge30pIHtcbiAgICB2YXIgX2E7XG4gICAgeG1sMmpzQnVpbGRlclNldHRpbmdzLnJvb3ROYW1lID0gb3B0cy5yb290TmFtZTtcbiAgICB4bWwyanNCdWlsZGVyU2V0dGluZ3MuY2hhcmtleSA9IChfYSA9IG9wdHMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogWE1MX0NIQVJLRVk7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcih4bWwyanNCdWlsZGVyU2V0dGluZ3MpO1xuICAgIHJldHVybiBidWlsZGVyLmJ1aWxkT2JqZWN0KG9iaik7XG59XG4vKipcbiAqIENvbnZlcnRzIGdpdmVuIFhNTCBzdHJpbmcgaW50byBKU09OXG4gKiBAcGFyYW0gc3RyIC0gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIFhNTCBjb250ZW50IHRvIGJlIHBhcnNlZCBpbnRvIEpTT05cbiAqIEBwYXJhbSBvcHRzIC0gT3B0aW9ucyB0aGF0IGdvdmVybiB0aGUgcGFyc2luZyBvZiBnaXZlbiB4bWwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTChzdHIsIG9wdHMgPSB7fSkge1xuICAgIHZhciBfYTtcbiAgICB4bWwyanNQYXJzZXJTZXR0aW5ncy5leHBsaWNpdFJvb3QgPSAhIW9wdHMuaW5jbHVkZVJvb3Q7XG4gICAgeG1sMmpzUGFyc2VyU2V0dGluZ3MuY2hhcmtleSA9IChfYSA9IG9wdHMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogWE1MX0NIQVJLRVk7XG4gICAgY29uc3QgeG1sUGFyc2VyID0gbmV3IHhtbDJqcy5QYXJzZXIoeG1sMmpzUGFyc2VyU2V0dGluZ3MpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICghc3RyKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiRG9jdW1lbnQgaXMgZW1wdHlcIikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeG1sUGFyc2VyLnBhcnNlU3RyaW5nKHN0ciwgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9eG1sLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgWE1MX0NIQVJLRVkgfSBmcm9tIFwiLi4vdXRpbC9zZXJpYWxpemVyLmNvbW1vblwiO1xuaW1wb3J0IHsgTWFwcGVyVHlwZSB9IGZyb20gXCIuLi9zZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBSZXN0RXJyb3IgfSBmcm9tIFwiLi4vcmVzdEVycm9yXCI7XG5pbXBvcnQgeyBwYXJzZVhNTCB9IGZyb20gXCIuLi91dGlsL3htbFwiO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc2VyaWFsaXphdGlvbiBSZXF1ZXN0UG9saWN5Q3JlYXRvciB0aGF0IHdpbGwgc2VyaWFsaXplZCBIVFRQIHJlcXVlc3QgYm9kaWVzIGFzIHRoZXlcbiAqIHBhc3MgdGhyb3VnaCB0aGUgSFRUUCBwaXBlbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXphdGlvblBvbGljeShkZXNlcmlhbGl6YXRpb25Db250ZW50VHlwZXMsIHBhcnNpbmdPcHRpb25zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXNlcmlhbGl6YXRpb25Qb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgZGVzZXJpYWxpemF0aW9uQ29udGVudFR5cGVzLCBwYXJzaW5nT3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBkZWZhdWx0SnNvbkNvbnRlbnRUeXBlcyA9IFtcImFwcGxpY2F0aW9uL2pzb25cIiwgXCJ0ZXh0L2pzb25cIl07XG5leHBvcnQgY29uc3QgZGVmYXVsdFhtbENvbnRlbnRUeXBlcyA9IFtcImFwcGxpY2F0aW9uL3htbFwiLCBcImFwcGxpY2F0aW9uL2F0b20reG1sXCJdO1xuZXhwb3J0IGNvbnN0IERlZmF1bHREZXNlcmlhbGl6YXRpb25PcHRpb25zID0ge1xuICAgIGV4cGVjdGVkQ29udGVudFR5cGVzOiB7XG4gICAgICAgIGpzb246IGRlZmF1bHRKc29uQ29udGVudFR5cGVzLFxuICAgICAgICB4bWw6IGRlZmF1bHRYbWxDb250ZW50VHlwZXMsXG4gICAgfSxcbn07XG4vKipcbiAqIEEgUmVxdWVzdFBvbGljeSB0aGF0IHdpbGwgZGVzZXJpYWxpemUgSFRUUCByZXNwb25zZSBib2RpZXMgYW5kIGhlYWRlcnMgYXMgdGhleSBwYXNzIHRocm91Z2ggdGhlXG4gKiBIVFRQIHBpcGVsaW5lLlxuICovXG5leHBvcnQgY2xhc3MgRGVzZXJpYWxpemF0aW9uUG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIHJlcXVlc3RQb2xpY3lPcHRpb25zLCBkZXNlcmlhbGl6YXRpb25Db250ZW50VHlwZXMsIHBhcnNpbmdPcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCByZXF1ZXN0UG9saWN5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMuanNvbkNvbnRlbnRUeXBlcyA9XG4gICAgICAgICAgICAoZGVzZXJpYWxpemF0aW9uQ29udGVudFR5cGVzICYmIGRlc2VyaWFsaXphdGlvbkNvbnRlbnRUeXBlcy5qc29uKSB8fCBkZWZhdWx0SnNvbkNvbnRlbnRUeXBlcztcbiAgICAgICAgdGhpcy54bWxDb250ZW50VHlwZXMgPVxuICAgICAgICAgICAgKGRlc2VyaWFsaXphdGlvbkNvbnRlbnRUeXBlcyAmJiBkZXNlcmlhbGl6YXRpb25Db250ZW50VHlwZXMueG1sKSB8fCBkZWZhdWx0WG1sQ29udGVudFR5cGVzO1xuICAgICAgICB0aGlzLnhtbENoYXJLZXkgPSAoX2EgPSBwYXJzaW5nT3B0aW9ucy54bWxDaGFyS2V5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBYTUxfQ0hBUktFWTtcbiAgICB9XG4gICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KS50aGVuKChyZXNwb25zZSkgPT4gZGVzZXJpYWxpemVSZXNwb25zZUJvZHkodGhpcy5qc29uQ29udGVudFR5cGVzLCB0aGlzLnhtbENvbnRlbnRUeXBlcywgcmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHhtbENoYXJLZXk6IHRoaXMueG1sQ2hhcktleSxcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldE9wZXJhdGlvblJlc3BvbnNlKHBhcnNlZFJlc3BvbnNlKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCByZXF1ZXN0ID0gcGFyc2VkUmVzcG9uc2UucmVxdWVzdDtcbiAgICBjb25zdCBvcGVyYXRpb25TcGVjID0gcmVxdWVzdC5vcGVyYXRpb25TcGVjO1xuICAgIGlmIChvcGVyYXRpb25TcGVjKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvblJlc3BvbnNlR2V0dGVyID0gcmVxdWVzdC5vcGVyYXRpb25SZXNwb25zZUdldHRlcjtcbiAgICAgICAgaWYgKCFvcGVyYXRpb25SZXNwb25zZUdldHRlcikge1xuICAgICAgICAgICAgcmVzdWx0ID0gb3BlcmF0aW9uU3BlYy5yZXNwb25zZXNbcGFyc2VkUmVzcG9uc2Uuc3RhdHVzXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG9wZXJhdGlvblJlc3BvbnNlR2V0dGVyKG9wZXJhdGlvblNwZWMsIHBhcnNlZFJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc2hvdWxkRGVzZXJpYWxpemVSZXNwb25zZShwYXJzZWRSZXNwb25zZSkge1xuICAgIGNvbnN0IHNob3VsZERlc2VyaWFsaXplID0gcGFyc2VkUmVzcG9uc2UucmVxdWVzdC5zaG91bGREZXNlcmlhbGl6ZTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChzaG91bGREZXNlcmlhbGl6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaG91bGREZXNlcmlhbGl6ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmVzdWx0ID0gc2hvdWxkRGVzZXJpYWxpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBzaG91bGREZXNlcmlhbGl6ZShwYXJzZWRSZXNwb25zZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEdpdmVuIGEgcGFydGljdWxhciBzZXQgb2YgY29udGVudCB0eXBlcyB0byBwYXJzZSBhcyBlaXRoZXIgSlNPTiBvciBYTUwsIGNvbnN1bWVzIHRoZSBIVFRQIHJlc3BvbnNlIHRvIHByb2R1Y2UgdGhlIHJlc3VsdCBvYmplY3QgZGVmaW5lZCBieSB0aGUgcmVxdWVzdCdzIHtAbGluayBPcGVyYXRpb25TcGVjfS5cbiAqIEBwYXJhbSBqc29uQ29udGVudFR5cGVzIC0gUmVzcG9uc2UgY29udGVudCB0eXBlcyB0byBwYXJzZSB0aGUgYm9keSBhcyBKU09OLlxuICogQHBhcmFtIHhtbENvbnRlbnRUeXBlcyAgLSBSZXNwb25zZSBjb250ZW50IHR5cGVzIHRvIHBhcnNlIHRoZSBib2R5IGFzIFhNTC5cbiAqIEBwYXJhbSByZXNwb25zZSAtIEhUVFAgUmVzcG9uc2UgZnJvbSB0aGUgcGlwZWxpbmUuXG4gKiBAcGFyYW0gb3B0aW9ucyAgLSBPcHRpb25zIHRvIHRoZSBzZXJpYWxpemVyLCBtb3N0bHkgZm9yIGNvbmZpZ3VyaW5nIHRoZSBYTUwgcGFyc2VyIGlmIG5lZWRlZC5cbiAqIEByZXR1cm5zIEEgcGFyc2VkIHtAbGluayBIdHRwT3BlcmF0aW9uUmVzcG9uc2V9IG9iamVjdCB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSB0aGUge0BsaW5rIFNlcnZpY2VDbGllbnR9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVSZXNwb25zZUJvZHkoanNvbkNvbnRlbnRUeXBlcywgeG1sQ29udGVudFR5cGVzLCByZXNwb25zZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSB7XG4gICAgICAgIHJvb3ROYW1lOiAoX2EgPSBvcHRpb25zLnJvb3ROYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiLFxuICAgICAgICBpbmNsdWRlUm9vdDogKF9iID0gb3B0aW9ucy5pbmNsdWRlUm9vdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2UsXG4gICAgICAgIHhtbENoYXJLZXk6IChfYyA9IG9wdGlvbnMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogWE1MX0NIQVJLRVksXG4gICAgfTtcbiAgICByZXR1cm4gcGFyc2UoanNvbkNvbnRlbnRUeXBlcywgeG1sQ29udGVudFR5cGVzLCByZXNwb25zZSwgdXBkYXRlZE9wdGlvbnMpLnRoZW4oKHBhcnNlZFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmICghc2hvdWxkRGVzZXJpYWxpemVSZXNwb25zZShwYXJzZWRSZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb25TcGVjID0gcGFyc2VkUmVzcG9uc2UucmVxdWVzdC5vcGVyYXRpb25TcGVjO1xuICAgICAgICBpZiAoIW9wZXJhdGlvblNwZWMgfHwgIW9wZXJhdGlvblNwZWMucmVzcG9uc2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2VTcGVjID0gZ2V0T3BlcmF0aW9uUmVzcG9uc2UocGFyc2VkUmVzcG9uc2UpO1xuICAgICAgICBjb25zdCB7IGVycm9yLCBzaG91bGRSZXR1cm5SZXNwb25zZSB9ID0gaGFuZGxlRXJyb3JSZXNwb25zZShwYXJzZWRSZXNwb25zZSwgb3BlcmF0aW9uU3BlYywgcmVzcG9uc2VTcGVjKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaG91bGRSZXR1cm5SZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFuIG9wZXJhdGlvbiByZXNwb25zZSBzcGVjIGRvZXMgZXhpc3QgZm9yIGN1cnJlbnQgc3RhdHVzIGNvZGUsIHNvXG4gICAgICAgIC8vIHVzZSBpdCB0byBkZXNlcmlhbGl6ZSB0aGUgcmVzcG9uc2UuXG4gICAgICAgIGlmIChyZXNwb25zZVNwZWMpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZVNwZWMuYm9keU1hcHBlcikge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZVRvRGVzZXJpYWxpemUgPSBwYXJzZWRSZXNwb25zZS5wYXJzZWRCb2R5O1xuICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjLmlzWE1MICYmIHJlc3BvbnNlU3BlYy5ib2R5TWFwcGVyLnR5cGUubmFtZSA9PT0gTWFwcGVyVHlwZS5TZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvRGVzZXJpYWxpemUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlVG9EZXNlcmlhbGl6ZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdmFsdWVUb0Rlc2VyaWFsaXplW3Jlc3BvbnNlU3BlYy5ib2R5TWFwcGVyLnhtbEVsZW1lbnROYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFJlc3BvbnNlLnBhcnNlZEJvZHkgPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzcG9uc2VTcGVjLmJvZHlNYXBwZXIsIHZhbHVlVG9EZXNlcmlhbGl6ZSwgXCJvcGVyYXRpb25SZXMucGFyc2VkQm9keVwiLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGlubmVyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdEVycm9yID0gbmV3IFJlc3RFcnJvcihgRXJyb3IgJHtpbm5lckVycm9yfSBvY2N1cnJlZCBpbiBkZXNlcmlhbGl6aW5nIHRoZSByZXNwb25zZUJvZHkgLSAke3BhcnNlZFJlc3BvbnNlLmJvZHlBc1RleHR9YCwgdW5kZWZpbmVkLCBwYXJzZWRSZXNwb25zZS5zdGF0dXMsIHBhcnNlZFJlc3BvbnNlLnJlcXVlc3QsIHBhcnNlZFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdEVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvblNwZWMuaHR0cE1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBoZWFkIG1ldGhvZHMgbmV2ZXIgaGF2ZSBhIGJvZHksIGJ1dCB3ZSByZXR1cm4gYSBib29sZWFuIHRvIGluZGljYXRlIHByZXNlbmNlL2Fic2VuY2Ugb2YgdGhlIHJlc291cmNlXG4gICAgICAgICAgICAgICAgcGFyc2VkUmVzcG9uc2UucGFyc2VkQm9keSA9IHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlU3BlYy5oZWFkZXJzTWFwcGVyKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkUmVzcG9uc2UucGFyc2VkSGVhZGVycyA9IG9wZXJhdGlvblNwZWMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNwb25zZVNwZWMuaGVhZGVyc01hcHBlciwgcGFyc2VkUmVzcG9uc2UuaGVhZGVycy50b0pzb24oKSwgXCJvcGVyYXRpb25SZXMucGFyc2VkSGVhZGVyc1wiLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VkUmVzcG9uc2U7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc09wZXJhdGlvblNwZWNFbXB0eShvcGVyYXRpb25TcGVjKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRTdGF0dXNDb2RlcyA9IE9iamVjdC5rZXlzKG9wZXJhdGlvblNwZWMucmVzcG9uc2VzKTtcbiAgICByZXR1cm4gKGV4cGVjdGVkU3RhdHVzQ29kZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIChleHBlY3RlZFN0YXR1c0NvZGVzLmxlbmd0aCA9PT0gMSAmJiBleHBlY3RlZFN0YXR1c0NvZGVzWzBdID09PSBcImRlZmF1bHRcIikpO1xufVxuZnVuY3Rpb24gaGFuZGxlRXJyb3JSZXNwb25zZShwYXJzZWRSZXNwb25zZSwgb3BlcmF0aW9uU3BlYywgcmVzcG9uc2VTcGVjKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGlzU3VjY2Vzc0J5U3RhdHVzID0gMjAwIDw9IHBhcnNlZFJlc3BvbnNlLnN0YXR1cyAmJiBwYXJzZWRSZXNwb25zZS5zdGF0dXMgPCAzMDA7XG4gICAgY29uc3QgaXNFeHBlY3RlZFN0YXR1c0NvZGUgPSBpc09wZXJhdGlvblNwZWNFbXB0eShvcGVyYXRpb25TcGVjKVxuICAgICAgICA/IGlzU3VjY2Vzc0J5U3RhdHVzXG4gICAgICAgIDogISFyZXNwb25zZVNwZWM7XG4gICAgaWYgKGlzRXhwZWN0ZWRTdGF0dXNDb2RlKSB7XG4gICAgICAgIGlmIChyZXNwb25zZVNwZWMpIHtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2VTcGVjLmlzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbnVsbCwgc2hvdWxkUmV0dXJuUmVzcG9uc2U6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbnVsbCwgc2hvdWxkUmV0dXJuUmVzcG9uc2U6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyb3JSZXNwb25zZVNwZWMgPSByZXNwb25zZVNwZWMgIT09IG51bGwgJiYgcmVzcG9uc2VTcGVjICE9PSB2b2lkIDAgPyByZXNwb25zZVNwZWMgOiBvcGVyYXRpb25TcGVjLnJlc3BvbnNlcy5kZWZhdWx0O1xuICAgIGNvbnN0IHN0cmVhbWluZyA9ICgoX2EgPSBwYXJzZWRSZXNwb25zZS5yZXF1ZXN0LnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYXMocGFyc2VkUmVzcG9uc2Uuc3RhdHVzKSkgfHxcbiAgICAgICAgcGFyc2VkUmVzcG9uc2UucmVxdWVzdC5zdHJlYW1SZXNwb25zZUJvZHk7XG4gICAgY29uc3QgaW5pdGlhbEVycm9yTWVzc2FnZSA9IHN0cmVhbWluZ1xuICAgICAgICA/IGBVbmV4cGVjdGVkIHN0YXR1cyBjb2RlOiAke3BhcnNlZFJlc3BvbnNlLnN0YXR1c31gXG4gICAgICAgIDogcGFyc2VkUmVzcG9uc2UuYm9keUFzVGV4dDtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBSZXN0RXJyb3IoaW5pdGlhbEVycm9yTWVzc2FnZSwgdW5kZWZpbmVkLCBwYXJzZWRSZXNwb25zZS5zdGF0dXMsIHBhcnNlZFJlc3BvbnNlLnJlcXVlc3QsIHBhcnNlZFJlc3BvbnNlKTtcbiAgICAvLyBJZiB0aGUgaXRlbSBmYWlsZWQgYnV0IHRoZXJlJ3Mgbm8gZXJyb3Igc3BlYyBvciBkZWZhdWx0IHNwZWMgdG8gZGVzZXJpYWxpemUgdGhlIGVycm9yLFxuICAgIC8vIHdlIHNob3VsZCBmYWlsIHNvIHdlIGp1c3QgdGhyb3cgdGhlIHBhcnNlZCByZXNwb25zZVxuICAgIGlmICghZXJyb3JSZXNwb25zZVNwZWMpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRCb2R5TWFwcGVyID0gZXJyb3JSZXNwb25zZVNwZWMuYm9keU1hcHBlcjtcbiAgICBjb25zdCBkZWZhdWx0SGVhZGVyc01hcHBlciA9IGVycm9yUmVzcG9uc2VTcGVjLmhlYWRlcnNNYXBwZXI7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gSWYgZXJyb3IgcmVzcG9uc2UgaGFzIGEgYm9keSwgdHJ5IHRvIGRlc2VyaWFsaXplIGl0IHVzaW5nIGRlZmF1bHQgYm9keSBtYXBwZXIuXG4gICAgICAgIC8vIFRoZW4gdHJ5IHRvIGV4dHJhY3QgZXJyb3IgY29kZSAmIG1lc3NhZ2UgZnJvbSBpdFxuICAgICAgICBpZiAocGFyc2VkUmVzcG9uc2UucGFyc2VkQm9keSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQm9keSA9IHBhcnNlZFJlc3BvbnNlLnBhcnNlZEJvZHk7XG4gICAgICAgICAgICBsZXQgcGFyc2VkRXJyb3I7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEJvZHlNYXBwZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVUb0Rlc2VyaWFsaXplID0gcGFyc2VkQm9keTtcbiAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uU3BlYy5pc1hNTCAmJiBkZWZhdWx0Qm9keU1hcHBlci50eXBlLm5hbWUgPT09IE1hcHBlclR5cGUuU2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVUb0Rlc2VyaWFsaXplID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwYXJzZWRCb2R5ID09PSBcIm9iamVjdFwiID8gcGFyc2VkQm9keVtkZWZhdWx0Qm9keU1hcHBlci54bWxFbGVtZW50TmFtZV0gOiBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyc2VkRXJyb3IgPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVmYXVsdEJvZHlNYXBwZXIsIHZhbHVlVG9EZXNlcmlhbGl6ZSwgXCJlcnJvci5yZXNwb25zZS5wYXJzZWRCb2R5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxFcnJvciA9IHBhcnNlZEJvZHkuZXJyb3IgfHwgcGFyc2VkRXJyb3IgfHwgcGFyc2VkQm9keTtcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSBpbnRlcm5hbEVycm9yLmNvZGU7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxFcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGludGVybmFsRXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZWZhdWx0Qm9keU1hcHBlcikge1xuICAgICAgICAgICAgICAgIGVycm9yLnJlc3BvbnNlLnBhcnNlZEJvZHkgPSBwYXJzZWRFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBlcnJvciByZXNwb25zZSBoYXMgaGVhZGVycywgdHJ5IHRvIGRlc2VyaWFsaXplIGl0IHVzaW5nIGRlZmF1bHQgaGVhZGVyIG1hcHBlclxuICAgICAgICBpZiAocGFyc2VkUmVzcG9uc2UuaGVhZGVycyAmJiBkZWZhdWx0SGVhZGVyc01hcHBlcikge1xuICAgICAgICAgICAgZXJyb3IucmVzcG9uc2UucGFyc2VkSGVhZGVycyA9IG9wZXJhdGlvblNwZWMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkZWZhdWx0SGVhZGVyc01hcHBlciwgcGFyc2VkUmVzcG9uc2UuaGVhZGVycy50b0pzb24oKSwgXCJvcGVyYXRpb25SZXMucGFyc2VkSGVhZGVyc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZGVmYXVsdEVycm9yKSB7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSBgRXJyb3IgXCIke2RlZmF1bHRFcnJvci5tZXNzYWdlfVwiIG9jY3VycmVkIGluIGRlc2VyaWFsaXppbmcgdGhlIHJlc3BvbnNlQm9keSAtIFwiJHtwYXJzZWRSZXNwb25zZS5ib2R5QXNUZXh0fVwiIGZvciB0aGUgZGVmYXVsdCByZXNwb25zZS5gO1xuICAgIH1cbiAgICByZXR1cm4geyBlcnJvciwgc2hvdWxkUmV0dXJuUmVzcG9uc2U6IGZhbHNlIH07XG59XG5mdW5jdGlvbiBwYXJzZShqc29uQ29udGVudFR5cGVzLCB4bWxDb250ZW50VHlwZXMsIG9wZXJhdGlvblJlc3BvbnNlLCBvcHRzKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGVycm9ySGFuZGxlciA9IChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgbXNnID0gYEVycm9yIFwiJHtlcnJ9XCIgb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGUgcmVzcG9uc2UgYm9keSAtICR7b3BlcmF0aW9uUmVzcG9uc2UuYm9keUFzVGV4dH0uYDtcbiAgICAgICAgY29uc3QgZXJyQ29kZSA9IGVyci5jb2RlIHx8IFJlc3RFcnJvci5QQVJTRV9FUlJPUjtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBSZXN0RXJyb3IobXNnLCBlcnJDb2RlLCBvcGVyYXRpb25SZXNwb25zZS5zdGF0dXMsIG9wZXJhdGlvblJlc3BvbnNlLnJlcXVlc3QsIG9wZXJhdGlvblJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH07XG4gICAgY29uc3Qgc3RyZWFtaW5nID0gKChfYSA9IG9wZXJhdGlvblJlc3BvbnNlLnJlcXVlc3Quc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhcyhvcGVyYXRpb25SZXNwb25zZS5zdGF0dXMpKSB8fFxuICAgICAgICBvcGVyYXRpb25SZXNwb25zZS5yZXF1ZXN0LnN0cmVhbVJlc3BvbnNlQm9keTtcbiAgICBpZiAoIXN0cmVhbWluZyAmJiBvcGVyYXRpb25SZXNwb25zZS5ib2R5QXNUZXh0KSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBvcGVyYXRpb25SZXNwb25zZS5ib2R5QXNUZXh0O1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IG9wZXJhdGlvblJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpIHx8IFwiXCI7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRDb21wb25lbnRzID0gIWNvbnRlbnRUeXBlXG4gICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICA6IGNvbnRlbnRUeXBlLnNwbGl0KFwiO1wiKS5tYXAoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoY29udGVudENvbXBvbmVudHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBjb250ZW50Q29tcG9uZW50cy5zb21lKChjb21wb25lbnQpID0+IGpzb25Db250ZW50VHlwZXMuaW5kZXhPZihjb21wb25lbnQpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvblJlc3BvbnNlLnBhcnNlZEJvZHkgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUob3BlcmF0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3JIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250ZW50Q29tcG9uZW50cy5zb21lKChjb21wb25lbnQpID0+IHhtbENvbnRlbnRUeXBlcy5pbmRleE9mKGNvbXBvbmVudCkgIT09IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlWE1MKHRleHQsIG9wdHMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXNwb25zZS5wYXJzZWRCb2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uUmVzcG9uc2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvckhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUob3BlcmF0aW9uUmVzcG9uc2UpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVzZXJpYWxpemF0aW9uUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgU2FuaXRpemVyIH0gZnJvbSBcIi4uL3V0aWwvc2FuaXRpemVyXCI7XG5pbXBvcnQgeyBsb2dnZXIgYXMgY29yZUxvZ2dlciB9IGZyb20gXCIuLi9sb2dcIjtcbi8qKlxuICogQ3JlYXRlcyBhIHBvbGljeSB0aGF0IGxvZ3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG91dGdvaW5nIHJlcXVlc3QgYW5kIHRoZSBpbmNvbWluZyByZXNwb25zZXMuXG4gKiBAcGFyYW0gbG9nZ2luZ09wdGlvbnMgLSBMb2dnaW5nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIExvZ1BvbGljeX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ1BvbGljeShsb2dnaW5nT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2dQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgbG9nZ2luZ09wdGlvbnMpO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEEgcG9saWN5IHRoYXQgbG9ncyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3V0Z29pbmcgcmVxdWVzdCBhbmQgdGhlIGluY29taW5nIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ1BvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCB7IGxvZ2dlciA9IGNvcmVMb2dnZXIuaW5mbywgYWxsb3dlZEhlYWRlck5hbWVzID0gW10sIGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBbXSwgfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZXIgPSBuZXcgU2FuaXRpemVyKHsgYWxsb3dlZEhlYWRlck5hbWVzLCBhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWFkZXIgbmFtZXMgd2hvc2UgdmFsdWVzIHdpbGwgYmUgbG9nZ2VkIHdoZW4gbG9nZ2luZyBpcyBlbmFibGVkLiBEZWZhdWx0cyB0b1xuICAgICAqIERhdGUsIHRyYWNlcGFyZW50LCB4LW1zLWNsaWVudC1yZXF1ZXN0LWlkLCBhbmQgeC1tcy1yZXF1ZXN0IGlkLiAgQW55IGhlYWRlcnNcbiAgICAgKiBzcGVjaWZpZWQgaW4gdGhpcyBmaWVsZCB3aWxsIGJlIGFkZGVkIHRvIHRoYXQgbGlzdC4gIEFueSBvdGhlciB2YWx1ZXMgd2lsbFxuICAgICAqIGJlIHdyaXR0ZW4gdG8gbG9ncyBhcyBcIlJFREFDVEVEXCIuXG4gICAgICogQGRlcHJlY2F0ZWQgUGFzcyB0aGVzZSBpbnRvIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGdldCBhbGxvd2VkSGVhZGVyTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplci5hbGxvd2VkSGVhZGVyTmFtZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhlYWRlciBuYW1lcyB3aG9zZSB2YWx1ZXMgd2lsbCBiZSBsb2dnZWQgd2hlbiBsb2dnaW5nIGlzIGVuYWJsZWQuIERlZmF1bHRzIHRvXG4gICAgICogRGF0ZSwgdHJhY2VwYXJlbnQsIHgtbXMtY2xpZW50LXJlcXVlc3QtaWQsIGFuZCB4LW1zLXJlcXVlc3QgaWQuICBBbnkgaGVhZGVyc1xuICAgICAqIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkIHdpbGwgYmUgYWRkZWQgdG8gdGhhdCBsaXN0LiAgQW55IG90aGVyIHZhbHVlcyB3aWxsXG4gICAgICogYmUgd3JpdHRlbiB0byBsb2dzIGFzIFwiUkVEQUNURURcIi5cbiAgICAgKiBAZGVwcmVjYXRlZCBQYXNzIHRoZXNlIGludG8gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuXG4gICAgICovXG4gICAgc2V0IGFsbG93ZWRIZWFkZXJOYW1lcyhhbGxvd2VkSGVhZGVyTmFtZXMpIHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZXIuYWxsb3dlZEhlYWRlck5hbWVzID0gYWxsb3dlZEhlYWRlck5hbWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBRdWVyeSBzdHJpbmcgbmFtZXMgd2hvc2UgdmFsdWVzIHdpbGwgYmUgbG9nZ2VkIHdoZW4gbG9nZ2luZyBpcyBlbmFibGVkLiBCeSBkZWZhdWx0IG5vXG4gICAgICogcXVlcnkgc3RyaW5nIHZhbHVlcyBhcmUgbG9nZ2VkLlxuICAgICAqIEBkZXByZWNhdGVkIFBhc3MgdGhlc2UgaW50byB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBnZXQgYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFF1ZXJ5IHN0cmluZyBuYW1lcyB3aG9zZSB2YWx1ZXMgd2lsbCBiZSBsb2dnZWQgd2hlbiBsb2dnaW5nIGlzIGVuYWJsZWQuIEJ5IGRlZmF1bHQgbm9cbiAgICAgKiBxdWVyeSBzdHJpbmcgdmFsdWVzIGFyZSBsb2dnZWQuXG4gICAgICogQGRlcHJlY2F0ZWQgUGFzcyB0aGVzZSBpbnRvIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHNldCBhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzKGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZXIuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyA9IGFsbG93ZWRRdWVyeVBhcmFtZXRlcnM7XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ2dlci5lbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIHRoaXMubG9nUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCkudGhlbigocmVzcG9uc2UpID0+IHRoaXMubG9nUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgICB9XG4gICAgbG9nUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyKGBSZXF1ZXN0OiAke3RoaXMuc2FuaXRpemVyLnNhbml0aXplKHJlcXVlc3QpfWApO1xuICAgIH1cbiAgICBsb2dSZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICB0aGlzLmxvZ2dlcihgUmVzcG9uc2Ugc3RhdHVzIGNvZGU6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB0aGlzLmxvZ2dlcihgSGVhZGVyczogJHt0aGlzLnNhbml0aXplci5zYW5pdGl6ZShyZXNwb25zZS5oZWFkZXJzKX1gKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ1BvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbi8qKlxuICogUmV0dXJucyBhIHJlcXVlc3QgcG9saWN5IGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAqIHtAbGluayBEaXNhYmxlUmVzcG9uc2VEZWNvbXByZXNzaW9uUG9saWN5fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3koKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXNhYmxlUmVzcG9uc2VEZWNvbXByZXNzaW9uUG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEEgcG9saWN5IHRvIGRpc2FibGUgcmVzcG9uc2UgZGVjb21wcmVzc2lvbiBhY2NvcmRpbmcgdG8gQWNjZXB0LUVuY29kaW5nIGhlYWRlclxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0FjY2VwdC1FbmNvZGluZ1xuICovXG5leHBvcnQgY2xhc3MgRGlzYWJsZVJlc3BvbnNlRGVjb21wcmVzc2lvblBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3kuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIC8vIFRoZSBwYXJlbnQgY29uc3RydWN0b3IgaXMgcHJvdGVjdGVkLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlbGVzcy1jb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIG91dCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICByZXF1ZXN0LmRlY29tcHJlc3NSZXNwb25zZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXNhYmxlUmVzcG9uc2VEZWNvbXByZXNzaW9uUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgSHR0cEhlYWRlcnMgdGhhdCBjYW4gYmUgc2VudCB3aXRoIGEgSFRUUCByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBnZXRIZWFkZXJLZXkoaGVhZGVyTmFtZSkge1xuICAgIHJldHVybiBoZWFkZXJOYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNIdHRwSGVhZGVyc0xpa2Uob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IGNhc3RPYmplY3QgPSBvYmplY3Q7XG4gICAgICAgIGlmICh0eXBlb2YgY2FzdE9iamVjdC5yYXdIZWFkZXJzID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LmNsb25lID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LmdldCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FzdE9iamVjdC5zZXQgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QuY29udGFpbnMgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QucmVtb3ZlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LmhlYWRlcnNBcnJheSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FzdE9iamVjdC5oZWFkZXJWYWx1ZXMgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QuaGVhZGVyTmFtZXMgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QudG9Kc29uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIEhUVFAgaGVhZGVyIGtleS92YWx1ZSBwYWlycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBIZWFkZXJzIHtcbiAgICBjb25zdHJ1Y3RvcihyYXdIZWFkZXJzKSB7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNNYXAgPSB7fTtcbiAgICAgICAgaWYgKHJhd0hlYWRlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBpbiByYXdIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoaGVhZGVyTmFtZSwgcmF3SGVhZGVyc1toZWFkZXJOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGEgaGVhZGVyIGluIHRoaXMgY29sbGVjdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCB2YWx1ZS4gVGhlIG5hbWUgaXNcbiAgICAgKiBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICAqIEBwYXJhbSBoZWFkZXJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQuIFRoaXMgdmFsdWUgaXMgY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICAgKiBAcGFyYW0gaGVhZGVyVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGhlYWRlciB0byBzZXQuXG4gICAgICovXG4gICAgc2V0KGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNNYXBbZ2V0SGVhZGVyS2V5KGhlYWRlck5hbWUpXSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGhlYWRlck5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogaGVhZGVyVmFsdWUudG9TdHJpbmcoKS50cmltKCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaGVhZGVyIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgaGVhZGVyIG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBubyBoZWFkZXIgZXhpc3RzIGluIHRoaXNcbiAgICAgKiBjb2xsZWN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIGhlYWRlck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaGVhZGVyLlxuICAgICAqL1xuICAgIGdldChoZWFkZXJOYW1lKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuX2hlYWRlcnNNYXBbZ2V0SGVhZGVyS2V5KGhlYWRlck5hbWUpXTtcbiAgICAgICAgcmV0dXJuICFoZWFkZXIgPyB1bmRlZmluZWQgOiBoZWFkZXIudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB3aGV0aGVyIG9yIG5vdCB0aGlzIGhlYWRlciBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgaGVhZGVyIGVudHJ5IGZvciB0aGUgcHJvdmlkZWQgaGVhZGVyIG5hbWUuXG4gICAgICovXG4gICAgY29udGFpbnMoaGVhZGVyTmFtZSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9oZWFkZXJzTWFwW2dldEhlYWRlcktleShoZWFkZXJOYW1lKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgaGVhZGVyIHdpdGggdGhlIHByb3ZpZGVkIGhlYWRlck5hbWUuIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgaGVhZGVyIGV4aXN0ZWQgYW5kXG4gICAgICogd2FzIHJlbW92ZWQuXG4gICAgICogQHBhcmFtIGhlYWRlck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaGVhZGVyIHRvIHJlbW92ZS5cbiAgICAgKi9cbiAgICByZW1vdmUoaGVhZGVyTmFtZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRhaW5zKGhlYWRlck5hbWUpO1xuICAgICAgICBkZWxldGUgdGhpcy5faGVhZGVyc01hcFtnZXRIZWFkZXJLZXkoaGVhZGVyTmFtZSldO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGhlYWRlcnMgdGhhdCBhcmUgY29udGFpbmVkIHRoaXMgY29sbGVjdGlvbiBhcyBhbiBvYmplY3QuXG4gICAgICovXG4gICAgcmF3SGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Kc29uKHsgcHJlc2VydmVDYXNlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGhlYWRlcnMgdGhhdCBhcmUgY29udGFpbmVkIGluIHRoaXMgY29sbGVjdGlvbiBhcyBhbiBhcnJheS5cbiAgICAgKi9cbiAgICBoZWFkZXJzQXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5faGVhZGVyc01hcCkge1xuICAgICAgICAgICAgaGVhZGVycy5wdXNoKHRoaXMuX2hlYWRlcnNNYXBbaGVhZGVyS2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaGVhZGVyIG5hbWVzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgaGVhZGVyTmFtZXMoKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWVzID0gW107XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmhlYWRlcnNBcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGhlYWRlck5hbWVzLnB1c2goaGVhZGVyc1tpXS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVyTmFtZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaGVhZGVyIHZhbHVlcyB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhpcyBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIGhlYWRlclZhbHVlcygpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmhlYWRlcnNBcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGhlYWRlclZhbHVlcy5wdXNoKGhlYWRlcnNbaV0udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJWYWx1ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgSlNPTiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBIVFRQIGhlYWRlciBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHRvSnNvbihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChvcHRpb25zLnByZXNlcnZlQ2FzZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5faGVhZGVyc01hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuX2hlYWRlcnNNYXBbaGVhZGVyS2V5XTtcbiAgICAgICAgICAgICAgICByZXN1bHRbaGVhZGVyLm5hbWVdID0gaGVhZGVyLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5faGVhZGVyc01hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuX2hlYWRlcnNNYXBbaGVhZGVyS2V5XTtcbiAgICAgICAgICAgICAgICByZXN1bHRbZ2V0SGVhZGVyS2V5KGhlYWRlci5uYW1lKV0gPSBoZWFkZXIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBIVFRQIGhlYWRlciBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pzb24oeyBwcmVzZXJ2ZUNhc2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBkZWVwIGNsb25lL2NvcHkgb2YgdGhpcyBIdHRwSGVhZGVycyBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCByZXN1bHRQcmVzZXJ2aW5nQ2FzaW5nID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGVyS2V5IGluIHRoaXMuX2hlYWRlcnNNYXApIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuX2hlYWRlcnNNYXBbaGVhZGVyS2V5XTtcbiAgICAgICAgICAgIHJlc3VsdFByZXNlcnZpbmdDYXNpbmdbaGVhZGVyLm5hbWVdID0gaGVhZGVyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSHR0cEhlYWRlcnMocmVzdWx0UHJlc2VydmluZ0Nhc2luZyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cEhlYWRlcnMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBIdHRwSGVhZGVycywgaXNIdHRwSGVhZGVyc0xpa2UgfSBmcm9tIFwiLi9odHRwSGVhZGVyc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL3NlcmlhbGl6ZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlVXVpZCB9IGZyb20gXCIuL3V0aWwvdXRpbHNcIjtcbmV4cG9ydCBmdW5jdGlvbiBpc1dlYlJlc291cmNlTGlrZShvYmplY3QpIHtcbiAgICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3QgY2FzdE9iamVjdCA9IG9iamVjdDtcbiAgICAgICAgaWYgKHR5cGVvZiBjYXN0T2JqZWN0LnVybCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QubWV0aG9kID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FzdE9iamVjdC5oZWFkZXJzID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBpc0h0dHBIZWFkZXJzTGlrZShjYXN0T2JqZWN0LmhlYWRlcnMpICYmXG4gICAgICAgICAgICB0eXBlb2YgY2FzdE9iamVjdC52YWxpZGF0ZVJlcXVlc3RQcm9wZXJ0aWVzID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjYXN0T2JqZWN0LnByZXBhcmUgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhc3RPYmplY3QuY2xvbmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFdlYlJlc291cmNlIG9iamVjdC5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIG92ZXIgYSBSRVNUIGNhbGwgYnkgYmVpbmcgbGlicmFyeSAvIGltcGxlbWVudGF0aW9uIGFnbm9zdGljIGFuZCB3cmFwcGluZyB0aGUgbmVjZXNzYXJ5XG4gKiBwcm9wZXJ0aWVzIHRvIGluaXRpYXRlIGEgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJlc291cmNlIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIG1ldGhvZCwgYm9keSwgcXVlcnksIGhlYWRlcnMsIHN0cmVhbVJlc3BvbnNlQm9keSwgd2l0aENyZWRlbnRpYWxzLCBhYm9ydFNpZ25hbCwgdGltZW91dCwgb25VcGxvYWRQcm9ncmVzcywgb25Eb3dubG9hZFByb2dyZXNzLCBwcm94eVNldHRpbmdzLCBrZWVwQWxpdmUsIGRlY29tcHJlc3NSZXNwb25zZSwgc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2Rlcykge1xuICAgICAgICB0aGlzLnN0cmVhbVJlc3BvbnNlQm9keSA9IHN0cmVhbVJlc3BvbnNlQm9keTtcbiAgICAgICAgdGhpcy5zdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzID0gc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcztcbiAgICAgICAgdGhpcy51cmwgPSB1cmwgfHwgXCJcIjtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2QgfHwgXCJHRVRcIjtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaXNIdHRwSGVhZGVyc0xpa2UoaGVhZGVycykgPyBoZWFkZXJzIDogbmV3IEh0dHBIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsID0gYWJvcnRTaWduYWw7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQgfHwgMDtcbiAgICAgICAgdGhpcy5vblVwbG9hZFByb2dyZXNzID0gb25VcGxvYWRQcm9ncmVzcztcbiAgICAgICAgdGhpcy5vbkRvd25sb2FkUHJvZ3Jlc3MgPSBvbkRvd25sb2FkUHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMucHJveHlTZXR0aW5ncyA9IHByb3h5U2V0dGluZ3M7XG4gICAgICAgIHRoaXMua2VlcEFsaXZlID0ga2VlcEFsaXZlO1xuICAgICAgICB0aGlzLmRlY29tcHJlc3NSZXNwb25zZSA9IGRlY29tcHJlc3NSZXNwb25zZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SWQgPSB0aGlzLmhlYWRlcnMuZ2V0KFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiKSB8fCBnZW5lcmF0ZVV1aWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgc3VjaCBhcyBtZXRob2QsIHVybCwgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSxcbiAgICAgKiBoZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdIGFyZSBkZWZpbmVkLiBJdCB3aWxsIHRocm93IGFuIGVycm9yIGlmIG9uZSBvZiB0aGUgYWJvdmVcbiAgICAgKiBtZW50aW9uZWQgcHJvcGVydGllcyBhcmUgbm90IGRlZmluZWQuXG4gICAgICovXG4gICAgdmFsaWRhdGVSZXF1ZXN0UHJvcGVydGllcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1ldGhvZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViUmVzb3VyY2UubWV0aG9kIGlzIHJlcXVpcmVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJSZXNvdXJjZS51cmwgaXMgcmVxdWlyZWQuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBwcm92aWRlIGZvciBwcmVwYXJpbmcgdGhlIHJlcXVlc3QuXG4gICAgICogQHJldHVybnMgUmV0dXJucyB0aGUgcHJlcGFyZWQgV2ViUmVzb3VyY2UgKEhUVFAgUmVxdWVzdCkgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgZ2l2ZW4gdG8gdGhlIHJlcXVlc3QgcGlwZWxpbmUuXG4gICAgICovXG4gICAgcHJlcGFyZShvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucyBvYmplY3QgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubWV0aG9kID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIG9wdGlvbnMubWV0aG9kID09PSBudWxsIHx8XG4gICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5tZXRob2QudmFsdWVPZigpICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLm1ldGhvZCBtdXN0IGJlIGEgc3RyaW5nLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy51cmwgJiYgb3B0aW9ucy5wYXRoVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMudXJsIGFuZCBvcHRpb25zLnBhdGhUZW1wbGF0ZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBQbGVhc2UgcHJvdmlkZSBleGFjdGx5IG9uZSBvZiB0aGVtLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKG9wdGlvbnMucGF0aFRlbXBsYXRlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIG9wdGlvbnMucGF0aFRlbXBsYXRlID09PSBudWxsIHx8XG4gICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5wYXRoVGVtcGxhdGUudmFsdWVPZigpICE9PSBcInN0cmluZ1wiKSAmJlxuICAgICAgICAgICAgKG9wdGlvbnMudXJsID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLnVybC52YWx1ZU9mKCkgIT09IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBleGFjdGx5IG9uZSBvZiBvcHRpb25zLnBhdGhUZW1wbGF0ZSBvciBvcHRpb25zLnVybC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IHRoZSB1cmwgaWYgaXQgaXMgcHJvdmlkZWQuXG4gICAgICAgIGlmIChvcHRpb25zLnVybCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnVybCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy51cmwgbXVzdCBiZSBvZiB0eXBlIFwic3RyaW5nXCIuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCB0aGUgbWV0aG9kXG4gICAgICAgIGlmIChvcHRpb25zLm1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRNZXRob2RzID0gW1wiR0VUXCIsIFwiUFVUXCIsIFwiSEVBRFwiLCBcIkRFTEVURVwiLCBcIk9QVElPTlNcIiwgXCJQT1NUXCIsIFwiUEFUQ0hcIiwgXCJUUkFDRVwiXTtcbiAgICAgICAgICAgIGlmICh2YWxpZE1ldGhvZHMuaW5kZXhPZihvcHRpb25zLm1ldGhvZC50b1VwcGVyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBtZXRob2QgXCInICtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5tZXRob2QgK1xuICAgICAgICAgICAgICAgICAgICAnXCIgaXMgaW52YWxpZC4gU3VwcG9ydGVkIEhUVFAgbWV0aG9kcyBhcmU6ICcgK1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh2YWxpZE1ldGhvZHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgdXJsIGlmIHBhdGggdGVtcGxhdGUgaXMgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9wdGlvbnMucGF0aFRlbXBsYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBhdGhUZW1wbGF0ZSwgcGF0aFBhcmFtZXRlcnMgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhdGhUZW1wbGF0ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5wYXRoVGVtcGxhdGUgbXVzdCBiZSBvZiB0eXBlIFwic3RyaW5nXCIuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYmFzZVVybCA9IFwiaHR0cHM6Ly9tYW5hZ2VtZW50LmF6dXJlLmNvbVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMuYmFzZVVybDtcbiAgICAgICAgICAgIGxldCB1cmwgPSBiYXNlVXJsICtcbiAgICAgICAgICAgICAgICAoYmFzZVVybC5lbmRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCIpICtcbiAgICAgICAgICAgICAgICAocGF0aFRlbXBsYXRlLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aFRlbXBsYXRlLnNsaWNlKDEpIDogcGF0aFRlbXBsYXRlKTtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdXJsLm1hdGNoKC8oe1tcXHctXSpcXHMqW1xcdy1dKn0pL2dpKTtcbiAgICAgICAgICAgIGlmIChzZWdtZW50cyAmJiBzZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdGhQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcGF0aFRlbXBsYXRlOiAke3BhdGhUZW1wbGF0ZX0gaGFzIGJlZW4gcHJvdmlkZWQuIEhlbmNlLCBvcHRpb25zLnBhdGhQYXJhbWV0ZXJzIG11c3QgYWxzbyBiZSBwcm92aWRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VnbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFyYW1OYW1lID0gaXRlbS5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJhbSA9IHBhdGhQYXJhbWV0ZXJzW3BhdGhQYXJhbU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFBhcmFtID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoUGFyYW0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgISh0eXBlb2YgcGF0aFBhcmFtID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBwYXRoUGFyYW0gPT09IFwib2JqZWN0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdpZmllZFBhdGhQYXJhbWV0ZXJzID0gSlNPTi5zdHJpbmdpZnkocGF0aFBhcmFtZXRlcnMsIHVuZGVmaW5lZCwgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBhdGhUZW1wbGF0ZTogJHtwYXRoVGVtcGxhdGV9IGNvbnRhaW5zIHRoZSBwYXRoIHBhcmFtZXRlciAke3BhdGhQYXJhbU5hbWV9YCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCBob3dldmVyLCBpdCBpcyBub3QgcHJlc2VudCBpbiBwYXJhbWV0ZXJzOiAke3N0cmluZ2lmaWVkUGF0aFBhcmFtZXRlcnN9LmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgdmFsdWUgb2YgdGhlIHBhdGggcGFyYW1ldGVyIGNhbiBlaXRoZXIgYmUgYSBcInN0cmluZ1wiIG9mIHRoZSBmb3JtIHsgJHtwYXRoUGFyYW1OYW1lfTogXCJzb21lIHNhbXBsZSB2YWx1ZVwiIH0gb3IgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGl0IGNhbiBiZSBhbiBcIm9iamVjdFwiIG9mIHRoZSBmb3JtIHsgXCIke3BhdGhQYXJhbU5hbWV9XCI6IHsgdmFsdWU6IFwic29tZSBzYW1wbGUgdmFsdWVcIiwgc2tpcFVybEVuY29kaW5nOiB0cnVlIH0gfS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJhbS52YWx1ZU9mKCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGl0ZW0sIGVuY29kZVVSSUNvbXBvbmVudChwYXRoUGFyYW0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJhbS52YWx1ZU9mKCkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGF0aFBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvcHRpb25zLnBhdGhQYXJhbWV0ZXJzWyR7cGF0aFBhcmFtTmFtZX1dIGlzIG9mIHR5cGUgXCJvYmplY3RcIiBidXQgaXQgZG9lcyBub3QgY29udGFpbiBhIFwidmFsdWVcIiBwcm9wZXJ0eS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoUGFyYW0uc2tpcFVybEVuY29kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoaXRlbSwgcGF0aFBhcmFtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGl0ZW0sIGVuY29kZVVSSUNvbXBvbmVudChwYXRoUGFyYW0udmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXBwZW5kIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdGhlIHVybCBpZiB0aGV5IGFyZSBwcm92aWRlZC4gVGhleSBjYW4gYmUgcHJvdmlkZWQgd2l0aCBwYXRoVGVtcGxhdGUgb3IgdXJsIG9wdGlvbi5cbiAgICAgICAgaWYgKG9wdGlvbnMucXVlcnlQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtZXRlcnMgPSBvcHRpb25zLnF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlcnlQYXJhbWV0ZXJzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvcHRpb25zLnF1ZXJ5UGFyYW1ldGVycyBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LiBJdCBzaG91bGQgYmUgYSBKU09OIG9iamVjdCBgICtcbiAgICAgICAgICAgICAgICAgICAgYG9mIFwicXVlcnktcGFyYW1ldGVyLW5hbWVcIiBhcyB0aGUga2V5IGFuZCB0aGUgXCJxdWVyeS1wYXJhbWV0ZXItdmFsdWVcIiBhcyB0aGUgdmFsdWUuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgVGhlIFwicXVlcnktcGFyYW1ldGVyLXZhbHVlXCIgbWF5IGJlIGZvIHR5cGUgXCJzdHJpbmdcIiBvciBhbiBcIm9iamVjdFwiIG9mIHRoZSBmb3JtIHsgdmFsdWU6IFwicXVlcnktcGFyYW1ldGVyLXZhbHVlXCIsIHNraXBVcmxFbmNvZGluZzogdHJ1ZSB9LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXBwZW5kIHF1ZXN0aW9uIG1hcmsgaWYgaXQgaXMgbm90IHByZXNlbnQgaW4gdGhlIHVybFxuICAgICAgICAgICAgaWYgKHRoaXMudXJsICYmIHRoaXMudXJsLmluZGV4T2YoXCI/XCIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXJsICs9IFwiP1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc3RydWN0IHF1ZXJ5U3RyaW5nXG4gICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IFtdO1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBwb3B1bGF0ZSB0aGlzLnF1ZXJ5IGFzIGEgZGljdGlvbmFyeSBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyB1c2VkIGZvciBTd2F5J3MgdmFsaWRhdGVSZXF1ZXN0KCkuXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHF1ZXJ5UGFyYW1OYW1lIGluIHF1ZXJ5UGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtZXRlcnNbcXVlcnlQYXJhbU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlcnlQYXJhbSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMucHVzaChxdWVyeVBhcmFtTmFtZSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlbcXVlcnlQYXJhbU5hbWVdID0gZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBxdWVyeVBhcmFtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXF1ZXJ5UGFyYW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG9wdGlvbnMucXVlcnlQYXJhbWV0ZXJzWyR7cXVlcnlQYXJhbU5hbWV9XSBpcyBvZiB0eXBlIFwib2JqZWN0XCIgYnV0IGl0IGRvZXMgbm90IGNvbnRhaW4gYSBcInZhbHVlXCIgcHJvcGVydHkuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbS5za2lwVXJsRW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKHF1ZXJ5UGFyYW1OYW1lICsgXCI9XCIgKyBxdWVyeVBhcmFtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5W3F1ZXJ5UGFyYW1OYW1lXSA9IHF1ZXJ5UGFyYW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKHF1ZXJ5UGFyYW1OYW1lICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQocXVlcnlQYXJhbS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlbcXVlcnlQYXJhbU5hbWVdID0gZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBlbmQtb2YtZm9yXG4gICAgICAgICAgICAvLyBhcHBlbmQgdGhlIHF1ZXJ5U3RyaW5nXG4gICAgICAgICAgICB0aGlzLnVybCArPSBxdWVyeVBhcmFtcy5qb2luKFwiJlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdCBpZiB0aGV5IGFyZSBwcm92aWRlZFxuICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIE9iamVjdC5rZXlzKG9wdGlvbnMuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KGhlYWRlck5hbWUsIGhlYWRlcnNbaGVhZGVyTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGVuc3VyZSBhY2NlcHQtbGFuZ3VhZ2UgaXMgc2V0IGNvcnJlY3RseVxuICAgICAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoXCJhY2NlcHQtbGFuZ3VhZ2VcIikpIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoXCJhY2NlcHQtbGFuZ3VhZ2VcIiwgXCJlbi1VU1wiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgdGhlIHJlcXVlc3QtaWQgaXMgc2V0IGNvcnJlY3RseVxuICAgICAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIpICYmICFvcHRpb25zLmRpc2FibGVDbGllbnRSZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsIHRoaXMucmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkZWZhdWx0XG4gICAgICAgIGlmICghdGhpcy5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKSkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzLnNldChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IHRoZSByZXF1ZXN0IGJvZHkuIHJlcXVlc3QuanMgYXV0b21hdGljYWxseSBzZXRzIHRoZSBDb250ZW50LUxlbmd0aCByZXF1ZXN0IGhlYWRlciwgc28gd2UgbmVlZCBub3Qgc2V0IGl0IGV4cGxpY2l0bHlcbiAgICAgICAgdGhpcy5ib2R5ID0gb3B0aW9ucy5ib2R5O1xuICAgICAgICBpZiAob3B0aW9ucy5ib2R5ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5ib2R5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBib2R5IGFzIGEgc3RyZWFtIHNwZWNpYWwgY2FzZS4gc2V0IHRoZSBib2R5IGFzLWlzIGFuZCBjaGVjayBmb3Igc29tZSBzcGVjaWFsIHJlcXVlc3QgaGVhZGVycyBzcGVjaWZpYyB0byBzZW5kaW5nIGEgc3RyZWFtLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYm9keUlzU3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KFwiVHJhbnNmZXItRW5jb2RpbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzLnNldChcIlRyYW5zZmVyLUVuY29kaW5nXCIsIFwiY2h1bmtlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIikgIT09IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzLnNldChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zZXJpYWxpemF0aW9uTWFwcGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm9keSA9IG5ldyBTZXJpYWxpemVyKG9wdGlvbnMubWFwcGVycykuc2VyaWFsaXplKG9wdGlvbnMuc2VyaWFsaXphdGlvbk1hcHBlciwgb3B0aW9ucy5ib2R5LCBcInJlcXVlc3RCb2R5XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGlzYWJsZUpzb25TdHJpbmdpZnlPbkJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuc3Bhbk9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuc3Bhbk9wdGlvbnMgPSBvcHRpb25zLnNwYW5PcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRyYWNpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNpbmdDb250ZXh0ID0gb3B0aW9ucy50cmFjaW5nQ29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFib3J0U2lnbmFsID0gb3B0aW9ucy5hYm9ydFNpZ25hbDtcbiAgICAgICAgdGhpcy5vbkRvd25sb2FkUHJvZ3Jlc3MgPSBvcHRpb25zLm9uRG93bmxvYWRQcm9ncmVzcztcbiAgICAgICAgdGhpcy5vblVwbG9hZFByb2dyZXNzID0gb3B0aW9ucy5vblVwbG9hZFByb2dyZXNzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvbmUgdGhpcyBXZWJSZXNvdXJjZSBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIFRoZSBjbG9uZSBvZiB0aGlzIFdlYlJlc291cmNlIEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBXZWJSZXNvdXJjZSh0aGlzLnVybCwgdGhpcy5tZXRob2QsIHRoaXMuYm9keSwgdGhpcy5xdWVyeSwgdGhpcy5oZWFkZXJzICYmIHRoaXMuaGVhZGVycy5jbG9uZSgpLCB0aGlzLnN0cmVhbVJlc3BvbnNlQm9keSwgdGhpcy53aXRoQ3JlZGVudGlhbHMsIHRoaXMuYWJvcnRTaWduYWwsIHRoaXMudGltZW91dCwgdGhpcy5vblVwbG9hZFByb2dyZXNzLCB0aGlzLm9uRG93bmxvYWRQcm9ncmVzcywgdGhpcy5wcm94eVNldHRpbmdzLCB0aGlzLmtlZXBBbGl2ZSwgdGhpcy5kZWNvbXByZXNzUmVzcG9uc2UsIHRoaXMuc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2Rlcyk7XG4gICAgICAgIGlmICh0aGlzLmZvcm1EYXRhKSB7XG4gICAgICAgICAgICByZXN1bHQuZm9ybURhdGEgPSB0aGlzLmZvcm1EYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvblNwZWMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcGVyYXRpb25TcGVjID0gdGhpcy5vcGVyYXRpb25TcGVjO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERlc2VyaWFsaXplKSB7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkRGVzZXJpYWxpemUgPSB0aGlzLnNob3VsZERlc2VyaWFsaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvblJlc3BvbnNlR2V0dGVyKSB7XG4gICAgICAgICAgICByZXN1bHQub3BlcmF0aW9uUmVzcG9uc2VHZXR0ZXIgPSB0aGlzLm9wZXJhdGlvblJlc3BvbnNlR2V0dGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViUmVzb3VyY2UuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBjcmVhdGVDbGllbnRMb2dnZXIgfSBmcm9tIFwiQGF6dXJlL2xvZ2dlclwiO1xuLyoqXG4gKiBUaGUgYEBhenVyZS9sb2dnZXJgIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IGNyZWF0ZUNsaWVudExvZ2dlcihcInN0b3JhZ2UtYmxvYlwiKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmV4cG9ydCBjb25zdCBTREtfVkVSU0lPTiA9IFwiMTIuMTcuMFwiO1xuZXhwb3J0IGNvbnN0IFNFUlZJQ0VfVkVSU0lPTiA9IFwiMjAyMy0xMS0wM1wiO1xuZXhwb3J0IGNvbnN0IEJMT0NLX0JMT0JfTUFYX1VQTE9BRF9CTE9CX0JZVEVTID0gMjU2ICogMTAyNCAqIDEwMjQ7IC8vIDI1Nk1CXG5leHBvcnQgY29uc3QgQkxPQ0tfQkxPQl9NQVhfU1RBR0VfQkxPQ0tfQllURVMgPSA0MDAwICogMTAyNCAqIDEwMjQ7IC8vIDQwMDBNQlxuZXhwb3J0IGNvbnN0IEJMT0NLX0JMT0JfTUFYX0JMT0NLUyA9IDUwMDAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkxPQ0tfQlVGRkVSX1NJWkVfQllURVMgPSA4ICogMTAyNCAqIDEwMjQ7IC8vIDhNQlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkxPQl9ET1dOTE9BRF9CTE9DS19CWVRFUyA9IDQgKiAxMDI0ICogMTAyNDsgLy8gNE1CXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfUkVUUllfUkVRVUVTVFMgPSA1O1xuZXhwb3J0IGNvbnN0IFJFUVVFU1RfVElNRU9VVCA9IDEwMCAqIDEwMDA7IC8vIEluIG1zXG4vKipcbiAqIFRoZSBPQXV0aCBzY29wZSB0byB1c2Ugd2l0aCBBenVyZSBTdG9yYWdlLlxuICovXG5leHBvcnQgY29uc3QgU3RvcmFnZU9BdXRoU2NvcGVzID0gXCJodHRwczovL3N0b3JhZ2UuYXp1cmUuY29tLy5kZWZhdWx0XCI7XG5leHBvcnQgY29uc3QgVVJMQ29uc3RhbnRzID0ge1xuICAgIFBhcmFtZXRlcnM6IHtcbiAgICAgICAgRk9SQ0VfQlJPV1NFUl9OT19DQUNIRTogXCJfXCIsXG4gICAgICAgIFNJR05BVFVSRTogXCJzaWdcIixcbiAgICAgICAgU05BUFNIT1Q6IFwic25hcHNob3RcIixcbiAgICAgICAgVkVSU0lPTklEOiBcInZlcnNpb25pZFwiLFxuICAgICAgICBUSU1FT1VUOiBcInRpbWVvdXRcIixcbiAgICB9LFxufTtcbmV4cG9ydCBjb25zdCBIVFRQVVJMQ29ubmVjdGlvbiA9IHtcbiAgICBIVFRQX0FDQ0VQVEVEOiAyMDIsXG4gICAgSFRUUF9DT05GTElDVDogNDA5LFxuICAgIEhUVFBfTk9UX0ZPVU5EOiA0MDQsXG4gICAgSFRUUF9QUkVDT05fRkFJTEVEOiA0MTIsXG4gICAgSFRUUF9SQU5HRV9OT1RfU0FUSVNGSUFCTEU6IDQxNixcbn07XG5leHBvcnQgY29uc3QgSGVhZGVyQ29uc3RhbnRzID0ge1xuICAgIEFVVEhPUklaQVRJT046IFwiQXV0aG9yaXphdGlvblwiLFxuICAgIEFVVEhPUklaQVRJT05fU0NIRU1FOiBcIkJlYXJlclwiLFxuICAgIENPTlRFTlRfRU5DT0RJTkc6IFwiQ29udGVudC1FbmNvZGluZ1wiLFxuICAgIENPTlRFTlRfSUQ6IFwiQ29udGVudC1JRFwiLFxuICAgIENPTlRFTlRfTEFOR1VBR0U6IFwiQ29udGVudC1MYW5ndWFnZVwiLFxuICAgIENPTlRFTlRfTEVOR1RIOiBcIkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgQ09OVEVOVF9NRDU6IFwiQ29udGVudC1NZDVcIixcbiAgICBDT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HOiBcIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdcIixcbiAgICBDT05URU5UX1RZUEU6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgQ09PS0lFOiBcIkNvb2tpZVwiLFxuICAgIERBVEU6IFwiZGF0ZVwiLFxuICAgIElGX01BVENIOiBcImlmLW1hdGNoXCIsXG4gICAgSUZfTU9ESUZJRURfU0lOQ0U6IFwiaWYtbW9kaWZpZWQtc2luY2VcIixcbiAgICBJRl9OT05FX01BVENIOiBcImlmLW5vbmUtbWF0Y2hcIixcbiAgICBJRl9VTk1PRElGSUVEX1NJTkNFOiBcImlmLXVubW9kaWZpZWQtc2luY2VcIixcbiAgICBQUkVGSVhfRk9SX1NUT1JBR0U6IFwieC1tcy1cIixcbiAgICBSQU5HRTogXCJSYW5nZVwiLFxuICAgIFVTRVJfQUdFTlQ6IFwiVXNlci1BZ2VudFwiLFxuICAgIFhfTVNfQ0xJRU5UX1JFUVVFU1RfSUQ6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgIFhfTVNfQ09QWV9TT1VSQ0U6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgIFhfTVNfREFURTogXCJ4LW1zLWRhdGVcIixcbiAgICBYX01TX0VSUk9SX0NPREU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgWF9NU19WRVJTSU9OOiBcIngtbXMtdmVyc2lvblwiLFxufTtcbmV4cG9ydCBjb25zdCBFVGFnTm9uZSA9IFwiXCI7XG5leHBvcnQgY29uc3QgRVRhZ0FueSA9IFwiKlwiO1xuZXhwb3J0IGNvbnN0IFNJWkVfMV9NQiA9IDEgKiAxMDI0ICogMTAyNDtcbmV4cG9ydCBjb25zdCBCQVRDSF9NQVhfUkVRVUVTVCA9IDI1NjtcbmV4cG9ydCBjb25zdCBCQVRDSF9NQVhfUEFZTE9BRF9JTl9CWVRFUyA9IDQgKiBTSVpFXzFfTUI7XG5leHBvcnQgY29uc3QgSFRUUF9MSU5FX0VORElORyA9IFwiXFxyXFxuXCI7XG5leHBvcnQgY29uc3QgSFRUUF9WRVJTSU9OXzFfMSA9IFwiSFRUUC8xLjFcIjtcbmV4cG9ydCBjb25zdCBFbmNyeXB0aW9uQWxnb3JpdGhtQUVTMjUgPSBcIkFFUzI1NlwiO1xuZXhwb3J0IGNvbnN0IERldmVsb3BtZW50Q29ubmVjdGlvblN0cmluZyA9IGBEZWZhdWx0RW5kcG9pbnRzUHJvdG9jb2w9aHR0cDtBY2NvdW50TmFtZT1kZXZzdG9yZWFjY291bnQxO0FjY291bnRLZXk9RWJ5OHZkTTAyeE5PY3FGbHFVd0pQTGxtRXRsQ0RYSjFPVXpGVDUwdVNSWjZJRnN1RnEyVVZFckN6NEk2dHEvSzFTWkZQVE90ci9LQkhCZWtzb0dNR3c9PTtCbG9iRW5kcG9pbnQ9aHR0cDovLzEyNy4wLjAuMToxMDAwMC9kZXZzdG9yZWFjY291bnQxO2A7XG5leHBvcnQgY29uc3QgU3RvcmFnZUJsb2JMb2dnaW5nQWxsb3dlZEhlYWRlck5hbWVzID0gW1xuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIsXG4gICAgXCJDYWNoZS1Db250cm9sXCIsXG4gICAgXCJDb250ZW50LUxlbmd0aFwiLFxuICAgIFwiQ29udGVudC1UeXBlXCIsXG4gICAgXCJEYXRlXCIsXG4gICAgXCJSZXF1ZXN0LUlkXCIsXG4gICAgXCJ0cmFjZXBhcmVudFwiLFxuICAgIFwiVHJhbnNmZXItRW5jb2RpbmdcIixcbiAgICBcIlVzZXItQWdlbnRcIixcbiAgICBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcIngtbXMtZGF0ZVwiLFxuICAgIFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICBcIngtbXMtcmV0dXJuLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgXCJ4LW1zLXZlcnNpb25cIixcbiAgICBcIkFjY2VwdC1SYW5nZXNcIixcbiAgICBcIkNvbnRlbnQtRGlzcG9zaXRpb25cIixcbiAgICBcIkNvbnRlbnQtRW5jb2RpbmdcIixcbiAgICBcIkNvbnRlbnQtTGFuZ3VhZ2VcIixcbiAgICBcIkNvbnRlbnQtTUQ1XCIsXG4gICAgXCJDb250ZW50LVJhbmdlXCIsXG4gICAgXCJFVGFnXCIsXG4gICAgXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgXCJTZXJ2ZXJcIixcbiAgICBcIlZhcnlcIixcbiAgICBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgIFwieC1tcy1jb3B5LWFjdGlvblwiLFxuICAgIFwieC1tcy1jb3B5LWNvbXBsZXRpb24tdGltZVwiLFxuICAgIFwieC1tcy1jb3B5LWlkXCIsXG4gICAgXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICBcIngtbXMtaGFzLWltbXV0YWJpbGl0eS1wb2xpY3lcIixcbiAgICBcIngtbXMtaGFzLWxlZ2FsLWhvbGRcIixcbiAgICBcIngtbXMtbGVhc2Utc3RhdGVcIixcbiAgICBcIngtbXMtbGVhc2Utc3RhdHVzXCIsXG4gICAgXCJ4LW1zLXJhbmdlXCIsXG4gICAgXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgIFwieC1tcy1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgXCJ4LW1zLXNuYXBzaG90XCIsXG4gICAgXCJ4LW1zLXNvdXJjZS1yYW5nZVwiLFxuICAgIFwiSWYtTWF0Y2hcIixcbiAgICBcIklmLU1vZGlmaWVkLVNpbmNlXCIsXG4gICAgXCJJZi1Ob25lLU1hdGNoXCIsXG4gICAgXCJJZi1Vbm1vZGlmaWVkLVNpbmNlXCIsXG4gICAgXCJ4LW1zLWFjY2Vzcy10aWVyXCIsXG4gICAgXCJ4LW1zLWFjY2Vzcy10aWVyLWNoYW5nZS10aW1lXCIsXG4gICAgXCJ4LW1zLWFjY2Vzcy10aWVyLWluZmVycmVkXCIsXG4gICAgXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgIFwieC1tcy1hcmNoaXZlLXN0YXR1c1wiLFxuICAgIFwieC1tcy1ibG9iLWFwcGVuZC1vZmZzZXRcIixcbiAgICBcIngtbXMtYmxvYi1jYWNoZS1jb250cm9sXCIsXG4gICAgXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgXCJ4LW1zLWJsb2ItY29uZGl0aW9uLWFwcGVuZHBvc1wiLFxuICAgIFwieC1tcy1ibG9iLWNvbmRpdGlvbi1tYXhzaXplXCIsXG4gICAgXCJ4LW1zLWJsb2ItY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgIFwieC1tcy1ibG9iLWNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICBcIngtbXMtYmxvYi1jb250ZW50LWxhbmd1YWdlXCIsXG4gICAgXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICBcIngtbXMtYmxvYi1jb250ZW50LW1kNVwiLFxuICAgIFwieC1tcy1ibG9iLWNvbnRlbnQtdHlwZVwiLFxuICAgIFwieC1tcy1ibG9iLXB1YmxpYy1hY2Nlc3NcIixcbiAgICBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgXCJ4LW1zLWNvcHktZGVzdGluYXRpb24tc25hcHNob3RcIixcbiAgICBcIngtbXMtY3JlYXRpb24tdGltZVwiLFxuICAgIFwieC1tcy1kZWZhdWx0LWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICBcIngtbXMtZGVsZXRlLXNuYXBzaG90c1wiLFxuICAgIFwieC1tcy1kZWxldGUtdHlwZS1wZXJtYW5lbnRcIixcbiAgICBcIngtbXMtZGVueS1lbmNyeXB0aW9uLXNjb3BlLW92ZXJyaWRlXCIsXG4gICAgXCJ4LW1zLWVuY3J5cHRpb24tYWxnb3JpdGhtXCIsXG4gICAgXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1lcVwiLFxuICAgIFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItbGVcIixcbiAgICBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWx0XCIsXG4gICAgXCJ4LW1zLWluY3JlbWVudGFsLWNvcHlcIixcbiAgICBcIngtbXMtbGVhc2UtYWN0aW9uXCIsXG4gICAgXCJ4LW1zLWxlYXNlLWJyZWFrLXBlcmlvZFwiLFxuICAgIFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgIFwieC1tcy1sZWFzZS1pZFwiLFxuICAgIFwieC1tcy1sZWFzZS10aW1lXCIsXG4gICAgXCJ4LW1zLXBhZ2Utd3JpdGVcIixcbiAgICBcIngtbXMtcHJvcG9zZWQtbGVhc2UtaWRcIixcbiAgICBcIngtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtbWQ1XCIsXG4gICAgXCJ4LW1zLXJlaHlkcmF0ZS1wcmlvcml0eVwiLFxuICAgIFwieC1tcy1zZXF1ZW5jZS1udW1iZXItYWN0aW9uXCIsXG4gICAgXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgXCJ4LW1zLXNvdXJjZS1jb250ZW50LW1kNVwiLFxuICAgIFwieC1tcy1zb3VyY2UtaWYtbWF0Y2hcIixcbiAgICBcIngtbXMtc291cmNlLWlmLW1vZGlmaWVkLXNpbmNlXCIsXG4gICAgXCJ4LW1zLXNvdXJjZS1pZi1ub25lLW1hdGNoXCIsXG4gICAgXCJ4LW1zLXNvdXJjZS1pZi11bm1vZGlmaWVkLXNpbmNlXCIsXG4gICAgXCJ4LW1zLXRhZy1jb3VudFwiLFxuICAgIFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICBcIngtbXMtaWYtdGFnc1wiLFxuICAgIFwieC1tcy1zb3VyY2UtaWYtdGFnc1wiLFxuXTtcbmV4cG9ydCBjb25zdCBTdG9yYWdlQmxvYkxvZ2dpbmdBbGxvd2VkUXVlcnlQYXJhbWV0ZXJzID0gW1xuICAgIFwiY29tcFwiLFxuICAgIFwibWF4cmVzdWx0c1wiLFxuICAgIFwicnNjY1wiLFxuICAgIFwicnNjZFwiLFxuICAgIFwicnNjZVwiLFxuICAgIFwicnNjbFwiLFxuICAgIFwicnNjdFwiLFxuICAgIFwic2VcIixcbiAgICBcInNpXCIsXG4gICAgXCJzaXBcIixcbiAgICBcInNwXCIsXG4gICAgXCJzcHJcIixcbiAgICBcInNyXCIsXG4gICAgXCJzcnRcIixcbiAgICBcInNzXCIsXG4gICAgXCJzdFwiLFxuICAgIFwic3ZcIixcbiAgICBcImluY2x1ZGVcIixcbiAgICBcIm1hcmtlclwiLFxuICAgIFwicHJlZml4XCIsXG4gICAgXCJjb3B5aWRcIixcbiAgICBcInJlc3R5cGVcIixcbiAgICBcImJsb2NraWRcIixcbiAgICBcImJsb2NrbGlzdHR5cGVcIixcbiAgICBcImRlbGltaXRlclwiLFxuICAgIFwicHJldnNuYXBzaG90XCIsXG4gICAgXCJza2VcIixcbiAgICBcInNrb2lkXCIsXG4gICAgXCJza3NcIixcbiAgICBcInNrdFwiLFxuICAgIFwic2t0aWRcIixcbiAgICBcInNrdlwiLFxuICAgIFwic25hcHNob3RcIixcbl07XG5leHBvcnQgY29uc3QgQmxvYlVzZXNDdXN0b21lclNwZWNpZmllZEVuY3J5cHRpb25Nc2cgPSBcIkJsb2JVc2VzQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uXCI7XG5leHBvcnQgY29uc3QgQmxvYkRvZXNOb3RVc2VDdXN0b21lclNwZWNpZmllZEVuY3J5cHRpb24gPSBcIkJsb2JEb2VzTm90VXNlQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uXCI7XG4vLy8gTGlzdCBvZiBwb3J0cyB1c2VkIGZvciBwYXRoIHN0eWxlIGFkZHJlc3NpbmcuXG4vLy8gUGF0aCBzdHlsZSBhZGRyZXNzaW5nIG1lYW5zIHRoYXQgc3RvcmFnZSBhY2NvdW50IGlzIHB1dCBpbiBVUkkncyBQYXRoIHNlZ21lbnQgaW4gaW5zdGVhZCBvZiBpbiBob3N0LlxuZXhwb3J0IGNvbnN0IFBhdGhTdHlsZVBvcnRzID0gW1xuICAgIFwiMTAwMDBcIixcbiAgICBcIjEwMDAxXCIsXG4gICAgXCIxMDAwMlwiLFxuICAgIFwiMTAwMDNcIixcbiAgICBcIjEwMDA0XCIsXG4gICAgXCIxMDEwMFwiLFxuICAgIFwiMTAxMDFcIixcbiAgICBcIjEwMTAyXCIsXG4gICAgXCIxMDEwM1wiLFxuICAgIFwiMTAxMDRcIixcbiAgICBcIjExMDAwXCIsXG4gICAgXCIxMTAwMVwiLFxuICAgIFwiMTEwMDJcIixcbiAgICBcIjExMDAzXCIsXG4gICAgXCIxMTAwNFwiLFxuICAgIFwiMTExMDBcIixcbiAgICBcIjExMTAxXCIsXG4gICAgXCIxMTEwMlwiLFxuICAgIFwiMTExMDNcIixcbiAgICBcIjExMTA0XCIsXG5dO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgSHR0cEhlYWRlcnMsIGlzTm9kZSwgVVJMQnVpbGRlciB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBEZXZlbG9wbWVudENvbm5lY3Rpb25TdHJpbmcsIEhlYWRlckNvbnN0YW50cywgUGF0aFN0eWxlUG9ydHMsIFVSTENvbnN0YW50cywgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbi8qKlxuICogUmVzZXJ2ZWQgVVJMIGNoYXJhY3RlcnMgbXVzdCBiZSBwcm9wZXJseSBlc2NhcGVkIGZvciBTdG9yYWdlIHNlcnZpY2VzIGxpa2UgQmxvYiBvciBGaWxlLlxuICpcbiAqICMjIFVSTCBlbmNvZGUgYW5kIGVzY2FwZSBzdHJhdGVneSBmb3IgSlMgU0RLc1xuICpcbiAqIFdoZW4gY3VzdG9tZXJzIHBhc3MgYSBVUkwgc3RyaW5nIGludG8gWHh4Q2xpZW50IGNsYXNzZXMgY29uc3RydWN0b3IsIHRoZSBVUkwgc3RyaW5nIG1heSBhbHJlYWR5IGJlIFVSTCBlbmNvZGVkIG9yIG5vdC5cbiAqIEJ1dCBiZWZvcmUgc2VuZGluZyB0byBBenVyZSBTdG9yYWdlIHNlcnZlciwgdGhlIFVSTCBtdXN0IGJlIGVuY29kZWQuIEhvd2V2ZXIsIGl0J3MgaGFyZCBmb3IgYSBTREsgdG8gZ3Vlc3Mgd2hldGhlciB0aGUgVVJMXG4gKiBzdHJpbmcgaGFzIGJlZW4gZW5jb2RlZCBvciBub3QuIFdlIGhhdmUgMiBwb3RlbnRpYWwgc3RyYXRlZ2llcywgYW5kIGNob3NlIHN0cmF0ZWd5IHR3byBmb3IgdGhlIFh4eENsaWVudCBjb25zdHJ1Y3RvcnMuXG4gKlxuICogIyMjIFN0cmF0ZWd5IE9uZTogQXNzdW1lIHRoZSBjdXN0b21lciBVUkwgc3RyaW5nIGlzIG5vdCBlbmNvZGVkLCBhbmQgYWx3YXlzIGVuY29kZSBVUkwgc3RyaW5nIGluIFNESy5cbiAqXG4gKiBUaGlzIGlzIHdoYXQgbGVnYWN5IFYyIFNESyBkb2VzLCBzaW1wbGUgYW5kIHdvcmtzIGZvciBtb3N0IG9mIHRoZSBjYXNlcy5cbiAqIC0gV2hlbiBjdXN0b21lciBVUkwgc3RyaW5nIGlzIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iOlwiLFxuICogICBTREsgd2lsbCBlbmNvZGUgaXQgdG8gXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlM0FcIiBhbmQgc2VuZCB0byBzZXJ2ZXIuIEEgYmxvYiBuYW1lZCBcImI6XCIgd2lsbCBiZSBjcmVhdGVkLlxuICogLSBXaGVuIGN1c3RvbWVyIFVSTCBzdHJpbmcgaXMgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlM0FcIixcbiAqICAgU0RLIHdpbGwgZW5jb2RlIGl0IHRvIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTI1M0FcIiBhbmQgc2VuZCB0byBzZXJ2ZXIuIEEgYmxvYiBuYW1lZCBcImIlM0FcIiB3aWxsIGJlIGNyZWF0ZWQuXG4gKlxuICogQnV0IHRoaXMgc3RyYXRlZ3kgd2lsbCBtYWtlIGl0IG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYSBibG9iIHdpdGggXCI/XCIgaW4gaXQncyBuYW1lLiBCZWNhdXNlIHdoZW4gY3VzdG9tZXIgVVJMIHN0cmluZyBpc1xuICogXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2Jsb2I/bmFtZVwiLCB0aGUgXCI/bmFtZVwiIHdpbGwgYmUgdHJlYXRlZCBhcyBVUkwgcGFyYW10ZXIgaW5zdGVhZCBvZiBibG9iIG5hbWUuXG4gKiBJZiBjdXN0b21lciBVUkwgc3RyaW5nIGlzIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9ibG9iJTNGbmFtZVwiLCBhIGJsb2IgbmFtZWQgXCJibG9iJTNGbmFtZVwiIHdpbGwgYmUgY3JlYXRlZC5cbiAqIFYyIFNESyBkb2Vzbid0IGhhdmUgdGhpcyBpc3N1ZSBiZWNhdXNlIGl0IGRvZXNuJ3QgYWxsb3cgY3VzdG9tZXIgcGFzcyBpbiBhIGZ1bGwgVVJMLCBpdCBhY2NlcHRzIGEgc2VwYXJhdGUgYmxvYiBuYW1lIGFuZCBlbmNvZGVVUklDb21wb25lbnQgZm9yIGl0LlxuICogV2UgY2Fubm90IGFjY2VwdCBhIFNESyBjYW5ub3QgY3JlYXRlIGEgYmxvYiBuYW1lIHdpdGggXCI/XCIuIFNvIHdlIGltcGxlbWVudCBzdHJhdGVneSB0d286XG4gKlxuICogIyMjIFN0cmF0ZWd5IFR3bzogU0RLIGRvZXNuJ3QgYXNzdW1lIHRoZSBVUkwgaGFzIGJlZW4gZW5jb2RlZCBvciBub3QuIEl0IHdpbGwganVzdCBlc2NhcGUgdGhlIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAqXG4gKiBUaGlzIGlzIHdoYXQgVjEwIEJsb2IgR28gU0RLIGRvZXMuIEl0IGFjY2VwdHMgYSBVUkwgdHlwZSBpbiBHbywgYW5kIGNhbGwgdXJsLkVzY2FwZWRQYXRoKCkgdG8gZXNjYXBlIHRoZSBzcGVjaWFsIGNoYXJzIHVuZXNjYXBlZC5cbiAqIC0gV2hlbiBjdXN0b21lciBVUkwgc3RyaW5nIGlzIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iOlwiLFxuICogICBTREsgd2lsbCBlc2NhcGUgXCI6XCIgbGlrZSBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUzQVwiIGFuZCBzZW5kIHRvIHNlcnZlci4gQSBibG9iIG5hbWVkIFwiYjpcIiB3aWxsIGJlIGNyZWF0ZWQuXG4gKiAtIFdoZW4gY3VzdG9tZXIgVVJMIHN0cmluZyBpcyBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUzQVwiLFxuICogICBUaGVyZSBpcyBubyBzcGVjaWFsIGNoYXJhY3RlcnMsIHNvIHNlbmQgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlM0FcIiB0byBzZXJ2ZXIuIEEgYmxvYiBuYW1lZCBcImI6XCIgd2lsbCBiZSBjcmVhdGVkLlxuICogLSBXaGVuIGN1c3RvbWVyIFVSTCBzdHJpbmcgaXMgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlMjUzQVwiLFxuICogICBUaGVyZSBpcyBubyBzcGVjaWFsIGNoYXJhY3RlcnMsIHNvIHNlbmQgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlMjUzQVwiIHRvIHNlcnZlci4gQSBibG9iIG5hbWVkIFwiYiUzQVwiIHdpbGwgYmUgY3JlYXRlZC5cbiAqXG4gKiBUaGlzIHN0cmF0ZWd5IGdpdmVzIHVzIGZsZXhpYmlsaXR5IHRvIGNyZWF0ZSB3aXRoIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMuIEJ1dCBcIiVcIiB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzcGVjaWFsIGNoYXJhY3RlcnMsIGlmIHRoZSBVUkwgc3RyaW5nXG4gKiBpcyBub3QgZW5jb2RlZCwgdGhlcmUgc2hvdWxkbid0IGEgXCIlXCIgaW4gdGhlIFVSTCBzdHJpbmcsIG90aGVyd2lzZSB0aGUgVVJMIGlzIG5vdCBhIHZhbGlkIFVSTC5cbiAqIElmIGN1c3RvbWVyIG5lZWRzIHRvIGNyZWF0ZSBhIGJsb2Igd2l0aCBcIiVcIiBpbiBpdCdzIGJsb2IgbmFtZSwgdXNlIFwiJTI1XCIgaW5zdGVhZCBvZiBcIiVcIi4gSnVzdCBsaWtlIGFib3ZlIDNyZCBzYW1wbGUuXG4gKiBBbmQgZm9sbG93aW5nIFVSTCBzdHJpbmdzIGFyZSBpbnZhbGlkOlxuICogLSBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiVcIlxuICogLSBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUyXCJcbiAqIC0gXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlR1wiXG4gKlxuICogQW5vdGhlciBzcGVjaWFsIGNoYXJhY3RlciBpcyBcIj9cIiwgdXNlIFwiJTJGXCIgdG8gcmVwcmVzZW50IGEgYmxvYiBuYW1lIHdpdGggXCI/XCIgaW4gYSBVUkwgc3RyaW5nLlxuICpcbiAqICMjIyBTdHJhdGVneSBmb3IgY29udGFpbmVyTmFtZSwgYmxvYk5hbWUgb3Igb3RoZXIgc3BlY2lmaWMgWFhYTmFtZSBwYXJhbWV0ZXJzIGluIG1ldGhvZHMgc3VjaCBhcyBgY29udGFpbmVyQ2xpZW50LmdldEJsb2JDbGllbnQoYmxvYk5hbWUpYFxuICpcbiAqIFdlIHdpbGwgYXBwbHkgc3RyYXRlZ3kgb25lLCBhbmQgY2FsbCBlbmNvZGVVUklDb21wb25lbnQgZm9yIHRoZXNlIHBhcmFtZXRlcnMgbGlrZSBibG9iTmFtZS4gQmVjYXVzZSB3aGF0IGN1c3RvbWVycyBwYXNzZXMgaW4gaXMgYSBwbGFpbiBuYW1lIGluc3RlYWQgb2YgYSBVUkwuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbmFtaW5nLWFuZC1yZWZlcmVuY2luZy1jb250YWluZXJzLS1ibG9icy0tYW5kLW1ldGFkYXRhXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9uYW1pbmctYW5kLXJlZmVyZW5jaW5nLXNoYXJlcy0tZGlyZWN0b3JpZXMtLWZpbGVzLS1hbmQtbWV0YWRhdGFcbiAqXG4gKiBAcGFyYW0gdXJsIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVVSTFBhdGgodXJsKSB7XG4gICAgY29uc3QgdXJsUGFyc2VkID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpO1xuICAgIGxldCBwYXRoID0gdXJsUGFyc2VkLmdldFBhdGgoKTtcbiAgICBwYXRoID0gcGF0aCB8fCBcIi9cIjtcbiAgICBwYXRoID0gZXNjYXBlKHBhdGgpO1xuICAgIHVybFBhcnNlZC5zZXRQYXRoKHBhdGgpO1xuICAgIHJldHVybiB1cmxQYXJzZWQudG9TdHJpbmcoKTtcbn1cbmZ1bmN0aW9uIGdldFByb3h5VXJpRnJvbURldkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZykge1xuICAgIC8vIERldmVsb3BtZW50IENvbm5lY3Rpb24gU3RyaW5nXG4gICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1jb25maWd1cmUtY29ubmVjdGlvbi1zdHJpbmcjY29ubmVjdC10by10aGUtZW11bGF0b3ItYWNjb3VudC11c2luZy10aGUtd2VsbC1rbm93bi1hY2NvdW50LW5hbWUtYW5kLWtleVxuICAgIGxldCBwcm94eVVyaSA9IFwiXCI7XG4gICAgaWYgKGNvbm5lY3Rpb25TdHJpbmcuc2VhcmNoKFwiRGV2ZWxvcG1lbnRTdG9yYWdlUHJveHlVcmk9XCIpICE9PSAtMSkge1xuICAgICAgICAvLyBDT05ORUNUSU9OX1NUUklORz1Vc2VEZXZlbG9wbWVudFN0b3JhZ2U9dHJ1ZTtEZXZlbG9wbWVudFN0b3JhZ2VQcm94eVVyaT1odHRwOi8vbXlQcm94eVVyaVxuICAgICAgICBjb25zdCBtYXRjaENyZWRlbnRpYWxzID0gY29ubmVjdGlvblN0cmluZy5zcGxpdChcIjtcIik7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBtYXRjaENyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcIkRldmVsb3BtZW50U3RvcmFnZVByb3h5VXJpPVwiKSkge1xuICAgICAgICAgICAgICAgIHByb3h5VXJpID0gZWxlbWVudC50cmltKCkubWF0Y2goXCJEZXZlbG9wbWVudFN0b3JhZ2VQcm94eVVyaT0oLiopXCIpWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm94eVVyaTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBhcmd1bWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gY29ubmVjdGlvblN0cmluZy5zcGxpdChcIjtcIik7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChlbGVtZW50LnRyaW0oKS5zdGFydHNXaXRoKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudHJpbSgpLm1hdGNoKGFyZ3VtZW50ICsgXCI9KC4qKVwiKVsxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbn1cbi8qKlxuICogRXh0cmFjdHMgdGhlIHBhcnRzIG9mIGFuIEF6dXJlIFN0b3JhZ2UgYWNjb3VudCBjb25uZWN0aW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gY29ubmVjdGlvblN0cmluZyAtIENvbm5lY3Rpb24gc3RyaW5nLlxuICogQHJldHVybnMgU3RyaW5nIGtleSB2YWx1ZSBwYWlycyBvZiB0aGUgc3RvcmFnZSBhY2NvdW50J3MgdXJsIGFuZCBjcmVkZW50aWFscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHMoY29ubmVjdGlvblN0cmluZykge1xuICAgIGxldCBwcm94eVVyaSA9IFwiXCI7XG4gICAgaWYgKGNvbm5lY3Rpb25TdHJpbmcuc3RhcnRzV2l0aChcIlVzZURldmVsb3BtZW50U3RvcmFnZT10cnVlXCIpKSB7XG4gICAgICAgIC8vIERldmVsb3BtZW50IGNvbm5lY3Rpb24gc3RyaW5nXG4gICAgICAgIHByb3h5VXJpID0gZ2V0UHJveHlVcmlGcm9tRGV2Q29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nKTtcbiAgICAgICAgY29ubmVjdGlvblN0cmluZyA9IERldmVsb3BtZW50Q29ubmVjdGlvblN0cmluZztcbiAgICB9XG4gICAgLy8gTWF0Y2hpbmcgQmxvYkVuZHBvaW50IGluIHRoZSBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nXG4gICAgbGV0IGJsb2JFbmRwb2ludCA9IGdldFZhbHVlSW5Db25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcsIFwiQmxvYkVuZHBvaW50XCIpO1xuICAgIC8vIFNsaWNpbmcgb2ZmICcvJyBhdCB0aGUgZW5kIGlmIGV4aXN0c1xuICAgIC8vIChUaGUgbWV0aG9kcyB0aGF0IHVzZSBgZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0c2AgZXhwZWN0IHRoZSB1cmwgdG8gbm90IGhhdmUgYC9gIGF0IHRoZSBlbmQpXG4gICAgYmxvYkVuZHBvaW50ID0gYmxvYkVuZHBvaW50LmVuZHNXaXRoKFwiL1wiKSA/IGJsb2JFbmRwb2ludC5zbGljZSgwLCAtMSkgOiBibG9iRW5kcG9pbnQ7XG4gICAgaWYgKGNvbm5lY3Rpb25TdHJpbmcuc2VhcmNoKFwiRGVmYXVsdEVuZHBvaW50c1Byb3RvY29sPVwiKSAhPT0gLTEgJiZcbiAgICAgICAgY29ubmVjdGlvblN0cmluZy5zZWFyY2goXCJBY2NvdW50S2V5PVwiKSAhPT0gLTEpIHtcbiAgICAgICAgLy8gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZ1xuICAgICAgICBsZXQgZGVmYXVsdEVuZHBvaW50c1Byb3RvY29sID0gXCJcIjtcbiAgICAgICAgbGV0IGFjY291bnROYW1lID0gXCJcIjtcbiAgICAgICAgbGV0IGFjY291bnRLZXkgPSBCdWZmZXIuZnJvbShcImFjY291bnRLZXlcIiwgXCJiYXNlNjRcIik7XG4gICAgICAgIGxldCBlbmRwb2ludFN1ZmZpeCA9IFwiXCI7XG4gICAgICAgIC8vIEdldCBhY2NvdW50IG5hbWUgYW5kIGtleVxuICAgICAgICBhY2NvdW50TmFtZSA9IGdldFZhbHVlSW5Db25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcsIFwiQWNjb3VudE5hbWVcIik7XG4gICAgICAgIGFjY291bnRLZXkgPSBCdWZmZXIuZnJvbShnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcIkFjY291bnRLZXlcIiksIFwiYmFzZTY0XCIpO1xuICAgICAgICBpZiAoIWJsb2JFbmRwb2ludCkge1xuICAgICAgICAgICAgLy8gQmxvYkVuZHBvaW50IGlzIG5vdCBwcmVzZW50IGluIHRoZSBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nXG4gICAgICAgICAgICAvLyBDYW4gYmUgb2J0YWluZWQgZnJvbSBgJHtkZWZhdWx0RW5kcG9pbnRzUHJvdG9jb2x9Oi8vJHthY2NvdW50TmFtZX0uYmxvYi4ke2VuZHBvaW50U3VmZml4fWBcbiAgICAgICAgICAgIGRlZmF1bHRFbmRwb2ludHNQcm90b2NvbCA9IGdldFZhbHVlSW5Db25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcsIFwiRGVmYXVsdEVuZHBvaW50c1Byb3RvY29sXCIpO1xuICAgICAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBkZWZhdWx0RW5kcG9pbnRzUHJvdG9jb2wudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwcm90b2NvbCAhPT0gXCJodHRwc1wiICYmIHByb3RvY29sICE9PSBcImh0dHBcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgRGVmYXVsdEVuZHBvaW50c1Byb3RvY29sIGluIHRoZSBwcm92aWRlZCBDb25uZWN0aW9uIFN0cmluZy4gRXhwZWN0aW5nICdodHRwcycgb3IgJ2h0dHAnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kcG9pbnRTdWZmaXggPSBnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcIkVuZHBvaW50U3VmZml4XCIpO1xuICAgICAgICAgICAgaWYgKCFlbmRwb2ludFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgRW5kcG9pbnRTdWZmaXggaW4gdGhlIHByb3ZpZGVkIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvYkVuZHBvaW50ID0gYCR7ZGVmYXVsdEVuZHBvaW50c1Byb3RvY29sfTovLyR7YWNjb3VudE5hbWV9LmJsb2IuJHtlbmRwb2ludFN1ZmZpeH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgQWNjb3VudE5hbWUgaW4gdGhlIHByb3ZpZGVkIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFjY291bnRLZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEFjY291bnRLZXkgaW4gdGhlIHByb3ZpZGVkIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIkFjY291bnRDb25uU3RyaW5nXCIsXG4gICAgICAgICAgICB1cmw6IGJsb2JFbmRwb2ludCxcbiAgICAgICAgICAgIGFjY291bnROYW1lLFxuICAgICAgICAgICAgYWNjb3VudEtleSxcbiAgICAgICAgICAgIHByb3h5VXJpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gU0FTIGNvbm5lY3Rpb24gc3RyaW5nXG4gICAgICAgIGNvbnN0IGFjY291bnRTYXMgPSBnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcIlNoYXJlZEFjY2Vzc1NpZ25hdHVyZVwiKTtcbiAgICAgICAgbGV0IGFjY291bnROYW1lID0gZ2V0VmFsdWVJbkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZywgXCJBY2NvdW50TmFtZVwiKTtcbiAgICAgICAgLy8gaWYgYWNjb3VudE5hbWUgaXMgZW1wdHksIHRyeSB0byByZWFkIGl0IGZyb20gQmxvYkVuZHBvaW50XG4gICAgICAgIGlmICghYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICAgIGFjY291bnROYW1lID0gZ2V0QWNjb3VudE5hbWVGcm9tVXJsKGJsb2JFbmRwb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFibG9iRW5kcG9pbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgQmxvYkVuZHBvaW50IGluIHRoZSBwcm92aWRlZCBTQVMgQ29ubmVjdGlvbiBTdHJpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWFjY291bnRTYXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU2hhcmVkQWNjZXNzU2lnbmF0dXJlIGluIHRoZSBwcm92aWRlZCBTQVMgQ29ubmVjdGlvbiBTdHJpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsga2luZDogXCJTQVNDb25uU3RyaW5nXCIsIHVybDogYmxvYkVuZHBvaW50LCBhY2NvdW50TmFtZSwgYWNjb3VudFNhcyB9O1xuICAgIH1cbn1cbi8qKlxuICogSW50ZXJuYWwgZXNjYXBlIG1ldGhvZCBpbXBsZW1lbnRlZCBTdHJhdGVneSBUd28gbWVudGlvbmVkIGluIGVzY2FwZVVSTCgpIGRlc2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC1cbiAqL1xuZnVuY3Rpb24gZXNjYXBlKHRleHQpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpXG4gICAgICAgIC5yZXBsYWNlKC8lMkYvZywgXCIvXCIpIC8vIERvbid0IGVzY2FwZSBmb3IgXCIvXCJcbiAgICAgICAgLnJlcGxhY2UoLycvZywgXCIlMjdcIikgLy8gRXNjYXBlIGZvciBcIidcIlxuICAgICAgICAucmVwbGFjZSgvXFwrL2csIFwiJTIwXCIpXG4gICAgICAgIC5yZXBsYWNlKC8lMjUvZywgXCIlXCIpOyAvLyBSZXZlcnQgZW5jb2RlZCBcIiVcIlxufVxuLyoqXG4gKiBBcHBlbmQgYSBzdHJpbmcgdG8gVVJMIHBhdGguIFdpbGwgcmVtb3ZlIGR1cGxpY2F0ZWQgXCIvXCIgaW4gZnJvbnQgb2YgdGhlIHN0cmluZ1xuICogd2hlbiBVUkwgcGF0aCBlbmRzIHdpdGggYSBcIi9cIi5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gU291cmNlIFVSTCBzdHJpbmdcbiAqIEBwYXJhbSBuYW1lIC0gU3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvIFVSTFxuICogQHJldHVybnMgQW4gdXBkYXRlZCBVUkwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRUb1VSTFBhdGgodXJsLCBuYW1lKSB7XG4gICAgY29uc3QgdXJsUGFyc2VkID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpO1xuICAgIGxldCBwYXRoID0gdXJsUGFyc2VkLmdldFBhdGgoKTtcbiAgICBwYXRoID0gcGF0aCA/IChwYXRoLmVuZHNXaXRoKFwiL1wiKSA/IGAke3BhdGh9JHtuYW1lfWAgOiBgJHtwYXRofS8ke25hbWV9YCkgOiBuYW1lO1xuICAgIHVybFBhcnNlZC5zZXRQYXRoKHBhdGgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVcmwgPSBuZXcgVVJMKHVybFBhcnNlZC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZFVybC50b1N0cmluZygpO1xufVxuLyoqXG4gKiBTZXQgVVJMIHBhcmFtZXRlciBuYW1lIGFuZCB2YWx1ZS4gSWYgbmFtZSBleGlzdHMgaW4gVVJMIHBhcmFtZXRlcnMsIG9sZCB2YWx1ZVxuICogd2lsbCBiZSByZXBsYWNlZCBieSBuYW1lIGtleS4gSWYgbm90IHByb3ZpZGUgdmFsdWUsIHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSBkZWxldGVkLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBTb3VyY2UgVVJMIHN0cmluZ1xuICogQHBhcmFtIG5hbWUgLSBQYXJhbWV0ZXIgbmFtZVxuICogQHBhcmFtIHZhbHVlIC0gUGFyYW1ldGVyIHZhbHVlXG4gKiBAcmV0dXJucyBBbiB1cGRhdGVkIFVSTCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFVSTFBhcmFtZXRlcih1cmwsIG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgdXJsUGFyc2VkID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpO1xuICAgIHVybFBhcnNlZC5zZXRRdWVyeVBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHVybFBhcnNlZC50b1N0cmluZygpO1xufVxuLyoqXG4gKiBHZXQgVVJMIHBhcmFtZXRlciBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB1cmwgLVxuICogQHBhcmFtIG5hbWUgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVJMUGFyYW1ldGVyKHVybCwgbmFtZSkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICByZXR1cm4gdXJsUGFyc2VkLmdldFF1ZXJ5UGFyYW1ldGVyVmFsdWUobmFtZSk7XG59XG4vKipcbiAqIFNldCBVUkwgaG9zdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gU291cmNlIFVSTCBzdHJpbmdcbiAqIEBwYXJhbSBob3N0IC0gTmV3IGhvc3Qgc3RyaW5nXG4gKiBAcmV0dXJucyBBbiB1cGRhdGVkIFVSTCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFVSTEhvc3QodXJsLCBob3N0KSB7XG4gICAgY29uc3QgdXJsUGFyc2VkID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpO1xuICAgIHVybFBhcnNlZC5zZXRIb3N0KGhvc3QpO1xuICAgIHJldHVybiB1cmxQYXJzZWQudG9TdHJpbmcoKTtcbn1cbi8qKlxuICogR2V0IFVSTCBwYXRoIGZyb20gYW4gVVJMIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gU291cmNlIFVSTCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVSTFBhdGgodXJsKSB7XG4gICAgY29uc3QgdXJsUGFyc2VkID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpO1xuICAgIHJldHVybiB1cmxQYXJzZWQuZ2V0UGF0aCgpO1xufVxuLyoqXG4gKiBHZXQgVVJMIHNjaGVtZSBmcm9tIGFuIFVSTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHVybCAtIFNvdXJjZSBVUkwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVUkxTY2hlbWUodXJsKSB7XG4gICAgY29uc3QgdXJsUGFyc2VkID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpO1xuICAgIHJldHVybiB1cmxQYXJzZWQuZ2V0U2NoZW1lKCk7XG59XG4vKipcbiAqIEdldCBVUkwgcGF0aCBhbmQgcXVlcnkgZnJvbSBhbiBVUkwgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBTb3VyY2UgVVJMIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVJMUGF0aEFuZFF1ZXJ5KHVybCkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IFVSTEJ1aWxkZXIucGFyc2UodXJsKTtcbiAgICBjb25zdCBwYXRoU3RyaW5nID0gdXJsUGFyc2VkLmdldFBhdGgoKTtcbiAgICBpZiAoIXBhdGhTdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHVybCB3aXRob3V0IHZhbGlkIHBhdGguXCIpO1xuICAgIH1cbiAgICBsZXQgcXVlcnlTdHJpbmcgPSB1cmxQYXJzZWQuZ2V0UXVlcnkoKSB8fCBcIlwiO1xuICAgIHF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmcudHJpbSgpO1xuICAgIGlmIChxdWVyeVN0cmluZyAhPT0gXCJcIikge1xuICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnN0YXJ0c1dpdGgoXCI/XCIpID8gcXVlcnlTdHJpbmcgOiBgPyR7cXVlcnlTdHJpbmd9YDsgLy8gRW5zdXJlIHF1ZXJ5IHN0cmluZyBzdGFydCB3aXRoICc/J1xuICAgIH1cbiAgICByZXR1cm4gYCR7cGF0aFN0cmluZ30ke3F1ZXJ5U3RyaW5nfWA7XG59XG4vKipcbiAqIEdldCBVUkwgcXVlcnkga2V5IHZhbHVlIHBhaXJzIGZyb20gYW4gVVJMIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdXJsIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVSTFF1ZXJpZXModXJsKSB7XG4gICAgbGV0IHF1ZXJ5U3RyaW5nID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpLmdldFF1ZXJ5KCk7XG4gICAgaWYgKCFxdWVyeVN0cmluZykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmcudHJpbSgpO1xuICAgIHF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmcuc3RhcnRzV2l0aChcIj9cIikgPyBxdWVyeVN0cmluZy5zdWJzdHIoMSkgOiBxdWVyeVN0cmluZztcbiAgICBsZXQgcXVlcnlTdWJTdHJpbmdzID0gcXVlcnlTdHJpbmcuc3BsaXQoXCImXCIpO1xuICAgIHF1ZXJ5U3ViU3RyaW5ncyA9IHF1ZXJ5U3ViU3RyaW5ncy5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4T2ZFcXVhbCA9IHZhbHVlLmluZGV4T2YoXCI9XCIpO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXhPZkVxdWFsID0gdmFsdWUubGFzdEluZGV4T2YoXCI9XCIpO1xuICAgICAgICByZXR1cm4gKGluZGV4T2ZFcXVhbCA+IDAgJiYgaW5kZXhPZkVxdWFsID09PSBsYXN0SW5kZXhPZkVxdWFsICYmIGxhc3RJbmRleE9mRXF1YWwgPCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICB9KTtcbiAgICBjb25zdCBxdWVyaWVzID0ge307XG4gICAgZm9yIChjb25zdCBxdWVyeVN1YlN0cmluZyBvZiBxdWVyeVN1YlN0cmluZ3MpIHtcbiAgICAgICAgY29uc3Qgc3BsaXRSZXN1bHRzID0gcXVlcnlTdWJTdHJpbmcuc3BsaXQoXCI9XCIpO1xuICAgICAgICBjb25zdCBrZXkgPSBzcGxpdFJlc3VsdHNbMF07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRSZXN1bHRzWzFdO1xuICAgICAgICBxdWVyaWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJpZXM7XG59XG4vKipcbiAqIEFwcGVuZCBhIHN0cmluZyB0byBVUkwgcXVlcnkuXG4gKlxuICogQHBhcmFtIHVybCAtIFNvdXJjZSBVUkwgc3RyaW5nLlxuICogQHBhcmFtIHF1ZXJ5UGFydHMgLSBTdHJpbmcgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIFVSTCBxdWVyeS5cbiAqIEByZXR1cm5zIEFuIHVwZGF0ZWQgVVJMIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFRvVVJMUXVlcnkodXJsLCBxdWVyeVBhcnRzKSB7XG4gICAgY29uc3QgdXJsUGFyc2VkID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpO1xuICAgIGxldCBxdWVyeSA9IHVybFBhcnNlZC5nZXRRdWVyeSgpO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgICBxdWVyeSArPSBcIiZcIiArIHF1ZXJ5UGFydHM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5UGFydHM7XG4gICAgfVxuICAgIHVybFBhcnNlZC5zZXRRdWVyeShxdWVyeSk7XG4gICAgcmV0dXJuIHVybFBhcnNlZC50b1N0cmluZygpO1xufVxuLyoqXG4gKiBSb3VuZHMgYSBkYXRlIG9mZiB0byBzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC1cbiAqIEBwYXJhbSB3aXRoTWlsbGlzZWNvbmRzIC0gSWYgdHJ1ZSwgWVlZWS1NTS1ERFRoaDptbTpzcy5mZmZmZmZmWiB3aWxsIGJlIHJldHVybmVkO1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBmYWxzZSwgWVlZWS1NTS1ERFRoaDptbTpzc1ogd2lsbCBiZSByZXR1cm5lZC5cbiAqIEByZXR1cm5zIERhdGUgc3RyaW5nIGluIElTTzgwNjEgZm9ybWF0LCB3aXRoIG9yIHdpdGhvdXQgNyBtaWxsaXNlY29uZHMgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZWRJU084MDYxRGF0ZShkYXRlLCB3aXRoTWlsbGlzZWNvbmRzID0gdHJ1ZSkge1xuICAgIC8vIERhdGUudG9JU09TdHJpbmcoKSB3aWxsIHJldHVybiBsaWtlIFwiMjAxOC0xMC0yOVQwNjozNDozNi4xMzlaXCJcbiAgICBjb25zdCBkYXRlU3RyaW5nID0gZGF0ZS50b0lTT1N0cmluZygpO1xuICAgIHJldHVybiB3aXRoTWlsbGlzZWNvbmRzXG4gICAgICAgID8gZGF0ZVN0cmluZy5zdWJzdHJpbmcoMCwgZGF0ZVN0cmluZy5sZW5ndGggLSAxKSArIFwiMDAwMFwiICsgXCJaXCJcbiAgICAgICAgOiBkYXRlU3RyaW5nLnN1YnN0cmluZygwLCBkYXRlU3RyaW5nLmxlbmd0aCAtIDUpICsgXCJaXCI7XG59XG4vKipcbiAqIEJhc2U2NCBlbmNvZGUuXG4gKlxuICogQHBhcmFtIGNvbnRlbnQgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0ZW5jb2RlKGNvbnRlbnQpIHtcbiAgICByZXR1cm4gIWlzTm9kZSA/IGJ0b2EoY29udGVudCkgOiBCdWZmZXIuZnJvbShjb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cbi8qKlxuICogQmFzZTY0IGRlY29kZS5cbiAqXG4gKiBAcGFyYW0gZW5jb2RlZFN0cmluZyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRkZWNvZGUoZW5jb2RlZFN0cmluZykge1xuICAgIHJldHVybiAhaXNOb2RlID8gYXRvYihlbmNvZGVkU3RyaW5nKSA6IEJ1ZmZlci5mcm9tKGVuY29kZWRTdHJpbmcsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKCk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEgNjQgYnl0ZXMgYmFzZTY0IGJsb2NrIElEIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYmxvY2tJbmRleCAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUJsb2NrSUQoYmxvY2tJRFByZWZpeCwgYmxvY2tJbmRleCkge1xuICAgIC8vIFRvIGdlbmVyYXRlIGEgNjQgYnl0ZXMgYmFzZTY0IHN0cmluZywgc291cmNlIHN0cmluZyBzaG91bGQgYmUgNDhcbiAgICBjb25zdCBtYXhTb3VyY2VTdHJpbmdMZW5ndGggPSA0ODtcbiAgICAvLyBBIGJsb2IgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDEwMCwwMDAgdW5jb21taXR0ZWQgYmxvY2tzIGF0IGFueSBnaXZlbiB0aW1lXG4gICAgY29uc3QgbWF4QmxvY2tJbmRleExlbmd0aCA9IDY7XG4gICAgY29uc3QgbWF4QWxsb3dlZEJsb2NrSURQcmVmaXhMZW5ndGggPSBtYXhTb3VyY2VTdHJpbmdMZW5ndGggLSBtYXhCbG9ja0luZGV4TGVuZ3RoO1xuICAgIGlmIChibG9ja0lEUHJlZml4Lmxlbmd0aCA+IG1heEFsbG93ZWRCbG9ja0lEUHJlZml4TGVuZ3RoKSB7XG4gICAgICAgIGJsb2NrSURQcmVmaXggPSBibG9ja0lEUHJlZml4LnNsaWNlKDAsIG1heEFsbG93ZWRCbG9ja0lEUHJlZml4TGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYmxvY2tJRFByZWZpeCArXG4gICAgICAgIHBhZFN0YXJ0KGJsb2NrSW5kZXgudG9TdHJpbmcoKSwgbWF4U291cmNlU3RyaW5nTGVuZ3RoIC0gYmxvY2tJRFByZWZpeC5sZW5ndGgsIFwiMFwiKTtcbiAgICByZXR1cm4gYmFzZTY0ZW5jb2RlKHJlcyk7XG59XG4vKipcbiAqIERlbGF5IHNwZWNpZmllZCB0aW1lIGludGVydmFsLlxuICpcbiAqIEBwYXJhbSB0aW1lSW5NcyAtXG4gKiBAcGFyYW0gYWJvcnRlciAtXG4gKiBAcGFyYW0gYWJvcnRFcnJvciAtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxheSh0aW1lSW5NcywgYWJvcnRlciwgYWJvcnRFcnJvcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QgKi9cbiAgICAgICAgbGV0IHRpbWVvdXQ7XG4gICAgICAgIGNvbnN0IGFib3J0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QoYWJvcnRFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc29sdmVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFib3J0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFib3J0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHJlc29sdmVIYW5kbGVyLCB0aW1lSW5Ncyk7XG4gICAgICAgIGlmIChhYm9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFib3J0ZXIuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCgpXG4gKlxuICogQHBhcmFtIGN1cnJlbnRTdHJpbmcgLVxuICogQHBhcmFtIHRhcmdldExlbmd0aCAtXG4gKiBAcGFyYW0gcGFkU3RyaW5nIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZFN0YXJ0KGN1cnJlbnRTdHJpbmcsIHRhcmdldExlbmd0aCwgcGFkU3RyaW5nID0gXCIgXCIpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBUUyBkb2Vzbid0IGtub3cgdGhpcyBjb2RlIG5lZWRzIHRvIHJ1biBkb3dubGV2ZWwgc29tZXRpbWVzXG4gICAgaWYgKFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTdHJpbmcucGFkU3RhcnQodGFyZ2V0TGVuZ3RoLCBwYWRTdHJpbmcpO1xuICAgIH1cbiAgICBwYWRTdHJpbmcgPSBwYWRTdHJpbmcgfHwgXCIgXCI7XG4gICAgaWYgKGN1cnJlbnRTdHJpbmcubGVuZ3RoID4gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RyaW5nO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0TGVuZ3RoIC0gY3VycmVudFN0cmluZy5sZW5ndGg7XG4gICAgICAgIGlmICh0YXJnZXRMZW5ndGggPiBwYWRTdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYWRTdHJpbmcgKz0gcGFkU3RyaW5nLnJlcGVhdCh0YXJnZXRMZW5ndGggLyBwYWRTdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFkU3RyaW5nLnNsaWNlKDAsIHRhcmdldExlbmd0aCkgKyBjdXJyZW50U3RyaW5nO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZVVSTCh1cmwpIHtcbiAgICBsZXQgc2FmZVVSTCA9IHVybDtcbiAgICBpZiAoZ2V0VVJMUGFyYW1ldGVyKHNhZmVVUkwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlNJR05BVFVSRSkpIHtcbiAgICAgICAgc2FmZVVSTCA9IHNldFVSTFBhcmFtZXRlcihzYWZlVVJMLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5TSUdOQVRVUkUsIFwiKioqKipcIik7XG4gICAgfVxuICAgIHJldHVybiBzYWZlVVJMO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSGVhZGVycyhvcmlnaW5hbEhlYWRlcikge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiBvcmlnaW5hbEhlYWRlci5oZWFkZXJzQXJyYXkoKSkge1xuICAgICAgICBpZiAoaGVhZGVyLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gSGVhZGVyQ29uc3RhbnRzLkFVVEhPUklaQVRJT04udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgaGVhZGVycy5zZXQoaGVhZGVyLm5hbWUsIFwiKioqKipcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGVhZGVyLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gSGVhZGVyQ29uc3RhbnRzLlhfTVNfQ09QWV9TT1VSQ0UpIHtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0KGhlYWRlci5uYW1lLCBzYW5pdGl6ZVVSTChoZWFkZXIudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0KGhlYWRlci5uYW1lLCBoZWFkZXIudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzO1xufVxuLyoqXG4gKiBJZiB0d28gc3RyaW5ncyBhcmUgZXF1YWwgd2hlbiBjb21wYXJlZCBjYXNlIGluc2Vuc2l0aXZlLlxuICpcbiAqIEBwYXJhbSBzdHIxIC1cbiAqIEBwYXJhbSBzdHIyIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlFcXVhbChzdHIxLCBzdHIyKSB7XG4gICAgcmV0dXJuIHN0cjEudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gc3RyMi50b0xvY2FsZUxvd2VyQ2FzZSgpO1xufVxuLyoqXG4gKiBFeHRyYWN0cyBhY2NvdW50IG5hbWUgZnJvbSB0aGUgdXJsXG4gKiBAcGFyYW0gdXJsIC0gdXJsIHRvIGV4dHJhY3QgdGhlIGFjY291bnQgbmFtZSBmcm9tXG4gKiBAcmV0dXJucyB3aXRoIHRoZSBhY2NvdW50IG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjY291bnROYW1lRnJvbVVybCh1cmwpIHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBVUkxCdWlsZGVyLnBhcnNlKHVybCk7XG4gICAgbGV0IGFjY291bnROYW1lO1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChwYXJzZWRVcmwuZ2V0SG9zdCgpLnNwbGl0KFwiLlwiKVsxXSA9PT0gXCJibG9iXCIpIHtcbiAgICAgICAgICAgIC8vIGAke2RlZmF1bHRFbmRwb2ludHNQcm90b2NvbH06Ly8ke2FjY291bnROYW1lfS5ibG9iLiR7ZW5kcG9pbnRTdWZmaXh9YDtcbiAgICAgICAgICAgIGFjY291bnROYW1lID0gcGFyc2VkVXJsLmdldEhvc3QoKS5zcGxpdChcIi5cIilbMF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNJcEVuZHBvaW50U3R5bGUocGFyc2VkVXJsKSkge1xuICAgICAgICAgICAgLy8gSVB2NC9JUHY2IGFkZHJlc3MgaG9zdHMuLi4gRXhhbXBsZSAtIGh0dHA6Ly8xOTIuMC4wLjEwOjEwMDAxL2RldnN0b3JlYWNjb3VudDEvXG4gICAgICAgICAgICAvLyBTaW5nbGUgd29yZCBkb21haW4gd2l0aG91dCBhIFtkb3RdIGluIHRoZSBlbmRwb2ludC4uLiBFeGFtcGxlIC0gaHR0cDovL2xvY2FsaG9zdDoxMDAwMS9kZXZzdG9yZWFjY291bnQxL1xuICAgICAgICAgICAgLy8gLmdldFBhdGgoKSAtPiAvZGV2c3RvcmVhY2NvdW50MS9cbiAgICAgICAgICAgIGFjY291bnROYW1lID0gcGFyc2VkVXJsLmdldFBhdGgoKS5zcGxpdChcIi9cIilbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDdXN0b20gZG9tYWluIGNhc2U6IFwiaHR0cHM6Ly9jdXN0b21kb21haW4uY29tL2NvbnRhaW5lcm5hbWUvYmxvYlwiLlxuICAgICAgICAgICAgYWNjb3VudE5hbWUgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2NvdW50TmFtZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBleHRyYWN0IGFjY291bnROYW1lIHdpdGggcHJvdmlkZWQgaW5mb3JtYXRpb24uXCIpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0lwRW5kcG9pbnRTdHlsZShwYXJzZWRVcmwpIHtcbiAgICBpZiAocGFyc2VkVXJsLmdldEhvc3QoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHBhcnNlZFVybC5nZXRIb3N0KCkgKyAocGFyc2VkVXJsLmdldFBvcnQoKSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFwiOlwiICsgcGFyc2VkVXJsLmdldFBvcnQoKSk7XG4gICAgLy8gQ2FzZSAxOiBJcHY2LCB1c2UgYSBicm9hZCByZWdleCB0byBmaW5kIG91dCBjYW5kaWRhdGVzIHdob3NlIGhvc3QgY29udGFpbnMgdHdvICc6Jy5cbiAgICAvLyBDYXNlIDI6IGxvY2FsaG9zdCg6cG9ydCkgb3IgaG9zdC5kb2NrZXIuaW50ZXJuYWwsIHVzZSBicm9hZCByZWdleCB0byBtYXRjaCBwb3J0IHBhcnQuXG4gICAgLy8gQ2FzZSAzOiBJcHY0LCB1c2UgYnJvYWQgcmVnZXggd2hpY2gganVzdCBjaGVjayBpZiBob3N0IGNvbnRhaW5zIElwdjQuXG4gICAgLy8gRm9yIHZhbGlkIGhvc3QgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjcvaG9zdG5hbWUuNy5odG1sLlxuICAgIHJldHVybiAoL14uKjouKjouKiR8Xihsb2NhbGhvc3R8aG9zdC5kb2NrZXIuaW50ZXJuYWwpKDpbMC05XSspPyR8XihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSkoXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKSl7M30oOlswLTldKyk/JC8udGVzdChob3N0KSB8fFxuICAgICAgICAocGFyc2VkVXJsLmdldFBvcnQoKSAhPT0gdW5kZWZpbmVkICYmIFBhdGhTdHlsZVBvcnRzLmluY2x1ZGVzKHBhcnNlZFVybC5nZXRQb3J0KCkpKSk7XG59XG4vKipcbiAqIENvbnZlcnQgVGFncyB0byBlbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdGFncyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Jsb2JUYWdzU3RyaW5nKHRhZ3MpIHtcbiAgICBpZiAodGFncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHRhZ1BhaXJzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGFncykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhZ3MsIGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGFnc1trZXldO1xuICAgICAgICAgICAgdGFnUGFpcnMucHVzaChgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsdWUpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YWdQYWlycy5qb2luKFwiJlwiKTtcbn1cbi8qKlxuICogQ29udmVydCBUYWdzIHR5cGUgdG8gQmxvYlRhZ3MuXG4gKlxuICogQHBhcmFtIHRhZ3MgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9CbG9iVGFncyh0YWdzKSB7XG4gICAgaWYgKHRhZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIGJsb2JUYWdTZXQ6IFtdLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGFncykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhZ3MsIGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGFnc1trZXldO1xuICAgICAgICAgICAgcmVzLmJsb2JUYWdTZXQucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogQ292ZXJ0IEJsb2JUYWdzIHRvIFRhZ3MgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdGFncyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1RhZ3ModGFncykge1xuICAgIGlmICh0YWdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgZm9yIChjb25zdCBibG9iVGFnIG9mIHRhZ3MuYmxvYlRhZ1NldCkge1xuICAgICAgICByZXNbYmxvYlRhZy5rZXldID0gYmxvYlRhZy52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogQ29udmVydCBCbG9iUXVlcnlUZXh0Q29uZmlndXJhdGlvbiB0byBRdWVyeVNlcmlhbGl6YXRpb24gdHlwZS5cbiAqXG4gKiBAcGFyYW0gdGV4dENvbmZpZ3VyYXRpb24gLVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9RdWVyeVNlcmlhbGl6YXRpb24odGV4dENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAodGV4dENvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzd2l0Y2ggKHRleHRDb25maWd1cmF0aW9uLmtpbmQpIHtcbiAgICAgICAgY2FzZSBcImNzdlwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkZWxpbWl0ZWRcIixcbiAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVkVGV4dENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblNlcGFyYXRvcjogdGV4dENvbmZpZ3VyYXRpb24uY29sdW1uU2VwYXJhdG9yIHx8IFwiLFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRRdW90ZTogdGV4dENvbmZpZ3VyYXRpb24uZmllbGRRdW90ZSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkU2VwYXJhdG9yOiB0ZXh0Q29uZmlndXJhdGlvbi5yZWNvcmRTZXBhcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVDaGFyOiB0ZXh0Q29uZmlndXJhdGlvbi5lc2NhcGVDaGFyYWN0ZXIgfHwgXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNQcmVzZW50OiB0ZXh0Q29uZmlndXJhdGlvbi5oYXNIZWFkZXJzIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJqc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIGpzb25UZXh0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkU2VwYXJhdG9yOiB0ZXh0Q29uZmlndXJhdGlvbi5yZWNvcmRTZXBhcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJvd1wiLFxuICAgICAgICAgICAgICAgICAgICBhcnJvd0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogdGV4dENvbmZpZ3VyYXRpb24uc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFwicGFycXVldFwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwYXJxdWV0XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgQmxvYlF1ZXJ5VGV4dENvbmZpZ3VyYXRpb24uXCIpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdFJlcGxpY2F0aW9uUmVjb3JkKG9iamVjdFJlcGxpY2F0aW9uUmVjb3JkKSB7XG4gICAgaWYgKCFvYmplY3RSZXBsaWNhdGlvblJlY29yZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoXCJwb2xpY3ktaWRcIiBpbiBvYmplY3RSZXBsaWNhdGlvblJlY29yZCkge1xuICAgICAgICAvLyBJZiB0aGUgZGljdGlvbmFyeSBjb250YWlucyBhIGtleSB3aXRoIHBvbGljeSBpZCwgd2UgYXJlIG5vdCByZXF1aXJlZCB0byBkbyBhbnkgcGFyc2luZyBzaW5jZVxuICAgICAgICAvLyB0aGUgcG9saWN5IGlkIHNob3VsZCBhbHJlYWR5IGJlIHN0b3JlZCBpbiB0aGUgT2JqZWN0UmVwbGljYXRpb25EZXN0aW5hdGlvblBvbGljeUlkLlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBvclByb3BlcnRpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3RSZXBsaWNhdGlvblJlY29yZCkge1xuICAgICAgICBjb25zdCBpZHMgPSBrZXkuc3BsaXQoXCJfXCIpO1xuICAgICAgICBjb25zdCBwb2xpY3lQcmVmaXggPSBcIm9yLVwiO1xuICAgICAgICBpZiAoaWRzWzBdLnN0YXJ0c1dpdGgocG9saWN5UHJlZml4KSkge1xuICAgICAgICAgICAgaWRzWzBdID0gaWRzWzBdLnN1YnN0cmluZyhwb2xpY3lQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlID0ge1xuICAgICAgICAgICAgcnVsZUlkOiBpZHNbMV0sXG4gICAgICAgICAgICByZXBsaWNhdGlvblN0YXR1czogb2JqZWN0UmVwbGljYXRpb25SZWNvcmRba2V5XSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcG9saWN5SW5kZXggPSBvclByb3BlcnRpZXMuZmluZEluZGV4KChwb2xpY3kpID0+IHBvbGljeS5wb2xpY3lJZCA9PT0gaWRzWzBdKTtcbiAgICAgICAgaWYgKHBvbGljeUluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIG9yUHJvcGVydGllc1twb2xpY3lJbmRleF0ucnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9yUHJvcGVydGllcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwb2xpY3lJZDogaWRzWzBdLFxuICAgICAgICAgICAgICAgIHJ1bGVzOiBbcnVsZV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3JQcm9wZXJ0aWVzO1xufVxuLyoqXG4gKiBBdHRhY2ggYSBUb2tlbkNyZWRlbnRpYWwgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB0aGluZyAtXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hDcmVkZW50aWFsKHRoaW5nLCBjcmVkZW50aWFsKSB7XG4gICAgdGhpbmcuY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XG4gICAgcmV0dXJuIHRoaW5nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBBdXRob3JpemF0aW9uVG9TdHJpbmcoaHR0cEF1dGhvcml6YXRpb24pIHtcbiAgICByZXR1cm4gaHR0cEF1dGhvcml6YXRpb24gPyBodHRwQXV0aG9yaXphdGlvbi5zY2hlbWUgKyBcIiBcIiArIGh0dHBBdXRob3JpemF0aW9uLnZhbHVlIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEJsb2JOYW1lVG9TdHJpbmcobmFtZSkge1xuICAgIGlmIChuYW1lLmVuY29kZWQpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChuYW1lLmNvbnRlbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5hbWUuY29udGVudDtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iRmxhdChpbnRlcm5hbFJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW50ZXJuYWxSZXNwb25zZSksIHsgc2VnbWVudDoge1xuICAgICAgICAgICAgYmxvYkl0ZW1zOiBpbnRlcm5hbFJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zLm1hcCgoYmxvYkl0ZW1JbnRlcmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvYkl0ZW0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2JJdGVtSW50ZXJhbCksIHsgbmFtZTogQmxvYk5hbWVUb1N0cmluZyhibG9iSXRlbUludGVyYWwubmFtZSkgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJsb2JJdGVtO1xuICAgICAgICAgICAgfSksXG4gICAgICAgIH0gfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iSGllcmFyY2h5KGludGVybmFsUmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW50ZXJuYWxSZXNwb25zZSksIHsgc2VnbWVudDoge1xuICAgICAgICAgICAgYmxvYlByZWZpeGVzOiAoX2EgPSBpbnRlcm5hbFJlc3BvbnNlLnNlZ21lbnQuYmxvYlByZWZpeGVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKChibG9iUHJlZml4SW50ZXJuYWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iUHJlZml4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBibG9iUHJlZml4SW50ZXJuYWwpLCB7IG5hbWU6IEJsb2JOYW1lVG9TdHJpbmcoYmxvYlByZWZpeEludGVybmFsLm5hbWUpIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBibG9iUHJlZml4O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBibG9iSXRlbXM6IGludGVybmFsUmVzcG9uc2Uuc2VnbWVudC5ibG9iSXRlbXMubWFwKChibG9iSXRlbUludGVyYWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iSXRlbSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmxvYkl0ZW1JbnRlcmFsKSwgeyBuYW1lOiBCbG9iTmFtZVRvU3RyaW5nKGJsb2JJdGVtSW50ZXJhbC5uYW1lKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvYkl0ZW07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiogRXh0cmFjdFBhZ2VSYW5nZUluZm9JdGVtcyhnZXRQYWdlUmFuZ2VzU2VnbWVudCkge1xuICAgIGxldCBwYWdlUmFuZ2UgPSBbXTtcbiAgICBsZXQgY2xlYXJSYW5nZSA9IFtdO1xuICAgIGlmIChnZXRQYWdlUmFuZ2VzU2VnbWVudC5wYWdlUmFuZ2UpXG4gICAgICAgIHBhZ2VSYW5nZSA9IGdldFBhZ2VSYW5nZXNTZWdtZW50LnBhZ2VSYW5nZTtcbiAgICBpZiAoZ2V0UGFnZVJhbmdlc1NlZ21lbnQuY2xlYXJSYW5nZSlcbiAgICAgICAgY2xlYXJSYW5nZSA9IGdldFBhZ2VSYW5nZXNTZWdtZW50LmNsZWFyUmFuZ2U7XG4gICAgbGV0IHBhZ2VSYW5nZUluZGV4ID0gMDtcbiAgICBsZXQgY2xlYXJSYW5nZUluZGV4ID0gMDtcbiAgICB3aGlsZSAocGFnZVJhbmdlSW5kZXggPCBwYWdlUmFuZ2UubGVuZ3RoICYmIGNsZWFyUmFuZ2VJbmRleCA8IGNsZWFyUmFuZ2UubGVuZ3RoKSB7XG4gICAgICAgIGlmIChwYWdlUmFuZ2VbcGFnZVJhbmdlSW5kZXhdLnN0YXJ0IDwgY2xlYXJSYW5nZVtjbGVhclJhbmdlSW5kZXhdLnN0YXJ0KSB7XG4gICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHBhZ2VSYW5nZVtwYWdlUmFuZ2VJbmRleF0uc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBwYWdlUmFuZ2VbcGFnZVJhbmdlSW5kZXhdLmVuZCxcbiAgICAgICAgICAgICAgICBpc0NsZWFyOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICArK3BhZ2VSYW5nZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBjbGVhclJhbmdlW2NsZWFyUmFuZ2VJbmRleF0uc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBjbGVhclJhbmdlW2NsZWFyUmFuZ2VJbmRleF0uZW5kLFxuICAgICAgICAgICAgICAgIGlzQ2xlYXI6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgKytjbGVhclJhbmdlSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yICg7IHBhZ2VSYW5nZUluZGV4IDwgcGFnZVJhbmdlLmxlbmd0aDsgKytwYWdlUmFuZ2VJbmRleCkge1xuICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICBzdGFydDogcGFnZVJhbmdlW3BhZ2VSYW5nZUluZGV4XS5zdGFydCxcbiAgICAgICAgICAgIGVuZDogcGFnZVJhbmdlW3BhZ2VSYW5nZUluZGV4XS5lbmQsXG4gICAgICAgICAgICBpc0NsZWFyOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZm9yICg7IGNsZWFyUmFuZ2VJbmRleCA8IGNsZWFyUmFuZ2UubGVuZ3RoOyArK2NsZWFyUmFuZ2VJbmRleCkge1xuICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICBzdGFydDogY2xlYXJSYW5nZVtjbGVhclJhbmdlSW5kZXhdLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBjbGVhclJhbmdlW2NsZWFyUmFuZ2VJbmRleF0uZW5kLFxuICAgICAgICAgICAgaXNDbGVhcjogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbiAqIEVzY2FwZSB0aGUgYmxvYk5hbWUgYnV0IGtlZXAgcGF0aCBzZXBhcmF0b3IgKCcvJykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFc2NhcGVQYXRoKGJsb2JOYW1lKSB7XG4gICAgY29uc3Qgc3BsaXQgPSBibG9iTmFtZS5zcGxpdChcIi9cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBzcGxpdFtpXSA9IGVuY29kZVVSSUNvbXBvbmVudChzcGxpdFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBzcGxpdC5qb2luKFwiL1wiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmNvbW1vbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCBpc05vZGUsIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IEhlYWRlckNvbnN0YW50cywgVVJMQ29uc3RhbnRzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2V0VVJMUGFyYW1ldGVyIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuLyoqXG4gKiBTdG9yYWdlQnJvd3NlclBvbGljeSB3aWxsIGhhbmRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIE5vZGUuanMgYW5kIGJyb3dzZXIgcnVudGltZSwgaW5jbHVkaW5nOlxuICpcbiAqIDEuIEJyb3dzZXJzIGNhY2hlIEdFVC9IRUFEIHJlcXVlc3RzIGJ5IGFkZGluZyBjb25kaXRpb25hbCBoZWFkZXJzIHN1Y2ggYXMgJ0lGX01PRElGSUVEX1NJTkNFJy5cbiAqIFN0b3JhZ2VCcm93c2VyUG9saWN5IGlzIGEgcG9saWN5IHVzZWQgdG8gYWRkIGEgdGltZXN0YW1wIHF1ZXJ5IHRvIEdFVC9IRUFEIHJlcXVlc3QgVVJMXG4gKiB0aHVzIGF2b2lkIHRoZSBicm93c2VyIGNhY2hlLlxuICpcbiAqIDIuIFJlbW92ZSBjb29raWUgaGVhZGVyIGZvciBzZWN1cml0eVxuICpcbiAqIDMuIFJlbW92ZSBjb250ZW50LWxlbmd0aCBoZWFkZXIgdG8gYXZvaWQgYnJvd3NlcnMgd2FybmluZ1xuICovXG5leHBvcnQgY2xhc3MgU3RvcmFnZUJyb3dzZXJQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTdG9yYWdlQnJvd3NlclBvbGljeS5cbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIC8vIFRoZSBiYXNlIGNsYXNzIGhhcyBhIHByb3RlY3RlZCBjb25zdHJ1Y3Rvci4gQWRkaW5nIGEgcHVibGljIG9uZSB0byBlbmFibGUgY29uc3RydWN0aW5nIG9mIHRoaXMgY2xhc3MuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2VsZXNzLWNvbnN0cnVjdG9yKi9cbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBvdXQgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpID09PSBcIkdFVFwiIHx8IHJlcXVlc3QubWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnVybCA9IHNldFVSTFBhcmFtZXRlcihyZXF1ZXN0LnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuRk9SQ0VfQlJPV1NFUl9OT19DQUNIRSwgbmV3IERhdGUoKS5nZXRUaW1lKCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnJlbW92ZShIZWFkZXJDb25zdGFudHMuQ09PS0lFKTtcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFhIUiBzdGFuZGFyZHMsIGNvbnRlbnQtbGVuZ3RoIHNob3VsZCBiZSBmdWxseSBjb250cm9sbGVkIGJ5IGJyb3dzZXJzXG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5yZW1vdmUoSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RvcmFnZUJyb3dzZXJQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBTdG9yYWdlQnJvd3NlclBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL1N0b3JhZ2VCcm93c2VyUG9saWN5XCI7XG5leHBvcnQgeyBTdG9yYWdlQnJvd3NlclBvbGljeSB9O1xuLyoqXG4gKiBTdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnkgaXMgYSBmYWN0b3J5IGNsYXNzIGhlbHBpbmcgZ2VuZXJhdGluZyBTdG9yYWdlQnJvd3NlclBvbGljeSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgY3JlYXRlKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlQnJvd3NlclBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnkuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vc2hpbXMtcHVibGljLmQudHNcIiAvPlxuY29uc3QgbGlzdGVuZXJzTWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IGFib3J0ZWRNYXAgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBBbiBhYm9ydGVyIGluc3RhbmNlIGltcGxlbWVudHMgQWJvcnRTaWduYWwgaW50ZXJmYWNlLCBjYW4gYWJvcnQgSFRUUCByZXF1ZXN0cy5cbiAqXG4gKiAtIENhbGwgQWJvcnRTaWduYWwubm9uZSB0byBjcmVhdGUgYSBuZXcgQWJvcnRTaWduYWwgaW5zdGFuY2UgdGhhdCBjYW5ub3QgYmUgY2FuY2VsbGVkLlxuICogVXNlIGBBYm9ydFNpZ25hbC5ub25lYCB3aGVuIHlvdSBhcmUgcmVxdWlyZWQgdG8gcGFzcyBhIGNhbmNlbGxhdGlvbiB0b2tlbiBidXQgdGhlIG9wZXJhdGlvblxuICogY2Fubm90IG9yIHdpbGwgbm90IGV2ZXIgYmUgY2FuY2VsbGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBBYm9ydCB3aXRob3V0IHRpbWVvdXRcbiAqIGBgYHRzXG4gKiBhd2FpdCBkb0FzeW5jV29yayhBYm9ydFNpZ25hbC5ub25lKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWJvcnRTaWduYWwge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogb25hYm9ydCBldmVudCBsaXN0ZW5lci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25hYm9ydCA9IG51bGw7XG4gICAgICAgIGxpc3RlbmVyc01hcC5zZXQodGhpcywgW10pO1xuICAgICAgICBhYm9ydGVkTWFwLnNldCh0aGlzLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXR1cyBvZiB3aGV0aGVyIGFib3J0ZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGFib3J0ZWQoKSB7XG4gICAgICAgIGlmICghYWJvcnRlZE1hcC5oYXModGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBgdGhpc2AgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgQWJvcnRTaWduYWwuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhYm9ydGVkTWFwLmdldCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBBYm9ydFNpZ25hbCBpbnN0YW5jZSB0aGF0IHdpbGwgbmV2ZXIgYmUgYWJvcnRlZC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBYm9ydFNpZ25hbCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRlZCBuZXcgXCJhYm9ydFwiIGV2ZW50IGxpc3RlbmVyLCBvbmx5IHN1cHBvcnQgXCJhYm9ydFwiIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIF90eXBlIC0gT25seSBzdXBwb3J0IFwiYWJvcnRcIiBldmVudFxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZFxuICAgICAqL1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgICBfdHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCFsaXN0ZW5lcnNNYXAuaGFzKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgYHRoaXNgIHRvIGJlIGFuIGluc3RhbmNlIG9mIEFib3J0U2lnbmFsLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBcImFib3J0XCIgZXZlbnQgbGlzdGVuZXIsIG9ubHkgc3VwcG9ydCBcImFib3J0XCIgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gX3R5cGUgLSBPbmx5IHN1cHBvcnQgXCJhYm9ydFwiIGV2ZW50XG4gICAgICogQHBhcmFtIGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWRcbiAgICAgKi9cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgX3R5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghbGlzdGVuZXJzTWFwLmhhcyh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGB0aGlzYCB0byBiZSBhbiBpbnN0YW5jZSBvZiBBYm9ydFNpZ25hbC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdGVuZXJzTWFwLmdldCh0aGlzKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGEgc3ludGhldGljIGV2ZW50IHRvIHRoZSBBYm9ydFNpZ25hbC5cbiAgICAgKi9cbiAgICBkaXNwYXRjaEV2ZW50KF9ldmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGlzIGEgc3R1YiBkaXNwYXRjaEV2ZW50IGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgSXQgb25seSBleGlzdHMgZm9yIHR5cGUtY2hlY2tpbmcgcHVycG9zZXMuXCIpO1xuICAgIH1cbn1cbi8qKlxuICogSGVscGVyIHRvIHRyaWdnZXIgYW4gYWJvcnQgZXZlbnQgaW1tZWRpYXRlbHksIHRoZSBvbmFib3J0IGFuZCBhbGwgYWJvcnQgZXZlbnQgbGlzdGVuZXJzIHdpbGwgYmUgdHJpZ2dlcmVkLlxuICogV2lsbCB0cnkgdG8gdHJpZ2dlciBhYm9ydCBldmVudCBmb3IgYWxsIGxpbmtlZCBBYm9ydFNpZ25hbCBub2Rlcy5cbiAqXG4gKiAtIElmIHRoZXJlIGlzIGEgdGltZW91dCwgdGhlIHRpbWVyIHdpbGwgYmUgY2FuY2VsbGVkLlxuICogLSBJZiBhYm9ydGVkIGlzIHRydWUsIG5vdGhpbmcgd2lsbCBoYXBwZW4uXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLXVzZS1pbnRlcmZhY2UtcGFyYW1ldGVyc1xuZXhwb3J0IGZ1bmN0aW9uIGFib3J0U2lnbmFsKHNpZ25hbCkge1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzaWduYWwub25hYm9ydCkge1xuICAgICAgICBzaWduYWwub25hYm9ydC5jYWxsKHNpZ25hbCk7XG4gICAgfVxuICAgIGNvbnN0IGxpc3RlbmVycyA9IGxpc3RlbmVyc01hcC5nZXQoc2lnbmFsKTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgbGlzdGVuZXJzIHNvIG11dGF0aW9ucyB0byB0aGUgYXJyYXlcbiAgICAgICAgLy8gKGUuZy4gdmlhIHJlbW92ZUxpc3RlbmVyIGNhbGxzKSBkb24ndCBhZmZlY3QgdGhlIGxpc3RlbmVyc1xuICAgICAgICAvLyB3ZSBpbnZva2UuXG4gICAgICAgIGxpc3RlbmVycy5zbGljZSgpLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHNpZ25hbCwgeyB0eXBlOiBcImFib3J0XCIgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhYm9ydGVkTWFwLnNldChzaWduYWwsIHRydWUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJvcnRTaWduYWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBBYm9ydFNpZ25hbCwgYWJvcnRTaWduYWwgfSBmcm9tIFwiLi9BYm9ydFNpZ25hbFwiO1xuLyoqXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGJlZW4gYWJvcnRlZC5cbiAqIENoZWNrIGZvciB0aGlzIGVycm9yIGJ5IHRlc3RpbmcgdGhlIGBuYW1lYCB0aGF0IHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZVxuICogZXJyb3IgbWF0Y2hlcyBgXCJBYm9ydEVycm9yXCJgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAqIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAqIHRyeSB7XG4gKiAgIGRvQXN5bmNXb3JrKGNvbnRyb2xsZXIuc2lnbmFsKVxuICogfSBjYXRjaCAoZSkge1xuICogICBpZiAoZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAqICAgICAvLyBoYW5kbGUgYWJvcnQgZXJyb3IgaGVyZS5cbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQWJvcnRFcnJvclwiO1xuICAgIH1cbn1cbi8qKlxuICogQW4gQWJvcnRDb250cm9sbGVyIHByb3ZpZGVzIGFuIEFib3J0U2lnbmFsIGFuZCB0aGUgYXNzb2NpYXRlZCBjb250cm9scyB0byBzaWduYWxcbiAqIHRoYXQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBzaG91bGQgYmUgYWJvcnRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogQWJvcnQgYW4gb3BlcmF0aW9uIHdoZW4gYW5vdGhlciBldmVudCBmaXJlc1xuICogYGBgdHNcbiAqIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKiBjb25zdCBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAqIGRvQXN5bmNXb3JrKHNpZ25hbCk7XG4gKiBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFNoYXJlIGFib3J0ZXIgY3Jvc3MgbXVsdGlwbGUgb3BlcmF0aW9ucyBpbiAzMHNcbiAqIGBgYHRzXG4gKiAvLyBVcGxvYWQgdGhlIHNhbWUgZGF0YSB0byAyIGRpZmZlcmVudCBkYXRhIGNlbnRlcnMgYXQgdGhlIHNhbWUgdGltZSxcbiAqIC8vIGFib3J0IGFub3RoZXIgd2hlbiBhbnkgb2YgdGhlbSBpcyBmaW5pc2hlZFxuICogY29uc3QgY29udHJvbGxlciA9IEFib3J0Q29udHJvbGxlci53aXRoVGltZW91dCgzMCAqIDEwMDApO1xuICogZG9Bc3luY1dvcmsoY29udHJvbGxlci5zaWduYWwpLnRoZW4oY29udHJvbGxlci5hYm9ydCk7XG4gKiBkb0FzeW5jV29yayhjb250cm9sbGVyLnNpZ25hbCkudGhlbihjb250cm9sbGVyLmFib3J0KTtcbiAqYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIENhc2NhZGVkIGFib3J0aW5nXG4gKiBgYGB0c1xuICogLy8gQWxsIG9wZXJhdGlvbnMgY2FuJ3QgdGFrZSBtb3JlIHRoYW4gMzAgc2Vjb25kc1xuICogY29uc3QgYWJvcnRlciA9IEFib3J0ZXIudGltZW91dCgzMCAqIDEwMDApO1xuICpcbiAqIC8vIEZvbGxvd2luZyAyIG9wZXJhdGlvbnMgY2FuJ3QgdGFrZSBtb3JlIHRoYW4gMjUgc2Vjb25kc1xuICogYXdhaXQgZG9Bc3luY1dvcmsoYWJvcnRlci53aXRoVGltZW91dCgyNSAqIDEwMDApKTtcbiAqIGF3YWl0IGRvQXN5bmNXb3JrKGFib3J0ZXIud2l0aFRpbWVvdXQoMjUgKiAxMDAwKSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRTaWduYWxzKSB7XG4gICAgICAgIHRoaXMuX3NpZ25hbCA9IG5ldyBBYm9ydFNpZ25hbCgpO1xuICAgICAgICBpZiAoIXBhcmVudFNpZ25hbHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb2VyY2UgcGFyZW50U2lnbmFscyBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJlbnRTaWduYWxzKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICAgICAgcGFyZW50U2lnbmFscyA9IGFyZ3VtZW50cztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHBhcmVudFNpZ25hbCBvZiBwYXJlbnRTaWduYWxzKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgcGFyZW50IHNpZ25hbCBoYXMgYWxyZWFkeSBoYWQgYWJvcnQoKSBjYWxsZWQsXG4gICAgICAgICAgICAvLyB0aGVuIGNhbGwgYWJvcnQgb24gdGhpcyBzaWduYWwgYXMgd2VsbC5cbiAgICAgICAgICAgIGlmIChwYXJlbnRTaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHBhcmVudCBzaWduYWwgYWJvcnRzLCB0aGlzIHNpZ25hbCBzaG91bGQgYXMgd2VsbC5cbiAgICAgICAgICAgICAgICBwYXJlbnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBBYm9ydFNpZ25hbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250cm9sbGVyIHRoYXQgd2lsbCBzaWduYWwgYWJvcnRlZFxuICAgICAqIHdoZW4gdGhlIGFib3J0IG1ldGhvZCBpcyBjYWxsZWQgb24gdGhpcyBjb250cm9sbGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25hbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2lnbmFsIHRoYXQgYW55IG9wZXJhdGlvbnMgcGFzc2VkIHRoaXMgY29udHJvbGxlcidzIGFzc29jaWF0ZWQgYWJvcnQgc2lnbmFsXG4gICAgICogdG8gY2FuY2VsIGFueSByZW1haW5pbmcgd29yayBhbmQgdGhyb3cgYW4gYEFib3J0RXJyb3JgLlxuICAgICAqL1xuICAgIGFib3J0KCkge1xuICAgICAgICBhYm9ydFNpZ25hbCh0aGlzLl9zaWduYWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEFib3J0U2lnbmFsIGluc3RhbmNlIHRoYXQgd2lsbCBhYm9ydCBhZnRlciB0aGUgcHJvdmlkZWQgbXMuXG4gICAgICogQHBhcmFtIG1zIC0gRWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB0cmlnZ2VyIGFuIGFib3J0LlxuICAgICAqL1xuICAgIHN0YXRpYyB0aW1lb3V0KG1zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBBYm9ydFNpZ25hbCgpO1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoYWJvcnRTaWduYWwsIG1zLCBzaWduYWwpO1xuICAgICAgICAvLyBQcmV2ZW50IHRoZSBhY3RpdmUgVGltZXIgZnJvbSBrZWVwaW5nIHRoZSBOb2RlLmpzIGV2ZW50IGxvb3AgYWN0aXZlLlxuICAgICAgICBpZiAodHlwZW9mIHRpbWVyLnVucmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRpbWVyLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpZ25hbDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYm9ydENvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBBYm9ydEVycm9yIH0gZnJvbSBcIkBhenVyZS9hYm9ydC1jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgVVJMQ29uc3RhbnRzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZGVsYXksIHNldFVSTEhvc3QsIHNldFVSTFBhcmFtZXRlciB9IGZyb20gXCIuLi91dGlscy91dGlscy5jb21tb25cIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9sb2dcIjtcbi8qKlxuICogQSBmYWN0b3J5IG1ldGhvZCB1c2VkIHRvIGdlbmVyYXRlZCBhIFJldHJ5UG9saWN5IGZhY3RvcnkuXG4gKlxuICogQHBhcmFtIHJldHJ5T3B0aW9ucyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOZXdSZXRyeVBvbGljeUZhY3RvcnkocmV0cnlPcHRpb25zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlUmV0cnlQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgcmV0cnlPcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBSZXRyeVBvbGljeSB0eXBlcy5cbiAqL1xuZXhwb3J0IHZhciBTdG9yYWdlUmV0cnlQb2xpY3lUeXBlO1xuKGZ1bmN0aW9uIChTdG9yYWdlUmV0cnlQb2xpY3lUeXBlKSB7XG4gICAgLyoqXG4gICAgICogRXhwb25lbnRpYWwgcmV0cnkuIFJldHJ5IHRpbWUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseS5cbiAgICAgKi9cbiAgICBTdG9yYWdlUmV0cnlQb2xpY3lUeXBlW1N0b3JhZ2VSZXRyeVBvbGljeVR5cGVbXCJFWFBPTkVOVElBTFwiXSA9IDBdID0gXCJFWFBPTkVOVElBTFwiO1xuICAgIC8qKlxuICAgICAqIExpbmVhciByZXRyeS4gUmV0cnkgdGltZSBkZWxheSBncm93cyBsaW5lYXJseS5cbiAgICAgKi9cbiAgICBTdG9yYWdlUmV0cnlQb2xpY3lUeXBlW1N0b3JhZ2VSZXRyeVBvbGljeVR5cGVbXCJGSVhFRFwiXSA9IDFdID0gXCJGSVhFRFwiO1xufSkoU3RvcmFnZVJldHJ5UG9saWN5VHlwZSB8fCAoU3RvcmFnZVJldHJ5UG9saWN5VHlwZSA9IHt9KSk7XG4vLyBEZWZhdWx0IHZhbHVlcyBvZiBTdG9yYWdlUmV0cnlPcHRpb25zXG5jb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMgPSB7XG4gICAgbWF4UmV0cnlEZWxheUluTXM6IDEyMCAqIDEwMDAsXG4gICAgbWF4VHJpZXM6IDQsXG4gICAgcmV0cnlEZWxheUluTXM6IDQgKiAxMDAwLFxuICAgIHJldHJ5UG9saWN5VHlwZTogU3RvcmFnZVJldHJ5UG9saWN5VHlwZS5FWFBPTkVOVElBTCxcbiAgICBzZWNvbmRhcnlIb3N0OiBcIlwiLFxuICAgIHRyeVRpbWVvdXRJbk1zOiB1bmRlZmluZWQsIC8vIFVzZSBzZXJ2ZXIgc2lkZSBkZWZhdWx0IHRpbWVvdXQgc3RyYXRlZ3lcbn07XG5jb25zdCBSRVRSWV9BQk9SVF9FUlJPUiA9IG5ldyBBYm9ydEVycm9yKFwiVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC5cIik7XG4vKipcbiAqIFJldHJ5IHBvbGljeSB3aXRoIGV4cG9uZW50aWFsIHJldHJ5IGFuZCBsaW5lYXIgcmV0cnkgaW1wbGVtZW50ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yYWdlUmV0cnlQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXRyeVBvbGljeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICogQHBhcmFtIHJldHJ5T3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgcmV0cnlPcHRpb25zID0gREVGQVVMVF9SRVRSWV9PUFRJT05TKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICAvLyBJbml0aWFsaXplIHJldHJ5IG9wdGlvbnNcbiAgICAgICAgdGhpcy5yZXRyeU9wdGlvbnMgPSB7XG4gICAgICAgICAgICByZXRyeVBvbGljeVR5cGU6IHJldHJ5T3B0aW9ucy5yZXRyeVBvbGljeVR5cGVcbiAgICAgICAgICAgICAgICA/IHJldHJ5T3B0aW9ucy5yZXRyeVBvbGljeVR5cGVcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfUkVUUllfT1BUSU9OUy5yZXRyeVBvbGljeVR5cGUsXG4gICAgICAgICAgICBtYXhUcmllczogcmV0cnlPcHRpb25zLm1heFRyaWVzICYmIHJldHJ5T3B0aW9ucy5tYXhUcmllcyA+PSAxXG4gICAgICAgICAgICAgICAgPyBNYXRoLmZsb29yKHJldHJ5T3B0aW9ucy5tYXhUcmllcylcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfUkVUUllfT1BUSU9OUy5tYXhUcmllcyxcbiAgICAgICAgICAgIHRyeVRpbWVvdXRJbk1zOiByZXRyeU9wdGlvbnMudHJ5VGltZW91dEluTXMgJiYgcmV0cnlPcHRpb25zLnRyeVRpbWVvdXRJbk1zID49IDBcbiAgICAgICAgICAgICAgICA/IHJldHJ5T3B0aW9ucy50cnlUaW1lb3V0SW5Nc1xuICAgICAgICAgICAgICAgIDogREVGQVVMVF9SRVRSWV9PUFRJT05TLnRyeVRpbWVvdXRJbk1zLFxuICAgICAgICAgICAgcmV0cnlEZWxheUluTXM6IHJldHJ5T3B0aW9ucy5yZXRyeURlbGF5SW5NcyAmJiByZXRyeU9wdGlvbnMucmV0cnlEZWxheUluTXMgPj0gMFxuICAgICAgICAgICAgICAgID8gTWF0aC5taW4ocmV0cnlPcHRpb25zLnJldHJ5RGVsYXlJbk1zLCByZXRyeU9wdGlvbnMubWF4UmV0cnlEZWxheUluTXNcbiAgICAgICAgICAgICAgICAgICAgPyByZXRyeU9wdGlvbnMubWF4UmV0cnlEZWxheUluTXNcbiAgICAgICAgICAgICAgICAgICAgOiBERUZBVUxUX1JFVFJZX09QVElPTlMubWF4UmV0cnlEZWxheUluTXMpXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX1JFVFJZX09QVElPTlMucmV0cnlEZWxheUluTXMsXG4gICAgICAgICAgICBtYXhSZXRyeURlbGF5SW5NczogcmV0cnlPcHRpb25zLm1heFJldHJ5RGVsYXlJbk1zICYmIHJldHJ5T3B0aW9ucy5tYXhSZXRyeURlbGF5SW5NcyA+PSAwXG4gICAgICAgICAgICAgICAgPyByZXRyeU9wdGlvbnMubWF4UmV0cnlEZWxheUluTXNcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfUkVUUllfT1BUSU9OUy5tYXhSZXRyeURlbGF5SW5NcyxcbiAgICAgICAgICAgIHNlY29uZGFyeUhvc3Q6IHJldHJ5T3B0aW9ucy5zZWNvbmRhcnlIb3N0XG4gICAgICAgICAgICAgICAgPyByZXRyeU9wdGlvbnMuc2Vjb25kYXJ5SG9zdFxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9SRVRSWV9PUFRJT05TLnNlY29uZGFyeUhvc3QsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICovXG4gICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRlbXB0U2VuZFJlcXVlc3QocmVxdWVzdCwgZmFsc2UsIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNpZGUgYW5kIHBlcmZvcm0gbmV4dCByZXRyeS4gV29uJ3QgbXV0YXRlIHJlcXVlc3QgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqIEBwYXJhbSBzZWNvbmRhcnlIYXM0MDQgLSAgSWYgYXR0ZW1wdCB3YXMgYWdhaW5zdCB0aGUgc2Vjb25kYXJ5ICYgaXQgcmV0dXJuZWQgYSBTdGF0dXNOb3RGb3VuZCAoNDA0KSwgdGhlblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzb3VyY2Ugd2FzIG5vdCBmb3VuZC4gVGhpcyBtYXkgYmUgZHVlIHRvIHJlcGxpY2F0aW9uIGRlbGF5LiBTbywgaW4gdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlLCB3ZSdsbCBuZXZlciB0cnkgdGhlIHNlY29uZGFyeSBhZ2FpbiBmb3IgdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIGF0dGVtcHQgLSAgICAgICAgICAgSG93IG1hbnkgcmV0cmllcyBoYXMgYmVlbiBhdHRlbXB0ZWQgdG8gcGVyZm9ybWVkLCBzdGFydGluZyBmcm9tIDEsIHdoaWNoIGluY2x1ZGVzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhdHRlbXB0IHdpbGwgYmUgcGVyZm9ybWVkIGJ5IHRoaXMgbWV0aG9kIGNhbGwuXG4gICAgICovXG4gICAgYXN5bmMgYXR0ZW1wdFNlbmRSZXF1ZXN0KHJlcXVlc3QsIHNlY29uZGFyeUhhczQwNCwgYXR0ZW1wdCkge1xuICAgICAgICBjb25zdCBuZXdSZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSgpO1xuICAgICAgICBjb25zdCBpc1ByaW1hcnlSZXRyeSA9IHNlY29uZGFyeUhhczQwNCB8fFxuICAgICAgICAgICAgIXRoaXMucmV0cnlPcHRpb25zLnNlY29uZGFyeUhvc3QgfHxcbiAgICAgICAgICAgICEocmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIgfHwgcmVxdWVzdC5tZXRob2QgPT09IFwiSEVBRFwiIHx8IHJlcXVlc3QubWV0aG9kID09PSBcIk9QVElPTlNcIikgfHxcbiAgICAgICAgICAgIGF0dGVtcHQgJSAyID09PSAxO1xuICAgICAgICBpZiAoIWlzUHJpbWFyeVJldHJ5KSB7XG4gICAgICAgICAgICBuZXdSZXF1ZXN0LnVybCA9IHNldFVSTEhvc3QobmV3UmVxdWVzdC51cmwsIHRoaXMucmV0cnlPcHRpb25zLnNlY29uZGFyeUhvc3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB0aGUgc2VydmVyLXNpZGUgdGltZW91dCBxdWVyeSBwYXJhbWV0ZXIgXCJ0aW1lb3V0PVtzZWNvbmRzXVwiXG4gICAgICAgIGlmICh0aGlzLnJldHJ5T3B0aW9ucy50cnlUaW1lb3V0SW5Ncykge1xuICAgICAgICAgICAgbmV3UmVxdWVzdC51cmwgPSBzZXRVUkxQYXJhbWV0ZXIobmV3UmVxdWVzdC51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlRJTUVPVVQsIE1hdGguZmxvb3IodGhpcy5yZXRyeU9wdGlvbnMudHJ5VGltZW91dEluTXMgLyAxMDAwKS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV0cnlQb2xpY3k6ID09PT09PiBUcnk9JHthdHRlbXB0fSAke2lzUHJpbWFyeVJldHJ5ID8gXCJQcmltYXJ5XCIgOiBcIlNlY29uZGFyeVwifWApO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KG5ld1JlcXVlc3QpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFJldHJ5KGlzUHJpbWFyeVJldHJ5LCBhdHRlbXB0LCByZXNwb25zZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWNvbmRhcnlIYXM0MDQgPSBzZWNvbmRhcnlIYXM0MDQgfHwgKCFpc1ByaW1hcnlSZXRyeSAmJiByZXNwb25zZS5zdGF0dXMgPT09IDQwNCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXRyeVBvbGljeTogQ2F1Z2h0IGVycm9yLCBtZXNzYWdlOiAke2Vyci5tZXNzYWdlfSwgY29kZTogJHtlcnIuY29kZX1gKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRSZXRyeShpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCwgcmVzcG9uc2UsIGVycikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5kZWxheShpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCwgcmVxdWVzdC5hYm9ydFNpZ25hbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmF0dGVtcHRTZW5kUmVxdWVzdChyZXF1ZXN0LCBzZWNvbmRhcnlIYXM0MDQsICsrYXR0ZW1wdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY2lkZSB3aGV0aGVyIHRvIHJldHJ5IGFjY29yZGluZyB0byBsYXN0IEhUVFAgcmVzcG9uc2UgYW5kIHJldHJ5IGNvdW50ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzUHJpbWFyeVJldHJ5IC1cbiAgICAgKiBAcGFyYW0gYXR0ZW1wdCAtXG4gICAgICogQHBhcmFtIHJlc3BvbnNlIC1cbiAgICAgKiBAcGFyYW0gZXJyIC1cbiAgICAgKi9cbiAgICBzaG91bGRSZXRyeShpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCwgcmVzcG9uc2UsIGVycikge1xuICAgICAgICBpZiAoYXR0ZW1wdCA+PSB0aGlzLnJldHJ5T3B0aW9ucy5tYXhUcmllcykge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5UG9saWN5OiBBdHRlbXB0KHMpICR7YXR0ZW1wdH0gPj0gbWF4VHJpZXMgJHt0aGlzLnJldHJ5T3B0aW9uc1xuICAgICAgICAgICAgICAgIC5tYXhUcmllc30sIG5vIGZ1cnRoZXIgdHJ5LmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBuZXR3b3JrIGZhaWx1cmVzLCB5b3UgbWF5IG5lZWQgdG8gY3VzdG9taXplIHRoZSBsaXN0IHdoZW4geW91IGltcGxlbWVudFxuICAgICAgICAvLyB5b3VyIG93biBodHRwIGNsaWVudFxuICAgICAgICBjb25zdCByZXRyaWFibGVFcnJvcnMgPSBbXG4gICAgICAgICAgICBcIkVUSU1FRE9VVFwiLFxuICAgICAgICAgICAgXCJFU09DS0VUVElNRURPVVRcIixcbiAgICAgICAgICAgIFwiRUNPTk5SRUZVU0VEXCIsXG4gICAgICAgICAgICBcIkVDT05OUkVTRVRcIixcbiAgICAgICAgICAgIFwiRU5PRU5UXCIsXG4gICAgICAgICAgICBcIkVOT1RGT1VORFwiLFxuICAgICAgICAgICAgXCJUSU1FT1VUXCIsXG4gICAgICAgICAgICBcIkVQSVBFXCIsXG4gICAgICAgICAgICBcIlJFUVVFU1RfU0VORF9FUlJPUlwiLCAvLyBGb3IgZGVmYXVsdCB4aHIgYmFzZWQgaHR0cCBjbGllbnQgcHJvdmlkZWQgaW4gbXMtcmVzdC1qc1xuICAgICAgICBdO1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJldHJpYWJsZUVycm9yIG9mIHJldHJpYWJsZUVycm9ycykge1xuICAgICAgICAgICAgICAgIGlmIChlcnIubmFtZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKHJldHJpYWJsZUVycm9yKSB8fFxuICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKHJldHJpYWJsZUVycm9yKSB8fFxuICAgICAgICAgICAgICAgICAgICAoZXJyLmNvZGUgJiYgZXJyLmNvZGUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpID09PSByZXRyaWFibGVFcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5UG9saWN5OiBOZXR3b3JrIGVycm9yICR7cmV0cmlhYmxlRXJyb3J9IGZvdW5kLCB3aWxsIHJldHJ5LmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgYXR0ZW1wdCB3YXMgYWdhaW5zdCB0aGUgc2Vjb25kYXJ5ICYgaXQgcmV0dXJuZWQgYSBTdGF0dXNOb3RGb3VuZCAoNDA0KSwgdGhlblxuICAgICAgICAvLyB0aGUgcmVzb3VyY2Ugd2FzIG5vdCBmb3VuZC4gVGhpcyBtYXkgYmUgZHVlIHRvIHJlcGxpY2F0aW9uIGRlbGF5LiBTbywgaW4gdGhpc1xuICAgICAgICAvLyBjYXNlLCB3ZSdsbCBuZXZlciB0cnkgdGhlIHNlY29uZGFyeSBhZ2FpbiBmb3IgdGhpcyBvcGVyYXRpb24uXG4gICAgICAgIGlmIChyZXNwb25zZSB8fCBlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IGVyciA/IGVyci5zdGF0dXNDb2RlIDogMDtcbiAgICAgICAgICAgIGlmICghaXNQcmltYXJ5UmV0cnkgJiYgc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5UG9saWN5OiBTZWNvbmRhcnkgYWNjZXNzIHdpdGggNDA0LCB3aWxsIHJldHJ5LmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2VydmVyIGludGVybmFsIGVycm9yIG9yIHNlcnZlciB0aW1lb3V0XG4gICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNTAzIHx8IHN0YXR1c0NvZGUgPT09IDUwMCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogV2lsbCByZXRyeSBmb3Igc3RhdHVzIGNvZGUgJHtzdGF0dXNDb2RlfS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGVyciA9PT0gbnVsbCB8fCBlcnIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVyci5jb2RlKSA9PT0gXCJQQVJTRV9FUlJPUlwiICYmIChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIubWVzc2FnZS5zdGFydHNXaXRoKGBFcnJvciBcIkVycm9yOiBVbmNsb3NlZCByb290IHRhZ2ApKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJSZXRyeVBvbGljeTogSW5jb21wbGV0ZSBYTUwgcmVzcG9uc2UgbGlrZWx5IGR1ZSB0byBzZXJ2aWNlIHRpbWVvdXQsIHdpbGwgcmV0cnkuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxheSBhIGNhbGN1bGF0ZWQgdGltZSBiZXR3ZWVuIHJldHJpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNQcmltYXJ5UmV0cnkgLVxuICAgICAqIEBwYXJhbSBhdHRlbXB0IC1cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGF5KGlzUHJpbWFyeVJldHJ5LCBhdHRlbXB0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBsZXQgZGVsYXlUaW1lSW5NcyA9IDA7XG4gICAgICAgIGlmIChpc1ByaW1hcnlSZXRyeSkge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnJldHJ5T3B0aW9ucy5yZXRyeVBvbGljeVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUuRVhQT05FTlRJQUw6XG4gICAgICAgICAgICAgICAgICAgIGRlbGF5VGltZUluTXMgPSBNYXRoLm1pbigoTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpIC0gMSkgKiB0aGlzLnJldHJ5T3B0aW9ucy5yZXRyeURlbGF5SW5NcywgdGhpcy5yZXRyeU9wdGlvbnMubWF4UmV0cnlEZWxheUluTXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUuRklYRUQ6XG4gICAgICAgICAgICAgICAgICAgIGRlbGF5VGltZUluTXMgPSB0aGlzLnJldHJ5T3B0aW9ucy5yZXRyeURlbGF5SW5NcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWxheVRpbWVJbk1zID0gTWF0aC5yYW5kb20oKSAqIDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5UG9saWN5OiBEZWxheSBmb3IgJHtkZWxheVRpbWVJbk1zfW1zYCk7XG4gICAgICAgIHJldHVybiBkZWxheShkZWxheVRpbWVJbk1zLCBhYm9ydFNpZ25hbCwgUkVUUllfQUJPUlRfRVJST1IpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0b3JhZ2VSZXRyeVBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IFN0b3JhZ2VSZXRyeVBvbGljeSwgU3RvcmFnZVJldHJ5UG9saWN5VHlwZSB9IGZyb20gXCIuL3BvbGljaWVzL1N0b3JhZ2VSZXRyeVBvbGljeVwiO1xuZXhwb3J0IHsgU3RvcmFnZVJldHJ5UG9saWN5VHlwZSwgU3RvcmFnZVJldHJ5UG9saWN5IH07XG4vKipcbiAqIFN0b3JhZ2VSZXRyeVBvbGljeUZhY3RvcnkgaXMgYSBmYWN0b3J5IGNsYXNzIGhlbHBpbmcgZ2VuZXJhdGluZyB7QGxpbmsgU3RvcmFnZVJldHJ5UG9saWN5fSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgU3RvcmFnZVJldHJ5UG9saWN5RmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5LlxuICAgICAqIEBwYXJhbSByZXRyeU9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJldHJ5T3B0aW9ucykge1xuICAgICAgICB0aGlzLnJldHJ5T3B0aW9ucyA9IHJldHJ5T3B0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFN0b3JhZ2VSZXRyeVBvbGljeSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RvcmFnZVJldHJ5UG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMsIHRoaXMucmV0cnlPcHRpb25zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3kgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuLyoqXG4gKiBDcmVkZW50aWFsIHBvbGljeSB1c2VkIHRvIHNpZ24gSFRUUChTKSByZXF1ZXN0cyBiZWZvcmUgc2VuZGluZy4gVGhpcyBpcyBhblxuICogYWJzdHJhY3QgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVkZW50aWFsUG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIFNlbmRzIG91dCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqL1xuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QodGhpcy5zaWduUmVxdWVzdChyZXF1ZXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoaWxkIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2Qgd2l0aCByZXF1ZXN0IHNpZ25pbmcuIFRoaXMgbWV0aG9kXG4gICAgICogd2lsbCBiZSBleGVjdXRlZCBpbiB7QGxpbmsgc2VuZFJlcXVlc3R9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqL1xuICAgIHNpZ25SZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgLy8gQ2hpbGQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggcmVxdWVzdCBzaWduaW5nLiBUaGlzIG1ldGhvZFxuICAgICAgICAvLyB3aWxsIGJlIGV4ZWN1dGVkIGluIHNlbmRSZXF1ZXN0KCkuXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNyZWRlbnRpYWxQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBDcmVkZW50aWFsUG9saWN5IH0gZnJvbSBcIi4vQ3JlZGVudGlhbFBvbGljeVwiO1xuLyoqXG4gKiBBbm9ueW1vdXNDcmVkZW50aWFsUG9saWN5IGlzIHVzZWQgd2l0aCBIVFRQKFMpIHJlcXVlc3RzIHRoYXQgcmVhZCBwdWJsaWMgcmVzb3VyY2VzXG4gKiBvciBmb3IgdXNlIHdpdGggU2hhcmVkIEFjY2VzcyBTaWduYXR1cmVzIChTQVMpLlxuICovXG5leHBvcnQgY2xhc3MgQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeSBleHRlbmRzIENyZWRlbnRpYWxQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeS5cbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIC8vIFRoZSBiYXNlIGNsYXNzIGhhcyBhIHByb3RlY3RlZCBjb25zdHJ1Y3Rvci4gQWRkaW5nIGEgcHVibGljIG9uZSB0byBlbmFibGUgY29uc3RydWN0aW5nIG9mIHRoaXMgY2xhc3MuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2VsZXNzLWNvbnN0cnVjdG9yKi9cbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFub255bW91c0NyZWRlbnRpYWxQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIENyZWRlbnRpYWwgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIEF6dXJlIFN0b3JhZ2UgSFRUUCByZXF1ZXN0cyBzaWduaW5nLiBUaGlzXG4gKiBjbGFzcyB3aWxsIGhvc3QgYW4gY3JlZGVudGlhbFBvbGljeUNyZWF0b3IgZmFjdG9yeSB3aGljaCBnZW5lcmF0ZXMgQ3JlZGVudGlhbFBvbGljeS5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRlbnRpYWwge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBSZXF1ZXN0UG9saWN5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIF9vcHRpb25zIC1cbiAgICAgKi9cbiAgICBjcmVhdGUoX25leHRQb2xpY3ksIF9vcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gY2hpbGRyZW4gY2xhc3Nlcy5cIik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3JlZGVudGlhbC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEFub255bW91c0NyZWRlbnRpYWxQb2xpY3kgfSBmcm9tIFwiLi4vcG9saWNpZXMvQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeVwiO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCB9IGZyb20gXCIuL0NyZWRlbnRpYWxcIjtcbi8qKlxuICogQW5vbnltb3VzQ3JlZGVudGlhbCBwcm92aWRlcyBhIGNyZWRlbnRpYWxQb2xpY3lDcmVhdG9yIG1lbWJlciB1c2VkIHRvIGNyZWF0ZVxuICogQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeSBvYmplY3RzLiBBbm9ueW1vdXNDcmVkZW50aWFsUG9saWN5IGlzIHVzZWQgd2l0aFxuICogSFRUUChTKSByZXF1ZXN0cyB0aGF0IHJlYWQgcHVibGljIHJlc291cmNlcyBvciBmb3IgdXNlIHdpdGggU2hhcmVkIEFjY2Vzc1xuICogU2lnbmF0dXJlcyAoU0FTKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFub255bW91c0NyZWRlbnRpYWwgZXh0ZW5kcyBDcmVkZW50aWFsIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBbm9ueW1vdXNDcmVkZW50aWFsUG9saWN5fSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bbm9ueW1vdXNDcmVkZW50aWFsLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIEh0dHBIZWFkZXJzLCBpc05vZGUsIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IEhlYWRlckNvbnN0YW50cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbi8qKlxuICogVGVsZW1ldHJ5UG9saWN5IGlzIGEgcG9saWN5IHVzZWQgdG8gdGFnIHVzZXItYWdlbnQgaGVhZGVyIGZvciBldmVyeSByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbGVtZXRyeVBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFRlbGVtZXRyeVBvbGljeS5cbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqIEBwYXJhbSB0ZWxlbWV0cnkgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIHRlbGVtZXRyeSkge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50ZWxlbWV0cnkgPSB0ZWxlbWV0cnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIG91dCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVxdWVzdC5oZWFkZXJzLmdldChIZWFkZXJDb25zdGFudHMuVVNFUl9BR0VOVCkpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEhlYWRlckNvbnN0YW50cy5VU0VSX0FHRU5ULCB0aGlzLnRlbGVtZXRyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGVsZW1ldHJ5UG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaXNOb2RlLCB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7IFRlbGVtZXRyeVBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL1RlbGVtZXRyeVBvbGljeVwiO1xuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tIFwiLi91dGlscy9jb25zdGFudHNcIjtcbi8qKlxuICogVGVsZW1ldHJ5UG9saWN5RmFjdG9yeSBpcyBhIGZhY3RvcnkgY2xhc3MgaGVscGluZyBnZW5lcmF0aW5nIHtAbGluayBUZWxlbWV0cnlQb2xpY3l9IG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZWxlbWV0cnlQb2xpY3lGYWN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFRlbGVtZXRyeVBvbGljeUZhY3RvcnkuXG4gICAgICogQHBhcmFtIHRlbGVtZXRyeSAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodGVsZW1ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHVzZXJBZ2VudEluZm8gPSBbXTtcbiAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgICAgaWYgKHRlbGVtZXRyeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbGVtZXRyeVN0cmluZyA9IHRlbGVtZXRyeS51c2VyQWdlbnRQcmVmaXggfHwgXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAodGVsZW1ldHJ5U3RyaW5nLmxlbmd0aCA+IDAgJiYgdXNlckFnZW50SW5mby5pbmRleE9mKHRlbGVtZXRyeVN0cmluZykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudEluZm8ucHVzaCh0ZWxlbWV0cnlTdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gYXpzZGstanMtc3RvcmFnZWJsb2IvMTAuMC4wXG4gICAgICAgICAgICBjb25zdCBsaWJJbmZvID0gYGF6c2RrLWpzLXN0b3JhZ2VibG9iLyR7U0RLX1ZFUlNJT059YDtcbiAgICAgICAgICAgIGlmICh1c2VyQWdlbnRJbmZvLmluZGV4T2YobGliSW5mbykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdXNlckFnZW50SW5mby5wdXNoKGxpYkluZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZS5nLiAoTk9ERS1WRVJTSU9OIDQuOS4xOyBXaW5kb3dzX05UIDEwLjAuMTYyOTkpXG4gICAgICAgICAgICBsZXQgcnVudGltZUluZm8gPSBgKE5PREUtVkVSU0lPTiAke3Byb2Nlc3MudmVyc2lvbn0pYDtcbiAgICAgICAgICAgIGlmIChvcykge1xuICAgICAgICAgICAgICAgIHJ1bnRpbWVJbmZvID0gYChOT0RFLVZFUlNJT04gJHtwcm9jZXNzLnZlcnNpb259OyAke29zLnR5cGUoKX0gJHtvcy5yZWxlYXNlKCl9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXNlckFnZW50SW5mby5pbmRleE9mKHJ1bnRpbWVJbmZvKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB1c2VyQWdlbnRJbmZvLnB1c2gocnVudGltZUluZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGVsZW1ldHJ5U3RyaW5nID0gdXNlckFnZW50SW5mby5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFRlbGVtZXRyeVBvbGljeSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVsZW1ldHJ5UG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMsIHRoaXMudGVsZW1ldHJ5U3RyaW5nKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UZWxlbWV0cnlQb2xpY3lGYWN0b3J5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0ICogYXMgdHVubmVsIGZyb20gXCJ0dW5uZWxcIjtcbmltcG9ydCB7IFVSTEJ1aWxkZXIgfSBmcm9tIFwiLi91cmxcIjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm94eUFnZW50KHJlcXVlc3RVcmwsIHByb3h5U2V0dGluZ3MsIGhlYWRlcnMpIHtcbiAgICBjb25zdCBob3N0ID0gVVJMQnVpbGRlci5wYXJzZShwcm94eVNldHRpbmdzLmhvc3QpLmdldEhvc3QoKTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0aW5nIGEgbm9uLWVtcHR5IGhvc3QgaW4gcHJveHkgc2V0dGluZ3MuXCIpO1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRQb3J0KHByb3h5U2V0dGluZ3MucG9ydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0aW5nIGEgdmFsaWQgcG9ydCBudW1iZXIgaW4gdGhlIHJhbmdlIG9mIFswLCA2NTUzNV0gaW4gcHJveHkgc2V0dGluZ3MuXCIpO1xuICAgIH1cbiAgICBjb25zdCB0dW5uZWxPcHRpb25zID0ge1xuICAgICAgICBwcm94eToge1xuICAgICAgICAgICAgaG9zdDogaG9zdCxcbiAgICAgICAgICAgIHBvcnQ6IHByb3h5U2V0dGluZ3MucG9ydCxcbiAgICAgICAgICAgIGhlYWRlcnM6IChoZWFkZXJzICYmIGhlYWRlcnMucmF3SGVhZGVycygpKSB8fCB7fSxcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChwcm94eVNldHRpbmdzLnVzZXJuYW1lICYmIHByb3h5U2V0dGluZ3MucGFzc3dvcmQpIHtcbiAgICAgICAgdHVubmVsT3B0aW9ucy5wcm94eS5wcm94eUF1dGggPSBgJHtwcm94eVNldHRpbmdzLnVzZXJuYW1lfToke3Byb3h5U2V0dGluZ3MucGFzc3dvcmR9YDtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJveHlTZXR0aW5ncy51c2VybmFtZSkge1xuICAgICAgICB0dW5uZWxPcHRpb25zLnByb3h5LnByb3h5QXV0aCA9IGAke3Byb3h5U2V0dGluZ3MudXNlcm5hbWV9YDtcbiAgICB9XG4gICAgY29uc3QgaXNSZXF1ZXN0SHR0cHMgPSBpc1VybEh0dHBzKHJlcXVlc3RVcmwpO1xuICAgIGNvbnN0IGlzUHJveHlIdHRwcyA9IGlzVXJsSHR0cHMocHJveHlTZXR0aW5ncy5ob3N0KTtcbiAgICBjb25zdCBwcm94eUFnZW50ID0ge1xuICAgICAgICBpc0h0dHBzOiBpc1JlcXVlc3RIdHRwcyxcbiAgICAgICAgYWdlbnQ6IGNyZWF0ZVR1bm5lbChpc1JlcXVlc3RIdHRwcywgaXNQcm94eUh0dHBzLCB0dW5uZWxPcHRpb25zKSxcbiAgICB9O1xuICAgIHJldHVybiBwcm94eUFnZW50O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVXJsSHR0cHModXJsKSB7XG4gICAgY29uc3QgdXJsU2NoZW1lID0gVVJMQnVpbGRlci5wYXJzZSh1cmwpLmdldFNjaGVtZSgpIHx8IFwiXCI7XG4gICAgcmV0dXJuIHVybFNjaGVtZS50b0xvd2VyQ2FzZSgpID09PSBcImh0dHBzXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHVubmVsKGlzUmVxdWVzdEh0dHBzLCBpc1Byb3h5SHR0cHMsIHR1bm5lbE9wdGlvbnMpIHtcbiAgICBpZiAoaXNSZXF1ZXN0SHR0cHMgJiYgaXNQcm94eUh0dHBzKSB7XG4gICAgICAgIHJldHVybiB0dW5uZWwuaHR0cHNPdmVySHR0cHModHVubmVsT3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUmVxdWVzdEh0dHBzICYmICFpc1Byb3h5SHR0cHMpIHtcbiAgICAgICAgcmV0dXJuIHR1bm5lbC5odHRwc092ZXJIdHRwKHR1bm5lbE9wdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNSZXF1ZXN0SHR0cHMgJiYgaXNQcm94eUh0dHBzKSB7XG4gICAgICAgIHJldHVybiB0dW5uZWwuaHR0cE92ZXJIdHRwcyh0dW5uZWxPcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB0dW5uZWwuaHR0cE92ZXJIdHRwKHR1bm5lbE9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzVmFsaWRQb3J0KHBvcnQpIHtcbiAgICAvLyBhbnkgcG9ydCBpbiAwLTY1NTM1IHJhbmdlIGlzIHZhbGlkIChSRkMgNzkzKSBldmVuIHRob3VnaCBhbG1vc3QgYWxsIGltcGxlbWVudGF0aW9uc1xuICAgIC8vIHdpbGwgcmVzZXJ2ZSAwIGZvciBhIHNwZWNpZmljIHB1cnBvc2UsIGFuZCBhIHJhbmdlIG9mIG51bWJlcnMgZm9yIGVwaGVtZXJhbCBwb3J0c1xuICAgIHJldHVybiAwIDw9IHBvcnQgJiYgcG9ydCA8PSA2NTUzNTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3h5QWdlbnQuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gXCJodHRwXCI7XG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tIFwiaHR0cHNcIjtcbmltcG9ydCB7IEFib3J0Q29udHJvbGxlciwgQWJvcnRFcnJvciB9IGZyb20gXCJAYXp1cmUvYWJvcnQtY29udHJvbGxlclwiO1xuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tIFwiLi9odHRwSGVhZGVyc1wiO1xuaW1wb3J0IHsgY3JlYXRlUHJveHlBZ2VudCwgaXNVcmxIdHRwcyB9IGZyb20gXCIuL3Byb3h5QWdlbnRcIjtcbmltcG9ydCB7IFRyYW5zZm9ybSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCBGb3JtRGF0YSBmcm9tIFwiZm9ybS1kYXRhXCI7XG5pbXBvcnQgeyBSZXN0RXJyb3IgfSBmcm9tIFwiLi9yZXN0RXJyb3JcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ1wiO1xuaW1wb3J0IG5vZGVfZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmZ1bmN0aW9uIGdldENhY2hlZEFnZW50KGlzSHR0cHMsIGFnZW50Q2FjaGUpIHtcbiAgICByZXR1cm4gaXNIdHRwcyA/IGFnZW50Q2FjaGUuaHR0cHNBZ2VudCA6IGFnZW50Q2FjaGUuaHR0cEFnZW50O1xufVxuZXhwb3J0IGNsYXNzIFJlcG9ydFRyYW5zZm9ybSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3IocHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnByb2dyZXNzQ2FsbGJhY2sgPSBwcm9ncmVzc0NhbGxiYWNrO1xuICAgICAgICB0aGlzLmxvYWRlZEJ5dGVzID0gMDtcbiAgICB9XG4gICAgX3RyYW5zZm9ybShjaHVuaywgX2VuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgICAgICB0aGlzLmxvYWRlZEJ5dGVzICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0NhbGxiYWNrKHsgbG9hZGVkQnl0ZXM6IHRoaXMubG9hZGVkQnl0ZXMgfSk7XG4gICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbShib2R5KSB7XG4gICAgcmV0dXJuIGJvZHkgJiYgdHlwZW9mIGJvZHkucGlwZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gaXNTdHJlYW1Db21wbGV0ZShzdHJlYW0sIGFib3J0ZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc3RyZWFtLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICBhYm9ydGVyID09PSBudWxsIHx8IGFib3J0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFib3J0ZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpO1xuICAgICAgICBzdHJlYW0ub25jZShcImVycm9yXCIsIHJlc29sdmUpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgc2V0IG9mIGhlYWRlcnMgaW50byB0aGUga2V5L3ZhbHVlIHBhaXIgZGVmaW5lZCBieSB7QGxpbmsgSHR0cEhlYWRlcnNMaWtlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICBjb25zdCBodHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIGhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBodHRwSGVhZGVycy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGh0dHBIZWFkZXJzO1xufVxuLyoqXG4gKiBBbiBIVFRQIGNsaWVudCB0aGF0IHVzZXMgYG5vZGUtZmV0Y2hgLlxuICovXG5leHBvcnQgY2xhc3MgTm9kZUZldGNoSHR0cENsaWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGEgbWFwcGluZyBvZiBwcm94eSBzZXR0aW5ncyBzdHJpbmcgYCR7aG9zdH06JHtwb3J0fToke3VzZXJuYW1lfToke3Bhc3N3b3JkfWAgdG8gYWdlbnRcbiAgICAgICAgdGhpcy5wcm94eUFnZW50TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmtlZXBBbGl2ZUFnZW50cyA9IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBtaW5pbXVtIHZpYWJsZSBlcnJvciBoYW5kbGluZyBhbmQgdGhlIGxvZ2ljIHRoYXQgZXhlY3V0ZXMgdGhlIGFic3RyYWN0IG1ldGhvZHMuXG4gICAgICogQHBhcmFtIGh0dHBSZXF1ZXN0IC0gT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgb3V0Z29pbmcgSFRUUCByZXF1ZXN0LlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGluY29taW5nIEhUVFAgcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgc2VuZFJlcXVlc3QoaHR0cFJlcXVlc3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIWh0dHBSZXF1ZXN0ICYmIHR5cGVvZiBodHRwUmVxdWVzdCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2h0dHBSZXF1ZXN0JyAoV2ViUmVzb3VyY2VMaWtlKSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQgYW5kIG11c3QgYmUgb2YgdHlwZSBvYmplY3QuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGFib3J0TGlzdGVuZXI7XG4gICAgICAgIGlmIChodHRwUmVxdWVzdC5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgaWYgKGh0dHBSZXF1ZXN0LmFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWJvcnRMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcImFib3J0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydExpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaHR0cFJlcXVlc3QudGltZW91dCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICB9LCBodHRwUmVxdWVzdC50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaHR0cFJlcXVlc3QuZm9ybURhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gaHR0cFJlcXVlc3QuZm9ybURhdGE7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0Rm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgY29uc3QgYXBwZW5kRm9ybVZhbHVlID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBmdW5jdGlvbiBwcm9iYWJseSByZXR1cm5zIGEgc3RyZWFtIHNvIHdlIGNhbiBwcm92aWRlIGEgZnJlc2ggc3RyZWFtIG9uIGVhY2ggcmV0cnlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgXCJvcHRpb25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RGb3JtLmFwcGVuZChrZXksIHZhbHVlLnZhbHVlLCB2YWx1ZS5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RGb3JtLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBmb3JtS2V5IG9mIE9iamVjdC5rZXlzKGZvcm1EYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1EYXRhW2Zvcm1LZXldO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmb3JtVmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEZvcm1WYWx1ZShmb3JtS2V5LCBmb3JtVmFsdWVbal0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcHBlbmRGb3JtVmFsdWUoZm9ybUtleSwgZm9ybVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBodHRwUmVxdWVzdC5ib2R5ID0gcmVxdWVzdEZvcm07XG4gICAgICAgICAgICBodHRwUmVxdWVzdC5mb3JtRGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaHR0cFJlcXVlc3QuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik7XG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5kZXhPZihcIm11bHRpcGFydC9mb3JtLWRhdGFcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0Rm9ybS5nZXRCb3VuZGFyeSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke3JlcXVlc3RGb3JtLmdldEJvdW5kYXJ5KCl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBhcHBseSBhIHN1aXRhYmxlIGNvbnRlbnQtdHlwZSBoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QuaGVhZGVycy5yZW1vdmUoXCJDb250ZW50LVR5cGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBib2R5ID0gaHR0cFJlcXVlc3QuYm9keVxuICAgICAgICAgICAgPyB0eXBlb2YgaHR0cFJlcXVlc3QuYm9keSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgPyBodHRwUmVxdWVzdC5ib2R5KClcbiAgICAgICAgICAgICAgICA6IGh0dHBSZXF1ZXN0LmJvZHlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaHR0cFJlcXVlc3Qub25VcGxvYWRQcm9ncmVzcyAmJiBodHRwUmVxdWVzdC5ib2R5KSB7XG4gICAgICAgICAgICBjb25zdCBvblVwbG9hZFByb2dyZXNzID0gaHR0cFJlcXVlc3Qub25VcGxvYWRQcm9ncmVzcztcbiAgICAgICAgICAgIGNvbnN0IHVwbG9hZFJlcG9ydFN0cmVhbSA9IG5ldyBSZXBvcnRUcmFuc2Zvcm0ob25VcGxvYWRQcm9ncmVzcyk7XG4gICAgICAgICAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbShib2R5KSkge1xuICAgICAgICAgICAgICAgIGJvZHkucGlwZSh1cGxvYWRSZXBvcnRTdHJlYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBsb2FkUmVwb3J0U3RyZWFtLmVuZChib2R5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvZHkgPSB1cGxvYWRSZXBvcnRTdHJlYW07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxhdGZvcm1TcGVjaWZpY1JlcXVlc3RJbml0ID0gYXdhaXQgdGhpcy5wcmVwYXJlUmVxdWVzdChodHRwUmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJbml0ID0gT2JqZWN0LmFzc2lnbih7IGJvZHk6IGJvZHksIGhlYWRlcnM6IGh0dHBSZXF1ZXN0LmhlYWRlcnMucmF3SGVhZGVycygpLCBtZXRob2Q6IGh0dHBSZXF1ZXN0Lm1ldGhvZCwgXG4gICAgICAgICAgICAvLyB0aGUgdHlwZXMgZm9yIFJlcXVlc3RJbml0IGFyZSBmcm9tIHRoZSBicm93c2VyLCB3aGljaCBleHBlY3RzIEFib3J0U2lnbmFsIHRvXG4gICAgICAgICAgICAvLyBoYXZlIGByZWFzb25gIGFuZCBgdGhyb3dJZkFib3J0ZWRgLCBidXQgdGhlc2UgZG9uJ3QgZXhpc3Qgb24gb3VyIHBvbHlmaWxsXG4gICAgICAgICAgICAvLyBmb3IgTm9kZS5cbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCwgcmVkaXJlY3Q6IFwibWFudWFsXCIgfSwgcGxhdGZvcm1TcGVjaWZpY1JlcXVlc3RJbml0KTtcbiAgICAgICAgbGV0IG9wZXJhdGlvblJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoKGh0dHBSZXF1ZXN0LnVybCwgcmVxdWVzdEluaXQpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHBhcnNlSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbWluZyA9ICgoX2EgPSBodHRwUmVxdWVzdC5zdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGFzKHJlc3BvbnNlLnN0YXR1cykpIHx8XG4gICAgICAgICAgICAgICAgaHR0cFJlcXVlc3Quc3RyZWFtUmVzcG9uc2VCb2R5O1xuICAgICAgICAgICAgb3BlcmF0aW9uUmVzcG9uc2UgPSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiBodHRwUmVxdWVzdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICByZWFkYWJsZVN0cmVhbUJvZHk6IHN0cmVhbWluZ1xuICAgICAgICAgICAgICAgICAgICA/IHJlc3BvbnNlLmJvZHlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYm9keUFzVGV4dDogIXN0cmVhbWluZyA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBvbkRvd25sb2FkUHJvZ3Jlc3MgPSBodHRwUmVxdWVzdC5vbkRvd25sb2FkUHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZiAob25Eb3dubG9hZFByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gcmVzcG9uc2UuYm9keSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVhZGFibGVTdHJlYW0ocmVzcG9uc2VCb2R5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3dubG9hZFJlcG9ydFN0cmVhbSA9IG5ldyBSZXBvcnRUcmFuc2Zvcm0ob25Eb3dubG9hZFByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LnBpcGUoZG93bmxvYWRSZXBvcnRTdHJlYW0pO1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHkgPSBkb3dubG9hZFJlcG9ydFN0cmVhbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGhlYWRlcnMuZ2V0KFwiQ29udGVudC1MZW5ndGhcIikpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGluZyBjYWxsYmFjayBmb3Igbm9uLXN0cmVhbSByZXNwb25zZSBmb3IgY29uc2lzdGVuY3kgd2l0aCBicm93c2VyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkRvd25sb2FkUHJvZ3Jlc3MoeyBsb2FkZWRCeXRlczogbGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzUmVxdWVzdChvcGVyYXRpb25SZXNwb25zZSk7XG4gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBmZXRjaEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICBpZiAoZmV0Y2hFcnJvci5jb2RlID09PSBcIkVOT1RGT1VORFwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3RFcnJvcihmZXRjaEVycm9yLm1lc3NhZ2UsIFJlc3RFcnJvci5SRVFVRVNUX1NFTkRfRVJST1IsIHVuZGVmaW5lZCwgaHR0cFJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmV0Y2hFcnJvci50eXBlID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKFwiVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBmZXRjaEVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gY2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgICAgIGlmIChodHRwUmVxdWVzdC5hYm9ydFNpZ25hbCAmJiBhYm9ydExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVwbG9hZFN0cmVhbURvbmUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbShib2R5KSkge1xuICAgICAgICAgICAgICAgICAgICB1cGxvYWRTdHJlYW1Eb25lID0gaXNTdHJlYW1Db21wbGV0ZShib2R5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkU3RyZWFtRG9uZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtKG9wZXJhdGlvblJlc3BvbnNlID09PSBudWxsIHx8IG9wZXJhdGlvblJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcGVyYXRpb25SZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkU3RyZWFtRG9uZSA9IGlzU3RyZWFtQ29tcGxldGUob3BlcmF0aW9uUmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5LCBhYm9ydENvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChbdXBsb2FkU3RyZWFtRG9uZSwgZG93bmxvYWRTdHJlYW1Eb25lXSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIChfYSA9IGh0dHBSZXF1ZXN0LmFib3J0U2lnbmFsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKFwiRXJyb3Igd2hlbiBjbGVhbmluZyB1cCBhYm9ydExpc3RlbmVyIG9uIGh0dHBSZXF1ZXN0XCIsIGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldE9yQ3JlYXRlQWdlbnQoaHR0cFJlcXVlc3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBpc0h0dHBzID0gaXNVcmxIdHRwcyhodHRwUmVxdWVzdC51cmwpO1xuICAgICAgICAvLyBBdCB0aGUgbW9tZW50LCBwcm94eSBzZXR0aW5ncyBhbmQga2VlcEFsaXZlIGFyZSBtdXR1YWxseVxuICAgICAgICAvLyBleGNsdXNpdmUgYmVjYXVzZSB0aGUgJ3R1bm5lbCcgbGlicmFyeSBjdXJyZW50bHkgbGFja3MgdGhlXG4gICAgICAgIC8vIGFiaWxpdHkgdG8gY3JlYXRlIGEgcHJveHkgd2l0aCBrZWVwQWxpdmUgdHVybmVkIG9uLlxuICAgICAgICBpZiAoaHR0cFJlcXVlc3QucHJveHlTZXR0aW5ncykge1xuICAgICAgICAgICAgY29uc3QgeyBob3N0LCBwb3J0LCB1c2VybmFtZSwgcGFzc3dvcmQgfSA9IGh0dHBSZXF1ZXN0LnByb3h5U2V0dGluZ3M7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgJHtob3N0fToke3BvcnR9OiR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YDtcbiAgICAgICAgICAgIGNvbnN0IHByb3h5QWdlbnRzID0gKF9hID0gdGhpcy5wcm94eUFnZW50TWFwLmdldChrZXkpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fTtcbiAgICAgICAgICAgIGxldCBhZ2VudCA9IGdldENhY2hlZEFnZW50KGlzSHR0cHMsIHByb3h5QWdlbnRzKTtcbiAgICAgICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhZ2VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR1bm5lbCA9IGNyZWF0ZVByb3h5QWdlbnQoaHR0cFJlcXVlc3QudXJsLCBodHRwUmVxdWVzdC5wcm94eVNldHRpbmdzLCBodHRwUmVxdWVzdC5oZWFkZXJzKTtcbiAgICAgICAgICAgIGFnZW50ID0gdHVubmVsLmFnZW50O1xuICAgICAgICAgICAgaWYgKHR1bm5lbC5pc0h0dHBzKSB7XG4gICAgICAgICAgICAgICAgcHJveHlBZ2VudHMuaHR0cHNBZ2VudCA9IHR1bm5lbC5hZ2VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb3h5QWdlbnRzLmh0dHBBZ2VudCA9IHR1bm5lbC5hZ2VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJveHlBZ2VudE1hcC5zZXQoa2V5LCBwcm94eUFnZW50cyk7XG4gICAgICAgICAgICByZXR1cm4gYWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaHR0cFJlcXVlc3Qua2VlcEFsaXZlKSB7XG4gICAgICAgICAgICBsZXQgYWdlbnQgPSBnZXRDYWNoZWRBZ2VudChpc0h0dHBzLCB0aGlzLmtlZXBBbGl2ZUFnZW50cyk7XG4gICAgICAgICAgICBpZiAoYWdlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWdlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhZ2VudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAga2VlcEFsaXZlOiBodHRwUmVxdWVzdC5rZWVwQWxpdmUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGlzSHR0cHMpIHtcbiAgICAgICAgICAgICAgICBhZ2VudCA9IHRoaXMua2VlcEFsaXZlQWdlbnRzLmh0dHBzQWdlbnQgPSBuZXcgaHR0cHMuQWdlbnQoYWdlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFnZW50ID0gdGhpcy5rZWVwQWxpdmVBZ2VudHMuaHR0cEFnZW50ID0gbmV3IGh0dHAuQWdlbnQoYWdlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0h0dHBzID8gaHR0cHMuZ2xvYmFsQWdlbnQgOiBodHRwLmdsb2JhbEFnZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZXMgYG5vZGUtZmV0Y2hgIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3QuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtYXBpc3VyZmFjZS1zdGFuZGFyZGl6ZWQtdmVyYnNcbiAgICBhc3luYyBmZXRjaChpbnB1dCwgaW5pdCkge1xuICAgICAgICByZXR1cm4gbm9kZV9mZXRjaChpbnB1dCwgaW5pdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGEgcmVxdWVzdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgd2ViIHJlc291cmNlLlxuICAgICAqL1xuICAgIGFzeW5jIHByZXBhcmVSZXF1ZXN0KGh0dHBSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJbml0ID0ge307XG4gICAgICAgIC8vIFNldCB0aGUgaHR0cChzKSBhZ2VudFxuICAgICAgICByZXF1ZXN0SW5pdC5hZ2VudCA9IHRoaXMuZ2V0T3JDcmVhdGVBZ2VudChodHRwUmVxdWVzdCk7XG4gICAgICAgIHJlcXVlc3RJbml0LmNvbXByZXNzID0gaHR0cFJlcXVlc3QuZGVjb21wcmVzc1Jlc3BvbnNlO1xuICAgICAgICByZXR1cm4gcmVxdWVzdEluaXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYW4gSFRUUCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChfb3BlcmF0aW9uUmVzcG9uc2UpIHtcbiAgICAgICAgLyogbm9fb3AgKi9cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub2RlRmV0Y2hIdHRwQ2xpZW50LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgRGVmYXVsdEh0dHBDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuY29uc3QgX2RlZmF1bHRIdHRwQ2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkRGVmYXVsdEh0dHBDbGllbnQoKSB7XG4gICAgcmV0dXJuIF9kZWZhdWx0SHR0cENsaWVudDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhY2hlLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgVVJMQnVpbGRlciB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuLyoqXG4gKiBBIHNldCBvZiBjb25zdGFudHMgdXNlZCBpbnRlcm5hbGx5IHdoZW4gcHJvY2Vzc2luZyByZXF1ZXN0cy5cbiAqL1xuY29uc3QgQ29uc3RhbnRzID0ge1xuICAgIERlZmF1bHRTY29wZTogXCIvLmRlZmF1bHRcIixcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGNvbnN0YW50cyBmb3IgdXNlIHdpdGggSFRUUCBoZWFkZXJzLlxuICAgICAqL1xuICAgIEhlYWRlckNvbnN0YW50czoge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgQVVUSE9SSVpBVElPTjogXCJhdXRob3JpemF0aW9uXCIsXG4gICAgfSxcbn07XG4vLyBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBjeWNsZXIgaWYgbm9uZSBhcmUgcHJvdmlkZWRcbmNvbnN0IERFRkFVTFRfQ1lDTEVSX09QVElPTlMgPSB7XG4gICAgZm9yY2VkUmVmcmVzaFdpbmRvd0luTXM6IDEwMDAsXG4gICAgcmV0cnlJbnRlcnZhbEluTXM6IDMwMDAsXG4gICAgcmVmcmVzaFdpbmRvd0luTXM6IDEwMDAgKiA2MCAqIDIsIC8vIFN0YXJ0IHJlZnJlc2hpbmcgMm0gYmVmb3JlIGV4cGlyeVxufTtcbi8qKlxuICogQ29udmVydHMgYW4gYW4gdW5yZWxpYWJsZSBhY2Nlc3MgdG9rZW4gZ2V0dGVyICh3aGljaCBtYXkgcmVzb2x2ZSB3aXRoIG51bGwpXG4gKiBpbnRvIGFuIEFjY2Vzc1Rva2VuR2V0dGVyIGJ5IHJldHJ5aW5nIHRoZSB1bnJlbGlhYmxlIGdldHRlciBpbiBhIHJlZ3VsYXJcbiAqIGludGVydmFsLlxuICpcbiAqIEBwYXJhbSBnZXRBY2Nlc3NUb2tlbiAtIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIHByb21pc2Ugb2YgYW4gYWNjZXNzXG4gKiB0b2tlbiB0aGF0IG1heSBmYWlsIGJ5IHJldHVybmluZyBudWxsXG4gKiBAcGFyYW0gcmV0cnlJbnRlcnZhbEluTXMgLSB0aGUgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0byB3YWl0IGJldHdlZW4gcmV0cnlcbiAqIGF0dGVtcHRzXG4gKiBAcGFyYW0gdGltZW91dEluTXMgLSB0aGUgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSByZWZyZXNoIGF0dGVtcHQgd2lsbCBmYWlsLFxuICogdGhyb3dpbmcgYW4gZXhjZXB0aW9uXG4gKiBAcmV0dXJucyAtIGEgcHJvbWlzZSB0aGF0LCBpZiBpdCByZXNvbHZlcywgd2lsbCByZXNvbHZlIHdpdGggYW4gYWNjZXNzIHRva2VuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJlZ2luUmVmcmVzaChnZXRBY2Nlc3NUb2tlbiwgcmV0cnlJbnRlcnZhbEluTXMsIHRpbWVvdXRJbk1zKSB7XG4gICAgLy8gVGhpcyB3cmFwcGVyIGhhbmRsZXMgZXhjZXB0aW9ucyBncmFjZWZ1bGx5IGFzIGxvbmcgYXMgd2UgaGF2ZW4ndCBleGNlZWRlZFxuICAgIC8vIHRoZSB0aW1lb3V0LlxuICAgIGFzeW5jIGZ1bmN0aW9uIHRyeUdldEFjY2Vzc1Rva2VuKCkge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSA8IHRpbWVvdXRJbk1zKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbFRva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICAgICAgICAgIC8vIFRpbWVvdXQgaXMgdXAsIHNvIHRocm93IGlmIGl0J3Mgc3RpbGwgbnVsbFxuICAgICAgICAgICAgaWYgKGZpbmFsVG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVmcmVzaCBhY2Nlc3MgdG9rZW4uXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVG9rZW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHRva2VuID0gYXdhaXQgdHJ5R2V0QWNjZXNzVG9rZW4oKTtcbiAgICB3aGlsZSAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgYXdhaXQgZGVsYXkocmV0cnlJbnRlcnZhbEluTXMpO1xuICAgICAgICB0b2tlbiA9IGF3YWl0IHRyeUdldEFjY2Vzc1Rva2VuKCk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbjtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHRva2VuIGN5Y2xlciBmcm9tIGEgY3JlZGVudGlhbCwgc2NvcGVzLCBhbmQgb3B0aW9uYWwgc2V0dGluZ3MuXG4gKlxuICogQSB0b2tlbiBjeWNsZXIgcmVwcmVzZW50cyBhIHdheSB0byByZWxpYWJseSByZXRyaWV2ZSBhIHZhbGlkIGFjY2VzcyB0b2tlblxuICogZnJvbSBhIFRva2VuQ3JlZGVudGlhbC4gSXQgd2lsbCBoYW5kbGUgaW5pdGlhbGl6aW5nIHRoZSB0b2tlbiwgcmVmcmVzaGluZyBpdFxuICogd2hlbiBpdCBuZWFycyBleHBpcmF0aW9uLCBhbmQgc3luY2hyb25pemVzIHJlZnJlc2ggYXR0ZW1wdHMgdG8gYXZvaWRcbiAqIGNvbmN1cnJlbmN5IGhhemFyZHMuXG4gKlxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSB0aGUgdW5kZXJseWluZyBUb2tlbkNyZWRlbnRpYWwgdGhhdCBwcm92aWRlcyB0aGUgYWNjZXNzXG4gKiB0b2tlblxuICogQHBhcmFtIHNjb3BlcyAtIHRoZSBzY29wZXMgdG8gcmVxdWVzdCBhdXRob3JpemF0aW9uIGZvclxuICogQHBhcmFtIHRva2VuQ3ljbGVyT3B0aW9ucyAtIG9wdGlvbmFsbHkgb3ZlcnJpZGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIGN5Y2xlclxuICpcbiAqIEByZXR1cm5zIC0gYSBmdW5jdGlvbiB0aGF0IHJlbGlhYmx5IHByb2R1Y2VzIGEgdmFsaWQgYWNjZXNzIHRva2VuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRva2VuQ3ljbGVyKGNyZWRlbnRpYWwsIHNjb3BlcywgdG9rZW5DeWNsZXJPcHRpb25zKSB7XG4gICAgbGV0IHJlZnJlc2hXb3JrZXIgPSBudWxsO1xuICAgIGxldCB0b2tlbiA9IG51bGw7XG4gICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DWUNMRVJfT1BUSU9OUyksIHRva2VuQ3ljbGVyT3B0aW9ucyk7XG4gICAgLyoqXG4gICAgICogVGhpcyBsaXR0bGUgaG9sZGVyIGRlZmluZXMgc2V2ZXJhbCBwcmVkaWNhdGVzIHRoYXQgd2UgdXNlIHRvIGNvbnN0cnVjdFxuICAgICAqIHRoZSBydWxlcyBvZiByZWZyZXNoaW5nIHRoZSB0b2tlbi5cbiAgICAgKi9cbiAgICBjb25zdCBjeWNsZXIgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9kdWNlcyB0cnVlIGlmIGEgcmVmcmVzaCBqb2IgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IGlzUmVmcmVzaGluZygpIHtcbiAgICAgICAgICAgIHJldHVybiByZWZyZXNoV29ya2VyICE9PSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUHJvZHVjZXMgdHJ1ZSBpZiB0aGUgY3ljbGVyIFNIT1VMRCByZWZyZXNoICh3ZSBhcmUgd2l0aGluIHRoZSByZWZyZXNoXG4gICAgICAgICAqIHdpbmRvdyBhbmQgbm90IGFscmVhZHkgcmVmcmVzaGluZylcbiAgICAgICAgICovXG4gICAgICAgIGdldCBzaG91bGRSZWZyZXNoKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuICghY3ljbGVyLmlzUmVmcmVzaGluZyAmJlxuICAgICAgICAgICAgICAgICgoX2EgPSB0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9rZW4uZXhwaXJlc09uVGltZXN0YW1wKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwKSAtIG9wdGlvbnMucmVmcmVzaFdpbmRvd0luTXMgPCBEYXRlLm5vdygpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb2R1Y2VzIHRydWUgaWYgdGhlIGN5Y2xlciBNVVNUIHJlZnJlc2ggKG51bGwgb3IgbmVhcmx5LWV4cGlyZWRcbiAgICAgICAgICogdG9rZW4pLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IG11c3RSZWZyZXNoKCkge1xuICAgICAgICAgICAgcmV0dXJuICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbi5leHBpcmVzT25UaW1lc3RhbXAgLSBvcHRpb25zLmZvcmNlZFJlZnJlc2hXaW5kb3dJbk1zIDwgRGF0ZS5ub3coKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSByZWZyZXNoIGpvYiBvciByZXR1cm5zIHRoZSBleGlzdGluZyBqb2IgaWYgb25lIGlzIGFscmVhZHlcbiAgICAgKiBydW5uaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZnJlc2goZ2V0VG9rZW5PcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCFjeWNsZXIuaXNSZWZyZXNoaW5nKSB7XG4gICAgICAgICAgICAvLyBXZSBiaW5kIGBzY29wZXNgIGhlcmUgdG8gYXZvaWQgcGFzc2luZyBpdCBhcm91bmQgYSBsb3RcbiAgICAgICAgICAgIGNvbnN0IHRyeUdldEFjY2Vzc1Rva2VuID0gKCkgPT4gY3JlZGVudGlhbC5nZXRUb2tlbihzY29wZXMsIGdldFRva2VuT3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBUYWtlIGFkdmFudGFnZSBvZiBwcm9taXNlIGNoYWluaW5nIHRvIGluc2VydCBhbiBhc3NpZ25tZW50IHRvIGB0b2tlbmBcbiAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgcmVmcmVzaCBjYW4gYmUgY29uc2lkZXJlZCBkb25lLlxuICAgICAgICAgICAgcmVmcmVzaFdvcmtlciA9IGJlZ2luUmVmcmVzaCh0cnlHZXRBY2Nlc3NUb2tlbiwgb3B0aW9ucy5yZXRyeUludGVydmFsSW5NcywgXG4gICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdG9rZW4sIHRoZW4gd2Ugc2hvdWxkIHRpbWVvdXQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIChfYSA9IHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b2tlbi5leHBpcmVzT25UaW1lc3RhbXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IERhdGUubm93KCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKF90b2tlbikgPT4ge1xuICAgICAgICAgICAgICAgIHJlZnJlc2hXb3JrZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRva2VuID0gX3Rva2VuO1xuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhbHNvIHNob3VsZCByZXNldCB0aGUgcmVmcmVzaGVyIGlmIHdlIGVudGVyIGEgZmFpbGVkIHN0YXRlLiAgQWxsXG4gICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgYXdhaXRlcnMgd2lsbCB0aHJvdywgYnV0IHN1YnNlcXVlbnQgcmVxdWVzdHMgd2lsbCBzdGFydCBhXG4gICAgICAgICAgICAgICAgLy8gbmV3IHJldHJ5IGNoYWluLlxuICAgICAgICAgICAgICAgIHJlZnJlc2hXb3JrZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRva2VuID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmcmVzaFdvcmtlcjtcbiAgICB9XG4gICAgcmV0dXJuIGFzeW5jICh0b2tlbk9wdGlvbnMpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2ltcGxlIHJ1bGVzOlxuICAgICAgICAvLyAtIElmIHdlIE1VU1QgcmVmcmVzaCwgdGhlbiByZXR1cm4gdGhlIHJlZnJlc2ggdGFzaywgYmxvY2tpbmdcbiAgICAgICAgLy8gICB0aGUgcGlwZWxpbmUgdW50aWwgYSB0b2tlbiBpcyBhdmFpbGFibGUuXG4gICAgICAgIC8vIC0gSWYgd2UgU0hPVUxEIHJlZnJlc2gsIHRoZW4gcnVuIHJlZnJlc2ggYnV0IGRvbid0IHJldHVybiBpdFxuICAgICAgICAvLyAgICh3ZSBjYW4gc3RpbGwgdXNlIHRoZSBjYWNoZWQgdG9rZW4pLlxuICAgICAgICAvLyAtIFJldHVybiB0aGUgdG9rZW4sIHNpbmNlIGl0J3MgZmluZSBpZiB3ZSBkaWRuJ3QgcmV0dXJuIGluXG4gICAgICAgIC8vICAgc3RlcCAxLlxuICAgICAgICAvL1xuICAgICAgICBpZiAoY3ljbGVyLm11c3RSZWZyZXNoKVxuICAgICAgICAgICAgcmV0dXJuIHJlZnJlc2godG9rZW5PcHRpb25zKTtcbiAgICAgICAgaWYgKGN5Y2xlci5zaG91bGRSZWZyZXNoKSB7XG4gICAgICAgICAgICByZWZyZXNoKHRva2VuT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH07XG59XG4vKipcbiAqIFdlIHdpbGwgcmV0cmlldmUgdGhlIGNoYWxsZW5nZSBvbmx5IGlmIHRoZSByZXNwb25zZSBzdGF0dXMgY29kZSB3YXMgNDAxLFxuICogYW5kIGlmIHRoZSByZXNwb25zZSBjb250YWluZWQgdGhlIGhlYWRlciBcIldXVy1BdXRoZW50aWNhdGVcIiB3aXRoIGEgbm9uLWVtcHR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRDaGFsbGVuZ2UocmVzcG9uc2UpIHtcbiAgICBjb25zdCBjaGFsbGVuZ2UgPSByZXNwb25zZS5oZWFkZXJzLmdldChcIldXVy1BdXRoZW50aWNhdGVcIik7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmIGNoYWxsZW5nZSkge1xuICAgICAgICByZXR1cm4gY2hhbGxlbmdlO1xuICAgIH1cbiAgICByZXR1cm47XG59XG4vKipcbiAqIENvbnZlcnRzOiBgQmVhcmVyIGE9XCJiXCIgYz1cImRcImAuXG4gKiBJbnRvOiBgWyB7IGE6ICdiJywgYzogJ2QnIH1dYC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gcGFyc2VDaGFsbGVuZ2UoY2hhbGxlbmdlKSB7XG4gICAgY29uc3QgYmVhcmVyQ2hhbGxlbmdlID0gY2hhbGxlbmdlLnNsaWNlKFwiQmVhcmVyIFwiLmxlbmd0aCk7XG4gICAgY29uc3QgY2hhbGxlbmdlUGFydHMgPSBgJHtiZWFyZXJDaGFsbGVuZ2UudHJpbSgpfSBgLnNwbGl0KFwiIFwiKS5maWx0ZXIoKHgpID0+IHgpO1xuICAgIGNvbnN0IGtleVZhbHVlUGFpcnMgPSBjaGFsbGVuZ2VQYXJ0cy5tYXAoKGtleVZhbHVlKSA9PiAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKShrZXlWYWx1ZS50cmltKCkuc3BsaXQoXCI9XCIpKSk7XG4gICAgLy8gS2V5LXZhbHVlIHBhaXJzIHRvIHBsYWluIG9iamVjdDpcbiAgICByZXR1cm4ga2V5VmFsdWVQYWlycy5yZWR1Y2UoKGEsIGIpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGEpLCBiKSksIHt9KTtcbn1cbi8vICNlbmRyZWdpb25cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmYWN0b3J5IGZvciBhIFJlcXVlc3RQb2xpY3kgdGhhdCBhcHBsaWVzIGEgYmVhcmVyIHRva2VuIHRvXG4gKiB0aGUgcmVxdWVzdHMnIGBBdXRob3JpemF0aW9uYCBoZWFkZXJzLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIFRva2VuQ3JlZGVudGlhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBzdXBwbHkgdGhlIGJlYXJlciB0b2tlbi5cbiAqIEBwYXJhbSBzY29wZXMgLSBUaGUgc2NvcGVzIGZvciB3aGljaCB0aGUgYmVhcmVyIHRva2VuIGFwcGxpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yYWdlQmVhcmVyVG9rZW5DaGFsbGVuZ2VBdXRoZW50aWNhdGlvblBvbGljeShjcmVkZW50aWFsLCBzY29wZXMpIHtcbiAgICAvLyBUaGlzIHNpbXBsZSBmdW5jdGlvbiBlbmNhcHN1bGF0ZXMgdGhlIGVudGlyZSBwcm9jZXNzIG9mIHJlbGlhYmx5IHJldHJpZXZpbmcgdGhlIHRva2VuXG4gICAgbGV0IGdldFRva2VuID0gY3JlYXRlVG9rZW5DeWNsZXIoY3JlZGVudGlhbCwgc2NvcGVzKTtcbiAgICBjbGFzcyBTdG9yYWdlQmVhcmVyVG9rZW5DaGFsbGVuZ2VBdXRoZW50aWNhdGlvblBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAgICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3Qod2ViUmVzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICghd2ViUmVzb3VyY2UudXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmVhcmVyIHRva2VuIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1UTFMgcHJvdGVjdGVkIChub24taHR0cHMpIFVSTHMuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ2V0VG9rZW5JbnRlcm5hbCA9IGdldFRva2VuO1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSAoYXdhaXQgZ2V0VG9rZW5JbnRlcm5hbCh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IHdlYlJlc291cmNlLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNpbmdDb250ZXh0OiB3ZWJSZXNvdXJjZS50cmFjaW5nQ29udGV4dCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpLnRva2VuO1xuICAgICAgICAgICAgd2ViUmVzb3VyY2UuaGVhZGVycy5zZXQoQ29uc3RhbnRzLkhlYWRlckNvbnN0YW50cy5BVVRIT1JJWkFUSU9OLCBgQmVhcmVyICR7dG9rZW59YCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3Qod2ViUmVzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzcG9uc2Uuc3RhdHVzKSA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbGxlbmdlID0gZ2V0Q2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbGxlbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYWxsZW5nZUluZm8gPSBwYXJzZUNoYWxsZW5nZShjaGFsbGVuZ2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFsbGVuZ2VTY29wZXMgPSBjaGFsbGVuZ2VJbmZvLnJlc291cmNlX2lkICsgQ29uc3RhbnRzLkRlZmF1bHRTY29wZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXV0aFVyaSA9IFVSTEJ1aWxkZXIucGFyc2UoY2hhbGxlbmdlSW5mby5hdXRob3JpemF0aW9uX3VyaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IHBhcnNlZEF1dGhVcmkuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVuYW50SWQgPSBwYXRoU2VnbWVudHNbMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldFRva2VuRm9yQ2hhbGxlbmdlID0gY3JlYXRlVG9rZW5DeWNsZXIoY3JlZGVudGlhbCwgY2hhbGxlbmdlU2NvcGVzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5Gb3JDaGFsbGVuZ2UgPSAoYXdhaXQgZ2V0VG9rZW5Gb3JDaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IHdlYlJlc291cmNlLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjaW5nQ29udGV4dDogd2ViUmVzb3VyY2UudHJhY2luZ0NvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVuYW50SWQ6IHRlbmFudElkLFxuICAgICAgICAgICAgICAgICAgICB9KSkudG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGdldFRva2VuID0gZ2V0VG9rZW5Gb3JDaGFsbGVuZ2U7XG4gICAgICAgICAgICAgICAgICAgIHdlYlJlc291cmNlLmhlYWRlcnMuc2V0KENvbnN0YW50cy5IZWFkZXJDb25zdGFudHMuQVVUSE9SSVpBVElPTiwgYEJlYXJlciAke3Rva2VuRm9yQ2hhbGxlbmdlfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdCh3ZWJSZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUJlYXJlclRva2VuQ2hhbGxlbmdlQXV0aGVudGljYXRpb25Qb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0b3JhZ2VCZWFyZXJUb2tlbkNoYWxsZW5nZUF1dGhlbnRpY2F0aW9uUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIGRlc2VyaWFsaXphdGlvblBvbGljeSwgZGlzYWJsZVJlc3BvbnNlRGVjb21wcmVzc2lvblBvbGljeSwgSHR0cEhlYWRlcnMsIFJlcXVlc3RQb2xpY3lPcHRpb25zLCBXZWJSZXNvdXJjZSwgcHJveHlQb2xpY3ksIGlzTm9kZSwgaXNUb2tlbkNyZWRlbnRpYWwsIHRyYWNpbmdQb2xpY3ksIGxvZ1BvbGljeSwga2VlcEFsaXZlUG9saWN5LCBnZW5lcmF0ZUNsaWVudFJlcXVlc3RJZFBvbGljeSwgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nXCI7XG5pbXBvcnQgeyBTdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnkgfSBmcm9tIFwiLi9TdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnlcIjtcbmltcG9ydCB7IFN0b3JhZ2VSZXRyeVBvbGljeUZhY3RvcnkgfSBmcm9tIFwiLi9TdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5XCI7XG5pbXBvcnQgeyBBbm9ueW1vdXNDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvQW5vbnltb3VzQ3JlZGVudGlhbFwiO1xuaW1wb3J0IHsgU3RvcmFnZU9BdXRoU2NvcGVzLCBTdG9yYWdlQmxvYkxvZ2dpbmdBbGxvd2VkSGVhZGVyTmFtZXMsIFN0b3JhZ2VCbG9iTG9nZ2luZ0FsbG93ZWRRdWVyeVBhcmFtZXRlcnMsIH0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBUZWxlbWV0cnlQb2xpY3lGYWN0b3J5IH0gZnJvbSBcIi4vVGVsZW1ldHJ5UG9saWN5RmFjdG9yeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGVkRGVmYXVsdEh0dHBDbGllbnQgfSBmcm9tIFwiLi91dGlscy9jYWNoZVwiO1xuaW1wb3J0IHsgYXR0YWNoQ3JlZGVudGlhbCB9IGZyb20gXCIuL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuaW1wb3J0IHsgc3RvcmFnZUJlYXJlclRva2VuQ2hhbGxlbmdlQXV0aGVudGljYXRpb25Qb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9TdG9yYWdlQmVhcmVyVG9rZW5DaGFsbGVuZ2VBdXRoZW50aWNhdGlvblBvbGljeVwiO1xuLy8gRXhwb3J0IGZvbGxvd2luZyBpbnRlcmZhY2VzIGFuZCB0eXBlcyBmb3IgY3VzdG9tZXJzIHdobyB3YW50IHRvIGltcGxlbWVudCB0aGVpclxuLy8gb3duIFJlcXVlc3RQb2xpY3kgb3IgSFRUUENsaWVudFxuZXhwb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIFN0b3JhZ2VPQXV0aFNjb3BlcywgZGVzZXJpYWxpemF0aW9uUG9saWN5LCBIdHRwSGVhZGVycywgV2ViUmVzb3VyY2UsIFJlcXVlc3RQb2xpY3lPcHRpb25zLCB9O1xuLyoqXG4gKiBBIGhlbHBlciB0byBkZWNpZGUgaWYgYSBnaXZlbiBhcmd1bWVudCBzYXRpc2ZpZXMgdGhlIFBpcGVsaW5lIGNvbnRyYWN0XG4gKiBAcGFyYW0gcGlwZWxpbmUgLSBBbiBhcmd1bWVudCB0aGF0IG1heSBiZSBhIFBpcGVsaW5lXG4gKiBAcmV0dXJucyB0cnVlIHdoZW4gdGhlIGFyZ3VtZW50IHNhdGlzZmllcyB0aGUgUGlwZWxpbmUgY29udHJhY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGlwZWxpbmVMaWtlKHBpcGVsaW5lKSB7XG4gICAgaWYgKCFwaXBlbGluZSB8fCB0eXBlb2YgcGlwZWxpbmUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjYXN0UGlwZWxpbmUgPSBwaXBlbGluZTtcbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkoY2FzdFBpcGVsaW5lLmZhY3RvcmllcykgJiZcbiAgICAgICAgdHlwZW9mIGNhc3RQaXBlbGluZS5vcHRpb25zID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHR5cGVvZiBjYXN0UGlwZWxpbmUudG9TZXJ2aWNlQ2xpZW50T3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKTtcbn1cbi8qKlxuICogQSBQaXBlbGluZSBjbGFzcyBjb250YWluaW5nIEhUVFAgcmVxdWVzdCBwb2xpY2llcy5cbiAqIFlvdSBjYW4gY3JlYXRlIGEgZGVmYXVsdCBQaXBlbGluZSBieSBjYWxsaW5nIHtAbGluayBuZXdQaXBlbGluZX0uXG4gKiBPciB5b3UgY2FuIGNyZWF0ZSBhIFBpcGVsaW5lIHdpdGggeW91ciBvd24gcG9saWNpZXMgYnkgdGhlIGNvbnN0cnVjdG9yIG9mIFBpcGVsaW5lLlxuICpcbiAqIFJlZmVyIHRvIHtAbGluayBuZXdQaXBlbGluZX0gYW5kIHByb3ZpZGVkIHBvbGljaWVzIGJlZm9yZSBpbXBsZW1lbnRpbmcgeW91clxuICogY3VzdG9taXplZCBQaXBlbGluZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVsaW5lIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFBpcGVsaW5lLiBDdXN0b21pemUgSFRUUENsaWVudCBieSBpbXBsZW1lbnRpbmcgSUh0dHBDbGllbnQgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZhY3RvcmllcyAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZhY3Rvcmllcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZmFjdG9yaWVzID0gZmFjdG9yaWVzO1xuICAgICAgICAvLyB3aGVuIG9wdGlvbnMuaHR0cENsaWVudCBpcyBub3Qgc3BlY2lmaWVkLCBwYXNzaW5nIGluIGEgRGVmYXVsdEh0dHBDbGllbnQgaW5zdGFuY2UgdG9cbiAgICAgICAgLy8gYXZvaWQgZWFjaCBjbGllbnQgY3JlYXRpbmcgaXRzIG93biBodHRwIGNsaWVudC5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBodHRwQ2xpZW50OiBvcHRpb25zLmh0dHBDbGllbnQgfHwgZ2V0Q2FjaGVkRGVmYXVsdEh0dHBDbGllbnQoKSB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhbnNmZXIgUGlwZWxpbmUgb2JqZWN0IHRvIFNlcnZpY2VDbGllbnRPcHRpb25zIG9iamVjdCB3aGljaCBpcyByZXF1aXJlZCBieVxuICAgICAqIFNlcnZpY2VDbGllbnQgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgU2VydmljZUNsaWVudE9wdGlvbnMgb2JqZWN0IGZyb20gdGhpcyBQaXBlbGluZS5cbiAgICAgKi9cbiAgICB0b1NlcnZpY2VDbGllbnRPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaHR0cENsaWVudDogdGhpcy5vcHRpb25zLmh0dHBDbGllbnQsXG4gICAgICAgICAgICByZXF1ZXN0UG9saWN5RmFjdG9yaWVzOiB0aGlzLmZhY3RvcmllcyxcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUGlwZWxpbmUgb2JqZWN0IHdpdGggQ3JlZGVudGlhbCBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtICBTdWNoIGFzIEFub255bW91c0NyZWRlbnRpYWwsIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIG9yIGFueSBjcmVkZW50aWFsIGZyb20gdGhlIGBAYXp1cmUvaWRlbnRpdHlgIHBhY2thZ2UgdG8gYXV0aGVudGljYXRlIHJlcXVlc3RzIHRvIHRoZSBzZXJ2aWNlLiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBUb2tlbkNyZWRlbnRpYWwgaW50ZXJmYWNlLiBJZiBub3Qgc3BlY2lmaWVkLCBBbm9ueW1vdXNDcmVkZW50aWFsIGlzIHVzZWQuXG4gKiBAcGFyYW0gcGlwZWxpbmVPcHRpb25zIC0gT3B0aW9uYWwuIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIG5ldyBQaXBlbGluZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdQaXBlbGluZShjcmVkZW50aWFsLCBwaXBlbGluZU9wdGlvbnMgPSB7fSkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoY3JlZGVudGlhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNyZWRlbnRpYWwgPSBuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpO1xuICAgIH1cbiAgICAvLyBPcmRlciBpcyBpbXBvcnRhbnQuIENsb3NlciB0byB0aGUgQVBJIGF0IHRoZSB0b3AgJiBjbG9zZXIgdG8gdGhlIG5ldHdvcmsgYXQgdGhlIGJvdHRvbS5cbiAgICAvLyBUaGUgY3JlZGVudGlhbCdzIHBvbGljeSBmYWN0b3J5IG11c3QgYXBwZWFyIGNsb3NlIHRvIHRoZSB3aXJlIHNvIGl0IGNhbiBzaWduIGFueVxuICAgIC8vIGNoYW5nZXMgbWFkZSBieSBvdGhlciBmYWN0b3JpZXMgKGxpa2UgVW5pcXVlUmVxdWVzdElEUG9saWN5RmFjdG9yeSlcbiAgICBjb25zdCB0ZWxlbWV0cnlQb2xpY3kgPSBuZXcgVGVsZW1ldHJ5UG9saWN5RmFjdG9yeShwaXBlbGluZU9wdGlvbnMudXNlckFnZW50T3B0aW9ucyk7XG4gICAgY29uc3QgZmFjdG9yaWVzID0gW1xuICAgICAgICB0cmFjaW5nUG9saWN5KHsgdXNlckFnZW50OiB0ZWxlbWV0cnlQb2xpY3kudGVsZW1ldHJ5U3RyaW5nIH0pLFxuICAgICAgICBrZWVwQWxpdmVQb2xpY3kocGlwZWxpbmVPcHRpb25zLmtlZXBBbGl2ZU9wdGlvbnMpLFxuICAgICAgICB0ZWxlbWV0cnlQb2xpY3ksXG4gICAgICAgIGdlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5KCksXG4gICAgICAgIG5ldyBTdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnkoKSxcbiAgICAgICAgbmV3IFN0b3JhZ2VSZXRyeVBvbGljeUZhY3RvcnkocGlwZWxpbmVPcHRpb25zLnJldHJ5T3B0aW9ucyksXG4gICAgICAgIC8vIERlZmF1bHQgZGVzZXJpYWxpemF0aW9uUG9saWN5IGlzIHByb3ZpZGVkIGJ5IHByb3RvY29sIGxheWVyXG4gICAgICAgIC8vIFVzZSBjdXN0b21pemVkIFhNTCBjaGFyIGtleSBvZiBcIiNcIiBzbyB3ZSBjb3VsZCBkZXNlcmlhbGl6ZSBtZXRhZGF0YVxuICAgICAgICAvLyB3aXRoIFwiX1wiIGtleVxuICAgICAgICBkZXNlcmlhbGl6YXRpb25Qb2xpY3kodW5kZWZpbmVkLCB7IHhtbENoYXJLZXk6IFwiI1wiIH0pLFxuICAgICAgICBsb2dQb2xpY3koe1xuICAgICAgICAgICAgbG9nZ2VyOiBsb2dnZXIuaW5mbyxcbiAgICAgICAgICAgIGFsbG93ZWRIZWFkZXJOYW1lczogU3RvcmFnZUJsb2JMb2dnaW5nQWxsb3dlZEhlYWRlck5hbWVzLFxuICAgICAgICAgICAgYWxsb3dlZFF1ZXJ5UGFyYW1ldGVyczogU3RvcmFnZUJsb2JMb2dnaW5nQWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgfSksXG4gICAgXTtcbiAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgIC8vIHBvbGljaWVzIG9ubHkgYXZhaWxhYmxlIGluIE5vZGUuanMgcnVudGltZSwgbm90IGluIGJyb3dzZXJzXG4gICAgICAgIGZhY3Rvcmllcy5wdXNoKHByb3h5UG9saWN5KHBpcGVsaW5lT3B0aW9ucy5wcm94eU9wdGlvbnMpKTtcbiAgICAgICAgZmFjdG9yaWVzLnB1c2goZGlzYWJsZVJlc3BvbnNlRGVjb21wcmVzc2lvblBvbGljeSgpKTtcbiAgICB9XG4gICAgZmFjdG9yaWVzLnB1c2goaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbClcbiAgICAgICAgPyBhdHRhY2hDcmVkZW50aWFsKHN0b3JhZ2VCZWFyZXJUb2tlbkNoYWxsZW5nZUF1dGhlbnRpY2F0aW9uUG9saWN5KGNyZWRlbnRpYWwsIChfYSA9IHBpcGVsaW5lT3B0aW9ucy5hdWRpZW5jZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogU3RvcmFnZU9BdXRoU2NvcGVzKSwgY3JlZGVudGlhbClcbiAgICAgICAgOiBjcmVkZW50aWFsKTtcbiAgICByZXR1cm4gbmV3IFBpcGVsaW5lKGZhY3RvcmllcywgcGlwZWxpbmVPcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpcGVsaW5lLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgSGVhZGVyQ29uc3RhbnRzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0VVJMUGF0aCwgZ2V0VVJMUXVlcmllcyB9IGZyb20gXCIuLi91dGlscy91dGlscy5jb21tb25cIjtcbmltcG9ydCB7IENyZWRlbnRpYWxQb2xpY3kgfSBmcm9tIFwiLi9DcmVkZW50aWFsUG9saWN5XCI7XG4vKipcbiAqIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5IGlzIGEgcG9saWN5IHVzZWQgdG8gc2lnbiBIVFRQIHJlcXVlc3Qgd2l0aCBhIHNoYXJlZCBrZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeSBleHRlbmRzIENyZWRlbnRpYWxQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kuXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKiBAcGFyYW0gZmFjdG9yeSAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgZmFjdG9yeSkge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2lnbnMgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBzaWduUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSGVhZGVyQ29uc3RhbnRzLlhfTVNfREFURSwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKTtcbiAgICAgICAgaWYgKHJlcXVlc3QuYm9keSAmJlxuICAgICAgICAgICAgKHR5cGVvZiByZXF1ZXN0LmJvZHkgPT09IFwic3RyaW5nXCIgfHwgcmVxdWVzdC5ib2R5ICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICByZXF1ZXN0LmJvZHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MRU5HVEgsIEJ1ZmZlci5ieXRlTGVuZ3RoKHJlcXVlc3QuYm9keSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IFtcbiAgICAgICAgICAgIHJlcXVlc3QubWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5DT05URU5UX0xBTkdVQUdFKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfRU5DT0RJTkcpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MRU5HVEgpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9NRDUpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9UWVBFKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkRBVEUpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuSUZfTU9ESUZJRURfU0lOQ0UpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuSUZfTUFUQ0gpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuSUZfTk9ORV9NQVRDSCksXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5JRl9VTk1PRElGSUVEX1NJTkNFKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLlJBTkdFKSxcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpICtcbiAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgdGhpcy5nZXRDYW5vbmljYWxpemVkSGVhZGVyc1N0cmluZyhyZXF1ZXN0KSArXG4gICAgICAgICAgICB0aGlzLmdldENhbm9uaWNhbGl6ZWRSZXNvdXJjZVN0cmluZyhyZXF1ZXN0KTtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5mYWN0b3J5LmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSGVhZGVyQ29uc3RhbnRzLkFVVEhPUklaQVRJT04sIGBTaGFyZWRLZXkgJHt0aGlzLmZhY3RvcnkuYWNjb3VudE5hbWV9OiR7c2lnbmF0dXJlfWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1VSTF06JHtyZXF1ZXN0LnVybH1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtIRUFERVJTXToke3JlcXVlc3QuaGVhZGVycy50b1N0cmluZygpfWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1NUUklORyBUTyBTSUdOXToke0pTT04uc3RyaW5naWZ5KHN0cmluZ1RvU2lnbil9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbS0VZXTogJHtyZXF1ZXN0LmhlYWRlcnMuZ2V0KEhlYWRlckNvbnN0YW50cy5BVVRIT1JJWkFUSU9OKX1gKTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGhlYWRlciB2YWx1ZSBhY2NvcmRpbmcgdG8gc2hhcmVkIGtleSBzaWduIHJ1bGVzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2F1dGhlbnRpY2F0ZS13aXRoLXNoYXJlZC1rZXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKiBAcGFyYW0gaGVhZGVyTmFtZSAtXG4gICAgICovXG4gICAgZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgaGVhZGVyTmFtZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlcXVlc3QuaGVhZGVycy5nZXQoaGVhZGVyTmFtZSk7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdXNpbmcgdmVyc2lvbiAyMDE1LTAyLTIxIG9yIGxhdGVyLCBpZiBDb250ZW50LUxlbmd0aCBpcyB6ZXJvLCB0aGVuXG4gICAgICAgIC8vIHNldCB0aGUgQ29udGVudC1MZW5ndGggcGFydCBvZiB0aGUgU3RyaW5nVG9TaWduIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2F1dGhlbnRpY2F0ZS13aXRoLXNoYXJlZC1rZXlcbiAgICAgICAgaWYgKGhlYWRlck5hbWUgPT09IEhlYWRlckNvbnN0YW50cy5DT05URU5UX0xFTkdUSCAmJiB2YWx1ZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gY29uc3RydWN0IHRoZSBDYW5vbmljYWxpemVkSGVhZGVycyBwb3J0aW9uIG9mIHRoZSBzaWduYXR1cmUgc3RyaW5nLCBmb2xsb3cgdGhlc2Ugc3RlcHM6XG4gICAgICogMS4gUmV0cmlldmUgYWxsIGhlYWRlcnMgZm9yIHRoZSByZXNvdXJjZSB0aGF0IGJlZ2luIHdpdGggeC1tcy0sIGluY2x1ZGluZyB0aGUgeC1tcy1kYXRlIGhlYWRlci5cbiAgICAgKiAyLiBDb252ZXJ0IGVhY2ggSFRUUCBoZWFkZXIgbmFtZSB0byBsb3dlcmNhc2UuXG4gICAgICogMy4gU29ydCB0aGUgaGVhZGVycyBsZXhpY29ncmFwaGljYWxseSBieSBoZWFkZXIgbmFtZSwgaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgICAqICAgIEVhY2ggaGVhZGVyIG1heSBhcHBlYXIgb25seSBvbmNlIGluIHRoZSBzdHJpbmcuXG4gICAgICogNC4gUmVwbGFjZSBhbnkgbGluZWFyIHdoaXRlc3BhY2UgaW4gdGhlIGhlYWRlciB2YWx1ZSB3aXRoIGEgc2luZ2xlIHNwYWNlLlxuICAgICAqIDUuIFRyaW0gYW55IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBjb2xvbiBpbiB0aGUgaGVhZGVyLlxuICAgICAqIDYuIEZpbmFsbHksIGFwcGVuZCBhIG5ldy1saW5lIGNoYXJhY3RlciB0byBlYWNoIGNhbm9uaWNhbGl6ZWQgaGVhZGVyIGluIHRoZSByZXN1bHRpbmcgbGlzdC5cbiAgICAgKiAgICBDb25zdHJ1Y3QgdGhlIENhbm9uaWNhbGl6ZWRIZWFkZXJzIHN0cmluZyBieSBjb25jYXRlbmF0aW5nIGFsbCBoZWFkZXJzIGluIHRoaXMgbGlzdCBpbnRvIGEgc2luZ2xlIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBnZXRDYW5vbmljYWxpemVkSGVhZGVyc1N0cmluZyhyZXF1ZXN0KSB7XG4gICAgICAgIGxldCBoZWFkZXJzQXJyYXkgPSByZXF1ZXN0LmhlYWRlcnMuaGVhZGVyc0FycmF5KCkuZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKEhlYWRlckNvbnN0YW50cy5QUkVGSVhfRk9SX1NUT1JBR0UpO1xuICAgICAgICB9KTtcbiAgICAgICAgaGVhZGVyc0FycmF5LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLm5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFJlbW92ZSBkdXBsaWNhdGUgaGVhZGVyc1xuICAgICAgICBoZWFkZXJzQXJyYXkgPSBoZWFkZXJzQXJyYXkuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIHZhbHVlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYXJyYXlbaW5kZXggLSAxXS5uYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjYW5vbmljYWxpemVkSGVhZGVyc1N0cmluZ1RvU2lnbiA9IFwiXCI7XG4gICAgICAgIGhlYWRlcnNBcnJheS5mb3JFYWNoKChoZWFkZXIpID0+IHtcbiAgICAgICAgICAgIGNhbm9uaWNhbGl6ZWRIZWFkZXJzU3RyaW5nVG9TaWduICs9IGAke2hlYWRlci5uYW1lXG4gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAudHJpbVJpZ2h0KCl9OiR7aGVhZGVyLnZhbHVlLnRyaW1MZWZ0KCl9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYW5vbmljYWxpemVkSGVhZGVyc1N0cmluZ1RvU2lnbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSB3ZWJSZXNvdXJjZSBjYW5vbmljYWxpemVkIHJlc291cmNlIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBnZXRDYW5vbmljYWxpemVkUmVzb3VyY2VTdHJpbmcocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0VVJMUGF0aChyZXF1ZXN0LnVybCkgfHwgXCIvXCI7XG4gICAgICAgIGxldCBjYW5vbmljYWxpemVkUmVzb3VyY2VTdHJpbmcgPSBcIlwiO1xuICAgICAgICBjYW5vbmljYWxpemVkUmVzb3VyY2VTdHJpbmcgKz0gYC8ke3RoaXMuZmFjdG9yeS5hY2NvdW50TmFtZX0ke3BhdGh9YDtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IGdldFVSTFF1ZXJpZXMocmVxdWVzdC51cmwpO1xuICAgICAgICBjb25zdCBsb3dlcmNhc2VRdWVyaWVzID0ge307XG4gICAgICAgIGlmIChxdWVyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHF1ZXJpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHF1ZXJpZXMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93ZXJjYXNlS2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGxvd2VyY2FzZVF1ZXJpZXNbbG93ZXJjYXNlS2V5XSA9IHF1ZXJpZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlLZXlzLnB1c2gobG93ZXJjYXNlS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVyeUtleXMuc29ydCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcXVlcnlLZXlzKSB7XG4gICAgICAgICAgICAgICAgY2Fub25pY2FsaXplZFJlc291cmNlU3RyaW5nICs9IGBcXG4ke2tleX06JHtkZWNvZGVVUklDb21wb25lbnQobG93ZXJjYXNlUXVlcmllc1trZXldKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5vbmljYWxpemVkUmVzb3VyY2VTdHJpbmc7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBjcmVhdGVIbWFjIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kgfSBmcm9tIFwiLi4vcG9saWNpZXMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3lcIjtcbmltcG9ydCB7IENyZWRlbnRpYWwgfSBmcm9tIFwiLi9DcmVkZW50aWFsXCI7XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCBmb3IgYWNjb3VudCBrZXkgYXV0aG9yaXphdGlvbiBvZiBBenVyZSBTdG9yYWdlIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCBleHRlbmRzIENyZWRlbnRpYWwge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwuXG4gICAgICogQHBhcmFtIGFjY291bnROYW1lIC1cbiAgICAgKiBAcGFyYW0gYWNjb3VudEtleSAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYWNjb3VudE5hbWUsIGFjY291bnRLZXkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hY2NvdW50TmFtZSA9IGFjY291bnROYW1lO1xuICAgICAgICB0aGlzLmFjY291bnRLZXkgPSBCdWZmZXIuZnJvbShhY2NvdW50S2V5LCBcImJhc2U2NFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgY3JlYXRlKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgaGFzaCBzaWduYXR1cmUgZm9yIGFuIEhUVFAgcmVxdWVzdCBvciBmb3IgYSBTQVMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nVG9TaWduIC1cbiAgICAgKi9cbiAgICBjb21wdXRlSE1BQ1NIQTI1NihzdHJpbmdUb1NpZ24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUhtYWMoXCJzaGEyNTZcIiwgdGhpcy5hY2NvdW50S2V5KS51cGRhdGUoc3RyaW5nVG9TaWduLCBcInV0ZjhcIikuZGlnZXN0KFwiYmFzZTY0XCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgVVJMQnVpbGRlciB9IGZyb20gXCIuLi91cmxcIjtcbi8qKlxuICogTWV0aG9kcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGZvbGxvdyByZWRpcmVjdHMgMzAxIGFuZCAzMDJcbiAqL1xuY29uc3QgYWxsb3dlZFJlZGlyZWN0ID0gW1wiR0VUXCIsIFwiSEVBRFwiXTtcbmV4cG9ydCBjb25zdCBEZWZhdWx0UmVkaXJlY3RPcHRpb25zID0ge1xuICAgIGhhbmRsZVJlZGlyZWN0czogdHJ1ZSxcbiAgICBtYXhSZXRyaWVzOiAyMCxcbn07XG4vKipcbiAqIENyZWF0ZXMgYSByZWRpcmVjdCBwb2xpY3ksIHdoaWNoIHNlbmRzIGEgcmVwZWF0cyB0aGUgcmVxdWVzdCB0byBhIG5ldyBkZXN0aW5hdGlvbiBpZiBhIHJlc3BvbnNlIGFycml2ZXMgd2l0aCBhIFwibG9jYXRpb25cIiBoZWFkZXIsIGFuZCBhIHN0YXR1cyBjb2RlIGJldHdlZW4gMzAwIGFuZCAzMDcuXG4gKiBAcGFyYW0gbWF4aW11bVJldHJpZXMgLSBNYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHMgdG8gZm9sbG93LlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBSZWRpcmVjdFBvbGljeX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGlyZWN0UG9saWN5KG1heGltdW1SZXRyaWVzID0gMjApIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IChuZXh0UG9saWN5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZGlyZWN0UG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMsIG1heGltdW1SZXRyaWVzKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBSZXNlbmRzIHRoZSByZXF1ZXN0IHRvIGEgbmV3IGRlc3RpbmF0aW9uIGlmIGEgcmVzcG9uc2UgYXJyaXZlcyB3aXRoIGEgXCJsb2NhdGlvblwiIGhlYWRlciwgYW5kIGEgc3RhdHVzIGNvZGUgYmV0d2VlbiAzMDAgYW5kIDMwNy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZGlyZWN0UG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIG1heFJldHJpZXMgPSAyMCkge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5tYXhSZXRyaWVzID0gbWF4UmV0cmllcztcbiAgICB9XG4gICAgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeVxuICAgICAgICAgICAgLnNlbmRSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IGhhbmRsZVJlZGlyZWN0KHRoaXMsIHJlc3BvbnNlLCAwKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlUmVkaXJlY3QocG9saWN5LCByZXNwb25zZSwgY3VycmVudFJldHJpZXMpIHtcbiAgICBjb25zdCB7IHJlcXVlc3QsIHN0YXR1cyB9ID0gcmVzcG9uc2U7XG4gICAgY29uc3QgbG9jYXRpb25IZWFkZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImxvY2F0aW9uXCIpO1xuICAgIGlmIChsb2NhdGlvbkhlYWRlciAmJlxuICAgICAgICAoc3RhdHVzID09PSAzMDAgfHxcbiAgICAgICAgICAgIChzdGF0dXMgPT09IDMwMSAmJiBhbGxvd2VkUmVkaXJlY3QuaW5jbHVkZXMocmVxdWVzdC5tZXRob2QpKSB8fFxuICAgICAgICAgICAgKHN0YXR1cyA9PT0gMzAyICYmIGFsbG93ZWRSZWRpcmVjdC5pbmNsdWRlcyhyZXF1ZXN0Lm1ldGhvZCkpIHx8XG4gICAgICAgICAgICAoc3RhdHVzID09PSAzMDMgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiUE9TVFwiKSB8fFxuICAgICAgICAgICAgc3RhdHVzID09PSAzMDcpICYmXG4gICAgICAgICghcG9saWN5Lm1heFJldHJpZXMgfHwgY3VycmVudFJldHJpZXMgPCBwb2xpY3kubWF4UmV0cmllcykpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IFVSTEJ1aWxkZXIucGFyc2UocmVxdWVzdC51cmwpO1xuICAgICAgICBidWlsZGVyLnNldFBhdGgobG9jYXRpb25IZWFkZXIpO1xuICAgICAgICByZXF1ZXN0LnVybCA9IGJ1aWxkZXIudG9TdHJpbmcoKTtcbiAgICAgICAgLy8gUE9TVCByZXF1ZXN0IHdpdGggU3RhdHVzIGNvZGUgMzAzIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byBhXG4gICAgICAgIC8vIHJlZGlyZWN0ZWQgR0VUIHJlcXVlc3QgaWYgdGhlIHJlZGlyZWN0IHVybCBpcyBwcmVzZW50IGluIHRoZSBsb2NhdGlvbiBoZWFkZXJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMzAzKSB7XG4gICAgICAgICAgICByZXF1ZXN0Lm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICBkZWxldGUgcmVxdWVzdC5ib2R5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb2xpY3kuX25leHRQb2xpY3lcbiAgICAgICAgICAgIC5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4gaGFuZGxlUmVkaXJlY3QocG9saWN5LCByZXMsIGN1cnJlbnRSZXRyaWVzICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZGlyZWN0UG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0xJRU5UX1JFVFJZX0NPVU5UID0gMztcbi8vIGludGVydmFscyBhcmUgaW4gbXNcbmV4cG9ydCBjb25zdCBERUZBVUxUX0NMSUVOVF9SRVRSWV9JTlRFUlZBTCA9IDEwMDAgKiAzMDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0NMSUVOVF9NQVhfUkVUUllfSU5URVJWQUwgPSAxMDAwICogOTA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9DTElFTlRfTUlOX1JFVFJZX0lOVEVSVkFMID0gMTAwMCAqIDM7XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIobikge1xuICAgIHJldHVybiB0eXBlb2YgbiA9PT0gXCJudW1iZXJcIjtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHJldHJpZWQuXG4gKlxuICogQHBhcmFtIHJldHJ5TGltaXQgLSBTcGVjaWZpZXMgdGhlIG1heCBudW1iZXIgb2YgcmV0cmllcy5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBJbml0aWFsIGNoZWtjayBvbiB3aGV0aGVyIHRvIHJldHJ5IGJhc2VkIG9uIGdpdmVuIHJlc3BvbnNlcyBvciBlcnJvcnNcbiAqIEBwYXJhbSByZXRyeURhdGEgLSAgVGhlIHJldHJ5IGRhdGEuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvcGVyYXRpb24gcXVhbGlmaWVzIGZvciBhIHJldHJ5OyBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXRyeShyZXRyeUxpbWl0LCBwcmVkaWNhdGUsIHJldHJ5RGF0YSwgcmVzcG9uc2UsIGVycm9yKSB7XG4gICAgaWYgKCFwcmVkaWNhdGUocmVzcG9uc2UsIGVycm9yKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiByZXRyeURhdGEucmV0cnlDb3VudCA8IHJldHJ5TGltaXQ7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICogVXBkYXRlcyB0aGUgcmV0cnkgZGF0YSBmb3IgdGhlIG5leHQgYXR0ZW1wdC5cbiAqXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gc3BlY2lmaWVzIHJldHJ5IGludGVydmFsLCBhbmQgaXRzIGxvd2VyIGJvdW5kIGFuZCB1cHBlciBib3VuZC5cbiAqIEBwYXJhbSByZXRyeURhdGEgLSAgVGhlIHJldHJ5IGRhdGEuXG4gKiBAcGFyYW0gZXJyIC0gVGhlIG9wZXJhdGlvblwicyBlcnJvciwgaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUmV0cnlEYXRhKHJldHJ5T3B0aW9ucywgcmV0cnlEYXRhID0geyByZXRyeUNvdW50OiAwLCByZXRyeUludGVydmFsOiAwIH0sIGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKHJldHJ5RGF0YS5lcnJvcikge1xuICAgICAgICAgICAgZXJyLmlubmVyRXJyb3IgPSByZXRyeURhdGEuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0cnlEYXRhLmVycm9yID0gZXJyO1xuICAgIH1cbiAgICAvLyBBZGp1c3QgcmV0cnkgY291bnRcbiAgICByZXRyeURhdGEucmV0cnlDb3VudCsrO1xuICAgIC8vIEFkanVzdCByZXRyeSBpbnRlcnZhbFxuICAgIGxldCBpbmNyZW1lbnREZWx0YSA9IE1hdGgucG93KDIsIHJldHJ5RGF0YS5yZXRyeUNvdW50IC0gMSkgLSAxO1xuICAgIGNvbnN0IGJvdW5kZWRSYW5kRGVsdGEgPSByZXRyeU9wdGlvbnMucmV0cnlJbnRlcnZhbCAqIDAuOCArXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChyZXRyeU9wdGlvbnMucmV0cnlJbnRlcnZhbCAqIDAuNCkpO1xuICAgIGluY3JlbWVudERlbHRhICo9IGJvdW5kZWRSYW5kRGVsdGE7XG4gICAgcmV0cnlEYXRhLnJldHJ5SW50ZXJ2YWwgPSBNYXRoLm1pbihyZXRyeU9wdGlvbnMubWluUmV0cnlJbnRlcnZhbCArIGluY3JlbWVudERlbHRhLCByZXRyeU9wdGlvbnMubWF4UmV0cnlJbnRlcnZhbCk7XG4gICAgcmV0dXJuIHJldHJ5RGF0YTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4cG9uZW50aWFsQmFja29mZlN0cmF0ZWd5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0lOVEVSVkFMLCBERUZBVUxUX0NMSUVOVF9SRVRSWV9DT1VOVCwgREVGQVVMVF9DTElFTlRfUkVUUllfSU5URVJWQUwsIGlzTnVtYmVyLCBzaG91bGRSZXRyeSwgdXBkYXRlUmV0cnlEYXRhLCB9IGZyb20gXCIuLi91dGlsL2V4cG9uZW50aWFsQmFja29mZlN0cmF0ZWd5XCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vdXRpbC9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlc3RFcnJvciB9IGZyb20gXCIuLi9yZXN0RXJyb3JcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIkBhenVyZS9jb3JlLXV0aWxcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9sb2dcIjtcbi8qKlxuICogUG9saWN5IHRoYXQgcmV0cmllcyB0aGUgcmVxdWVzdCBhcyBtYW55IHRpbWVzIGFzIGNvbmZpZ3VyZWQgZm9yIGFzIGxvbmcgYXMgdGhlIG1heCByZXRyeSB0aW1lIGludGVydmFsIHNwZWNpZmllZCwgZWFjaCByZXRyeSB3YWl0aW5nIGxvbmdlciB0byBiZWdpbiB0aGFuIHRoZSBsYXN0IHRpbWUuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAtIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlJbnRlcnZhbCAtIEJhc2UgdGltZSBiZXR3ZWVuIHJldHJpZXMuXG4gKiBAcGFyYW0gbWF4UmV0cnlJbnRlcnZhbCAtIE1heGltdW0gdGltZSB0byB3YWl0IGJldHdlZW4gcmV0cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50aWFsUmV0cnlQb2xpY3kocmV0cnlDb3VudCwgcmV0cnlJbnRlcnZhbCwgbWF4UmV0cnlJbnRlcnZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwb25lbnRpYWxSZXRyeVBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCByZXRyeUNvdW50LCByZXRyeUludGVydmFsLCBtYXhSZXRyeUludGVydmFsKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIFJldHJ5IE1vZGUgdHlwZS4gQ3VycmVudGx5IHN1cHBvcnRpbmcgb25seSBFeHBvbmVudGlhbC5cbiAqL1xuZXhwb3J0IHZhciBSZXRyeU1vZGU7XG4oZnVuY3Rpb24gKFJldHJ5TW9kZSkge1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnRseSBzdXBwb3J0ZWQgcmV0cnkgbW9kZS5cbiAgICAgKiBFYWNoIHRpbWUgYSByZXRyeSBoYXBwZW5zLCBpdCB3aWxsIHRha2UgZXhwb25lbnRpYWxseSBtb3JlIHRpbWUgdGhhbiB0aGUgbGFzdCB0aW1lLlxuICAgICAqL1xuICAgIFJldHJ5TW9kZVtSZXRyeU1vZGVbXCJFeHBvbmVudGlhbFwiXSA9IDBdID0gXCJFeHBvbmVudGlhbFwiO1xufSkoUmV0cnlNb2RlIHx8IChSZXRyeU1vZGUgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IERlZmF1bHRSZXRyeU9wdGlvbnMgPSB7XG4gICAgbWF4UmV0cmllczogREVGQVVMVF9DTElFTlRfUkVUUllfQ09VTlQsXG4gICAgcmV0cnlEZWxheUluTXM6IERFRkFVTFRfQ0xJRU5UX1JFVFJZX0lOVEVSVkFMLFxuICAgIG1heFJldHJ5RGVsYXlJbk1zOiBERUZBVUxUX0NMSUVOVF9NQVhfUkVUUllfSU5URVJWQUwsXG59O1xuLyoqXG4gKiBJbnN0YW50aWF0ZXMgYSBuZXcgXCJFeHBvbmVudGlhbFJldHJ5UG9saWN5RmlsdGVyXCIgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHBvbmVudGlhbFJldHJ5UG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC0gVGhlIG5leHQgUmVxdWVzdFBvbGljeSBpbiB0aGUgcGlwZWxpbmUgY2hhaW4uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhpcyBSZXF1ZXN0UG9saWN5LlxuICAgICAqIEBwYXJhbSByZXRyeUNvdW50IC0gVGhlIGNsaWVudCByZXRyeSBjb3VudC5cbiAgICAgKiBAcGFyYW0gcmV0cnlJbnRlcnZhbCAtIFRoZSBjbGllbnQgcmV0cnkgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKiBAcGFyYW0gbWluUmV0cnlJbnRlcnZhbCAtIFRoZSBtaW5pbXVtIHJldHJ5IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gICAgICogQHBhcmFtIG1heFJldHJ5SW50ZXJ2YWwgLSBUaGUgbWF4aW11bSByZXRyeSBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIHJldHJ5Q291bnQsIHJldHJ5SW50ZXJ2YWwsIG1heFJldHJ5SW50ZXJ2YWwpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMucmV0cnlDb3VudCA9IGlzTnVtYmVyKHJldHJ5Q291bnQpID8gcmV0cnlDb3VudCA6IERFRkFVTFRfQ0xJRU5UX1JFVFJZX0NPVU5UO1xuICAgICAgICB0aGlzLnJldHJ5SW50ZXJ2YWwgPSBpc051bWJlcihyZXRyeUludGVydmFsKSA/IHJldHJ5SW50ZXJ2YWwgOiBERUZBVUxUX0NMSUVOVF9SRVRSWV9JTlRFUlZBTDtcbiAgICAgICAgdGhpcy5tYXhSZXRyeUludGVydmFsID0gaXNOdW1iZXIobWF4UmV0cnlJbnRlcnZhbClcbiAgICAgICAgICAgID8gbWF4UmV0cnlJbnRlcnZhbFxuICAgICAgICAgICAgOiBERUZBVUxUX0NMSUVOVF9NQVhfUkVUUllfSU5URVJWQUw7XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3lcbiAgICAgICAgICAgIC5zZW5kUmVxdWVzdChyZXF1ZXN0LmNsb25lKCkpXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHJldHJ5KHRoaXMsIHJlcXVlc3QsIHJlc3BvbnNlKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHJldHJ5KHRoaXMsIHJlcXVlc3QsIGVycm9yLnJlc3BvbnNlLCB1bmRlZmluZWQsIGVycm9yKSk7XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcmV0cnkocG9saWN5LCByZXF1ZXN0LCByZXNwb25zZSwgcmV0cnlEYXRhLCByZXF1ZXN0RXJyb3IpIHtcbiAgICBmdW5jdGlvbiBzaG91bGRQb2xpY3lSZXRyeShyZXNwb25zZVBhcmFtKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXNwb25zZVBhcmFtID09PSBudWxsIHx8IHJlc3BvbnNlUGFyYW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3BvbnNlUGFyYW0uc3RhdHVzO1xuICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNTAzICYmIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzcG9uc2UuaGVhZGVycy5nZXQoQ29uc3RhbnRzLkhlYWRlckNvbnN0YW50cy5SRVRSWV9BRlRFUikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKHN0YXR1c0NvZGUgPCA1MDAgJiYgc3RhdHVzQ29kZSAhPT0gNDA4KSB8fFxuICAgICAgICAgICAgc3RhdHVzQ29kZSA9PT0gNTAxIHx8XG4gICAgICAgICAgICBzdGF0dXNDb2RlID09PSA1MDUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0cnlEYXRhID0gdXBkYXRlUmV0cnlEYXRhKHtcbiAgICAgICAgcmV0cnlJbnRlcnZhbDogcG9saWN5LnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgIG1pblJldHJ5SW50ZXJ2YWw6IDAsXG4gICAgICAgIG1heFJldHJ5SW50ZXJ2YWw6IHBvbGljeS5tYXhSZXRyeUludGVydmFsLFxuICAgIH0sIHJldHJ5RGF0YSwgcmVxdWVzdEVycm9yKTtcbiAgICBjb25zdCBpc0Fib3J0ZWQgPSByZXF1ZXN0LmFib3J0U2lnbmFsICYmIHJlcXVlc3QuYWJvcnRTaWduYWwuYWJvcnRlZDtcbiAgICBpZiAoIWlzQWJvcnRlZCAmJiBzaG91bGRSZXRyeShwb2xpY3kucmV0cnlDb3VudCwgc2hvdWxkUG9saWN5UmV0cnksIHJldHJ5RGF0YSwgcmVzcG9uc2UpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeWluZyByZXF1ZXN0IGluICR7cmV0cnlEYXRhLnJldHJ5SW50ZXJ2YWx9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShyZXRyeURhdGEucmV0cnlJbnRlcnZhbCk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBwb2xpY3kuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdC5jbG9uZSgpKTtcbiAgICAgICAgICAgIHJldHVybiByZXRyeShwb2xpY3ksIHJlcXVlc3QsIHJlcywgcmV0cnlEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0cnkocG9saWN5LCByZXF1ZXN0LCByZXNwb25zZSwgcmV0cnlEYXRhLCBlcnIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQWJvcnRlZCB8fCByZXF1ZXN0RXJyb3IgfHwgIXJlc3BvbnNlKSB7XG4gICAgICAgIC8vIElmIHRoZSBvcGVyYXRpb24gZmFpbGVkIGluIHRoZSBlbmQsIHJldHVybiBhbGwgZXJyb3JzIGluc3RlYWQgb2YganVzdCB0aGUgbGFzdCBvbmVcbiAgICAgICAgY29uc3QgZXJyID0gcmV0cnlEYXRhLmVycm9yIHx8XG4gICAgICAgICAgICBuZXcgUmVzdEVycm9yKFwiRmFpbGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QuXCIsIFJlc3RFcnJvci5SRVFVRVNUX1NFTkRfRVJST1IsIHJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UgJiYgcmVzcG9uc2UucmVxdWVzdCwgcmVzcG9uc2UpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwb25lbnRpYWxSZXRyeVBvbGljeS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIHRoaXMgcGFyYW1ldGVyJ3MgdmFsdWUgYXMgYSBkb3R0ZWQgc3RyaW5nIChhLmIuYykuXG4gKiBAcGFyYW0gcGFyYW1ldGVyIC0gVGhlIHBhcmFtZXRlciB0byBnZXQgdGhlIHBhdGggc3RyaW5nIGZvci5cbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoaXMgcGFyYW1ldGVyJ3MgdmFsdWUgYXMgYSBkb3R0ZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXIocGFyYW1ldGVyKSB7XG4gICAgcmV0dXJuIGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyUGF0aChwYXJhbWV0ZXIucGFyYW1ldGVyUGF0aCwgcGFyYW1ldGVyLm1hcHBlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXJQYXRoKHBhcmFtZXRlclBhdGgsIG1hcHBlcikge1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJQYXRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJlc3VsdCA9IHBhcmFtZXRlclBhdGg7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1ldGVyUGF0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gcGFyYW1ldGVyUGF0aC5qb2luKFwiLlwiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IG1hcHBlci5zZXJpYWxpemVkTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvblBhcmFtZXRlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IE1hcHBlclR5cGUgfSBmcm9tIFwiLi9zZXJpYWxpemVyXCI7XG4vKipcbiAqIEdldHMgdGhlIGxpc3Qgb2Ygc3RhdHVzIGNvZGVzIGZvciBzdHJlYW1pbmcgcmVzcG9uc2VzLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzKG9wZXJhdGlvblNwZWMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBzdGF0dXNDb2RlIGluIG9wZXJhdGlvblNwZWMucmVzcG9uc2VzKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvblJlc3BvbnNlID0gb3BlcmF0aW9uU3BlYy5yZXNwb25zZXNbc3RhdHVzQ29kZV07XG4gICAgICAgIGlmIChvcGVyYXRpb25SZXNwb25zZS5ib2R5TWFwcGVyICYmXG4gICAgICAgICAgICBvcGVyYXRpb25SZXNwb25zZS5ib2R5TWFwcGVyLnR5cGUubmFtZSA9PT0gTWFwcGVyVHlwZS5TdHJlYW0pIHtcbiAgICAgICAgICAgIHJlc3VsdC5hZGQoTnVtYmVyKHN0YXR1c0NvZGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlcmF0aW9uU3BlYy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uL3V0aWwvY29uc3RhbnRzXCI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFVzZXJBZ2VudEtleSgpIHtcbiAgICByZXR1cm4gQ29uc3RhbnRzLkhlYWRlckNvbnN0YW50cy5VU0VSX0FHRU5UO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBsYXRmb3JtU3BlY2lmaWNEYXRhKCkge1xuICAgIGNvbnN0IHJ1bnRpbWVJbmZvID0ge1xuICAgICAgICBrZXk6IFwiTm9kZVwiLFxuICAgICAgICB2YWx1ZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgIH07XG4gICAgY29uc3Qgb3NJbmZvID0ge1xuICAgICAgICBrZXk6IFwiT1NcIixcbiAgICAgICAgdmFsdWU6IGAoJHtvcy5hcmNoKCl9LSR7b3MudHlwZSgpfS0ke29zLnJlbGVhc2UoKX0pYCxcbiAgICB9O1xuICAgIHJldHVybiBbcnVudGltZUluZm8sIG9zSW5mb107XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tc1Jlc3RVc2VyQWdlbnRQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiLi9yZXF1ZXN0UG9saWN5XCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0VXNlckFnZW50S2V5LCBnZXRQbGF0Zm9ybVNwZWNpZmljRGF0YSB9IGZyb20gXCIuL21zUmVzdFVzZXJBZ2VudFBvbGljeVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uL3V0aWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBIdHRwSGVhZGVycyB9IGZyb20gXCIuLi9odHRwSGVhZGVyc1wiO1xuZnVuY3Rpb24gZ2V0UnVudGltZUluZm8oKSB7XG4gICAgY29uc3QgbXNSZXN0UnVudGltZSA9IHtcbiAgICAgICAga2V5OiBcImNvcmUtaHR0cFwiLFxuICAgICAgICB2YWx1ZTogQ29uc3RhbnRzLmNvcmVIdHRwVmVyc2lvbixcbiAgICB9O1xuICAgIHJldHVybiBbbXNSZXN0UnVudGltZV07XG59XG5mdW5jdGlvbiBnZXRVc2VyQWdlbnRTdHJpbmcodGVsZW1ldHJ5SW5mbywga2V5U2VwYXJhdG9yID0gXCIgXCIsIHZhbHVlU2VwYXJhdG9yID0gXCIvXCIpIHtcbiAgICByZXR1cm4gdGVsZW1ldHJ5SW5mb1xuICAgICAgICAubWFwKChpbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaW5mby52YWx1ZSA/IGAke3ZhbHVlU2VwYXJhdG9yfSR7aW5mby52YWx1ZX1gIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIGAke2luZm8ua2V5fSR7dmFsdWV9YDtcbiAgICB9KVxuICAgICAgICAuam9pbihrZXlTZXBhcmF0b3IpO1xufVxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRVc2VyQWdlbnRIZWFkZXJOYW1lID0gZ2V0RGVmYXVsdFVzZXJBZ2VudEtleTtcbi8qKlxuICogVGhlIGRlZmF1bHQgYXBwcm9hY2ggdG8gZ2VuZXJhdGUgdXNlciBhZ2VudHMuXG4gKiBVc2VzIHN0YXRpYyBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgcGFja2FnZSwgcGx1cyBzeXN0ZW0gaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZyb20gdGhlIHJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VXNlckFnZW50VmFsdWUoKSB7XG4gICAgY29uc3QgcnVudGltZUluZm8gPSBnZXRSdW50aW1lSW5mbygpO1xuICAgIGNvbnN0IHBsYXRmb3JtU3BlY2lmaWNEYXRhID0gZ2V0UGxhdGZvcm1TcGVjaWZpY0RhdGEoKTtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSBnZXRVc2VyQWdlbnRTdHJpbmcocnVudGltZUluZm8uY29uY2F0KHBsYXRmb3JtU3BlY2lmaWNEYXRhKSk7XG4gICAgcmV0dXJuIHVzZXJBZ2VudDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHBvbGljeSB0aGF0IGFkZHMgdGhlIHVzZXIgYWdlbnQgaGVhZGVyIHRvIG91dGdvaW5nIHJlcXVlc3RzIGJhc2VkIG9uIHRoZSBnaXZlbiB7QGxpbmsgVGVsZW1ldHJ5SW5mb30uXG4gKiBAcGFyYW0gdXNlckFnZW50RGF0YSAtIFRlbGVtZXRyeSBpbmZvcm1hdGlvbi5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBVc2VyQWdlbnRQb2xpY3l9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlckFnZW50UG9saWN5KHVzZXJBZ2VudERhdGEpIHtcbiAgICBjb25zdCBrZXkgPSAhdXNlckFnZW50RGF0YSB8fCB1c2VyQWdlbnREYXRhLmtleSA9PT0gdW5kZWZpbmVkIHx8IHVzZXJBZ2VudERhdGEua2V5ID09PSBudWxsXG4gICAgICAgID8gZ2V0RGVmYXVsdFVzZXJBZ2VudEtleSgpXG4gICAgICAgIDogdXNlckFnZW50RGF0YS5rZXk7XG4gICAgY29uc3QgdmFsdWUgPSAhdXNlckFnZW50RGF0YSB8fCB1c2VyQWdlbnREYXRhLnZhbHVlID09PSB1bmRlZmluZWQgfHwgdXNlckFnZW50RGF0YS52YWx1ZSA9PT0gbnVsbFxuICAgICAgICA/IGdldERlZmF1bHRVc2VyQWdlbnRWYWx1ZSgpXG4gICAgICAgIDogdXNlckFnZW50RGF0YS52YWx1ZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IChuZXh0UG9saWN5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVzZXJBZ2VudFBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBBIHBvbGljeSB0aGF0IGFkZHMgdGhlIHVzZXIgYWdlbnQgaGVhZGVyIHRvIG91dGdvaW5nIHJlcXVlc3RzIGJhc2VkIG9uIHRoZSBnaXZlbiB7QGxpbmsgVGVsZW1ldHJ5SW5mb30uXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQWdlbnRQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgY29uc3RydWN0b3IoX25leHRQb2xpY3ksIF9vcHRpb25zLCBoZWFkZXJLZXksIGhlYWRlclZhbHVlKSB7XG4gICAgICAgIHN1cGVyKF9uZXh0UG9saWN5LCBfb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX25leHRQb2xpY3kgPSBfbmV4dFBvbGljeTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLmhlYWRlcktleSA9IGhlYWRlcktleTtcbiAgICAgICAgdGhpcy5oZWFkZXJWYWx1ZSA9IGhlYWRlclZhbHVlO1xuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHRoaXMuYWRkVXNlckFnZW50SGVhZGVyKHJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgdXNlciBhZ2VudCBoZWFkZXIgdG8gdGhlIG91dGdvaW5nIHJlcXVlc3QuXG4gICAgICovXG4gICAgYWRkVXNlckFnZW50SGVhZGVyKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVxdWVzdC5oZWFkZXJzLmdldCh0aGlzLmhlYWRlcktleSkgJiYgdGhpcy5oZWFkZXJWYWx1ZSkge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldCh0aGlzLmhlYWRlcktleSwgdGhpcy5oZWFkZXJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VyQWdlbnRQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiLi4vcG9saWNpZXMvcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uL3V0aWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJAYXp1cmUvY29yZS11dGlsXCI7XG4vLyBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBjeWNsZXIgaWYgbm9uZSBhcmUgcHJvdmlkZWRcbmV4cG9ydCBjb25zdCBERUZBVUxUX0NZQ0xFUl9PUFRJT05TID0ge1xuICAgIGZvcmNlZFJlZnJlc2hXaW5kb3dJbk1zOiAxMDAwLFxuICAgIHJldHJ5SW50ZXJ2YWxJbk1zOiAzMDAwLFxuICAgIHJlZnJlc2hXaW5kb3dJbk1zOiAxMDAwICogNjAgKiAyLCAvLyBTdGFydCByZWZyZXNoaW5nIDJtIGJlZm9yZSBleHBpcnlcbn07XG4vKipcbiAqIENvbnZlcnRzIGFuIGFuIHVucmVsaWFibGUgYWNjZXNzIHRva2VuIGdldHRlciAod2hpY2ggbWF5IHJlc29sdmUgd2l0aCBudWxsKVxuICogaW50byBhbiBBY2Nlc3NUb2tlbkdldHRlciBieSByZXRyeWluZyB0aGUgdW5yZWxpYWJsZSBnZXR0ZXIgaW4gYSByZWd1bGFyXG4gKiBpbnRlcnZhbC5cbiAqXG4gKiBAcGFyYW0gZ2V0QWNjZXNzVG9rZW4gLSBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBwcm9taXNlIG9mIGFuIGFjY2Vzc1xuICogdG9rZW4gdGhhdCBtYXkgZmFpbCBieSByZXR1cm5pbmcgbnVsbFxuICogQHBhcmFtIHJldHJ5SW50ZXJ2YWxJbk1zIC0gdGhlIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdG8gd2FpdCBiZXR3ZWVuIHJldHJ5XG4gKiBhdHRlbXB0c1xuICogQHBhcmFtIHRpbWVvdXRJbk1zIC0gdGhlIHRpbWVzdGFtcCBhZnRlciB3aGljaCB0aGUgcmVmcmVzaCBhdHRlbXB0IHdpbGwgZmFpbCxcbiAqIHRocm93aW5nIGFuIGV4Y2VwdGlvblxuICogQHJldHVybnMgLSBhIHByb21pc2UgdGhhdCwgaWYgaXQgcmVzb2x2ZXMsIHdpbGwgcmVzb2x2ZSB3aXRoIGFuIGFjY2VzcyB0b2tlblxuICovXG5hc3luYyBmdW5jdGlvbiBiZWdpblJlZnJlc2goZ2V0QWNjZXNzVG9rZW4sIHJldHJ5SW50ZXJ2YWxJbk1zLCB0aW1lb3V0SW5Ncykge1xuICAgIC8vIFRoaXMgd3JhcHBlciBoYW5kbGVzIGV4Y2VwdGlvbnMgZ3JhY2VmdWxseSBhcyBsb25nIGFzIHdlIGhhdmVuJ3QgZXhjZWVkZWRcbiAgICAvLyB0aGUgdGltZW91dC5cbiAgICBhc3luYyBmdW5jdGlvbiB0cnlHZXRBY2Nlc3NUb2tlbigpIHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgPCB0aW1lb3V0SW5Ncykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgICAgICAgICAvLyBUaW1lb3V0IGlzIHVwLCBzbyB0aHJvdyBpZiBpdCdzIHN0aWxsIG51bGxcbiAgICAgICAgICAgIGlmIChmaW5hbFRva2VuID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlZnJlc2ggYWNjZXNzIHRva2VuLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmaW5hbFRva2VuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB0b2tlbiA9IGF3YWl0IHRyeUdldEFjY2Vzc1Rva2VuKCk7XG4gICAgd2hpbGUgKHRva2VuID09PSBudWxsKSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KHJldHJ5SW50ZXJ2YWxJbk1zKTtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCB0cnlHZXRBY2Nlc3NUb2tlbigpO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG59XG4vKipcbiAqIENyZWF0ZXMgYSB0b2tlbiBjeWNsZXIgZnJvbSBhIGNyZWRlbnRpYWwsIHNjb3BlcywgYW5kIG9wdGlvbmFsIHNldHRpbmdzLlxuICpcbiAqIEEgdG9rZW4gY3ljbGVyIHJlcHJlc2VudHMgYSB3YXkgdG8gcmVsaWFibHkgcmV0cmlldmUgYSB2YWxpZCBhY2Nlc3MgdG9rZW5cbiAqIGZyb20gYSBUb2tlbkNyZWRlbnRpYWwuIEl0IHdpbGwgaGFuZGxlIGluaXRpYWxpemluZyB0aGUgdG9rZW4sIHJlZnJlc2hpbmcgaXRcbiAqIHdoZW4gaXQgbmVhcnMgZXhwaXJhdGlvbiwgYW5kIHN5bmNocm9uaXplcyByZWZyZXNoIGF0dGVtcHRzIHRvIGF2b2lkXG4gKiBjb25jdXJyZW5jeSBoYXphcmRzLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gdGhlIHVuZGVybHlpbmcgVG9rZW5DcmVkZW50aWFsIHRoYXQgcHJvdmlkZXMgdGhlIGFjY2Vzc1xuICogdG9rZW5cbiAqIEBwYXJhbSBzY29wZXMgLSB0aGUgc2NvcGVzIHRvIHJlcXVlc3QgYXV0aG9yaXphdGlvbiBmb3JcbiAqIEBwYXJhbSB0b2tlbkN5Y2xlck9wdGlvbnMgLSBvcHRpb25hbGx5IG92ZXJyaWRlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBjeWNsZXJcbiAqXG4gKiBAcmV0dXJucyAtIGEgZnVuY3Rpb24gdGhhdCByZWxpYWJseSBwcm9kdWNlcyBhIHZhbGlkIGFjY2VzcyB0b2tlblxuICovXG5mdW5jdGlvbiBjcmVhdGVUb2tlbkN5Y2xlcihjcmVkZW50aWFsLCBzY29wZXMsIHRva2VuQ3ljbGVyT3B0aW9ucykge1xuICAgIGxldCByZWZyZXNoV29ya2VyID0gbnVsbDtcbiAgICBsZXQgdG9rZW4gPSBudWxsO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ1lDTEVSX09QVElPTlMpLCB0b2tlbkN5Y2xlck9wdGlvbnMpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgbGl0dGxlIGhvbGRlciBkZWZpbmVzIHNldmVyYWwgcHJlZGljYXRlcyB0aGF0IHdlIHVzZSB0byBjb25zdHJ1Y3RcbiAgICAgKiB0aGUgcnVsZXMgb2YgcmVmcmVzaGluZyB0aGUgdG9rZW4uXG4gICAgICovXG4gICAgY29uc3QgY3ljbGVyID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogUHJvZHVjZXMgdHJ1ZSBpZiBhIHJlZnJlc2ggam9iIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy5cbiAgICAgICAgICovXG4gICAgICAgIGdldCBpc1JlZnJlc2hpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVmcmVzaFdvcmtlciAhPT0gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb2R1Y2VzIHRydWUgaWYgdGhlIGN5Y2xlciBTSE9VTEQgcmVmcmVzaCAod2UgYXJlIHdpdGhpbiB0aGUgcmVmcmVzaFxuICAgICAgICAgKiB3aW5kb3cgYW5kIG5vdCBhbHJlYWR5IHJlZnJlc2hpbmcpXG4gICAgICAgICAqL1xuICAgICAgICBnZXQgc2hvdWxkUmVmcmVzaCgpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiAoIWN5Y2xlci5pc1JlZnJlc2hpbmcgJiZcbiAgICAgICAgICAgICAgICAoKF9hID0gdG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRva2VuLmV4cGlyZXNPblRpbWVzdGFtcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCkgLSBvcHRpb25zLnJlZnJlc2hXaW5kb3dJbk1zIDwgRGF0ZS5ub3coKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9kdWNlcyB0cnVlIGlmIHRoZSBjeWNsZXIgTVVTVCByZWZyZXNoIChudWxsIG9yIG5lYXJseS1leHBpcmVkXG4gICAgICAgICAqIHRva2VuKS5cbiAgICAgICAgICovXG4gICAgICAgIGdldCBtdXN0UmVmcmVzaCgpIHtcbiAgICAgICAgICAgIHJldHVybiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4uZXhwaXJlc09uVGltZXN0YW1wIC0gb3B0aW9ucy5mb3JjZWRSZWZyZXNoV2luZG93SW5NcyA8IERhdGUubm93KCkpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgcmVmcmVzaCBqb2Igb3IgcmV0dXJucyB0aGUgZXhpc3Rpbmcgam9iIGlmIG9uZSBpcyBhbHJlYWR5XG4gICAgICogcnVubmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWZyZXNoKGdldFRva2VuT3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghY3ljbGVyLmlzUmVmcmVzaGluZykge1xuICAgICAgICAgICAgLy8gV2UgYmluZCBgc2NvcGVzYCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgaXQgYXJvdW5kIGEgbG90XG4gICAgICAgICAgICBjb25zdCB0cnlHZXRBY2Nlc3NUb2tlbiA9ICgpID0+IGNyZWRlbnRpYWwuZ2V0VG9rZW4oc2NvcGVzLCBnZXRUb2tlbk9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgcHJvbWlzZSBjaGFpbmluZyB0byBpbnNlcnQgYW4gYXNzaWdubWVudCB0byBgdG9rZW5gXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJlZnJlc2ggY2FuIGJlIGNvbnNpZGVyZWQgZG9uZS5cbiAgICAgICAgICAgIHJlZnJlc2hXb3JrZXIgPSBiZWdpblJlZnJlc2godHJ5R2V0QWNjZXNzVG9rZW4sIG9wdGlvbnMucmV0cnlJbnRlcnZhbEluTXMsIFxuICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHRva2VuLCB0aGVuIHdlIHNob3VsZCB0aW1lb3V0IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAoX2EgPSB0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9rZW4uZXhwaXJlc09uVGltZXN0YW1wKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBEYXRlLm5vdygpKVxuICAgICAgICAgICAgICAgIC50aGVuKChfdG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICByZWZyZXNoV29ya2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IF90b2tlbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2UgYWxzbyBzaG91bGQgcmVzZXQgdGhlIHJlZnJlc2hlciBpZiB3ZSBlbnRlciBhIGZhaWxlZCBzdGF0ZS4gIEFsbFxuICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGF3YWl0ZXJzIHdpbGwgdGhyb3csIGJ1dCBzdWJzZXF1ZW50IHJlcXVlc3RzIHdpbGwgc3RhcnQgYVxuICAgICAgICAgICAgICAgIC8vIG5ldyByZXRyeSBjaGFpbi5cbiAgICAgICAgICAgICAgICByZWZyZXNoV29ya2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZnJlc2hXb3JrZXI7XG4gICAgfVxuICAgIHJldHVybiBhc3luYyAodG9rZW5PcHRpb25zKSA9PiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNpbXBsZSBydWxlczpcbiAgICAgICAgLy8gLSBJZiB3ZSBNVVNUIHJlZnJlc2gsIHRoZW4gcmV0dXJuIHRoZSByZWZyZXNoIHRhc2ssIGJsb2NraW5nXG4gICAgICAgIC8vICAgdGhlIHBpcGVsaW5lIHVudGlsIGEgdG9rZW4gaXMgYXZhaWxhYmxlLlxuICAgICAgICAvLyAtIElmIHdlIFNIT1VMRCByZWZyZXNoLCB0aGVuIHJ1biByZWZyZXNoIGJ1dCBkb24ndCByZXR1cm4gaXRcbiAgICAgICAgLy8gICAod2UgY2FuIHN0aWxsIHVzZSB0aGUgY2FjaGVkIHRva2VuKS5cbiAgICAgICAgLy8gLSBSZXR1cm4gdGhlIHRva2VuLCBzaW5jZSBpdCdzIGZpbmUgaWYgd2UgZGlkbid0IHJldHVybiBpblxuICAgICAgICAvLyAgIHN0ZXAgMS5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGN5Y2xlci5tdXN0UmVmcmVzaClcbiAgICAgICAgICAgIHJldHVybiByZWZyZXNoKHRva2VuT3B0aW9ucyk7XG4gICAgICAgIGlmIChjeWNsZXIuc2hvdWxkUmVmcmVzaCkge1xuICAgICAgICAgICAgcmVmcmVzaCh0b2tlbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9O1xufVxuLy8gI2VuZHJlZ2lvblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZhY3RvcnkgZm9yIGEgUmVxdWVzdFBvbGljeSB0aGF0IGFwcGxpZXMgYSBiZWFyZXIgdG9rZW4gdG9cbiAqIHRoZSByZXF1ZXN0cycgYEF1dGhvcml6YXRpb25gIGhlYWRlcnMuXG4gKlxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgVG9rZW5DcmVkZW50aWFsIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIHN1cHBseSB0aGUgYmVhcmVyIHRva2VuLlxuICogQHBhcmFtIHNjb3BlcyAtIFRoZSBzY29wZXMgZm9yIHdoaWNoIHRoZSBiZWFyZXIgdG9rZW4gYXBwbGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3koY3JlZGVudGlhbCwgc2NvcGVzKSB7XG4gICAgLy8gVGhpcyBzaW1wbGUgZnVuY3Rpb24gZW5jYXBzdWxhdGVzIHRoZSBlbnRpcmUgcHJvY2VzcyBvZiByZWxpYWJseSByZXRyaWV2aW5nIHRoZSB0b2tlblxuICAgIGNvbnN0IGdldFRva2VuID0gY3JlYXRlVG9rZW5DeWNsZXIoY3JlZGVudGlhbCwgc2NvcGVzIC8qICwgb3B0aW9ucyAqLyk7XG4gICAgY2xhc3MgQmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAgICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3Qod2ViUmVzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICghd2ViUmVzb3VyY2UudXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmVhcmVyIHRva2VuIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1UTFMgcHJvdGVjdGVkIChub24taHR0cHMpIFVSTHMuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyB0b2tlbiB9ID0gYXdhaXQgZ2V0VG9rZW4oe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiB3ZWJSZXNvdXJjZS5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICB0cmFjaW5nQ29udGV4dDogd2ViUmVzb3VyY2UudHJhY2luZ0NvbnRleHQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd2ViUmVzb3VyY2UuaGVhZGVycy5zZXQoQ29uc3RhbnRzLkhlYWRlckNvbnN0YW50cy5BVVRIT1JJWkFUSU9OLCBgQmVhcmVyICR7dG9rZW59YCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdCh3ZWJSZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgRGVmYXVsdEh0dHBDbGllbnQgfSBmcm9tIFwiLi9kZWZhdWx0SHR0cENsaWVudFwiO1xubGV0IGNhY2hlZEh0dHBDbGllbnQ7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkRGVmYXVsdEh0dHBDbGllbnQoKSB7XG4gICAgaWYgKCFjYWNoZWRIdHRwQ2xpZW50KSB7XG4gICAgICAgIGNhY2hlZEh0dHBDbGllbnQgPSBuZXcgRGVmYXVsdEh0dHBDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZEh0dHBDbGllbnQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odHRwQ2xpZW50Q2FjaGUuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi4vdXRpbC91dGlsc1wiO1xuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGF6dXJlL2NvcmUtdXRpbFwiO1xuZXhwb3J0IGZ1bmN0aW9uIHJwUmVnaXN0cmF0aW9uUG9saWN5KHJldHJ5VGltZW91dCA9IDMwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSUFJlZ2lzdHJhdGlvblBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCByZXRyeVRpbWVvdXQpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnQgY2xhc3MgUlBSZWdpc3RyYXRpb25Qb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgX3JldHJ5VGltZW91dCA9IDMwKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9yZXRyeVRpbWVvdXQgPSBfcmV0cnlUaW1lb3V0O1xuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5XG4gICAgICAgICAgICAuc2VuZFJlcXVlc3QocmVxdWVzdC5jbG9uZSgpKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZWdpc3RlcklmTmVlZGVkKHRoaXMsIHJlcXVlc3QsIHJlc3BvbnNlKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVnaXN0ZXJJZk5lZWRlZChwb2xpY3ksIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgIGNvbnN0IHJwTmFtZSA9IGNoZWNrUlBOb3RSZWdpc3RlcmVkRXJyb3IocmVzcG9uc2UuYm9keUFzVGV4dCk7XG4gICAgICAgIGlmIChycE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybFByZWZpeCA9IGV4dHJhY3RTdWJzY3JpcHRpb25VcmwocmVxdWVzdC51cmwpO1xuICAgICAgICAgICAgcmV0dXJuIChyZWdpc3RlclJQKHBvbGljeSwgdXJsUHJlZml4LCBycE5hbWUsIHJlcXVlc3QpXG4gICAgICAgICAgICAgICAgLy8gQXV0b3JlZ2lzdHJhdGlvbiBvZiAke3Byb3ZpZGVyfSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLiBXZSB3aWxsIG5vdCByZXR1cm4gdGhpcyBlcnJvclxuICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgd2lsbCByZXR1cm4gdGhlIGluaXRpYWwgcmVzcG9uc2Ugd2l0aCA0MDkgc3RhdHVzIGNvZGUgYmFjayB0byB0aGUgdXNlci5cbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIGhlcmUgYXMgd2UgYXJlIHJldHVybmluZyB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC5cbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlZ2lzdHJhdGlvblN0YXR1cykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyYXRpb25TdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnkgdGhlIG9yaWdpbmFsIHJlcXVlc3QuIFdlIGhhdmUgdG8gY2hhbmdlIHRoZSB4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBBenVyZSBlbmRwb2ludCB3aWxsIHJldHVybiB0aGUgaW5pdGlhbCA0MDkgKGNhY2hlZCkgcmVzcG9uc2UuXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsIHV0aWxzLmdlbmVyYXRlVXVpZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvbGljeS5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0LmNsb25lKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG59XG4vKipcbiAqIFJldXNlcyB0aGUgaGVhZGVycyBvZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCBhbmQgdXJsIChpZiBzcGVjaWZpZWQpLlxuICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdCAtIFRoZSBvcmlnaW5hbCByZXF1ZXN0XG4gKiBAcGFyYW0gcmV1c2VVcmxUb28gLSBTaG91bGQgdGhlIHVybCBmcm9tIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGJlIHJldXNlZCBhcyB3ZWxsLiBEZWZhdWx0IGZhbHNlLlxuICogQHJldHVybnMgQSBuZXcgcmVxdWVzdCBvYmplY3Qgd2l0aCBkZXNpcmVkIGhlYWRlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldFJlcXVlc3RFc3NlbnRpYWxzKG9yaWdpbmFsUmVxdWVzdCwgcmV1c2VVcmxUb28gPSBmYWxzZSkge1xuICAgIGNvbnN0IHJlcU9wdGlvbnMgPSBvcmlnaW5hbFJlcXVlc3QuY2xvbmUoKTtcbiAgICBpZiAocmV1c2VVcmxUb28pIHtcbiAgICAgICAgcmVxT3B0aW9ucy51cmwgPSBvcmlnaW5hbFJlcXVlc3QudXJsO1xuICAgIH1cbiAgICAvLyBXZSBoYXZlIHRvIGNoYW5nZSB0aGUgeC1tcy1jbGllbnQtcmVxdWVzdC1pZCBvdGhlcndpc2UgQXp1cmUgZW5kcG9pbnRcbiAgICAvLyB3aWxsIHJldHVybiB0aGUgaW5pdGlhbCA0MDkgKGNhY2hlZCkgcmVzcG9uc2UuXG4gICAgcmVxT3B0aW9ucy5oZWFkZXJzLnNldChcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIiwgdXRpbHMuZ2VuZXJhdGVVdWlkKCkpO1xuICAgIC8vIFNldCBjb250ZW50LXR5cGUgdG8gYXBwbGljYXRpb24vanNvblxuICAgIHJlcU9wdGlvbnMuaGVhZGVycy5zZXQoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJldHVybiByZXFPcHRpb25zO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGVycm9yIGNvZGUgYW5kIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIDQwOSByZXNwb25zZSBzdGF0dXMgY29kZS4gSWYgaXQgbWF0Y2hlcyB0byB0aGF0IG9mXG4gKiBSUCBub3QgcmVnaXN0ZXJlZCB0aGVuIGl0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFJQIGVsc2UgcmV0dXJucyB1bmRlZmluZWQuXG4gKiBAcGFyYW0gYm9keSAtIFRoZSByZXNwb25zZSBib2R5IHJlY2VpdmVkIGFmdGVyIG1ha2luZyB0aGUgb3JpZ2luYWwgcmVxdWVzdC5cbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBSUCBpZiBjb25kaXRpb24gaXMgc2F0aXNmaWVkIGVsc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBjaGVja1JQTm90UmVnaXN0ZXJlZEVycm9yKGJvZHkpIHtcbiAgICBsZXQgcmVzdWx0LCByZXNwb25zZUJvZHk7XG4gICAgaWYgKGJvZHkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VCb2R5ICYmXG4gICAgICAgICAgICByZXNwb25zZUJvZHkuZXJyb3IgJiZcbiAgICAgICAgICAgIHJlc3BvbnNlQm9keS5lcnJvci5tZXNzYWdlICYmXG4gICAgICAgICAgICByZXNwb25zZUJvZHkuZXJyb3IuY29kZSAmJlxuICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmVycm9yLmNvZGUgPT09IFwiTWlzc2luZ1N1YnNjcmlwdGlvblJlZ2lzdHJhdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaFJlcyA9IHJlc3BvbnNlQm9keS5lcnJvci5tZXNzYWdlLm1hdGNoKC8uKicoLiopJy9pKTtcbiAgICAgICAgICAgIGlmIChtYXRjaFJlcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1hdGNoUmVzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEV4dHJhY3RzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBVUkwsIGp1c3QgYWZ0ZXIgc3Vic2NyaXB0aW9uOlxuICogaHR0cHM6Ly9tYW5hZ2VtZW50LmF6dXJlLmNvbS9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMC9cbiAqIEBwYXJhbSB1cmwgLSBUaGUgb3JpZ2luYWwgcmVxdWVzdCB1cmxcbiAqIEByZXR1cm5zIFRoZSB1cmwgcHJlZml4IGFzIGV4cGxhaW5lZCBhYm92ZS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFN1YnNjcmlwdGlvblVybCh1cmwpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IG1hdGNoUmVzID0gdXJsLm1hdGNoKC8uKlxcL3N1YnNjcmlwdGlvbnNcXC9bYS1mMC05LV0rXFwvL2dpKTtcbiAgICBpZiAobWF0Y2hSZXMgJiYgbWF0Y2hSZXNbMF0pIHtcbiAgICAgICAgcmVzdWx0ID0gbWF0Y2hSZXNbMF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBleHRyYWN0IHN1YnNjcmlwdGlvbklkIGZyb20gdGhlIGdpdmVuIHVybCAtICR7dXJsfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBwcm92aWRlci5cbiAqIEBwYXJhbSBwb2xpY3kgLSBUaGUgUlBSZWdpc3RyYXRpb25Qb2xpY3kgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSB1cmxQcmVmaXggLSBodHRwczovL21hbmFnZW1lbnQuYXp1cmUuY29tL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwL1xuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIG5hbWUgdG8gYmUgcmVnaXN0ZXJlZC5cbiAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3QgLSBUaGUgb3JpZ2luYWwgcmVxdWVzdCBzZW50IGJ5IHRoZSB1c2VyIHRoYXQgcmV0dXJuZWQgYSA0MDkgcmVzcG9uc2VcbiAqIHdpdGggYSBtZXNzYWdlIHRoYXQgdGhlIHByb3ZpZGVyIGlzIG5vdCByZWdpc3RlcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWdpc3RlclJQKHBvbGljeSwgdXJsUHJlZml4LCBwcm92aWRlciwgb3JpZ2luYWxSZXF1ZXN0KSB7XG4gICAgY29uc3QgcG9zdFVybCA9IGAke3VybFByZWZpeH1wcm92aWRlcnMvJHtwcm92aWRlcn0vcmVnaXN0ZXI/YXBpLXZlcnNpb249MjAxNi0wMi0wMWA7XG4gICAgY29uc3QgZ2V0VXJsID0gYCR7dXJsUHJlZml4fXByb3ZpZGVycy8ke3Byb3ZpZGVyfT9hcGktdmVyc2lvbj0yMDE2LTAyLTAxYDtcbiAgICBjb25zdCByZXFPcHRpb25zID0gZ2V0UmVxdWVzdEVzc2VudGlhbHMob3JpZ2luYWxSZXF1ZXN0KTtcbiAgICByZXFPcHRpb25zLm1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIHJlcU9wdGlvbnMudXJsID0gcG9zdFVybDtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvbGljeS5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXFPcHRpb25zKTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRvcmVnaXN0cmF0aW9uIG9mICR7cHJvdmlkZXJ9IGZhaWxlZC4gUGxlYXNlIHRyeSByZWdpc3RlcmluZyBtYW51YWxseS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldFJlZ2lzdHJhdGlvblN0YXR1cyhwb2xpY3ksIGdldFVybCwgb3JpZ2luYWxSZXF1ZXN0KTtcbn1cbi8qKlxuICogUG9sbHMgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0dXMgb2YgdGhlIHByb3ZpZGVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQuIFBvbGxpbmcgaGFwcGVucyBhdCBhbiBpbnRlcnZhbCBvZiAzMCBzZWNvbmRzLlxuICogUG9sbGluZyB3aWxsIGhhcHBlbiB0aWxsIHRoZSByZWdpc3RyYXRpb25TdGF0ZSBwcm9wZXJ0eSBvZiB0aGUgcmVzcG9uc2UgYm9keSBpcyBcIlJlZ2lzdGVyZWRcIi5cbiAqIEBwYXJhbSBwb2xpY3kgLSBUaGUgUlBSZWdpc3RyYXRpb25Qb2xpY3kgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSB1cmwgLSBUaGUgcmVxdWVzdCB1cmwgZm9yIHBvbGxpbmdcbiAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3QgLSBUaGUgb3JpZ2luYWwgcmVxdWVzdCBzZW50IGJ5IHRoZSB1c2VyIHRoYXQgcmV0dXJuZWQgYSA0MDkgcmVzcG9uc2VcbiAqIHdpdGggYSBtZXNzYWdlIHRoYXQgdGhlIHByb3ZpZGVyIGlzIG5vdCByZWdpc3RlcmVkLlxuICogQHJldHVybnMgVHJ1ZSBpZiBSUCBSZWdpc3RyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVnaXN0cmF0aW9uU3RhdHVzKHBvbGljeSwgdXJsLCBvcmlnaW5hbFJlcXVlc3QpIHtcbiAgICBjb25zdCByZXFPcHRpb25zID0gZ2V0UmVxdWVzdEVzc2VudGlhbHMob3JpZ2luYWxSZXF1ZXN0KTtcbiAgICByZXFPcHRpb25zLnVybCA9IHVybDtcbiAgICByZXFPcHRpb25zLm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcG9saWN5Ll9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcU9wdGlvbnMpO1xuICAgIGNvbnN0IG9iaiA9IHJlcy5wYXJzZWRCb2R5O1xuICAgIGlmIChyZXMucGFyc2VkQm9keSAmJiBvYmoucmVnaXN0cmF0aW9uU3RhdGUgJiYgb2JqLnJlZ2lzdHJhdGlvblN0YXRlID09PSBcIlJlZ2lzdGVyZWRcIikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KHBvbGljeS5fcmV0cnlUaW1lb3V0ICogMTAwMCk7XG4gICAgICAgIHJldHVybiBnZXRSZWdpc3RyYXRpb25TdGF0dXMocG9saWN5LCB1cmwsIG9yaWdpbmFsUmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnBSZWdpc3RyYXRpb25Qb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXNlUmVxdWVzdFBvbGljeSwgfSBmcm9tIFwiLi9yZXF1ZXN0UG9saWN5XCI7XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xpY3kgdGhhdCBzaWducyBvdXRnb2luZyByZXF1ZXN0cyBieSBjYWxsaW5nIHRvIHRoZSBwcm92aWRlZCBgYXV0aGVudGljYXRpb25Qcm92aWRlcmAncyBgc2lnblJlcXVlc3RgIG1ldGhvZC5cbiAqIEBwYXJhbSBhdXRoZW50aWNhdGlvblByb3ZpZGVyIC0gVGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBTaWduaW5nUG9saWN5fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25pbmdQb2xpY3koYXV0aGVudGljYXRpb25Qcm92aWRlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZTogKG5leHRQb2xpY3ksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmluZ1BvbGljeShuZXh0UG9saWN5LCBvcHRpb25zLCBhdXRoZW50aWNhdGlvblByb3ZpZGVyKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBBIHBvbGljeSB0aGF0IHNpZ25zIG91dGdvaW5nIHJlcXVlc3RzIGJ5IGNhbGxpbmcgdG8gdGhlIHByb3ZpZGVkIGBhdXRoZW50aWNhdGlvblByb3ZpZGVyYCdzIGBzaWduUmVxdWVzdGAgbWV0aG9kLlxuICovXG5leHBvcnQgY2xhc3MgU2lnbmluZ1BvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zLCBhdXRoZW50aWNhdGlvblByb3ZpZGVyKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgPSBhdXRoZW50aWNhdGlvblByb3ZpZGVyO1xuICAgIH1cbiAgICBzaWduUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuc2lnblJlcXVlc3QocmVxdWVzdCk7XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3QocmVxdWVzdCkudGhlbigobmV4dFJlcXVlc3QpID0+IHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QobmV4dFJlcXVlc3QpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaWduaW5nUG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIH0gZnJvbSBcIi4vcmVxdWVzdFBvbGljeVwiO1xuaW1wb3J0IHsgREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0lOVEVSVkFMLCBERUZBVUxUX0NMSUVOVF9NSU5fUkVUUllfSU5URVJWQUwsIERFRkFVTFRfQ0xJRU5UX1JFVFJZX0NPVU5ULCBERUZBVUxUX0NMSUVOVF9SRVRSWV9JTlRFUlZBTCwgaXNOdW1iZXIsIHNob3VsZFJldHJ5LCB1cGRhdGVSZXRyeURhdGEsIH0gZnJvbSBcIi4uL3V0aWwvZXhwb25lbnRpYWxCYWNrb2ZmU3RyYXRlZ3lcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIkBhenVyZS9jb3JlLXV0aWxcIjtcbi8qKlxuICogQSBwb2xpY3kgdGhhdCByZXRyaWVzIHdoZW4gdGhlcmUncyBhIHN5c3RlbSBlcnJvciwgaWRlbnRpZmllZCBieSB0aGUgY29kZXMgXCJFVElNRURPVVRcIiwgXCJFU09DS0VUVElNRURPVVRcIiwgXCJFQ09OTlJFRlVTRURcIiwgXCJFQ09OTlJFU0VUXCIgb3IgXCJFTk9FTlRcIi5cbiAqIEBwYXJhbSByZXRyeUNvdW50IC0gTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy5cbiAqIEBwYXJhbSByZXRyeUludGVydmFsIC0gVGhlIGNsaWVudCByZXRyeSBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIG1pblJldHJ5SW50ZXJ2YWwgLSBUaGUgbWluaW11bSByZXRyeSBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIG1heFJldHJ5SW50ZXJ2YWwgLSBUaGUgbWF4aW11bSByZXRyeSBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBTeXN0ZW1FcnJvclJldHJ5UG9saWN5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3lzdGVtRXJyb3JSZXRyeVBvbGljeShyZXRyeUNvdW50LCByZXRyeUludGVydmFsLCBtaW5SZXRyeUludGVydmFsLCBtYXhSZXRyeUludGVydmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlOiAobmV4dFBvbGljeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTeXN0ZW1FcnJvclJldHJ5UG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMsIHJldHJ5Q291bnQsIHJldHJ5SW50ZXJ2YWwsIG1pblJldHJ5SW50ZXJ2YWwsIG1heFJldHJ5SW50ZXJ2YWwpO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEEgcG9saWN5IHRoYXQgcmV0cmllcyB3aGVuIHRoZXJlJ3MgYSBzeXN0ZW0gZXJyb3IsIGlkZW50aWZpZWQgYnkgdGhlIGNvZGVzIFwiRVRJTUVET1VUXCIsIFwiRVNPQ0tFVFRJTUVET1VUXCIsIFwiRUNPTk5SRUZVU0VEXCIsIFwiRUNPTk5SRVNFVFwiIG9yIFwiRU5PRU5UXCIuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAtIFRoZSBjbGllbnQgcmV0cnkgY291bnQuXG4gKiBAcGFyYW0gcmV0cnlJbnRlcnZhbCAtIFRoZSBjbGllbnQgcmV0cnkgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSBtaW5SZXRyeUludGVydmFsIC0gVGhlIG1pbmltdW0gcmV0cnkgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSBtYXhSZXRyeUludGVydmFsIC0gVGhlIG1heGltdW0gcmV0cnkgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN5c3RlbUVycm9yUmV0cnlQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgcmV0cnlDb3VudCwgcmV0cnlJbnRlcnZhbCwgbWluUmV0cnlJbnRlcnZhbCwgbWF4UmV0cnlJbnRlcnZhbCkge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gaXNOdW1iZXIocmV0cnlDb3VudCkgPyByZXRyeUNvdW50IDogREVGQVVMVF9DTElFTlRfUkVUUllfQ09VTlQ7XG4gICAgICAgIHRoaXMucmV0cnlJbnRlcnZhbCA9IGlzTnVtYmVyKHJldHJ5SW50ZXJ2YWwpID8gcmV0cnlJbnRlcnZhbCA6IERFRkFVTFRfQ0xJRU5UX1JFVFJZX0lOVEVSVkFMO1xuICAgICAgICB0aGlzLm1pblJldHJ5SW50ZXJ2YWwgPSBpc051bWJlcihtaW5SZXRyeUludGVydmFsKVxuICAgICAgICAgICAgPyBtaW5SZXRyeUludGVydmFsXG4gICAgICAgICAgICA6IERFRkFVTFRfQ0xJRU5UX01JTl9SRVRSWV9JTlRFUlZBTDtcbiAgICAgICAgdGhpcy5tYXhSZXRyeUludGVydmFsID0gaXNOdW1iZXIobWF4UmV0cnlJbnRlcnZhbClcbiAgICAgICAgICAgID8gbWF4UmV0cnlJbnRlcnZhbFxuICAgICAgICAgICAgOiBERUZBVUxUX0NMSUVOVF9NQVhfUkVUUllfSU5URVJWQUw7XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3lcbiAgICAgICAgICAgIC5zZW5kUmVxdWVzdChyZXF1ZXN0LmNsb25lKCkpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiByZXRyeSh0aGlzLCByZXF1ZXN0LCBlcnJvci5yZXNwb25zZSwgZXJyb3IpKTtcbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiByZXRyeShwb2xpY3ksIHJlcXVlc3QsIG9wZXJhdGlvblJlc3BvbnNlLCBlcnIsIHJldHJ5RGF0YSkge1xuICAgIHJldHJ5RGF0YSA9IHVwZGF0ZVJldHJ5RGF0YShwb2xpY3ksIHJldHJ5RGF0YSwgZXJyKTtcbiAgICBmdW5jdGlvbiBzaG91bGRQb2xpY3lSZXRyeShfcmVzcG9uc2UsIGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciAmJlxuICAgICAgICAgICAgZXJyb3IuY29kZSAmJlxuICAgICAgICAgICAgKGVycm9yLmNvZGUgPT09IFwiRVRJTUVET1VUXCIgfHxcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID09PSBcIkVTT0NLRVRUSU1FRE9VVFwiIHx8XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9PT0gXCJFQ09OTlJFRlVTRURcIiB8fFxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPT09IFwiRUNPTk5SRVNFVFwiIHx8XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJldHJ5KHBvbGljeS5yZXRyeUNvdW50LCBzaG91bGRQb2xpY3lSZXRyeSwgcmV0cnlEYXRhLCBvcGVyYXRpb25SZXNwb25zZSwgZXJyKSkge1xuICAgICAgICAvLyBJZiBwcmV2aW91cyBvcGVyYXRpb24gZW5kZWQgd2l0aCBhbiBlcnJvciBhbmQgdGhlIHBvbGljeSBhbGxvd3MgYSByZXRyeSwgZG8gdGhhdFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkocmV0cnlEYXRhLnJldHJ5SW50ZXJ2YWwpO1xuICAgICAgICAgICAgcmV0dXJuIHBvbGljeS5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0LmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChuZXN0ZWRFcnIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXRyeShwb2xpY3ksIHJlcXVlc3QsIG9wZXJhdGlvblJlc3BvbnNlLCBuZXN0ZWRFcnIsIHJldHJ5RGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBvcGVyYXRpb24gZmFpbGVkIGluIHRoZSBlbmQsIHJldHVybiBhbGwgZXJyb3JzIGluc3RlYWQgb2YganVzdCB0aGUgbGFzdCBvbmVcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXRyeURhdGEuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcGVyYXRpb25SZXNwb25zZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zeXN0ZW1FcnJvclJldHJ5UG9saWN5LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciB0aGUgdGhyb3R0bGluZyByZXRyeSBwb2xpY3lcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0xJRU5UX01BWF9SRVRSWV9DT1VOVCA9IDM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJvdHRsaW5nUmV0cnlTdHJhdGVneS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJhc2VSZXF1ZXN0UG9saWN5LCB9IGZyb20gXCIuL3JlcXVlc3RQb2xpY3lcIjtcbmltcG9ydCB7IEFib3J0RXJyb3IgfSBmcm9tIFwiQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi91dGlsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0NPVU5UIH0gZnJvbSBcIi4uL3V0aWwvdGhyb3R0bGluZ1JldHJ5U3RyYXRlZ3lcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIkBhenVyZS9jb3JlLXV0aWxcIjtcbmNvbnN0IFN0YXR1c0NvZGVzID0gQ29uc3RhbnRzLkh0dHBDb25zdGFudHMuU3RhdHVzQ29kZXM7XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xpY3kgdGhhdCByZS1zZW5kcyB0aGUgcmVxdWVzdCBpZiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHRoZSByZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIG9mIHRocm90dGxpbmcgcmVhc29ucy5cbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgcmVzcG9uc2UgY29udGFpbnMgYSBgUmV0cnktQWZ0ZXJgIGhlYWRlciwgaXQgd2lsbCByZXRyeSBzZW5kaW5nIHRoZSByZXF1ZXN0IGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGF0IGhlYWRlci5cbiAqXG4gKiBUbyBsZWFybiBtb3JlLCBwbGVhc2UgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL2F6dXJlLXJlc291cmNlLW1hbmFnZXIvcmVzb3VyY2UtbWFuYWdlci1yZXF1ZXN0LWxpbWl0cyxcbiAqIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL2F6dXJlLXN1YnNjcmlwdGlvbi1zZXJ2aWNlLWxpbWl0cyBhbmRcbiAqIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3ZpcnR1YWwtbWFjaGluZXMvdHJvdWJsZXNob290aW5nL3Ryb3VibGVzaG9vdGluZy10aHJvdHRsaW5nLWVycm9yc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxpbmdSZXRyeVBvbGljeSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGU6IChuZXh0UG9saWN5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRocm90dGxpbmdSZXRyeVBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuY29uc3QgU3RhbmRhcmRBYm9ydE1lc3NhZ2UgPSBcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xpY3kgdGhhdCByZS1zZW5kcyB0aGUgcmVxdWVzdCBpZiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHRoZSByZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIG9mIHRocm90dGxpbmcgcmVhc29ucy5cbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgcmVzcG9uc2UgY29udGFpbnMgYSBgUmV0cnktQWZ0ZXJgIGhlYWRlciwgaXQgd2lsbCByZXRyeSBzZW5kaW5nIHRoZSByZXF1ZXN0IGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGF0IGhlYWRlci5cbiAqXG4gKiBUbyBsZWFybiBtb3JlLCBwbGVhc2UgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL2F6dXJlLXJlc291cmNlLW1hbmFnZXIvcmVzb3VyY2UtbWFuYWdlci1yZXF1ZXN0LWxpbWl0cyxcbiAqIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL2F6dXJlLXN1YnNjcmlwdGlvbi1zZXJ2aWNlLWxpbWl0cyBhbmRcbiAqIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3ZpcnR1YWwtbWFjaGluZXMvdHJvdWJsZXNob290aW5nL3Ryb3VibGVzaG9vdGluZy10aHJvdHRsaW5nLWVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgVGhyb3R0bGluZ1JldHJ5UG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIF9oYW5kbGVSZXNwb25zZSkge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5udW1iZXJPZlJldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLl9oYW5kbGVSZXNwb25zZSA9IF9oYW5kbGVSZXNwb25zZSB8fCB0aGlzLl9kZWZhdWx0UmVzcG9uc2VIYW5kbGVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kUmVxdWVzdChodHRwUmVxdWVzdCkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QoaHR0cFJlcXVlc3QuY2xvbmUoKSk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IFN0YXR1c0NvZGVzLlRvb01hbnlSZXF1ZXN0cyAmJlxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzICE9PSBTdGF0dXNDb2Rlcy5TZXJ2aWNlVW5hdmFpbGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVSZXNwb25zZShodHRwUmVxdWVzdCwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9kZWZhdWx0UmVzcG9uc2VIYW5kbGVyKGh0dHBSZXF1ZXN0LCBodHRwUmVzcG9uc2UpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCByZXRyeUFmdGVySGVhZGVyID0gaHR0cFJlc3BvbnNlLmhlYWRlcnMuZ2V0KENvbnN0YW50cy5IZWFkZXJDb25zdGFudHMuUkVUUllfQUZURVIpO1xuICAgICAgICBpZiAocmV0cnlBZnRlckhlYWRlcikge1xuICAgICAgICAgICAgY29uc3QgZGVsYXlJbk1zID0gVGhyb3R0bGluZ1JldHJ5UG9saWN5LnBhcnNlUmV0cnlBZnRlckhlYWRlcihyZXRyeUFmdGVySGVhZGVyKTtcbiAgICAgICAgICAgIGlmIChkZWxheUluTXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm51bWJlck9mUmV0cmllcyArPSAxO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KGRlbGF5SW5Ncywge1xuICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogaHR0cFJlcXVlc3QuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgIGFib3J0RXJyb3JNc2c6IFN0YW5kYXJkQWJvcnRNZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICgoX2EgPSBodHRwUmVxdWVzdC5hYm9ydFNpZ25hbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoU3RhbmRhcmRBYm9ydE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5udW1iZXJPZlJldHJpZXMgPCBERUZBVUxUX0NMSUVOVF9NQVhfUkVUUllfQ09VTlQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QoaHR0cFJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QoaHR0cFJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFJlc3BvbnNlO1xuICAgIH1cbiAgICBzdGF0aWMgcGFyc2VSZXRyeUFmdGVySGVhZGVyKGhlYWRlclZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJJblNlY29uZHMgPSBOdW1iZXIoaGVhZGVyVmFsdWUpO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldHJ5QWZ0ZXJJblNlY29uZHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gVGhyb3R0bGluZ1JldHJ5UG9saWN5LnBhcnNlRGF0ZVJldHJ5QWZ0ZXJIZWFkZXIoaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJldHJ5QWZ0ZXJJblNlY29uZHMgKiAxMDAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBwYXJzZURhdGVSZXRyeUFmdGVySGVhZGVyKGhlYWRlclZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERhdGUucGFyc2UoaGVhZGVyVmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IGRhdGUgLSBub3c7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRpZmYpID8gdW5kZWZpbmVkIDogZGlmZjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJvdHRsaW5nUmV0cnlQb2xpY3kuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi91dGlsL3V0aWxzXCI7XG5pbXBvcnQgeyBNYXBwZXJUeXBlIH0gZnJvbSBcIi4vc2VyaWFsaXplclwiO1xuaW1wb3J0IHsgRGVmYXVsdERlc2VyaWFsaXphdGlvbk9wdGlvbnMsIGRlc2VyaWFsaXphdGlvblBvbGljeSwgfSBmcm9tIFwiLi9wb2xpY2llcy9kZXNlcmlhbGl6YXRpb25Qb2xpY3lcIjtcbmltcG9ydCB7IERlZmF1bHRLZWVwQWxpdmVPcHRpb25zLCBrZWVwQWxpdmVQb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9rZWVwQWxpdmVQb2xpY3lcIjtcbmltcG9ydCB7IERlZmF1bHRSZWRpcmVjdE9wdGlvbnMsIHJlZGlyZWN0UG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvcmVkaXJlY3RQb2xpY3lcIjtcbmltcG9ydCB7IERlZmF1bHRSZXRyeU9wdGlvbnMsIGV4cG9uZW50aWFsUmV0cnlQb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9leHBvbmVudGlhbFJldHJ5UG9saWN5XCI7XG5pbXBvcnQgeyBsb2dQb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9sb2dQb2xpY3lcIjtcbmltcG9ydCB7IGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyLCBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlclBhdGgsIH0gZnJvbSBcIi4vb3BlcmF0aW9uUGFyYW1ldGVyXCI7XG5pbXBvcnQgeyBnZXRTdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzIH0gZnJvbSBcIi4vb3BlcmF0aW9uU3BlY1wiO1xuaW1wb3J0IHsgV2ViUmVzb3VyY2UsIGlzV2ViUmVzb3VyY2VMaWtlLCB9IGZyb20gXCIuL3dlYlJlc291cmNlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0UG9saWN5T3B0aW9ucywgfSBmcm9tIFwiLi9wb2xpY2llcy9yZXF1ZXN0UG9saWN5XCI7XG5pbXBvcnQgeyBYTUxfQVRUUktFWSwgWE1MX0NIQVJLRVkgfSBmcm9tIFwiLi91dGlsL3NlcmlhbGl6ZXIuY29tbW9uXCI7XG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwiQGF6dXJlL2NvcmUtdXRpbFwiO1xuaW1wb3J0IHsgaXNUb2tlbkNyZWRlbnRpYWwgfSBmcm9tIFwiQGF6dXJlL2NvcmUtYXV0aFwiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFVzZXJBZ2VudEhlYWRlck5hbWUsIGdldERlZmF1bHRVc2VyQWdlbnRWYWx1ZSwgdXNlckFnZW50UG9saWN5LCB9IGZyb20gXCIuL3BvbGljaWVzL3VzZXJBZ2VudFBvbGljeVwiO1xuaW1wb3J0IHsgUXVlcnlDb2xsZWN0aW9uRm9ybWF0IH0gZnJvbSBcIi4vcXVlcnlDb2xsZWN0aW9uRm9ybWF0XCI7XG5pbXBvcnQgeyBVUkxCdWlsZGVyIH0gZnJvbSBcIi4vdXJsXCI7XG5pbXBvcnQgeyBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeVwiO1xuaW1wb3J0IHsgZGlzYWJsZVJlc3BvbnNlRGVjb21wcmVzc2lvblBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL2Rpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3lcIjtcbmltcG9ydCB7IGdlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvZ2VuZXJhdGVDbGllbnRSZXF1ZXN0SWRQb2xpY3lcIjtcbmltcG9ydCB7IGdldENhY2hlZERlZmF1bHRIdHRwQ2xpZW50IH0gZnJvbSBcIi4vaHR0cENsaWVudENhY2hlXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi9sb2dcIjtcbmltcG9ydCB7IG5kSnNvblBvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL25kSnNvblBvbGljeVwiO1xuaW1wb3J0IHsgcHJveHlQb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9wcm94eVBvbGljeVwiO1xuaW1wb3J0IHsgcnBSZWdpc3RyYXRpb25Qb2xpY3kgfSBmcm9tIFwiLi9wb2xpY2llcy9ycFJlZ2lzdHJhdGlvblBvbGljeVwiO1xuaW1wb3J0IHsgc2lnbmluZ1BvbGljeSB9IGZyb20gXCIuL3BvbGljaWVzL3NpZ25pbmdQb2xpY3lcIjtcbmltcG9ydCB7IHN0cmluZ2lmeVhNTCB9IGZyb20gXCIuL3V0aWwveG1sXCI7XG5pbXBvcnQgeyBzeXN0ZW1FcnJvclJldHJ5UG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvc3lzdGVtRXJyb3JSZXRyeVBvbGljeVwiO1xuaW1wb3J0IHsgdGhyb3R0bGluZ1JldHJ5UG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvdGhyb3R0bGluZ1JldHJ5UG9saWN5XCI7XG5pbXBvcnQgeyB0cmFjaW5nUG9saWN5IH0gZnJvbSBcIi4vcG9saWNpZXMvdHJhY2luZ1BvbGljeVwiO1xuLyoqXG4gKiBTZXJ2aWNlQ2xpZW50IHNlbmRzIHNlcnZpY2UgcmVxdWVzdHMgYW5kIHJlY2VpdmVzIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBTZXJ2aWNlQ2xpZW50IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIC0gVGhlIGNyZWRlbnRpYWxzIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgc2VydmljZSBjbGllbnQgb3B0aW9ucyB0aGF0IGdvdmVybiB0aGUgYmVoYXZpb3Igb2YgdGhlIGNsaWVudC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjcmVkZW50aWFscywgXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMgKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9odHRwQ2xpZW50ID0gb3B0aW9ucy5odHRwQ2xpZW50IHx8IGdldENhY2hlZERlZmF1bHRIdHRwQ2xpZW50KCk7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RQb2xpY3lPcHRpb25zID0gbmV3IFJlcXVlc3RQb2xpY3lPcHRpb25zKG9wdGlvbnMuaHR0cFBpcGVsaW5lTG9nZ2VyKTtcbiAgICAgICAgbGV0IHJlcXVlc3RQb2xpY3lGYWN0b3JpZXM7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMucmVxdWVzdFBvbGljeUZhY3RvcmllcykpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiU2VydmljZUNsaWVudDogdXNpbmcgY3VzdG9tIHJlcXVlc3QgcG9saWNpZXNcIik7XG4gICAgICAgICAgICByZXF1ZXN0UG9saWN5RmFjdG9yaWVzID0gb3B0aW9ucy5yZXF1ZXN0UG9saWN5RmFjdG9yaWVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGF1dGhQb2xpY3lGYWN0b3J5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxzKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiU2VydmljZUNsaWVudDogY3JlYXRpbmcgYmVhcmVyIHRva2VuIGF1dGhlbnRpY2F0aW9uIHBvbGljeSBmcm9tIHByb3ZpZGVkIGNyZWRlbnRpYWxzXCIpO1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHdyYXBwZWQgUmVxdWVzdFBvbGljeUZhY3RvcnkgaGVyZSBzbyB0aGF0IHdlIGNhbiBwcm92aWRlIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Qgc2NvcGUgdG8gdGhlIEJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3kgYXQgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICAgICAgICAvLyBvbmUgaXMgcmVxdWVzdGVkLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBnZW5lcmF0ZWQgU2VydmljZUNsaWVudFxuICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBkbyBub3Qgc2V0IGJhc2VVcmkgdW50aWwgYWZ0ZXIgU2VydmljZUNsaWVudCdzIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICAgICAgLy8gaXMgZmluaXNoZWQsIGxlYXZpbmcgYmFzZVVyaSBlbXB0eSBhdCB0aGUgdGltZSB3aGVuIGl0IGlzIG5lZWRlZCB0b1xuICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBjb3JyZWN0IHNjb3BlIG5hbWUuXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFBvbGljeUZhY3RvcnkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiZWFyZXJUb2tlblBvbGljeUZhY3RvcnkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlQ2xpZW50ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZUNsaWVudE9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlKG5leHRQb2xpY3ksIGNyZWF0ZU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVkZW50aWFsU2NvcGVzID0gZ2V0Q3JlZGVudGlhbFNjb3BlcyhzZXJ2aWNlQ2xpZW50T3B0aW9ucywgc2VydmljZUNsaWVudC5iYXNlVXJpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWRlbnRpYWxTY29wZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaGVuIHVzaW5nIGNyZWRlbnRpYWwsIHRoZSBTZXJ2aWNlQ2xpZW50IG11c3QgY29udGFpbiBhIGJhc2VVcmkgb3IgYSBjcmVkZW50aWFsU2NvcGVzIGluIFNlcnZpY2VDbGllbnRPcHRpb25zLiBVbmFibGUgdG8gY3JlYXRlIGEgYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVhcmVyVG9rZW5Qb2xpY3lGYWN0b3J5ID09PSB1bmRlZmluZWQgfHwgYmVhcmVyVG9rZW5Qb2xpY3lGYWN0b3J5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYXJlclRva2VuUG9saWN5RmFjdG9yeSA9IGJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3koY3JlZGVudGlhbHMsIGNyZWRlbnRpYWxTY29wZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVhcmVyVG9rZW5Qb2xpY3lGYWN0b3J5LmNyZWF0ZShuZXh0UG9saWN5LCBjcmVhdGVPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhdXRoUG9saWN5RmFjdG9yeSA9IHdyYXBwZWRQb2xpY3lGYWN0b3J5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjcmVkZW50aWFscyAmJiB0eXBlb2YgY3JlZGVudGlhbHMuc2lnblJlcXVlc3QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiU2VydmljZUNsaWVudDogY3JlYXRpbmcgc2lnbmluZyBwb2xpY3kgZnJvbSBwcm92aWRlZCBjcmVkZW50aWFsc1wiKTtcbiAgICAgICAgICAgICAgICBhdXRoUG9saWN5RmFjdG9yeSA9IHNpZ25pbmdQb2xpY3koY3JlZGVudGlhbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiBjcmVkZW50aWFscyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBjcmVkZW50aWFscyBhcmd1bWVudCBtdXN0IGltcGxlbWVudCB0aGUgVG9rZW5DcmVkZW50aWFsIGludGVyZmFjZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiU2VydmljZUNsaWVudDogdXNpbmcgZGVmYXVsdCByZXF1ZXN0IHBvbGljaWVzXCIpO1xuICAgICAgICAgICAgcmVxdWVzdFBvbGljeUZhY3RvcmllcyA9IGNyZWF0ZURlZmF1bHRSZXF1ZXN0UG9saWN5RmFjdG9yaWVzKGF1dGhQb2xpY3lGYWN0b3J5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlcXVlc3RQb2xpY3lGYWN0b3JpZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25zLnJlcXVlc3RQb2xpY3lGYWN0b3JpZXMgY2FuIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG1hbmlwdWxhdGVzXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgcmVxdWVzdFBvbGljeUZhY3RvcmllcyBhcnJheVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JlcXVlc3RQb2xpY3lGYWN0b3JpZXMgPSBvcHRpb25zLnJlcXVlc3RQb2xpY3lGYWN0b3JpZXMocmVxdWVzdFBvbGljeUZhY3Rvcmllcyk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1JlcXVlc3RQb2xpY3lGYWN0b3JpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGljeUZhY3RvcmllcyA9IG5ld1JlcXVlc3RQb2xpY3lGYWN0b3JpZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlcXVlc3RQb2xpY3lGYWN0b3JpZXMgPSByZXF1ZXN0UG9saWN5RmFjdG9yaWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBwcm92aWRlZCBodHRwUmVxdWVzdC5cbiAgICAgKi9cbiAgICBzZW5kUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygb3B0aW9ucyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucyBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQgYW5kIGl0IG11c3QgYmUgb2YgdHlwZSBvYmplY3QuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBodHRwUmVxdWVzdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc1dlYlJlc291cmNlTGlrZShvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudmFsaWRhdGVSZXF1ZXN0UHJvcGVydGllcygpO1xuICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0ID0gb3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0ID0gbmV3IFdlYlJlc291cmNlKCk7XG4gICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QgPSBodHRwUmVxdWVzdC5wcmVwYXJlKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaHR0cFBpcGVsaW5lID0gdGhpcy5faHR0cENsaWVudDtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RQb2xpY3lGYWN0b3JpZXMgJiYgdGhpcy5fcmVxdWVzdFBvbGljeUZhY3Rvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fcmVxdWVzdFBvbGljeUZhY3Rvcmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGh0dHBQaXBlbGluZSA9IHRoaXMuX3JlcXVlc3RQb2xpY3lGYWN0b3JpZXNbaV0uY3JlYXRlKGh0dHBQaXBlbGluZSwgdGhpcy5fcmVxdWVzdFBvbGljeU9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGlwZWxpbmUuc2VuZFJlcXVlc3QoaHR0cFJlcXVlc3QpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIEhUVFAgcmVxdWVzdCB0aGF0IGlzIHBvcHVsYXRlZCB1c2luZyB0aGUgcHJvdmlkZWQgT3BlcmF0aW9uU3BlYy5cbiAgICAgKiBAcGFyYW0gb3BlcmF0aW9uQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0aGF0IHRoZSBIVFRQIHJlcXVlc3QncyB0ZW1wbGF0ZWQgdmFsdWVzIHdpbGwgYmUgcG9wdWxhdGVkIGZyb20uXG4gICAgICogQHBhcmFtIG9wZXJhdGlvblNwZWMgLSBUaGUgT3BlcmF0aW9uU3BlYyB0byB1c2UgdG8gcG9wdWxhdGUgdGhlIGh0dHBSZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgb3BlcmF0aW9uU3BlYywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodHlwZW9mIG9wZXJhdGlvbkFyZ3VtZW50cy5vcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gb3BlcmF0aW9uQXJndW1lbnRzLm9wdGlvbnM7XG4gICAgICAgICAgICBvcGVyYXRpb25Bcmd1bWVudHMub3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemVyT3B0aW9ucyA9IChfYSA9IG9wZXJhdGlvbkFyZ3VtZW50cy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2VyaWFsaXplck9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0ID0gbmV3IFdlYlJlc291cmNlKCk7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlVXJpID0gb3BlcmF0aW9uU3BlYy5iYXNlVXJsIHx8IHRoaXMuYmFzZVVyaTtcbiAgICAgICAgICAgIGlmICghYmFzZVVyaSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklmIG9wZXJhdGlvblNwZWMuYmFzZVVybCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSBTZXJ2aWNlQ2xpZW50IG11c3QgaGF2ZSBhIGJhc2VVcmkgc3RyaW5nIHByb3BlcnR5IHRoYXQgY29udGFpbnMgdGhlIGJhc2UgVVJMIHRvIHVzZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBodHRwUmVxdWVzdC5tZXRob2QgPSBvcGVyYXRpb25TcGVjLmh0dHBNZXRob2Q7XG4gICAgICAgICAgICBodHRwUmVxdWVzdC5vcGVyYXRpb25TcGVjID0gb3BlcmF0aW9uU3BlYztcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RVcmwgPSBVUkxCdWlsZGVyLnBhcnNlKGJhc2VVcmkpO1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvblNwZWMucGF0aCkge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RVcmwuYXBwZW5kUGF0aChvcGVyYXRpb25TcGVjLnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvblNwZWMudXJsUGFyYW1ldGVycyAmJiBvcGVyYXRpb25TcGVjLnVybFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdXJsUGFyYW1ldGVyIG9mIG9wZXJhdGlvblNwZWMudXJsUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsUGFyYW1ldGVyVmFsdWUgPSBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcih0aGlzLCBvcGVyYXRpb25Bcmd1bWVudHMsIHVybFBhcmFtZXRlciwgb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1ldGVyVmFsdWUgPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHVybFBhcmFtZXRlci5tYXBwZXIsIHVybFBhcmFtZXRlclZhbHVlLCBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlcih1cmxQYXJhbWV0ZXIpLCBzZXJpYWxpemVyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdXJsUGFyYW1ldGVyLnNraXBFbmNvZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1ldGVyVmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodXJsUGFyYW1ldGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RVcmwucmVwbGFjZUFsbChgeyR7dXJsUGFyYW1ldGVyLm1hcHBlci5zZXJpYWxpemVkTmFtZSB8fCBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlcih1cmxQYXJhbWV0ZXIpfX1gLCB1cmxQYXJhbWV0ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvblNwZWMucXVlcnlQYXJhbWV0ZXJzICYmIG9wZXJhdGlvblNwZWMucXVlcnlQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHF1ZXJ5UGFyYW1ldGVyIG9mIG9wZXJhdGlvblNwZWMucXVlcnlQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeVBhcmFtZXRlclZhbHVlID0gZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXIodGhpcywgb3BlcmF0aW9uQXJndW1lbnRzLCBxdWVyeVBhcmFtZXRlciwgb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBxdWVyeVBhcmFtZXRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlclZhbHVlID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLnNlcmlhbGl6ZShxdWVyeVBhcmFtZXRlci5tYXBwZXIsIHF1ZXJ5UGFyYW1ldGVyVmFsdWUsIGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKHF1ZXJ5UGFyYW1ldGVyKSwgc2VyaWFsaXplck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdCA9PT0gUXVlcnlDb2xsZWN0aW9uRm9ybWF0Lk11bHRpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtZXRlclZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gaXMgZW1wdHksIG5vIG5lZWQgdG8gdHJ5IHNlcmlhbGl6aW5nIHRoZSBjdXJyZW50IHF1ZXJ5UGFyYW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleCBpbiBxdWVyeVBhcmFtZXRlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHF1ZXJ5UGFyYW1ldGVyVmFsdWVbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyVmFsdWVbaW5kZXhdID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW0gPT09IG51bGwgPyBcIlwiIDogaXRlbS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgPT09IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdC5Tc3YgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdCA9PT0gUXVlcnlDb2xsZWN0aW9uRm9ybWF0LlRzdikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlclZhbHVlID0gcXVlcnlQYXJhbWV0ZXJWYWx1ZS5qb2luKHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcXVlcnlQYXJhbWV0ZXIuc2tpcEVuY29kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocXVlcnlQYXJhbWV0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleCBpbiBxdWVyeVBhcmFtZXRlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbWV0ZXJWYWx1ZVtpbmRleF0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyVmFsdWVbaW5kZXhdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZVtpbmRleF0gPSBlbmNvZGVVUklDb21wb25lbnQocXVlcnlQYXJhbWV0ZXJWYWx1ZVtpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlclZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW1ldGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdCAhPT0gUXVlcnlDb2xsZWN0aW9uRm9ybWF0Lk11bHRpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdCAhPT0gUXVlcnlDb2xsZWN0aW9uRm9ybWF0LlNzdiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgIT09IFF1ZXJ5Q29sbGVjdGlvbkZvcm1hdC5Uc3YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlclZhbHVlID0gcXVlcnlQYXJhbWV0ZXJWYWx1ZS5qb2luKHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVybC5zZXRRdWVyeVBhcmFtZXRlcihxdWVyeVBhcmFtZXRlci5tYXBwZXIuc2VyaWFsaXplZE5hbWUgfHwgZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXIocXVlcnlQYXJhbWV0ZXIpLCBxdWVyeVBhcmFtZXRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0dHBSZXF1ZXN0LnVybCA9IHJlcXVlc3RVcmwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gb3BlcmF0aW9uU3BlYy5jb250ZW50VHlwZSB8fCB0aGlzLnJlcXVlc3RDb250ZW50VHlwZTtcbiAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAmJiBvcGVyYXRpb25TcGVjLnJlcXVlc3RCb2R5KSB7XG4gICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QuaGVhZGVycy5zZXQoXCJDb250ZW50LVR5cGVcIiwgY29udGVudFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvblNwZWMuaGVhZGVyUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyUGFyYW1ldGVyIG9mIG9wZXJhdGlvblNwZWMuaGVhZGVyUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZGVyVmFsdWUgPSBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcih0aGlzLCBvcGVyYXRpb25Bcmd1bWVudHMsIGhlYWRlclBhcmFtZXRlciwgb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclZhbHVlID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLnNlcmlhbGl6ZShoZWFkZXJQYXJhbWV0ZXIubWFwcGVyLCBoZWFkZXJWYWx1ZSwgZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXIoaGVhZGVyUGFyYW1ldGVyKSwgc2VyaWFsaXplck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyQ29sbGVjdGlvblByZWZpeCA9IGhlYWRlclBhcmFtZXRlci5tYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyQ29sbGVjdGlvblByZWZpeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJDb2xsZWN0aW9uUHJlZml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaGVhZGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnMuc2V0KGhlYWRlckNvbGxlY3Rpb25QcmVmaXggKyBrZXksIGhlYWRlclZhbHVlW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnMuc2V0KGhlYWRlclBhcmFtZXRlci5tYXBwZXIuc2VyaWFsaXplZE5hbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXIoaGVhZGVyUGFyYW1ldGVyKSwgaGVhZGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wZXJhdGlvbkFyZ3VtZW50cy5vcHRpb25zO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jdXN0b21IZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VzdG9tSGVhZGVyTmFtZSBpbiBvcHRpb25zLmN1c3RvbUhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnMuc2V0KGN1c3RvbUhlYWRlck5hbWUsIG9wdGlvbnMuY3VzdG9tSGVhZGVyc1tjdXN0b21IZWFkZXJOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QuYWJvcnRTaWduYWwgPSBvcHRpb25zLmFib3J0U2lnbmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LnRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm9uVXBsb2FkUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3Qub25VcGxvYWRQcm9ncmVzcyA9IG9wdGlvbnMub25VcGxvYWRQcm9ncmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub25Eb3dubG9hZFByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0Lm9uRG93bmxvYWRQcm9ncmVzcyA9IG9wdGlvbnMub25Eb3dubG9hZFByb2dyZXNzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zcGFuT3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAvLyBCeSBwYXNzaW5nIHNwYW5PcHRpb25zIGlmIHRoZXkgZXhpc3QgYXQgcnVudGltZSwgd2UncmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBAYXp1cmUvY29yZS10cmFjaW5nQHByZXZpZXcuMTMgYW5kIGVhcmxpZXIuXG4gICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LnNwYW5PcHRpb25zID0gb3B0aW9ucy5zcGFuT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudHJhY2luZ0NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QudHJhY2luZ0NvbnRleHQgPSBvcHRpb25zLnRyYWNpbmdDb250ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGREZXNlcmlhbGl6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuc2hvdWxkRGVzZXJpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3Quc2hvdWxkRGVzZXJpYWxpemUgPSBvcHRpb25zLnNob3VsZERlc2VyaWFsaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0dHBSZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRoaXMuX3dpdGhDcmVkZW50aWFscztcbiAgICAgICAgICAgIHNlcmlhbGl6ZVJlcXVlc3RCb2R5KHRoaXMsIGh0dHBSZXF1ZXN0LCBvcGVyYXRpb25Bcmd1bWVudHMsIG9wZXJhdGlvblNwZWMpO1xuICAgICAgICAgICAgaWYgKGh0dHBSZXF1ZXN0LnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMgPSBnZXRTdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzKG9wZXJhdGlvblNwZWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJhd1Jlc3BvbnNlO1xuICAgICAgICAgICAgbGV0IHNlbmRSZXF1ZXN0RXJyb3I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJhd1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdChodHRwUmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzZW5kUmVxdWVzdEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VuZFJlcXVlc3RFcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChzZW5kUmVxdWVzdEVycm9yLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0RXJyb3IuZGV0YWlscyA9IGZsYXR0ZW5SZXNwb25zZShzZW5kUmVxdWVzdEVycm9yLnJlc3BvbnNlLCBvcGVyYXRpb25TcGVjLnJlc3BvbnNlc1tzZW5kUmVxdWVzdEVycm9yLnN0YXR1c0NvZGVdIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjLnJlc3BvbnNlc1tcImRlZmF1bHRcIl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBQcm9taXNlLnJlamVjdChzZW5kUmVxdWVzdEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFByb21pc2UucmVzb2x2ZShmbGF0dGVuUmVzcG9uc2UocmF3UmVzcG9uc2UsIG9wZXJhdGlvblNwZWMucmVzcG9uc2VzW3Jhd1Jlc3BvbnNlLnN0YXR1c10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYiA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgIC50aGVuKChyZXMpID0+IGNiKG51bGwsIHJlcy5fcmVzcG9uc2UucGFyc2VkQm9keSwgcmVzLl9yZXNwb25zZS5yZXF1ZXN0LCByZXMuX3Jlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gY2IoZXJyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVxdWVzdEJvZHkoc2VydmljZUNsaWVudCwgaHR0cFJlcXVlc3QsIG9wZXJhdGlvbkFyZ3VtZW50cywgb3BlcmF0aW9uU3BlYykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgIGNvbnN0IHNlcmlhbGl6ZXJPcHRpb25zID0gKF9iID0gKF9hID0gb3BlcmF0aW9uQXJndW1lbnRzLm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXJpYWxpemVyT3B0aW9ucykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge307XG4gICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSB7XG4gICAgICAgIHJvb3ROYW1lOiAoX2MgPSBzZXJpYWxpemVyT3B0aW9ucy5yb290TmFtZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogXCJcIixcbiAgICAgICAgaW5jbHVkZVJvb3Q6IChfZCA9IHNlcmlhbGl6ZXJPcHRpb25zLmluY2x1ZGVSb290KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZSxcbiAgICAgICAgeG1sQ2hhcktleTogKF9lID0gc2VyaWFsaXplck9wdGlvbnMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogWE1MX0NIQVJLRVksXG4gICAgfTtcbiAgICBjb25zdCB4bWxDaGFyS2V5ID0gc2VyaWFsaXplck9wdGlvbnMueG1sQ2hhcktleTtcbiAgICBpZiAob3BlcmF0aW9uU3BlYy5yZXF1ZXN0Qm9keSAmJiBvcGVyYXRpb25TcGVjLnJlcXVlc3RCb2R5Lm1hcHBlcikge1xuICAgICAgICBodHRwUmVxdWVzdC5ib2R5ID0gZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXIoc2VydmljZUNsaWVudCwgb3BlcmF0aW9uQXJndW1lbnRzLCBvcGVyYXRpb25TcGVjLnJlcXVlc3RCb2R5LCBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIpO1xuICAgICAgICBjb25zdCBib2R5TWFwcGVyID0gb3BlcmF0aW9uU3BlYy5yZXF1ZXN0Qm9keS5tYXBwZXI7XG4gICAgICAgIGNvbnN0IHsgcmVxdWlyZWQsIHhtbE5hbWUsIHhtbEVsZW1lbnROYW1lLCBzZXJpYWxpemVkTmFtZSwgeG1sTmFtZXNwYWNlLCB4bWxOYW1lc3BhY2VQcmVmaXggfSA9IGJvZHlNYXBwZXI7XG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gYm9keU1hcHBlci50eXBlLm5hbWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoKGh0dHBSZXF1ZXN0LmJvZHkgIT09IHVuZGVmaW5lZCAmJiBodHRwUmVxdWVzdC5ib2R5ICE9PSBudWxsKSB8fCByZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5UGFyYW1ldGVyUGF0aFN0cmluZyA9IGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKG9wZXJhdGlvblNwZWMucmVxdWVzdEJvZHkpO1xuICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmJvZHkgPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGJvZHlNYXBwZXIsIGh0dHBSZXF1ZXN0LmJvZHksIHJlcXVlc3RCb2R5UGFyYW1ldGVyUGF0aFN0cmluZywgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU3RyZWFtID0gdHlwZU5hbWUgPT09IE1hcHBlclR5cGUuU3RyZWFtO1xuICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjLmlzWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbG5zS2V5ID0geG1sTmFtZXNwYWNlUHJlZml4ID8gYHhtbG5zOiR7eG1sTmFtZXNwYWNlUHJlZml4fWAgOiBcInhtbG5zXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0WG1sVmFsdWVXaXRoTmFtZXNwYWNlKHhtbE5hbWVzcGFjZSwgeG1sbnNLZXksIHR5cGVOYW1lLCBodHRwUmVxdWVzdC5ib2R5LCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlTmFtZSA9PT0gTWFwcGVyVHlwZS5TZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QuYm9keSA9IHN0cmluZ2lmeVhNTCh1dGlscy5wcmVwYXJlWE1MUm9vdExpc3QodmFsdWUsIHhtbEVsZW1lbnROYW1lIHx8IHhtbE5hbWUgfHwgc2VyaWFsaXplZE5hbWUsIHhtbG5zS2V5LCB4bWxOYW1lc3BhY2UpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE5hbWU6IHhtbE5hbWUgfHwgc2VyaWFsaXplZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc1N0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QuYm9keSA9IHN0cmluZ2lmeVhNTCh2YWx1ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROYW1lOiB4bWxOYW1lIHx8IHNlcmlhbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbENoYXJLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlTmFtZSA9PT0gTWFwcGVyVHlwZS5TdHJpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgKCgoX2YgPSBvcGVyYXRpb25TcGVjLmNvbnRlbnRUeXBlKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YubWF0Y2goXCJ0ZXh0L3BsYWluXCIpKSB8fCBvcGVyYXRpb25TcGVjLm1lZGlhVHlwZSA9PT0gXCJ0ZXh0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTdHJpbmcgc2VyaWFsaXplciBoYXMgdmFsaWRhdGVkIHRoYXQgcmVxdWVzdCBib2R5IGlzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHNvIGp1c3Qgc2VuZCB0aGUgc3RyaW5nLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc1N0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoaHR0cFJlcXVlc3QuYm9keSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBcIiR7ZXJyb3IubWVzc2FnZX1cIiBvY2N1cnJlZCBpbiBzZXJpYWxpemluZyB0aGUgcGF5bG9hZCAtICR7SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZE5hbWUsIHVuZGVmaW5lZCwgXCIgIFwiKX0uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAob3BlcmF0aW9uU3BlYy5mb3JtRGF0YVBhcmFtZXRlcnMgJiYgb3BlcmF0aW9uU3BlYy5mb3JtRGF0YVBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBodHRwUmVxdWVzdC5mb3JtRGF0YSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGZvcm1EYXRhUGFyYW1ldGVyIG9mIG9wZXJhdGlvblNwZWMuZm9ybURhdGFQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YVBhcmFtZXRlclZhbHVlID0gZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXIoc2VydmljZUNsaWVudCwgb3BlcmF0aW9uQXJndW1lbnRzLCBmb3JtRGF0YVBhcmFtZXRlciwgb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyKTtcbiAgICAgICAgICAgIGlmIChmb3JtRGF0YVBhcmFtZXRlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgZm9ybURhdGFQYXJhbWV0ZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhUGFyYW1ldGVyUHJvcGVydHlOYW1lID0gZm9ybURhdGFQYXJhbWV0ZXIubWFwcGVyLnNlcmlhbGl6ZWROYW1lIHx8IGdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKGZvcm1EYXRhUGFyYW1ldGVyKTtcbiAgICAgICAgICAgICAgICBodHRwUmVxdWVzdC5mb3JtRGF0YVtmb3JtRGF0YVBhcmFtZXRlclByb3BlcnR5TmFtZV0gPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGZvcm1EYXRhUGFyYW1ldGVyLm1hcHBlciwgZm9ybURhdGFQYXJhbWV0ZXJWYWx1ZSwgZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXIoZm9ybURhdGFQYXJhbWV0ZXIpLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEFkZHMgYW4geG1sIG5hbWVzcGFjZSB0byB0aGUgeG1sIHNlcmlhbGl6ZWQgb2JqZWN0IGlmIG5lZWRlZCwgb3RoZXJ3aXNlIGl0IGp1c3QgcmV0dXJucyB0aGUgdmFsdWUgaXRzZWxmXG4gKi9cbmZ1bmN0aW9uIGdldFhtbFZhbHVlV2l0aE5hbWVzcGFjZSh4bWxOYW1lc3BhY2UsIHhtbG5zS2V5LCB0eXBlTmFtZSwgc2VyaWFsaXplZFZhbHVlLCBvcHRpb25zKSB7XG4gICAgLy8gQ29tcG9zaXRlIGFuZCBTZXF1ZW5jZSBzY2hlbWFzIGFscmVhZHkgZ290IHRoZWlyIHJvb3QgbmFtZXNwYWNlIHNldCBkdXJpbmcgc2VyaWFsaXphdGlvblxuICAgIC8vIFdlIGp1c3QgbmVlZCB0byBhZGQgeG1sbnMgdG8gdGhlIG90aGVyIHNjaGVtYSB0eXBlc1xuICAgIGlmICh4bWxOYW1lc3BhY2UgJiYgIVtcIkNvbXBvc2l0ZVwiLCBcIlNlcXVlbmNlXCIsIFwiRGljdGlvbmFyeVwiXS5pbmNsdWRlcyh0eXBlTmFtZSkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHJlc3VsdFtvcHRpb25zLnhtbENoYXJLZXldID0gc2VyaWFsaXplZFZhbHVlO1xuICAgICAgICByZXN1bHRbWE1MX0FUVFJLRVldID0geyBbeG1sbnNLZXldOiB4bWxOYW1lc3BhY2UgfTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRWYWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlT3JGdW5jdGlvblJlc3VsdCh2YWx1ZSwgZGVmYXVsdFZhbHVlQ3JlYXRvcikge1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGRlZmF1bHRWYWx1ZUNyZWF0b3IoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0UmVxdWVzdFBvbGljeUZhY3RvcmllcyhhdXRoUG9saWN5RmFjdG9yeSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZhY3RvcmllcyA9IFtdO1xuICAgIGlmIChvcHRpb25zLmdlbmVyYXRlQ2xpZW50UmVxdWVzdElkSGVhZGVyKSB7XG4gICAgICAgIGZhY3Rvcmllcy5wdXNoKGdlbmVyYXRlQ2xpZW50UmVxdWVzdElkUG9saWN5KG9wdGlvbnMuY2xpZW50UmVxdWVzdElkSGVhZGVyTmFtZSkpO1xuICAgIH1cbiAgICBpZiAoYXV0aFBvbGljeUZhY3RvcnkpIHtcbiAgICAgICAgZmFjdG9yaWVzLnB1c2goYXV0aFBvbGljeUZhY3RvcnkpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyQWdlbnRIZWFkZXJOYW1lID0gZ2V0VmFsdWVPckZ1bmN0aW9uUmVzdWx0KG9wdGlvbnMudXNlckFnZW50SGVhZGVyTmFtZSwgZ2V0RGVmYXVsdFVzZXJBZ2VudEhlYWRlck5hbWUpO1xuICAgIGNvbnN0IHVzZXJBZ2VudEhlYWRlclZhbHVlID0gZ2V0VmFsdWVPckZ1bmN0aW9uUmVzdWx0KG9wdGlvbnMudXNlckFnZW50LCBnZXREZWZhdWx0VXNlckFnZW50VmFsdWUpO1xuICAgIGlmICh1c2VyQWdlbnRIZWFkZXJOYW1lICYmIHVzZXJBZ2VudEhlYWRlclZhbHVlKSB7XG4gICAgICAgIGZhY3Rvcmllcy5wdXNoKHVzZXJBZ2VudFBvbGljeSh7IGtleTogdXNlckFnZW50SGVhZGVyTmFtZSwgdmFsdWU6IHVzZXJBZ2VudEhlYWRlclZhbHVlIH0pKTtcbiAgICB9XG4gICAgZmFjdG9yaWVzLnB1c2gocmVkaXJlY3RQb2xpY3koKSk7XG4gICAgZmFjdG9yaWVzLnB1c2gocnBSZWdpc3RyYXRpb25Qb2xpY3kob3B0aW9ucy5ycFJlZ2lzdHJhdGlvblJldHJ5VGltZW91dCkpO1xuICAgIGlmICghb3B0aW9ucy5ub1JldHJ5UG9saWN5KSB7XG4gICAgICAgIGZhY3Rvcmllcy5wdXNoKGV4cG9uZW50aWFsUmV0cnlQb2xpY3koKSk7XG4gICAgICAgIGZhY3Rvcmllcy5wdXNoKHN5c3RlbUVycm9yUmV0cnlQb2xpY3koKSk7XG4gICAgICAgIGZhY3Rvcmllcy5wdXNoKHRocm90dGxpbmdSZXRyeVBvbGljeSgpKTtcbiAgICB9XG4gICAgZmFjdG9yaWVzLnB1c2goZGVzZXJpYWxpemF0aW9uUG9saWN5KG9wdGlvbnMuZGVzZXJpYWxpemF0aW9uQ29udGVudFR5cGVzKSk7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgICBmYWN0b3JpZXMucHVzaChwcm94eVBvbGljeShvcHRpb25zLnByb3h5U2V0dGluZ3MpKTtcbiAgICB9XG4gICAgZmFjdG9yaWVzLnB1c2gobG9nUG9saWN5KHsgbG9nZ2VyOiBsb2dnZXIuaW5mbyB9KSk7XG4gICAgcmV0dXJuIGZhY3Rvcmllcztcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBIVFRQIHBpcGVsaW5lIGJhc2VkIG9uIHRoZSBnaXZlbiBvcHRpb25zLlxuICogQHBhcmFtIHBpcGVsaW5lT3B0aW9ucyAtIERlZmluZXMgb3B0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSBwb2xpY2llcyBpbiB0aGUgSFRUUCBwaXBlbGluZSBmb3IgYW4gU0RLIGNsaWVudC5cbiAqIEBwYXJhbSBhdXRoUG9saWN5RmFjdG9yeSAtIEFuIG9wdGlvbmFsIGF1dGhlbnRpY2F0aW9uIHBvbGljeSBmYWN0b3J5IHRvIHVzZSBmb3Igc2lnbmluZyByZXF1ZXN0cy5cbiAqIEByZXR1cm5zIEEgc2V0IG9mIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGNyZWF0ZSBhIG5ldyB7QGxpbmsgU2VydmljZUNsaWVudH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQaXBlbGluZUZyb21PcHRpb25zKHBpcGVsaW5lT3B0aW9ucywgYXV0aFBvbGljeUZhY3RvcnkpIHtcbiAgICBjb25zdCByZXF1ZXN0UG9saWN5RmFjdG9yaWVzID0gW107XG4gICAgaWYgKHBpcGVsaW5lT3B0aW9ucy5zZW5kU3RyZWFtaW5nSnNvbikge1xuICAgICAgICByZXF1ZXN0UG9saWN5RmFjdG9yaWVzLnB1c2gobmRKc29uUG9saWN5KCkpO1xuICAgIH1cbiAgICBsZXQgdXNlckFnZW50VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBpcGVsaW5lT3B0aW9ucy51c2VyQWdlbnRPcHRpb25zICYmIHBpcGVsaW5lT3B0aW9ucy51c2VyQWdlbnRPcHRpb25zLnVzZXJBZ2VudFByZWZpeCkge1xuICAgICAgICBjb25zdCB1c2VyQWdlbnRJbmZvID0gW107XG4gICAgICAgIHVzZXJBZ2VudEluZm8ucHVzaChwaXBlbGluZU9wdGlvbnMudXNlckFnZW50T3B0aW9ucy51c2VyQWdlbnRQcmVmaXgpO1xuICAgICAgICAvLyBBZGQgdGhlIGRlZmF1bHQgdXNlciBhZ2VudCB2YWx1ZSBpZiBpdCBpc24ndCBhbHJlYWR5IHNwZWNpZmllZFxuICAgICAgICAvLyBieSB0aGUgdXNlckFnZW50UHJlZml4IG9wdGlvbi5cbiAgICAgICAgY29uc3QgZGVmYXVsdFVzZXJBZ2VudEluZm8gPSBnZXREZWZhdWx0VXNlckFnZW50VmFsdWUoKTtcbiAgICAgICAgaWYgKHVzZXJBZ2VudEluZm8uaW5kZXhPZihkZWZhdWx0VXNlckFnZW50SW5mbykgPT09IC0xKSB7XG4gICAgICAgICAgICB1c2VyQWdlbnRJbmZvLnB1c2goZGVmYXVsdFVzZXJBZ2VudEluZm8pO1xuICAgICAgICB9XG4gICAgICAgIHVzZXJBZ2VudFZhbHVlID0gdXNlckFnZW50SW5mby5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgY29uc3Qga2VlcEFsaXZlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEtlZXBBbGl2ZU9wdGlvbnMpLCBwaXBlbGluZU9wdGlvbnMua2VlcEFsaXZlT3B0aW9ucyk7XG4gICAgY29uc3QgcmV0cnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0UmV0cnlPcHRpb25zKSwgcGlwZWxpbmVPcHRpb25zLnJldHJ5T3B0aW9ucyk7XG4gICAgY29uc3QgcmVkaXJlY3RPcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0UmVkaXJlY3RPcHRpb25zKSwgcGlwZWxpbmVPcHRpb25zLnJlZGlyZWN0T3B0aW9ucyk7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgICByZXF1ZXN0UG9saWN5RmFjdG9yaWVzLnB1c2gocHJveHlQb2xpY3kocGlwZWxpbmVPcHRpb25zLnByb3h5T3B0aW9ucykpO1xuICAgIH1cbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0RGVzZXJpYWxpemF0aW9uT3B0aW9ucyksIHBpcGVsaW5lT3B0aW9ucy5kZXNlcmlhbGl6YXRpb25PcHRpb25zKTtcbiAgICBjb25zdCBsb2dnaW5nT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHBpcGVsaW5lT3B0aW9ucy5sb2dnaW5nT3B0aW9ucyk7XG4gICAgcmVxdWVzdFBvbGljeUZhY3Rvcmllcy5wdXNoKHRyYWNpbmdQb2xpY3koeyB1c2VyQWdlbnQ6IHVzZXJBZ2VudFZhbHVlIH0pLCBrZWVwQWxpdmVQb2xpY3koa2VlcEFsaXZlT3B0aW9ucyksIHVzZXJBZ2VudFBvbGljeSh7IHZhbHVlOiB1c2VyQWdlbnRWYWx1ZSB9KSwgZ2VuZXJhdGVDbGllbnRSZXF1ZXN0SWRQb2xpY3koKSwgZGVzZXJpYWxpemF0aW9uUG9saWN5KGRlc2VyaWFsaXphdGlvbk9wdGlvbnMuZXhwZWN0ZWRDb250ZW50VHlwZXMpLCB0aHJvdHRsaW5nUmV0cnlQb2xpY3koKSwgc3lzdGVtRXJyb3JSZXRyeVBvbGljeSgpLCBleHBvbmVudGlhbFJldHJ5UG9saWN5KHJldHJ5T3B0aW9ucy5tYXhSZXRyaWVzLCByZXRyeU9wdGlvbnMucmV0cnlEZWxheUluTXMsIHJldHJ5T3B0aW9ucy5tYXhSZXRyeURlbGF5SW5NcykpO1xuICAgIGlmIChyZWRpcmVjdE9wdGlvbnMuaGFuZGxlUmVkaXJlY3RzKSB7XG4gICAgICAgIHJlcXVlc3RQb2xpY3lGYWN0b3JpZXMucHVzaChyZWRpcmVjdFBvbGljeShyZWRpcmVjdE9wdGlvbnMubWF4UmV0cmllcykpO1xuICAgIH1cbiAgICBpZiAoYXV0aFBvbGljeUZhY3RvcnkpIHtcbiAgICAgICAgcmVxdWVzdFBvbGljeUZhY3Rvcmllcy5wdXNoKGF1dGhQb2xpY3lGYWN0b3J5KTtcbiAgICB9XG4gICAgcmVxdWVzdFBvbGljeUZhY3Rvcmllcy5wdXNoKGxvZ1BvbGljeShsb2dnaW5nT3B0aW9ucykpO1xuICAgIGlmIChpc05vZGUgJiYgcGlwZWxpbmVPcHRpb25zLmRlY29tcHJlc3NSZXNwb25zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmVxdWVzdFBvbGljeUZhY3Rvcmllcy5wdXNoKGRpc2FibGVSZXNwb25zZURlY29tcHJlc3Npb25Qb2xpY3koKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGh0dHBDbGllbnQ6IHBpcGVsaW5lT3B0aW9ucy5odHRwQ2xpZW50LFxuICAgICAgICByZXF1ZXN0UG9saWN5RmFjdG9yaWVzLFxuICAgIH07XG59XG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgcGFyZW50IGZvciB0aGUgcHJvcGVydHkgYXQgdGhlIHByb3ZpZGVkIHBhdGggd2hlbiBzdGFydGluZyB3aXRoIHRoZSBwcm92aWRlZFxuICogcGFyZW50IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5UGFyZW50KHBhcmVudCwgcHJvcGVydHlQYXRoKSB7XG4gICAgaWYgKHBhcmVudCAmJiBwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoTGVuZ3RoID0gcHJvcGVydHlQYXRoLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhMZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5UGF0aFtpXTtcbiAgICAgICAgICAgIGlmICghcGFyZW50W3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRbcHJvcGVydHlOYW1lXSA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudDtcbn1cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkFyZ3VtZW50VmFsdWVGcm9tUGFyYW1ldGVyKHNlcnZpY2VDbGllbnQsIG9wZXJhdGlvbkFyZ3VtZW50cywgcGFyYW1ldGVyLCBzZXJpYWxpemVyKSB7XG4gICAgcmV0dXJuIGdldE9wZXJhdGlvbkFyZ3VtZW50VmFsdWVGcm9tUGFyYW1ldGVyUGF0aChzZXJ2aWNlQ2xpZW50LCBvcGVyYXRpb25Bcmd1bWVudHMsIHBhcmFtZXRlci5wYXJhbWV0ZXJQYXRoLCBwYXJhbWV0ZXIubWFwcGVyLCBzZXJpYWxpemVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlclBhdGgoc2VydmljZUNsaWVudCwgb3BlcmF0aW9uQXJndW1lbnRzLCBwYXJhbWV0ZXJQYXRoLCBwYXJhbWV0ZXJNYXBwZXIsIHNlcmlhbGl6ZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyUGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBwYXJhbWV0ZXJQYXRoID0gW3BhcmFtZXRlclBhdGhdO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVyT3B0aW9ucyA9IChfYSA9IG9wZXJhdGlvbkFyZ3VtZW50cy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2VyaWFsaXplck9wdGlvbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1ldGVyUGF0aCkpIHtcbiAgICAgICAgaWYgKHBhcmFtZXRlclBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRlck1hcHBlci5pc0NvbnN0YW50KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJhbWV0ZXJNYXBwZXIuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3BlcnR5U2VhcmNoUmVzdWx0ID0gZ2V0UHJvcGVydHlGcm9tUGFyYW1ldGVyUGF0aChvcGVyYXRpb25Bcmd1bWVudHMsIHBhcmFtZXRlclBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHlTZWFyY2hSZXN1bHQucHJvcGVydHlGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVNlYXJjaFJlc3VsdCA9IGdldFByb3BlcnR5RnJvbVBhcmFtZXRlclBhdGgoc2VydmljZUNsaWVudCwgcGFyYW1ldGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB1c2VEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5U2VhcmNoUmVzdWx0LnByb3BlcnR5Rm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlRGVmYXVsdFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlck1hcHBlci5yZXF1aXJlZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbWV0ZXJQYXRoWzBdID09PSBcIm9wdGlvbnNcIiAmJiBwYXJhbWV0ZXJQYXRoLmxlbmd0aCA9PT0gMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdXNlRGVmYXVsdFZhbHVlID8gcGFyYW1ldGVyTWFwcGVyLmRlZmF1bHRWYWx1ZSA6IHByb3BlcnR5U2VhcmNoUmVzdWx0LnByb3BlcnR5VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZXJpYWxpemUganVzdCBmb3IgdmFsaWRhdGlvbiBwdXJwb3Nlcy5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlclBhdGhTdHJpbmcgPSBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlclBhdGgocGFyYW1ldGVyUGF0aCwgcGFyYW1ldGVyTWFwcGVyKTtcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHBhcmFtZXRlck1hcHBlciwgdmFsdWUsIHBhcmFtZXRlclBhdGhTdHJpbmcsIHNlcmlhbGl6ZXJPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHBhcmFtZXRlck1hcHBlci5yZXF1aXJlZCkge1xuICAgICAgICAgICAgdmFsdWUgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBwYXJhbWV0ZXJQYXRoKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU1hcHBlciA9IHBhcmFtZXRlck1hcHBlci50eXBlLm1vZGVsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gcGFyYW1ldGVyUGF0aFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGdldE9wZXJhdGlvbkFyZ3VtZW50VmFsdWVGcm9tUGFyYW1ldGVyUGF0aChzZXJ2aWNlQ2xpZW50LCBvcGVyYXRpb25Bcmd1bWVudHMsIHByb3BlcnR5UGF0aCwgcHJvcGVydHlNYXBwZXIsIHNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgLy8gU2VyaWFsaXplIGp1c3QgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVBhdGhTdHJpbmcgPSBnZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlclBhdGgocHJvcGVydHlQYXRoLCBwcm9wZXJ0eU1hcHBlcik7XG4gICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgcHJvcGVydHlWYWx1ZSwgcHJvcGVydHlQYXRoU3RyaW5nLCBzZXJpYWxpemVyT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFByb3BlcnR5RnJvbVBhcmFtZXRlclBhdGgocGFyZW50LCBwYXJhbWV0ZXJQYXRoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0geyBwcm9wZXJ0eUZvdW5kOiBmYWxzZSB9O1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHBhcmFtZXRlclBhdGgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aFBhcnQgPSBwYXJhbWV0ZXJQYXRoW2ldO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdG8gY2hlY2sgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG9vLCBzbyBkb24ndCB1c2UgaGFzT3duUHJvcGVydHkoKS5cbiAgICAgICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudCAhPT0gbnVsbCAmJiBwYXJhbWV0ZXJQYXRoUGFydCBpbiBwYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFtwYXJhbWV0ZXJQYXRoUGFydF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA9PT0gcGFyYW1ldGVyUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0LnByb3BlcnR5VmFsdWUgPSBwYXJlbnQ7XG4gICAgICAgIHJlc3VsdC5wcm9wZXJ0eUZvdW5kID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogUGFyc2VzIGFuIHtAbGluayBIdHRwT3BlcmF0aW9uUmVzcG9uc2V9IGludG8gYSBub3JtYWxpemVkIEhUVFAgcmVzcG9uc2Ugb2JqZWN0ICh7QGxpbmsgUmVzdFJlc3BvbnNlfSkuXG4gKiBAcGFyYW0gX3Jlc3BvbnNlIC0gV3JhcHBlciBvYmplY3QgZm9yIGh0dHAgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcmVzcG9uc2VTcGVjIC0gTWFwcGVycyBmb3IgaG93IHRvIHBhcnNlIHRoZSByZXNwb25zZSBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMgLSBBIG5vcm1hbGl6ZWQgcmVzcG9uc2Ugb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblJlc3BvbnNlKF9yZXNwb25zZSwgcmVzcG9uc2VTcGVjKSB7XG4gICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IF9yZXNwb25zZS5wYXJzZWRIZWFkZXJzO1xuICAgIGNvbnN0IGJvZHlNYXBwZXIgPSByZXNwb25zZVNwZWMgJiYgcmVzcG9uc2VTcGVjLmJvZHlNYXBwZXI7XG4gICAgY29uc3QgYWRkT3BlcmF0aW9uUmVzcG9uc2UgPSAob2JqKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBcIl9yZXNwb25zZVwiLCB7XG4gICAgICAgICAgICB2YWx1ZTogX3Jlc3BvbnNlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGlmIChib2R5TWFwcGVyKSB7XG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gYm9keU1hcHBlci50eXBlLm5hbWU7XG4gICAgICAgIGlmICh0eXBlTmFtZSA9PT0gXCJTdHJlYW1cIikge1xuICAgICAgICAgICAgcmV0dXJuIGFkZE9wZXJhdGlvblJlc3BvbnNlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyc2VkSGVhZGVycyksIHsgYmxvYkJvZHk6IF9yZXNwb25zZS5ibG9iQm9keSwgcmVhZGFibGVTdHJlYW1Cb2R5OiBfcmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5IH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbFByb3BlcnRpZXMgPSAodHlwZU5hbWUgPT09IFwiQ29tcG9zaXRlXCIgJiYgYm9keU1hcHBlci50eXBlLm1vZGVsUHJvcGVydGllcykgfHwge307XG4gICAgICAgIGNvbnN0IGlzUGFnZWFibGVSZXNwb25zZSA9IE9iamVjdC5rZXlzKG1vZGVsUHJvcGVydGllcykuc29tZSgoaykgPT4gbW9kZWxQcm9wZXJ0aWVzW2tdLnNlcmlhbGl6ZWROYW1lID09PSBcIlwiKTtcbiAgICAgICAgaWYgKHR5cGVOYW1lID09PSBcIlNlcXVlbmNlXCIgfHwgaXNQYWdlYWJsZVJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCBhcnJheVJlc3BvbnNlID0gWy4uLihfcmVzcG9uc2UucGFyc2VkQm9keSB8fCBbXSldO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobW9kZWxQcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlbFByb3BlcnRpZXNba2V5XS5zZXJpYWxpemVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBhcnJheVJlc3BvbnNlW2tleV0gPSBfcmVzcG9uc2UucGFyc2VkQm9keVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJzZWRIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyc2VkSGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlSZXNwb25zZVtrZXldID0gcGFyc2VkSGVhZGVyc1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE9wZXJhdGlvblJlc3BvbnNlKGFycmF5UmVzcG9uc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5UmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVOYW1lID09PSBcIkNvbXBvc2l0ZVwiIHx8IHR5cGVOYW1lID09PSBcIkRpY3Rpb25hcnlcIikge1xuICAgICAgICAgICAgcmV0dXJuIGFkZE9wZXJhdGlvblJlc3BvbnNlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyc2VkSGVhZGVycyksIF9yZXNwb25zZS5wYXJzZWRCb2R5KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJvZHlNYXBwZXIgfHxcbiAgICAgICAgX3Jlc3BvbnNlLnJlcXVlc3QubWV0aG9kID09PSBcIkhFQURcIiB8fFxuICAgICAgICB1dGlscy5pc1ByaW1pdGl2ZVR5cGUoX3Jlc3BvbnNlLnBhcnNlZEJvZHkpKSB7XG4gICAgICAgIC8vIHByaW1pdGl2ZSBib2R5IHR5cGVzIGFuZCBIRUFEIGJvb2xlYW5zXG4gICAgICAgIHJldHVybiBhZGRPcGVyYXRpb25SZXNwb25zZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcnNlZEhlYWRlcnMpLCB7IGJvZHk6IF9yZXNwb25zZS5wYXJzZWRCb2R5IH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZE9wZXJhdGlvblJlc3BvbnNlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyc2VkSGVhZGVycyksIF9yZXNwb25zZS5wYXJzZWRCb2R5KSk7XG59XG5mdW5jdGlvbiBnZXRDcmVkZW50aWFsU2NvcGVzKG9wdGlvbnMsIGJhc2VVcmkpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNyZWRlbnRpYWxTY29wZXMpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY3JlZGVudGlhbFNjb3BlcztcbiAgICB9XG4gICAgaWYgKGJhc2VVcmkpIHtcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VVcml9Ly5kZWZhdWx0YDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcnZpY2VDbGllbnQuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuaW1wb3J0ICogYXMgY29yZUh0dHAgZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmNvbnN0IHBhY2thZ2VOYW1lID0gXCJhenVyZS1zdG9yYWdlLWJsb2JcIjtcbmNvbnN0IHBhY2thZ2VWZXJzaW9uID0gXCIxMi4xNy4wXCI7XG5leHBvcnQgY2xhc3MgU3RvcmFnZUNsaWVudENvbnRleHQgZXh0ZW5kcyBjb3JlSHR0cC5TZXJ2aWNlQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RvcmFnZUNsaWVudENvbnRleHQgY2xhc3MuXG4gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBzZXJ2aWNlIGFjY291bnQsIGNvbnRhaW5lciwgb3IgYmxvYiB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIGRlc2lyZWRcbiAgICAgKiAgICAgICAgICAgIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgcGFyYW1ldGVyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIndXJsJyBjYW5ub3QgYmUgbnVsbFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXppbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbnNcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zLnVzZXJBZ2VudCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFVzZXJBZ2VudCA9IGNvcmVIdHRwLmdldERlZmF1bHRVc2VyQWdlbnRWYWx1ZSgpO1xuICAgICAgICAgICAgb3B0aW9ucy51c2VyQWdlbnQgPSBgJHtwYWNrYWdlTmFtZX0vJHtwYWNrYWdlVmVyc2lvbn0gJHtkZWZhdWx0VXNlckFnZW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIodW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGVudFR5cGUgPSBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIjtcbiAgICAgICAgdGhpcy5iYXNlVXJpID0gb3B0aW9ucy5lbmRwb2ludCB8fCBcInt1cmx9XCI7XG4gICAgICAgIC8vIFBhcmFtZXRlciBhc3NpZ25tZW50c1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgLy8gQXNzaWduaW5nIHZhbHVlcyB0byBDb25zdGFudCBwYXJhbWV0ZXJzXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCBcIjIwMjMtMTEtMDNcIjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdG9yYWdlQ2xpZW50Q29udGV4dC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IFN0b3JhZ2VDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4vZ2VuZXJhdGVkL3NyYy9zdG9yYWdlQ2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgZXNjYXBlVVJMUGF0aCwgZ2V0VVJMU2NoZW1lLCBpRXF1YWwsIGdldEFjY291bnROYW1lRnJvbVVybCB9IGZyb20gXCIuL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuaW1wb3J0IHsgQW5vbnltb3VzQ3JlZGVudGlhbCB9IGZyb20gXCIuL2NyZWRlbnRpYWxzL0Fub255bW91c0NyZWRlbnRpYWxcIjtcbmltcG9ydCB7IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcIjtcbmltcG9ydCB7IGlzVG9rZW5DcmVkZW50aWFsLCBpc05vZGUgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuLyoqXG4gKiBBIFN0b3JhZ2VDbGllbnQgcmVwcmVzZW50cyBhIGJhc2VkIFVSTCBjbGFzcyBmb3Ige0BsaW5rIEJsb2JTZXJ2aWNlQ2xpZW50fSwge0BsaW5rIENvbnRhaW5lckNsaWVudH1cbiAqIGFuZCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yYWdlQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0b3JhZ2VDbGllbnQuXG4gICAgICogQHBhcmFtIHVybCAtIHVybCB0byByZXNvdXJjZVxuICAgICAqIEBwYXJhbSBwaXBlbGluZSAtIHJlcXVlc3QgcG9saWN5IHBpcGVsaW5lLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCwgcGlwZWxpbmUpIHtcbiAgICAgICAgLy8gVVJMIHNob3VsZCBiZSBlbmNvZGVkIGFuZCBvbmx5IG9uY2UsIHByb3RvY29sIGxheWVyIHNob3VsZG4ndCBlbmNvZGUgVVJMIGFnYWluXG4gICAgICAgIHRoaXMudXJsID0gZXNjYXBlVVJMUGF0aCh1cmwpO1xuICAgICAgICB0aGlzLmFjY291bnROYW1lID0gZ2V0QWNjb3VudE5hbWVGcm9tVXJsKHVybCk7XG4gICAgICAgIHRoaXMucGlwZWxpbmUgPSBwaXBlbGluZTtcbiAgICAgICAgdGhpcy5zdG9yYWdlQ2xpZW50Q29udGV4dCA9IG5ldyBTdG9yYWdlQ2xpZW50Q29udGV4dCh0aGlzLnVybCwgcGlwZWxpbmUudG9TZXJ2aWNlQ2xpZW50T3B0aW9ucygpKTtcbiAgICAgICAgdGhpcy5pc0h0dHBzID0gaUVxdWFsKGdldFVSTFNjaGVtZSh0aGlzLnVybCkgfHwgXCJcIiwgXCJodHRwc1wiKTtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFsID0gbmV3IEFub255bW91c0NyZWRlbnRpYWwoKTtcbiAgICAgICAgZm9yIChjb25zdCBmYWN0b3J5IG9mIHRoaXMucGlwZWxpbmUuZmFjdG9yaWVzKSB7XG4gICAgICAgICAgICBpZiAoKGlzTm9kZSAmJiBmYWN0b3J5IGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpIHx8XG4gICAgICAgICAgICAgICAgZmFjdG9yeSBpbnN0YW5jZW9mIEFub255bW91c0NyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWwgPSBmYWN0b3J5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNUb2tlbkNyZWRlbnRpYWwoZmFjdG9yeS5jcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgd29ya3MgaWYgdGhlIGZhY3RvcnkgaGFzIGJlZW4gYXR0YWNoZWQgYSBcImNyZWRlbnRpYWxcIiBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAvLyBXZSBkbyB0aGF0IGluIG5ld1BpcGVsaW5lKCkgd2hlbiB1c2luZyBUb2tlbkNyZWRlbnRpYWwuXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsID0gZmFjdG9yeS5jcmVkZW50aWFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE92ZXJyaWRlIHByb3RvY29sIGxheWVyJ3MgZGVmYXVsdCBjb250ZW50LXR5cGVcbiAgICAgICAgY29uc3Qgc3RvcmFnZUNsaWVudENvbnRleHQgPSB0aGlzLnN0b3JhZ2VDbGllbnRDb250ZXh0O1xuICAgICAgICBzdG9yYWdlQ2xpZW50Q29udGV4dC5yZXF1ZXN0Q29udGVudFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RvcmFnZUNsaWVudC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGNyZWF0ZVNwYW5GdW5jdGlvbiB9IGZyb20gXCJAYXp1cmUvY29yZS10cmFjaW5nXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBzcGFuIHVzaW5nIHRoZSBnbG9iYWwgdHJhY2VyLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVTcGFuID0gY3JlYXRlU3BhbkZ1bmN0aW9uKHtcbiAgICBwYWNrYWdlUHJlZml4OiBcIkF6dXJlLlN0b3JhZ2UuQmxvYlwiLFxuICAgIG5hbWVzcGFjZTogXCJNaWNyb3NvZnQuU3RvcmFnZVwiLFxufSk7XG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEFkYXB0IHRoZSB0cmFjaW5nIG9wdGlvbnMgZnJvbSBPcGVyYXRpb25PcHRpb25zIHRvIHdoYXQgdGhleSBuZWVkIHRvIGJlIGZvclxuICogUmVxdWVzdE9wdGlvbnNCYXNlICh3aGVuIHdlIHVwZGF0ZSB0byBsYXRlciBPcGVuVGVsZW1ldHJ5IHZlcnNpb25zIHRoaXMgaXMgbm93XG4gKiB0d28gc2VwYXJhdGUgZmllbGRzLCBub3QganVzdCBvbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBCeSBwYXNzaW5nIHNwYW5PcHRpb25zIGlmIHRoZXkgZXhpc3QgYXQgcnVudGltZSwgd2UncmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBAYXp1cmUvY29yZS10cmFjaW5nQHByZXZpZXcuMTMgYW5kIGVhcmxpZXIuXG4gICAgICAgIHNwYW5PcHRpb25zOiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHJhY2luZ09wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zcGFuT3B0aW9ucyxcbiAgICAgICAgdHJhY2luZ0NvbnRleHQ6IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50cmFjaW5nT3B0aW9ucykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnRyYWNpbmdDb250ZXh0LFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjaW5nLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IGEgU2VydmljZVNBUyB0byBhIGJsb2IuIFNldHRpbmdcbiAqIGEgdmFsdWUgdG8gdHJ1ZSBtZWFucyB0aGF0IGFueSBTQVMgd2hpY2ggdXNlcyB0aGVzZSBwZXJtaXNzaW9ucyB3aWxsIGdyYW50IHBlcm1pc3Npb25zIGZvciB0aGF0IG9wZXJhdGlvbi4gT25jZSBhbGxcbiAqIHRoZSB2YWx1ZXMgYXJlIHNldCwgdGhpcyBzaG91bGQgYmUgc2VyaWFsaXplZCB3aXRoIHRvU3RyaW5nIGFuZCBzZXQgYXMgdGhlIHBlcm1pc3Npb25zIGZpZWxkIG9uIGFcbiAqIHtAbGluayBCbG9iU0FTU2lnbmF0dXJlVmFsdWVzfSBvYmplY3QuIEl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGUgcGVybWlzc2lvbnMgc3RyaW5nIHdpdGhvdXQgdGhpcyBjbGFzcywgYnV0XG4gKiB0aGUgb3JkZXIgb2YgdGhlIHBlcm1pc3Npb25zIGlzIHBhcnRpY3VsYXIgYW5kIHRoaXMgY2xhc3MgZ3VhcmFudGVlcyBjb3JyZWN0bmVzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJsb2JTQVNQZXJtaXNzaW9ucyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgUmVhZCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIEFkZCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgQ3JlYXRlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBXcml0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3JpdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBEZWxldGUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGV0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIERlbGV0ZSB2ZXJzaW9uIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxldGVWZXJzaW9uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjZmllcyBUYWcgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhZyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIE1vdmUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1vdmUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBFeGVjdXRlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leGVjdXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgU2V0SW1tdXRhYmlsaXR5UG9saWN5IGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZXRJbW11dGFiaWxpdHlQb2xpY3kgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGF0IFBlcm1hbmVudCBEZWxldGUgaXMgcGVybWl0dGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wZXJtYW5lbnREZWxldGUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBCbG9iU0FTUGVybWlzc2lvbnN9IGZyb20gdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9ucyBzdHJpbmcuIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW5cbiAgICAgKiBFcnJvciBpZiBpdCBlbmNvdW50ZXJzIGEgY2hhcmFjdGVyIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbnMgLVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShwZXJtaXNzaW9ucykge1xuICAgICAgICBjb25zdCBibG9iU0FTUGVybWlzc2lvbnMgPSBuZXcgQmxvYlNBU1Blcm1pc3Npb25zKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJcIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLnJlYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuYWRkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLmNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ3XCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy53cml0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5kZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuZGVsZXRlVmVyc2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMubW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlXCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5leGVjdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwZXJtaXNzaW9uOiAke2NoYXJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2JTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBCbG9iU0FTUGVybWlzc2lvbnN9IGZyb20gYSByYXcgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHNhbWUga2V5cyBhcyBpdFxuICAgICAqIGFuZCBib29sZWFuIHZhbHVlcyBmb3IgdGhlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uTGlrZSAtXG4gICAgICovXG4gICAgc3RhdGljIGZyb20ocGVybWlzc2lvbkxpa2UpIHtcbiAgICAgICAgY29uc3QgYmxvYlNBU1Blcm1pc3Npb25zID0gbmV3IEJsb2JTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucmVhZCkge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLnJlYWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5hZGQpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5hZGQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5jcmVhdGUpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5jcmVhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS53cml0ZSkge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLndyaXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZGVsZXRlKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuZGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZGVsZXRlVmVyc2lvbikge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS50YWcpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5tb3ZlKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMubW92ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmV4ZWN1dGUpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5leGVjdXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2Uuc2V0SW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucGVybWFuZW50RGVsZXRlKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMucGVybWFuZW50RGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvYlNBU1Blcm1pc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcGVybWlzc2lvbnMgdG8gYSBzdHJpbmcuIFVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgZ3VhcmFudGVlIHRoZSBwZXJtaXNzaW9ucyBhcmUgaW4gYW5cbiAgICAgKiBvcmRlciBhY2NlcHRlZCBieSB0aGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHdoaWNoIHJlcHJlc2VudHMgdGhlIEJsb2JTQVNQZXJtaXNzaW9uc1xuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5yZWFkKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiclwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hZGQpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNyZWF0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud3JpdGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ3XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlVmVyc2lvbikge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInhcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGFnKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwidFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb3ZlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwibVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leGVjdXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXRJbW11dGFiaWxpdHlQb2xpY3kpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBlcm1hbmVudERlbGV0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmpvaW4oXCJcIik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmxvYlNBU1Blcm1pc3Npb25zLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGNvbnN0cnVjdCBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgYSBTZXJ2aWNlU0FTIHRvIGEgY29udGFpbmVyLlxuICogU2V0dGluZyBhIHZhbHVlIHRvIHRydWUgbWVhbnMgdGhhdCBhbnkgU0FTIHdoaWNoIHVzZXMgdGhlc2UgcGVybWlzc2lvbnMgd2lsbCBncmFudCBwZXJtaXNzaW9ucyBmb3IgdGhhdCBvcGVyYXRpb24uXG4gKiBPbmNlIGFsbCB0aGUgdmFsdWVzIGFyZSBzZXQsIHRoaXMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgd2l0aCB0b1N0cmluZyBhbmQgc2V0IGFzIHRoZSBwZXJtaXNzaW9ucyBmaWVsZCBvbiBhXG4gKiB7QGxpbmsgQmxvYlNBU1NpZ25hdHVyZVZhbHVlc30gb2JqZWN0LiBJdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhlIHBlcm1pc3Npb25zIHN0cmluZyB3aXRob3V0IHRoaXMgY2xhc3MsIGJ1dFxuICogdGhlIG9yZGVyIG9mIHRoZSBwZXJtaXNzaW9ucyBpcyBwYXJ0aWN1bGFyIGFuZCB0aGlzIGNsYXNzIGd1YXJhbnRlZXMgY29ycmVjdG5lc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250YWluZXJTQVNQZXJtaXNzaW9ucyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgUmVhZCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIEFkZCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgQ3JlYXRlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBXcml0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3JpdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBEZWxldGUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGV0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIERlbGV0ZSB2ZXJzaW9uIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxldGVWZXJzaW9uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgTGlzdCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGlzdCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2ZpZXMgVGFnIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBNb3ZlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tb3ZlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgRXhlY3V0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhlY3V0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIFNldEltbXV0YWJpbGl0eVBvbGljeSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCBQZXJtYW5lbnQgRGVsZXRlIGlzIHBlcm1pdHRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGVybWFuZW50RGVsZXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCBGaWx0ZXIgQmxvYnMgYnkgVGFncyBpcyBwZXJtaXR0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlckJ5VGFncyA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBDb250YWluZXJTQVNQZXJtaXNzaW9uc30gZnJvbSB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb25zIHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhblxuICAgICAqIEVycm9yIGlmIGl0IGVuY291bnRlcnMgYSBjaGFyYWN0ZXIgdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgdmFsaWQgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9ucyAtXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclNBU1Blcm1pc3Npb25zID0gbmV3IENvbnRhaW5lclNBU1Blcm1pc3Npb25zKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMucmVhZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmFkZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ3XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLndyaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuZGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImxcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMubGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5tb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuZXhlY3V0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBlcm1hbmVudERlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmZpbHRlckJ5VGFncyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHBlcm1pc3Npb24gJHtjaGFyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWluZXJTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb250YWluZXJTQVNQZXJtaXNzaW9uc30gZnJvbSBhIHJhdyBvYmplY3Qgd2hpY2ggY29udGFpbnMgc2FtZSBrZXlzIGFzIGl0XG4gICAgICogYW5kIGJvb2xlYW4gdmFsdWVzIGZvciB0aGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBlcm1pc3Npb25MaWtlIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShwZXJtaXNzaW9uTGlrZSkge1xuICAgICAgICBjb25zdCBjb250YWluZXJTQVNQZXJtaXNzaW9ucyA9IG5ldyBDb250YWluZXJTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucmVhZCkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMucmVhZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmFkZCkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuYWRkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuY3JlYXRlKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5jcmVhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS53cml0ZSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMud3JpdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5kZWxldGUpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmxpc3QpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmxpc3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5kZWxldGVWZXJzaW9uKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UudGFnKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5tb3ZlKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5tb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZXhlY3V0ZSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuZXhlY3V0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnNldEltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucGVybWFuZW50RGVsZXRlKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5maWx0ZXJCeVRhZ3MpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmZpbHRlckJ5VGFncyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcGVybWlzc2lvbnMgdG8gYSBzdHJpbmcuIFVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgZ3VhcmFudGVlIHRoZSBwZXJtaXNzaW9ucyBhcmUgaW4gYW5cbiAgICAgKiBvcmRlciBhY2NlcHRlZCBieSB0aGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIFRoZSBvcmRlciBvZiB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgYXMgc3BlY2lmaWVkIGhlcmUgdG8gZW5zdXJlIGNvcnJlY3RuZXNzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvbnN0cnVjdGluZy1hLXNlcnZpY2Utc2FzXG4gICAgICpcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMucmVhZCkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWRkKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiYVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jcmVhdGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJjXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyaXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwid1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxldGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3QpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRhZykge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW92ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcIm1cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2V0SW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiaVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wZXJtYW5lbnREZWxldGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckJ5VGFncykge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmpvaW4oXCJcIik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udGFpbmVyU0FTUGVybWlzc2lvbnMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBjcmVhdGVIbWFjIH0gZnJvbSBcImNyeXB0b1wiO1xuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogVXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGlvbiBvZiB1c2VyIGRlbGVnYXRpb24gU0FTLlxuICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY3JlYXRlLXVzZXItZGVsZWdhdGlvbi1zYXNcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBVc2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuXG4gICAgICogQHBhcmFtIGFjY291bnROYW1lIC1cbiAgICAgKiBAcGFyYW0gdXNlckRlbGVnYXRpb25LZXkgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjY291bnROYW1lLCB1c2VyRGVsZWdhdGlvbktleSkge1xuICAgICAgICB0aGlzLmFjY291bnROYW1lID0gYWNjb3VudE5hbWU7XG4gICAgICAgIHRoaXMudXNlckRlbGVnYXRpb25LZXkgPSB1c2VyRGVsZWdhdGlvbktleTtcbiAgICAgICAgdGhpcy5rZXkgPSBCdWZmZXIuZnJvbSh1c2VyRGVsZWdhdGlvbktleS52YWx1ZSwgXCJiYXNlNjRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGhhc2ggc2lnbmF0dXJlIGZvciBhbiBIVFRQIHJlcXVlc3Qgb3IgZm9yIGEgU0FTLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZ1RvU2lnbiAtXG4gICAgICovXG4gICAgY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBzdHJpbmdUb1NpZ246ICR7SlNPTi5zdHJpbmdpZnkoc3RyaW5nVG9TaWduKX1gKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUhtYWMoXCJzaGEyNTZcIiwgdGhpcy5rZXkpLnVwZGF0ZShzdHJpbmdUb1NpZ24sIFwidXRmOFwiKS5kaWdlc3QoXCJiYXNlNjRcIik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBHZW5lcmF0ZSBTYXNJUFJhbmdlIGZvcm1hdCBzdHJpbmcuIEZvciBleGFtcGxlOlxuICpcbiAqIFwiOC44LjguOFwiIG9yIFwiMS4xLjEuMS0yNTUuMjU1LjI1NS4yNTVcIlxuICpcbiAqIEBwYXJhbSBpcFJhbmdlIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlwUmFuZ2VUb1N0cmluZyhpcFJhbmdlKSB7XG4gICAgcmV0dXJuIGlwUmFuZ2UuZW5kID8gYCR7aXBSYW5nZS5zdGFydH0tJHtpcFJhbmdlLmVuZH1gIDogaXBSYW5nZS5zdGFydDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNhc0lQUmFuZ2UuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBpcFJhbmdlVG9TdHJpbmcgfSBmcm9tIFwiLi9TYXNJUFJhbmdlXCI7XG5pbXBvcnQgeyB0cnVuY2F0ZWRJU084MDYxRGF0ZSB9IGZyb20gXCIuLi91dGlscy91dGlscy5jb21tb25cIjtcbi8qKlxuICogUHJvdG9jb2xzIGZvciBnZW5lcmF0ZWQgU0FTLlxuICovXG5leHBvcnQgdmFyIFNBU1Byb3RvY29sO1xuKGZ1bmN0aW9uIChTQVNQcm90b2NvbCkge1xuICAgIC8qKlxuICAgICAqIFByb3RvY29sIHRoYXQgYWxsb3dzIEhUVFBTIG9ubHlcbiAgICAgKi9cbiAgICBTQVNQcm90b2NvbFtcIkh0dHBzXCJdID0gXCJodHRwc1wiO1xuICAgIC8qKlxuICAgICAqIFByb3RvY29sIHRoYXQgYWxsb3dzIGJvdGggSFRUUFMgYW5kIEhUVFBcbiAgICAgKi9cbiAgICBTQVNQcm90b2NvbFtcIkh0dHBzQW5kSHR0cFwiXSA9IFwiaHR0cHMsaHR0cFwiO1xufSkoU0FTUHJvdG9jb2wgfHwgKFNBU1Byb3RvY29sID0ge30pKTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29tcG9uZW50cyB0aGF0IG1ha2UgdXAgYW4gQXp1cmUgU3RvcmFnZSBTQVMnIHF1ZXJ5IHBhcmFtZXRlcnMuIFRoaXMgdHlwZSBpcyBub3QgY29uc3RydWN0ZWQgZGlyZWN0bHlcbiAqIGJ5IHRoZSB1c2VyOyBpdCBpcyBvbmx5IGdlbmVyYXRlZCBieSB0aGUge0BsaW5rIEFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXN9IGFuZCB7QGxpbmsgQmxvYlNBU1NpZ25hdHVyZVZhbHVlc31cbiAqIHR5cGVzLiBPbmNlIGdlbmVyYXRlZCwgaXQgY2FuIGJlIGVuY29kZWQgaW50byBhIHtAbGluayBTdHJpbmd9IGFuZCBhcHBlbmRlZCB0byBhIFVSTCBkaXJlY3RseSAodGhvdWdoIGNhdXRpb24gc2hvdWxkXG4gKiBiZSB0YWtlbiBoZXJlIGluIGNhc2UgdGhlcmUgYXJlIGV4aXN0aW5nIHF1ZXJ5IHBhcmFtZXRlcnMsIHdoaWNoIG1pZ2h0IGFmZmVjdCB0aGUgYXBwcm9wcmlhdGUgbWVhbnMgb2YgYXBwZW5kaW5nXG4gKiB0aGVzZSBxdWVyeSBwYXJhbWV0ZXJzKS5cbiAqXG4gKiBOT1RFOiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgaW1tdXRhYmxlLlxuICovXG5leHBvcnQgY2xhc3MgU0FTUXVlcnlQYXJhbWV0ZXJzIHtcbiAgICBjb25zdHJ1Y3Rvcih2ZXJzaW9uLCBzaWduYXR1cmUsIHBlcm1pc3Npb25zT3JPcHRpb25zLCBzZXJ2aWNlcywgcmVzb3VyY2VUeXBlcywgcHJvdG9jb2wsIHN0YXJ0c09uLCBleHBpcmVzT24sIGlwUmFuZ2UsIGlkZW50aWZpZXIsIHJlc291cmNlLCBjYWNoZUNvbnRyb2wsIGNvbnRlbnREaXNwb3NpdGlvbiwgY29udGVudEVuY29kaW5nLCBjb250ZW50TGFuZ3VhZ2UsIGNvbnRlbnRUeXBlLCB1c2VyRGVsZWdhdGlvbktleSwgcHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQsIGNvcnJlbGF0aW9uSWQsIGVuY3J5cHRpb25TY29wZSkge1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgICAgICAgaWYgKHBlcm1pc3Npb25zT3JPcHRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBlcm1pc3Npb25zT3JPcHRpb25zICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBTQVNRdWVyeVBhcmFtZXRlcnNPcHRpb25zXG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnNPck9wdGlvbnMucGVybWlzc2lvbnM7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VzID0gcGVybWlzc2lvbnNPck9wdGlvbnMuc2VydmljZXM7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZXMgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5yZXNvdXJjZVR5cGVzO1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnByb3RvY29sO1xuICAgICAgICAgICAgdGhpcy5zdGFydHNPbiA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnN0YXJ0c09uO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVzT24gPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5leHBpcmVzT247XG4gICAgICAgICAgICB0aGlzLmlwUmFuZ2VJbm5lciA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmlwUmFuZ2U7XG4gICAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5pZGVudGlmaWVyO1xuICAgICAgICAgICAgdGhpcy5lbmNyeXB0aW9uU2NvcGUgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5lbmNyeXB0aW9uU2NvcGU7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gcGVybWlzc2lvbnNPck9wdGlvbnMucmVzb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmNhY2hlQ29udHJvbCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uID0gcGVybWlzc2lvbnNPck9wdGlvbnMuY29udGVudERpc3Bvc2l0aW9uO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RW5jb2RpbmcgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5jb250ZW50RW5jb2Rpbmc7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMYW5ndWFnZSA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmNvbnRlbnRMYW5ndWFnZTtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5jb250ZW50VHlwZTtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkT2lkID0gcGVybWlzc2lvbnNPck9wdGlvbnMudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkT2JqZWN0SWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduZWRUZW5hbnRJZCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFRlbmFudElkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkU3RhcnRzT24gPSBwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZEV4cGlyZXNPbiA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZFNlcnZpY2UgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTZXJ2aWNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVmVyc2lvbiA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFZlcnNpb247XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VzID0gc2VydmljZXM7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZXMgPSByZXNvdXJjZVR5cGVzO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVzT24gPSBleHBpcmVzT247XG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnNPck9wdGlvbnM7XG4gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0c09uID0gc3RhcnRzT247XG4gICAgICAgICAgICB0aGlzLmlwUmFuZ2VJbm5lciA9IGlwUmFuZ2U7XG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRpb25TY29wZSA9IGVuY3J5cHRpb25TY29wZTtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmNhY2hlQ29udHJvbCA9IGNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uID0gY29udGVudERpc3Bvc2l0aW9uO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RW5jb2RpbmcgPSBjb250ZW50RW5jb2Rpbmc7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMYW5ndWFnZSA9IGNvbnRlbnRMYW5ndWFnZTtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTtcbiAgICAgICAgICAgIGlmICh1c2VyRGVsZWdhdGlvbktleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkT2lkID0gdXNlckRlbGVnYXRpb25LZXkuc2lnbmVkT2JqZWN0SWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduZWRUZW5hbnRJZCA9IHVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFRlbmFudElkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkU3RhcnRzT24gPSB1c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZEV4cGlyZXNPbiA9IHVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZFNlcnZpY2UgPSB1c2VyRGVsZWdhdGlvbktleS5zaWduZWRTZXJ2aWNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVmVyc2lvbiA9IHVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFZlcnNpb247XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCA9IHByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IGNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwuIElQIHJhbmdlIGFsbG93ZWQgZm9yIHRoaXMgU0FTLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGlwUmFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmlwUmFuZ2VJbm5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuaXBSYW5nZUlubmVyLmVuZCxcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5pcFJhbmdlSW5uZXIuc3RhcnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZXMgYWxsIFNBUyBxdWVyeSBwYXJhbWV0ZXJzIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgYXBwZW5kZWQgdG8gYSBVUkwuXG4gICAgICpcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gW1xuICAgICAgICAgICAgXCJzdlwiLFxuICAgICAgICAgICAgXCJzc1wiLFxuICAgICAgICAgICAgXCJzcnRcIixcbiAgICAgICAgICAgIFwic3ByXCIsXG4gICAgICAgICAgICBcInN0XCIsXG4gICAgICAgICAgICBcInNlXCIsXG4gICAgICAgICAgICBcInNpcFwiLFxuICAgICAgICAgICAgXCJzaVwiLFxuICAgICAgICAgICAgXCJzZXNcIixcbiAgICAgICAgICAgIFwic2tvaWRcIixcbiAgICAgICAgICAgIFwic2t0aWRcIixcbiAgICAgICAgICAgIFwic2t0XCIsXG4gICAgICAgICAgICBcInNrZVwiLFxuICAgICAgICAgICAgXCJza3NcIixcbiAgICAgICAgICAgIFwic2t2XCIsXG4gICAgICAgICAgICBcInNyXCIsXG4gICAgICAgICAgICBcInNwXCIsXG4gICAgICAgICAgICBcInNpZ1wiLFxuICAgICAgICAgICAgXCJyc2NjXCIsXG4gICAgICAgICAgICBcInJzY2RcIixcbiAgICAgICAgICAgIFwicnNjZVwiLFxuICAgICAgICAgICAgXCJyc2NsXCIsXG4gICAgICAgICAgICBcInJzY3RcIixcbiAgICAgICAgICAgIFwic2FvaWRcIixcbiAgICAgICAgICAgIFwic2NpZFwiLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN2XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnNlcnZpY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNydFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnJlc291cmNlVHlwZXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ByXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMucHJvdG9jb2wpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zdGFydHNPbiA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHRoaXMuc3RhcnRzT24sIGZhbHNlKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzZVwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmV4cGlyZXNPbiA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHRoaXMuZXhwaXJlc09uLCBmYWxzZSkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2lwXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyh0aGlzLmlwUmFuZ2UpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNpXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuaWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzZXNcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5lbmNyeXB0aW9uU2NvcGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2tvaWRcIjogLy8gU2lnbmVkIG9iamVjdCBJRFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnNpZ25lZE9pZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJza3RpZFwiOiAvLyBTaWduZWQgdGVuYW50IElEXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc2lnbmVkVGVuYW50SWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2t0XCI6IC8vIFNpZ25lZCBrZXkgc3RhcnQgdGltZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnNpZ25lZFN0YXJ0c09uID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodGhpcy5zaWduZWRTdGFydHNPbiwgZmFsc2UpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNrZVwiOiAvLyBTaWduZWQga2V5IGV4cGlyeSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc2lnbmVkRXhwaXJlc09uID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodGhpcy5zaWduZWRFeHBpcmVzT24sIGZhbHNlKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJza3NcIjogLy8gU2lnbmVkIGtleSBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc2lnbmVkU2VydmljZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJza3ZcIjogLy8gU2lnbmVkIGtleSB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc2lnbmVkVmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzclwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnJlc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNwXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMucGVybWlzc2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2lnXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc2lnbmF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJzY2NcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5jYWNoZUNvbnRyb2wpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicnNjZFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmNvbnRlbnREaXNwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyc2NlXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuY29udGVudEVuY29kaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJzY2xcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5jb250ZW50TGFuZ3VhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicnNjdFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNhb2lkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMucHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NpZFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlcmllcy5qb2luKFwiJlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcml2YXRlIGhlbHBlciBtZXRob2QgdXNlZCB0byBmaWx0ZXIgYW5kIGFwcGVuZCBxdWVyeSBrZXkvdmFsdWUgcGFpcnMgaW50byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBxdWVyaWVzIC1cbiAgICAgKiBAcGFyYW0ga2V5IC1cbiAgICAgKiBAcGFyYW0gdmFsdWUgLVxuICAgICAqL1xuICAgIHRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpO1xuICAgICAgICB2YWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICAgIGlmIChrZXkubGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBxdWVyaWVzLnB1c2goYCR7a2V5fT0ke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U0FTUXVlcnlQYXJhbWV0ZXJzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmxvYlNBU1Blcm1pc3Npb25zIH0gZnJvbSBcIi4vQmxvYlNBU1Blcm1pc3Npb25zXCI7XG5pbXBvcnQgeyBDb250YWluZXJTQVNQZXJtaXNzaW9ucyB9IGZyb20gXCIuL0NvbnRhaW5lclNBU1Blcm1pc3Npb25zXCI7XG5pbXBvcnQgeyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB9IGZyb20gXCIuLi9jcmVkZW50aWFscy9TdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFwiO1xuaW1wb3J0IHsgVXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsIH0gZnJvbSBcIi4uL2NyZWRlbnRpYWxzL1VzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbFwiO1xuaW1wb3J0IHsgaXBSYW5nZVRvU3RyaW5nIH0gZnJvbSBcIi4vU2FzSVBSYW5nZVwiO1xuaW1wb3J0IHsgU0FTUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSBcIi4vU0FTUXVlcnlQYXJhbWV0ZXJzXCI7XG5pbXBvcnQgeyBTRVJWSUNFX1ZFUlNJT04gfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB0cnVuY2F0ZWRJU084MDYxRGF0ZSB9IGZyb20gXCIuLi91dGlscy91dGlscy5jb21tb25cIjtcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbE9yVXNlckRlbGVnYXRpb25LZXksIGFjY291bnROYW1lKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiA6IFNFUlZJQ0VfVkVSU0lPTjtcbiAgICBjb25zdCBzaGFyZWRLZXlDcmVkZW50aWFsID0gc2hhcmVkS2V5Q3JlZGVudGlhbE9yVXNlckRlbGVnYXRpb25LZXkgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFxuICAgICAgICA/IHNoYXJlZEtleUNyZWRlbnRpYWxPclVzZXJEZWxlZ2F0aW9uS2V5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGxldCB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWw7XG4gICAgaWYgKHNoYXJlZEtleUNyZWRlbnRpYWwgPT09IHVuZGVmaW5lZCAmJiBhY2NvdW50TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCA9IG5ldyBVc2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwoYWNjb3VudE5hbWUsIHNoYXJlZEtleUNyZWRlbnRpYWxPclVzZXJEZWxlZ2F0aW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKHNoYXJlZEtleUNyZWRlbnRpYWwgPT09IHVuZGVmaW5lZCAmJiB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIHNoYXJlZEtleUNyZWRlbnRpYWwsIHVzZXJEZWxlZ2F0aW9uS2V5IG9yIGFjY291bnROYW1lLlwiKTtcbiAgICB9XG4gICAgLy8gVmVyc2lvbiAyMDIwLTEyLTA2IGFkZHMgc3VwcG9ydCBmb3IgZW5jcnlwdGlvbnNjb3BlIGluIFNBUy5cbiAgICBpZiAodmVyc2lvbiA+PSBcIjIwMjAtMTItMDZcIikge1xuICAgICAgICBpZiAoc2hhcmVkS2V5Q3JlZGVudGlhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzMjAyMDEyMDYoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzVURLMjAyMDEyMDYoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBWZXJzaW9uIDIwMTktMTItMTIgYWRkcyBzdXBwb3J0IGZvciB0aGUgYmxvYiB0YWdzIHBlcm1pc3Npb24uXG4gICAgLy8gVmVyc2lvbiAyMDE4LTExLTA5IGFkZHMgc3VwcG9ydCBmb3IgdGhlIHNpZ25lZCByZXNvdXJjZSBhbmQgc2lnbmVkIGJsb2Igc25hcHNob3QgdGltZSBmaWVsZHMuXG4gICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvbnN0cnVjdGluZy1hLXNlcnZpY2Utc2FzI2NvbnN0cnVjdGluZy10aGUtc2lnbmF0dXJlLXN0cmluZ1xuICAgIGlmICh2ZXJzaW9uID49IFwiMjAxOC0xMS0wOVwiKSB7XG4gICAgICAgIGlmIChzaGFyZWRLZXlDcmVkZW50aWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMyMDE4MTEwOShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCBzaGFyZWRLZXlDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFZlcnNpb24gMjAyMC0wMi0xMCBkZWxlZ2F0aW9uIFNBUyBzaWduYXR1cmUgY29uc3RydWN0aW9uIGluY2x1ZGVzIHByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkLCBhZ2VudE9iamVjdElkLCBjb3JyZWxhdGlvbklkLlxuICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gXCIyMDIwLTAyLTEwXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzVURLMjAyMDAyMTAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnNVREsyMDE4MTEwOShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uID49IFwiMjAxNS0wNC0wNVwiKSB7XG4gICAgICAgIGlmIChzaGFyZWRLZXlDcmVkZW50aWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMyMDE1MDQwNShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCBzaGFyZWRLZXlDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTgtMTEtMDknIHdoZW4gZ2VuZXJhdGluZyB1c2VyIGRlbGVnYXRpb24gU0FTIHVzaW5nIHVzZXIgZGVsZWdhdGlvbiBrZXkuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTUtMDQtMDUnLlwiKTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICogSU1QTEVNRU5UQVRJT04gRk9SIEFQSSBWRVJTSU9OIEZST00gMjAxNS0wNC0wNSBBTkQgQkVGT1JFIDIwMTgtMTEtMDkuXG4gKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTQVNRdWVyeVBhcmFtZXRlcnMuXG4gKlxuICogT25seSBhY2NlcHRzIHJlcXVpcmVkIHNldHRpbmdzIG5lZWRlZCB0byBjcmVhdGUgYSBTQVMuIEZvciBvcHRpb25hbCBzZXR0aW5ncyBwbGVhc2VcbiAqIHNldCBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHksIHN1Y2ggYXMgcGVybWlzc2lvbnMsIHN0YXJ0c09uIGFuZCBpZGVudGlmaWVyLlxuICpcbiAqIFdBUk5JTkc6IFdoZW4gaWRlbnRpZmllciBpcyBub3QgcHJvdmlkZWQsIHBlcm1pc3Npb25zIGFuZCBleHBpcmVzT24gYXJlIHJlcXVpcmVkLlxuICogWW91IE1VU1QgYXNzaWduIHZhbHVlIHRvIGlkZW50aWZpZXIgb3IgZXhwaXJlc09uICYgcGVybWlzc2lvbnMgbWFudWFsbHkgaWYgeW91IGluaXRpYWwgd2l0aFxuICogdGhpcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyAtXG4gKiBAcGFyYW0gc2hhcmVkS2V5Q3JlZGVudGlhbCAtXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyczIwMTUwNDA1KGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWwpIHtcbiAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzID0gU0FTU2lnbmF0dXJlVmFsdWVzU2FuaXR5Q2hlY2tBbmRBdXRvZmlsbChibG9iU0FTU2lnbmF0dXJlVmFsdWVzKTtcbiAgICBpZiAoIWJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciAmJlxuICAgICAgICAhKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiYgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24pKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVzdCBwcm92aWRlICdwZXJtaXNzaW9ucycgYW5kICdleHBpcmVzT24nIGZvciBCbG9iIFNBUyBnZW5lcmF0aW9uIHdoZW4gJ2lkZW50aWZpZXInIGlzIG5vdCBwcm92aWRlZC5cIik7XG4gICAgfVxuICAgIGxldCByZXNvdXJjZSA9IFwiY1wiO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgIHJlc291cmNlID0gXCJiXCI7XG4gICAgfVxuICAgIC8vIENhbGxpbmcgcGFyc2UgYW5kIHRvU3RyaW5nIGd1YXJhbnRlZXMgdGhlIHByb3BlciBvcmRlcmluZyBhbmQgdGhyb3dzIG9uIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICBsZXQgdmVyaWZpZWRQZXJtaXNzaW9ucztcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucykge1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IEJsb2JTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQ29udGFpbmVyU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNpZ25hdHVyZSBpcyBnZW5lcmF0ZWQgb24gdGhlIHVuLXVybC1lbmNvZGVkIHZhbHVlcy5cbiAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPyB2ZXJpZmllZFBlcm1pc3Npb25zIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBnZXRDYW5vbmljYWxOYW1lKHNoYXJlZEtleUNyZWRlbnRpYWwuYWNjb3VudE5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGFpbmVyTmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSksXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllcixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSkgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24gOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZyA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlIDogXCJcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gc2hhcmVkS2V5Q3JlZGVudGlhbC5jb21wdXRlSE1BQ1NIQTI1NihzdHJpbmdUb1NpZ24pO1xuICAgIHJldHVybiBuZXcgU0FTUXVlcnlQYXJhbWV0ZXJzKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiwgc2lnbmF0dXJlLCB2ZXJpZmllZFBlcm1pc3Npb25zLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyLCByZXNvdXJjZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZywgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUpO1xufVxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKiBJTVBMRU1FTlRBVElPTiBGT1IgQVBJIFZFUlNJT04gRlJPTSAyMDE4LTExLTA5LlxuICpcbiAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU0FTUXVlcnlQYXJhbWV0ZXJzLlxuICpcbiAqIE9ubHkgYWNjZXB0cyByZXF1aXJlZCBzZXR0aW5ncyBuZWVkZWQgdG8gY3JlYXRlIGEgU0FTLiBGb3Igb3B0aW9uYWwgc2V0dGluZ3MgcGxlYXNlXG4gKiBzZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LCBzdWNoIGFzIHBlcm1pc3Npb25zLCBzdGFydHNPbiBhbmQgaWRlbnRpZmllci5cbiAqXG4gKiBXQVJOSU5HOiBXaGVuIGlkZW50aWZpZXIgaXMgbm90IHByb3ZpZGVkLCBwZXJtaXNzaW9ucyBhbmQgZXhwaXJlc09uIGFyZSByZXF1aXJlZC5cbiAqIFlvdSBNVVNUIGFzc2lnbiB2YWx1ZSB0byBpZGVudGlmaWVyIG9yIGV4cGlyZXNPbiAmIHBlcm1pc3Npb25zIG1hbnVhbGx5IGlmIHlvdSBpbml0aWFsIHdpdGhcbiAqIHRoaXMgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgLVxuICogQHBhcmFtIHNoYXJlZEtleUNyZWRlbnRpYWwgLVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMyMDE4MTEwOShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCBzaGFyZWRLZXlDcmVkZW50aWFsKSB7XG4gICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyA9IFNBU1NpZ25hdHVyZVZhbHVlc1Nhbml0eUNoZWNrQW5kQXV0b2ZpbGwoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyk7XG4gICAgaWYgKCFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIgJiZcbiAgICAgICAgIShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11c3QgcHJvdmlkZSAncGVybWlzc2lvbnMnIGFuZCAnZXhwaXJlc09uJyBmb3IgQmxvYiBTQVMgZ2VuZXJhdGlvbiB3aGVuICdpZGVudGlmaWVyJyBpcyBub3QgcHJvdmlkZWQuXCIpO1xuICAgIH1cbiAgICBsZXQgcmVzb3VyY2UgPSBcImNcIjtcbiAgICBsZXQgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWU7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgcmVzb3VyY2UgPSBcImJcIjtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnNcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZCkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJ2XCI7XG4gICAgICAgICAgICB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxsaW5nIHBhcnNlIGFuZCB0b1N0cmluZyBndWFyYW50ZWVzIHRoZSBwcm9wZXIgb3JkZXJpbmcgYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnMuXG4gICAgbGV0IHZlcmlmaWVkUGVybWlzc2lvbnM7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBCbG9iU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IENvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaWduYXR1cmUgaXMgZ2VuZXJhdGVkIG9uIHRoZSB1bi11cmwtZW5jb2RlZCB2YWx1ZXMuXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID8gdmVyaWZpZWRQZXJtaXNzaW9ucyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZShzaGFyZWRLZXlDcmVkZW50aWFsLmFjY291bnROYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRhaW5lck5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sXG4gICAgICAgIHJlc291cmNlLFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSA6IFwiXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNoYXJlZEtleUNyZWRlbnRpYWwuY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKTtcbiAgICByZXR1cm4gbmV3IFNBU1F1ZXJ5UGFyYW1ldGVycyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sIHNpZ25hdHVyZSwgdmVyaWZpZWRQZXJtaXNzaW9ucywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciwgcmVzb3VyY2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlKTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICogSU1QTEVNRU5UQVRJT04gRk9SIEFQSSBWRVJTSU9OIEZST00gMjAyMC0xMi0wNi5cbiAqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNBU1F1ZXJ5UGFyYW1ldGVycy5cbiAqXG4gKiBPbmx5IGFjY2VwdHMgcmVxdWlyZWQgc2V0dGluZ3MgbmVlZGVkIHRvIGNyZWF0ZSBhIFNBUy4gRm9yIG9wdGlvbmFsIHNldHRpbmdzIHBsZWFzZVxuICogc2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcyBkaXJlY3RseSwgc3VjaCBhcyBwZXJtaXNzaW9ucywgc3RhcnRzT24gYW5kIGlkZW50aWZpZXIuXG4gKlxuICogV0FSTklORzogV2hlbiBpZGVudGlmaWVyIGlzIG5vdCBwcm92aWRlZCwgcGVybWlzc2lvbnMgYW5kIGV4cGlyZXNPbiBhcmUgcmVxdWlyZWQuXG4gKiBZb3UgTVVTVCBhc3NpZ24gdmFsdWUgdG8gaWRlbnRpZmllciBvciBleHBpcmVzT24gJiBwZXJtaXNzaW9ucyBtYW51YWxseSBpZiB5b3UgaW5pdGlhbCB3aXRoXG4gKiB0aGlzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzIC1cbiAqIEBwYXJhbSBzaGFyZWRLZXlDcmVkZW50aWFsIC1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzMjAyMDEyMDYoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCkge1xuICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgPSBTQVNTaWduYXR1cmVWYWx1ZXNTYW5pdHlDaGVja0FuZEF1dG9maWxsKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMpO1xuICAgIGlmICghYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyICYmXG4gICAgICAgICEoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJiBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ3Blcm1pc3Npb25zJyBhbmQgJ2V4cGlyZXNPbicgZm9yIEJsb2IgU0FTIGdlbmVyYXRpb24gd2hlbiAnaWRlbnRpZmllcicgaXMgbm90IHByb3ZpZGVkLlwiKTtcbiAgICB9XG4gICAgbGV0IHJlc291cmNlID0gXCJjXCI7XG4gICAgbGV0IHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgIHJlc291cmNlID0gXCJiXCI7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZSkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJzXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJidlwiO1xuICAgICAgICAgICAgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsbGluZyBwYXJzZSBhbmQgdG9TdHJpbmcgZ3VhcmFudGVlcyB0aGUgcHJvcGVyIG9yZGVyaW5nIGFuZCB0aHJvd3Mgb24gaW52YWxpZCBjaGFyYWN0ZXJzLlxuICAgIGxldCB2ZXJpZmllZFBlcm1pc3Npb25zO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQmxvYlNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBDb250YWluZXJTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2lnbmF0dXJlIGlzIGdlbmVyYXRlZCBvbiB0aGUgdW4tdXJsLWVuY29kZWQgdmFsdWVzLlxuICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IFtcbiAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA/IHZlcmlmaWVkUGVybWlzc2lvbnMgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGdldENhbm9uaWNhbE5hbWUoc2hhcmVkS2V5Q3JlZGVudGlhbC5hY2NvdW50TmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250YWluZXJOYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UgPyBpcFJhbmdlVG9TdHJpbmcoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlKSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLFxuICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24gOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZyA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlIDogXCJcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gc2hhcmVkS2V5Q3JlZGVudGlhbC5jb21wdXRlSE1BQ1NIQTI1NihzdHJpbmdUb1NpZ24pO1xuICAgIHJldHVybiBuZXcgU0FTUXVlcnlQYXJhbWV0ZXJzKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiwgc2lnbmF0dXJlLCB2ZXJpZmllZFBlcm1pc3Npb25zLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyLCByZXNvdXJjZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZywgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlKTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICogSU1QTEVNRU5UQVRJT04gRk9SIEFQSSBWRVJTSU9OIEZST00gMjAxOC0xMS0wOS5cbiAqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNBU1F1ZXJ5UGFyYW1ldGVycy5cbiAqXG4gKiBPbmx5IGFjY2VwdHMgcmVxdWlyZWQgc2V0dGluZ3MgbmVlZGVkIHRvIGNyZWF0ZSBhIFNBUy4gRm9yIG9wdGlvbmFsIHNldHRpbmdzIHBsZWFzZVxuICogc2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcyBkaXJlY3RseSwgc3VjaCBhcyBwZXJtaXNzaW9ucywgc3RhcnRzT24uXG4gKlxuICogV0FSTklORzogaWRlbnRpZmllciB3aWxsIGJlIGlnbm9yZWQsIHBlcm1pc3Npb25zIGFuZCBleHBpcmVzT24gYXJlIHJlcXVpcmVkLlxuICpcbiAqIEBwYXJhbSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzIC1cbiAqIEBwYXJhbSB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwgLVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnNVREsyMDE4MTEwOShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwpIHtcbiAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzID0gU0FTU2lnbmF0dXJlVmFsdWVzU2FuaXR5Q2hlY2tBbmRBdXRvZmlsbChibG9iU0FTU2lnbmF0dXJlVmFsdWVzKTtcbiAgICAvLyBTdG9yZWQgYWNjZXNzIHBvbGljaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBhIHVzZXIgZGVsZWdhdGlvbiBTQVMuXG4gICAgaWYgKCFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zIHx8ICFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbikge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11c3QgcHJvdmlkZSAncGVybWlzc2lvbnMnIGFuZCAnZXhwaXJlc09uJyBmb3IgQmxvYiBTQVMgZ2VuZXJhdGlvbiB3aGVuIGdlbmVyYXRpbmcgdXNlciBkZWxlZ2F0aW9uIFNBUy5cIik7XG4gICAgfVxuICAgIGxldCByZXNvdXJjZSA9IFwiY1wiO1xuICAgIGxldCB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZTtcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICByZXNvdXJjZSA9IFwiYlwiO1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWUpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJic1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnZcIjtcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbGxpbmcgcGFyc2UgYW5kIHRvU3RyaW5nIGd1YXJhbnRlZXMgdGhlIHByb3BlciBvcmRlcmluZyBhbmQgdGhyb3dzIG9uIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICBsZXQgdmVyaWZpZWRQZXJtaXNzaW9ucztcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucykge1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IEJsb2JTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQ29udGFpbmVyU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNpZ25hdHVyZSBpcyBnZW5lcmF0ZWQgb24gdGhlIHVuLXVybC1lbmNvZGVkIHZhbHVlcy5cbiAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPyB2ZXJpZmllZFBlcm1pc3Npb25zIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBnZXRDYW5vbmljYWxOYW1lKHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC5hY2NvdW50TmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250YWluZXJOYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZE9iamVjdElkLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkVGVuYW50SWQsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkRXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRFeHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU2VydmljZSxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFZlcnNpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sXG4gICAgICAgIHJlc291cmNlLFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKTtcbiAgICByZXR1cm4gbmV3IFNBU1F1ZXJ5UGFyYW1ldGVycyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sIHNpZ25hdHVyZSwgdmVyaWZpZWRQZXJtaXNzaW9ucywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciwgcmVzb3VyY2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlLCB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkpO1xufVxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKiBJTVBMRU1FTlRBVElPTiBGT1IgQVBJIFZFUlNJT04gRlJPTSAyMDIwLTAyLTEwLlxuICpcbiAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU0FTUXVlcnlQYXJhbWV0ZXJzLlxuICpcbiAqIE9ubHkgYWNjZXB0cyByZXF1aXJlZCBzZXR0aW5ncyBuZWVkZWQgdG8gY3JlYXRlIGEgU0FTLiBGb3Igb3B0aW9uYWwgc2V0dGluZ3MgcGxlYXNlXG4gKiBzZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LCBzdWNoIGFzIHBlcm1pc3Npb25zLCBzdGFydHNPbi5cbiAqXG4gKiBXQVJOSU5HOiBpZGVudGlmaWVyIHdpbGwgYmUgaWdub3JlZCwgcGVybWlzc2lvbnMgYW5kIGV4cGlyZXNPbiBhcmUgcmVxdWlyZWQuXG4gKlxuICogQHBhcmFtIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgLVxuICogQHBhcmFtIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCAtXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyc1VESzIwMjAwMjEwKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCkge1xuICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgPSBTQVNTaWduYXR1cmVWYWx1ZXNTYW5pdHlDaGVja0FuZEF1dG9maWxsKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMpO1xuICAgIC8vIFN0b3JlZCBhY2Nlc3MgcG9saWNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGEgdXNlciBkZWxlZ2F0aW9uIFNBUy5cbiAgICBpZiAoIWJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgfHwgIWJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVzdCBwcm92aWRlICdwZXJtaXNzaW9ucycgYW5kICdleHBpcmVzT24nIGZvciBCbG9iIFNBUyBnZW5lcmF0aW9uIHdoZW4gZ2VuZXJhdGluZyB1c2VyIGRlbGVnYXRpb24gU0FTLlwiKTtcbiAgICB9XG4gICAgbGV0IHJlc291cmNlID0gXCJjXCI7XG4gICAgbGV0IHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgIHJlc291cmNlID0gXCJiXCI7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZSkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJzXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJidlwiO1xuICAgICAgICAgICAgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsbGluZyBwYXJzZSBhbmQgdG9TdHJpbmcgZ3VhcmFudGVlcyB0aGUgcHJvcGVyIG9yZGVyaW5nIGFuZCB0aHJvd3Mgb24gaW52YWxpZCBjaGFyYWN0ZXJzLlxuICAgIGxldCB2ZXJpZmllZFBlcm1pc3Npb25zO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQmxvYlNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBDb250YWluZXJTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2lnbmF0dXJlIGlzIGdlbmVyYXRlZCBvbiB0aGUgdW4tdXJsLWVuY29kZWQgdmFsdWVzLlxuICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IFtcbiAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA/IHZlcmlmaWVkUGVybWlzc2lvbnMgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGdldENhbm9uaWNhbE5hbWUodXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmFjY291bnROYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRhaW5lck5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkT2JqZWN0SWQsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRUZW5hbnRJZCxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFN0YXJ0c09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRFeHBpcmVzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTZXJ2aWNlLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkVmVyc2lvbixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sXG4gICAgICAgIHJlc291cmNlLFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKTtcbiAgICByZXR1cm4gbmV3IFNBU1F1ZXJ5UGFyYW1ldGVycyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sIHNpZ25hdHVyZSwgdmVyaWZpZWRQZXJtaXNzaW9ucywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciwgcmVzb3VyY2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlLCB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXksIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29ycmVsYXRpb25JZCk7XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqIElNUExFTUVOVEFUSU9OIEZPUiBBUEkgVkVSU0lPTiBGUk9NIDIwMjAtMTItMDYuXG4gKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTQVNRdWVyeVBhcmFtZXRlcnMuXG4gKlxuICogT25seSBhY2NlcHRzIHJlcXVpcmVkIHNldHRpbmdzIG5lZWRlZCB0byBjcmVhdGUgYSBTQVMuIEZvciBvcHRpb25hbCBzZXR0aW5ncyBwbGVhc2VcbiAqIHNldCBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHksIHN1Y2ggYXMgcGVybWlzc2lvbnMsIHN0YXJ0c09uLlxuICpcbiAqIFdBUk5JTkc6IGlkZW50aWZpZXIgd2lsbCBiZSBpZ25vcmVkLCBwZXJtaXNzaW9ucyBhbmQgZXhwaXJlc09uIGFyZSByZXF1aXJlZC5cbiAqXG4gKiBAcGFyYW0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyAtXG4gKiBAcGFyYW0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsIC1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzVURLMjAyMDEyMDYoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKSB7XG4gICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyA9IFNBU1NpZ25hdHVyZVZhbHVlc1Nhbml0eUNoZWNrQW5kQXV0b2ZpbGwoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyk7XG4gICAgLy8gU3RvcmVkIGFjY2VzcyBwb2xpY2llcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgYSB1c2VyIGRlbGVnYXRpb24gU0FTLlxuICAgIGlmICghYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyB8fCAhYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ3Blcm1pc3Npb25zJyBhbmQgJ2V4cGlyZXNPbicgZm9yIEJsb2IgU0FTIGdlbmVyYXRpb24gd2hlbiBnZW5lcmF0aW5nIHVzZXIgZGVsZWdhdGlvbiBTQVMuXCIpO1xuICAgIH1cbiAgICBsZXQgcmVzb3VyY2UgPSBcImNcIjtcbiAgICBsZXQgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWU7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgcmVzb3VyY2UgPSBcImJcIjtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnNcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZCkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJ2XCI7XG4gICAgICAgICAgICB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxsaW5nIHBhcnNlIGFuZCB0b1N0cmluZyBndWFyYW50ZWVzIHRoZSBwcm9wZXIgb3JkZXJpbmcgYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnMuXG4gICAgbGV0IHZlcmlmaWVkUGVybWlzc2lvbnM7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBCbG9iU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IENvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaWduYXR1cmUgaXMgZ2VuZXJhdGVkIG9uIHRoZSB1bi11cmwtZW5jb2RlZCB2YWx1ZXMuXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID8gdmVyaWZpZWRQZXJtaXNzaW9ucyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuYWNjb3VudE5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGFpbmVyTmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSksXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRPYmplY3RJZCxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFRlbmFudElkLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkRXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFNlcnZpY2UsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRWZXJzaW9uLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSkgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbixcbiAgICAgICAgcmVzb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKTtcbiAgICByZXR1cm4gbmV3IFNBU1F1ZXJ5UGFyYW1ldGVycyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sIHNpZ25hdHVyZSwgdmVyaWZpZWRQZXJtaXNzaW9ucywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciwgcmVzb3VyY2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlLCB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXksIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29ycmVsYXRpb25JZCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5lbmNyeXB0aW9uU2NvcGUpO1xufVxuZnVuY3Rpb24gZ2V0Q2Fub25pY2FsTmFtZShhY2NvdW50TmFtZSwgY29udGFpbmVyTmFtZSwgYmxvYk5hbWUpIHtcbiAgICAvLyBDb250YWluZXI6IFwiL2Jsb2IvYWNjb3VudC9jb250YWluZXJOYW1lXCJcbiAgICAvLyBCbG9iOiAgICAgIFwiL2Jsb2IvYWNjb3VudC9jb250YWluZXJOYW1lL2Jsb2JOYW1lXCJcbiAgICBjb25zdCBlbGVtZW50cyA9IFtgL2Jsb2IvJHthY2NvdW50TmFtZX0vJHtjb250YWluZXJOYW1lfWBdO1xuICAgIGlmIChibG9iTmFtZSkge1xuICAgICAgICBlbGVtZW50cy5wdXNoKGAvJHtibG9iTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiBTQVNTaWduYXR1cmVWYWx1ZXNTYW5pdHlDaGVja0FuZEF1dG9maWxsKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uIDogU0VSVklDRV9WRVJTSU9OO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZSAmJiB2ZXJzaW9uIDwgXCIyMDE4LTExLTA5XCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE4LTExLTA5JyB3aGVuIHByb3ZpZGluZyAnc25hcHNob3RUaW1lJy5cIik7XG4gICAgfVxuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lID09PSB1bmRlZmluZWQgJiYgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWUpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIk11c3QgcHJvdmlkZSAnYmxvYk5hbWUnIHdoZW4gcHJvdmlkaW5nICdzbmFwc2hvdFRpbWUnLlwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkICYmIHZlcnNpb24gPCBcIjIwMTktMTAtMTBcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTktMTAtMTAnIHdoZW4gcHJvdmlkaW5nICd2ZXJzaW9uSWQnLlwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUgPT09IHVuZGVmaW5lZCAmJiBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZCkge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiTXVzdCBwcm92aWRlICdibG9iTmFtZScgd2hlbiBwcm92aWRpbmcgJ3ZlcnNpb25JZCcuXCIpO1xuICAgIH1cbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDIwLTA4LTA0XCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDIwLTA4LTA0JyB3aGVuIHByb3ZpZGVkICdpJyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uICYmXG4gICAgICAgIHZlcnNpb24gPCBcIjIwMTktMTAtMTBcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTktMTAtMTAnIHdoZW4gcHJvdmlkaW5nICd4JyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAxOS0xMC0xMFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOS0xMC0xMCcgd2hlbiBwcm92aWRpbmcgJ3knIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRhZyAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDE5LTEyLTEyXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEyLTEyJyB3aGVuIHByb3ZpZGluZyAndCcgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uIDwgXCIyMDIwLTAyLTEwXCIgJiZcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5tb3ZlIHx8IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMuZXhlY3V0ZSkpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDIwLTAyLTEwJyB3aGVuIHByb3ZpZGluZyB0aGUgJ20nIG9yICdlJyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKHZlcnNpb24gPCBcIjIwMjEtMDQtMTBcIiAmJlxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMuZmlsdGVyQnlUYWdzKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAyMS0wNC0xMCcgd2hlbiBwcm92aWRpbmcgdGhlICdmJyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKHZlcnNpb24gPCBcIjIwMjAtMDItMTBcIiAmJlxuICAgICAgICAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCB8fCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAyMC0wMi0xMCcgd2hlbiBwcm92aWRpbmcgJ3ByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkJyBvciAnY29ycmVsYXRpb25JZCcuXCIpO1xuICAgIH1cbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5lbmNyeXB0aW9uU2NvcGUgJiYgdmVyc2lvbiA8IFwiMjAyMC0xMi0wNlwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAyMC0xMi0wNicgd2hlbiBwcm92aWRlZCAnZW5jcnlwdGlvblNjb3BlJyBpbiBTQVMuXCIpO1xuICAgIH1cbiAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHJldHVybiBibG9iU0FTU2lnbmF0dXJlVmFsdWVzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKlxuICogQ29kZSBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IChSKSBBdXRvUmVzdCBDb2RlIEdlbmVyYXRvci5cbiAqIENoYW5nZXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLlxuICovXG5pbXBvcnQgKiBhcyBjb3JlSHR0cCBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0ICogYXMgTWFwcGVycyBmcm9tIFwiLi4vbW9kZWxzL21hcHBlcnNcIjtcbmltcG9ydCAqIGFzIFBhcmFtZXRlcnMgZnJvbSBcIi4uL21vZGVscy9wYXJhbWV0ZXJzXCI7XG4vKiogQ2xhc3MgcmVwcmVzZW50aW5nIGEgQmxvYi4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBCbG9iIGNsYXNzLlxuICAgICAqIEBwYXJhbSBjbGllbnQgUmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlIGNsaWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIERvd25sb2FkIG9wZXJhdGlvbiByZWFkcyBvciBkb3dubG9hZHMgYSBibG9iIGZyb20gdGhlIHN5c3RlbSwgaW5jbHVkaW5nIGl0cyBtZXRhZGF0YSBhbmRcbiAgICAgKiBwcm9wZXJ0aWVzLiBZb3UgY2FuIGFsc28gY2FsbCBEb3dubG9hZCB0byByZWFkIGEgc25hcHNob3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBkb3dubG9hZChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBkb3dubG9hZE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgR2V0IFByb3BlcnRpZXMgb3BlcmF0aW9uIHJldHVybnMgYWxsIHVzZXItZGVmaW5lZCBtZXRhZGF0YSwgc3RhbmRhcmQgSFRUUCBwcm9wZXJ0aWVzLCBhbmQgc3lzdGVtXG4gICAgICogcHJvcGVydGllcyBmb3IgdGhlIGJsb2IuIEl0IGRvZXMgbm90IHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldFByb3BlcnRpZXMob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0UHJvcGVydGllc09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgc3RvcmFnZSBhY2NvdW50J3Mgc29mdCBkZWxldGUgZmVhdHVyZSBpcyBkaXNhYmxlZCB0aGVuLCB3aGVuIGEgYmxvYiBpcyBkZWxldGVkLCBpdCBpc1xuICAgICAqIHBlcm1hbmVudGx5IHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSBhY2NvdW50LiBJZiB0aGUgc3RvcmFnZSBhY2NvdW50J3Mgc29mdCBkZWxldGUgZmVhdHVyZSBpc1xuICAgICAqIGVuYWJsZWQsIHRoZW4sIHdoZW4gYSBibG9iIGlzIGRlbGV0ZWQsIGl0IGlzIG1hcmtlZCBmb3IgZGVsZXRpb24gYW5kIGJlY29tZXMgaW5hY2Nlc3NpYmxlXG4gICAgICogaW1tZWRpYXRlbHkuIEhvd2V2ZXIsIHRoZSBibG9iIHNlcnZpY2UgcmV0YWlucyB0aGUgYmxvYiBvciBzbmFwc2hvdCBmb3IgdGhlIG51bWJlciBvZiBkYXlzIHNwZWNpZmllZFxuICAgICAqIGJ5IHRoZSBEZWxldGVSZXRlbnRpb25Qb2xpY3kgc2VjdGlvbiBvZiBbU3RvcmFnZSBzZXJ2aWNlIHByb3BlcnRpZXNdXG4gICAgICogKFNldC1CbG9iLVNlcnZpY2UtUHJvcGVydGllcy5tZCkuIEFmdGVyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgaGFzIHBhc3NlZCwgdGhlIGJsb2IncyBkYXRhIGlzXG4gICAgICogcGVybWFuZW50bHkgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlIGFjY291bnQuIE5vdGUgdGhhdCB5b3UgY29udGludWUgdG8gYmUgY2hhcmdlZCBmb3IgdGhlXG4gICAgICogc29mdC1kZWxldGVkIGJsb2IncyBzdG9yYWdlIHVudGlsIGl0IGlzIHBlcm1hbmVudGx5IHJlbW92ZWQuIFVzZSB0aGUgTGlzdCBCbG9icyBBUEkgYW5kIHNwZWNpZnkgdGhlXG4gICAgICogXCJpbmNsdWRlPWRlbGV0ZWRcIiBxdWVyeSBwYXJhbWV0ZXIgdG8gZGlzY292ZXIgd2hpY2ggYmxvYnMgYW5kIHNuYXBzaG90cyBoYXZlIGJlZW4gc29mdCBkZWxldGVkLiBZb3VcbiAgICAgKiBjYW4gdGhlbiB1c2UgdGhlIFVuZGVsZXRlIEJsb2IgQVBJIHRvIHJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgYmxvYi4gQWxsIG90aGVyIG9wZXJhdGlvbnMgb24gYVxuICAgICAqIHNvZnQtZGVsZXRlZCBibG9iIG9yIHNuYXBzaG90IGNhdXNlcyB0aGUgc2VydmljZSB0byByZXR1cm4gYW4gSFRUUCBzdGF0dXMgY29kZSBvZiA0MDRcbiAgICAgKiAoUmVzb3VyY2VOb3RGb3VuZCkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBkZWxldGUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZGVsZXRlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVuZGVsZXRlIGEgYmxvYiB0aGF0IHdhcyBwcmV2aW91c2x5IHNvZnQgZGVsZXRlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgdW5kZWxldGUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgdW5kZWxldGVPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGltZSBhIGJsb2Igd2lsbCBleHBpcmUgYW5kIGJlIGRlbGV0ZWQuXG4gICAgICogQHBhcmFtIGV4cGlyeU9wdGlvbnMgUmVxdWlyZWQuIEluZGljYXRlcyBtb2RlIG9mIHRoZSBleHBpcnkgdGltZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2V0RXhwaXJ5KGV4cGlyeU9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgZXhwaXJ5T3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZXRFeHBpcnlPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNldCBIVFRQIEhlYWRlcnMgb3BlcmF0aW9uIHNldHMgc3lzdGVtIHByb3BlcnRpZXMgb24gdGhlIGJsb2JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldEh0dHBIZWFkZXJzKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHNldEh0dHBIZWFkZXJzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTZXQgSW1tdXRhYmlsaXR5IFBvbGljeSBvcGVyYXRpb24gc2V0cyB0aGUgaW1tdXRhYmlsaXR5IHBvbGljeSBvbiB0aGUgYmxvYlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2V0SW1tdXRhYmlsaXR5UG9saWN5KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHNldEltbXV0YWJpbGl0eVBvbGljeU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgRGVsZXRlIEltbXV0YWJpbGl0eSBQb2xpY3kgb3BlcmF0aW9uIGRlbGV0ZXMgdGhlIGltbXV0YWJpbGl0eSBwb2xpY3kgb24gdGhlIGJsb2JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBkZWxldGVJbW11dGFiaWxpdHlQb2xpY3lPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNldCBMZWdhbCBIb2xkIG9wZXJhdGlvbiBzZXRzIGEgbGVnYWwgaG9sZCBvbiB0aGUgYmxvYi5cbiAgICAgKiBAcGFyYW0gbGVnYWxIb2xkIFNwZWNpZmllZCBpZiBhIGxlZ2FsIGhvbGQgc2hvdWxkIGJlIHNldCBvbiB0aGUgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldExlZ2FsSG9sZChsZWdhbEhvbGQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgbGVnYWxIb2xkLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHNldExlZ2FsSG9sZE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU2V0IEJsb2IgTWV0YWRhdGEgb3BlcmF0aW9uIHNldHMgdXNlci1kZWZpbmVkIG1ldGFkYXRhIGZvciB0aGUgc3BlY2lmaWVkIGJsb2IgYXMgb25lIG9yIG1vcmVcbiAgICAgKiBuYW1lLXZhbHVlIHBhaXJzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZXRNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZXRNZXRhZGF0YU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBUaGUgTGVhc2UgQmxvYiBvcGVyYXRpb24gZXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgYmxvYiBmb3Igd3JpdGUgYW5kIGRlbGV0ZVxuICAgICAqIG9wZXJhdGlvbnNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGFjcXVpcmVMZWFzZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBhY3F1aXJlTGVhc2VPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gVGhlIExlYXNlIEJsb2Igb3BlcmF0aW9uIGVzdGFibGlzaGVzIGFuZCBtYW5hZ2VzIGEgbG9jayBvbiBhIGJsb2IgZm9yIHdyaXRlIGFuZCBkZWxldGVcbiAgICAgKiBvcGVyYXRpb25zXG4gICAgICogQHBhcmFtIGxlYXNlSWQgU3BlY2lmaWVzIHRoZSBjdXJyZW50IGxlYXNlIElEIG9uIHRoZSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlbGVhc2VMZWFzZShsZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGxlYXNlSWQsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgcmVsZWFzZUxlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMZWFzZSBCbG9iIG9wZXJhdGlvbiBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBibG9iIGZvciB3cml0ZSBhbmQgZGVsZXRlXG4gICAgICogb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSBsZWFzZUlkIFNwZWNpZmllcyB0aGUgY3VycmVudCBsZWFzZSBJRCBvbiB0aGUgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICByZW5ld0xlYXNlKGxlYXNlSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCByZW5ld0xlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMZWFzZSBCbG9iIG9wZXJhdGlvbiBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBibG9iIGZvciB3cml0ZSBhbmQgZGVsZXRlXG4gICAgICogb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSBsZWFzZUlkIFNwZWNpZmllcyB0aGUgY3VycmVudCBsZWFzZSBJRCBvbiB0aGUgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHByb3Bvc2VkTGVhc2VJZCBQcm9wb3NlZCBsZWFzZSBJRCwgaW4gYSBHVUlEIHN0cmluZyBmb3JtYXQuIFRoZSBCbG9iIHNlcnZpY2UgcmV0dXJucyA0MDBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChJbnZhbGlkIHJlcXVlc3QpIGlmIHRoZSBwcm9wb3NlZCBsZWFzZSBJRCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LiBTZWUgR3VpZCBDb25zdHJ1Y3RvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZm9yIGEgbGlzdCBvZiB2YWxpZCBHVUlEIHN0cmluZyBmb3JtYXRzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY2hhbmdlTGVhc2UobGVhc2VJZCwgcHJvcG9zZWRMZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGxlYXNlSWQsXG4gICAgICAgICAgICBwcm9wb3NlZExlYXNlSWQsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgY2hhbmdlTGVhc2VPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gVGhlIExlYXNlIEJsb2Igb3BlcmF0aW9uIGVzdGFibGlzaGVzIGFuZCBtYW5hZ2VzIGEgbG9jayBvbiBhIGJsb2IgZm9yIHdyaXRlIGFuZCBkZWxldGVcbiAgICAgKiBvcGVyYXRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBicmVha0xlYXNlKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGJyZWFrTGVhc2VPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENyZWF0ZSBTbmFwc2hvdCBvcGVyYXRpb24gY3JlYXRlcyBhIHJlYWQtb25seSBzbmFwc2hvdCBvZiBhIGJsb2JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNyZWF0ZVNuYXBzaG90KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGNyZWF0ZVNuYXBzaG90T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTdGFydCBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbiBjb3BpZXMgYSBibG9iIG9yIGFuIGludGVybmV0IHJlc291cmNlIHRvIGEgbmV3IGJsb2IuXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgcGFnZSBibG9iIHNuYXBzaG90LiBUaGlzIHZhbHVlIGlzIGEgVVJMIG9mIHVwIHRvXG4gICAgICogICAgICAgICAgICAgICAgICAgMiBLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgYSBwYWdlIGJsb2Igc25hcHNob3QuIFRoZSB2YWx1ZSBzaG91bGQgYmUgVVJMLWVuY29kZWQgYXMgaXQgd291bGRcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhcHBlYXIgaW4gYSByZXF1ZXN0IFVSSS4gVGhlIHNvdXJjZSBibG9iIG11c3QgZWl0aGVyIGJlIHB1YmxpYyBvciBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdmlhIGEgc2hhcmVkXG4gICAgICogICAgICAgICAgICAgICAgICAgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHN0YXJ0Q29weUZyb21VUkwoY29weVNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb3B5U291cmNlLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHN0YXJ0Q29weUZyb21VUkxPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uIGNvcGllcyBhIGJsb2Igb3IgYW4gaW50ZXJuZXQgcmVzb3VyY2UgdG8gYSBuZXcgYmxvYi4gSXQgd2lsbCBub3QgcmV0dXJuXG4gICAgICogYSByZXNwb25zZSB1bnRpbCB0aGUgY29weSBpcyBjb21wbGV0ZS5cbiAgICAgKiBAcGFyYW0gY29weVNvdXJjZSBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBwYWdlIGJsb2Igc25hcHNob3QuIFRoaXMgdmFsdWUgaXMgYSBVUkwgb2YgdXAgdG9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAyIEtCIGluIGxlbmd0aCB0aGF0IHNwZWNpZmllcyBhIHBhZ2UgYmxvYiBzbmFwc2hvdC4gVGhlIHZhbHVlIHNob3VsZCBiZSBVUkwtZW5jb2RlZCBhcyBpdCB3b3VsZFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFwcGVhciBpbiBhIHJlcXVlc3QgVVJJLiBUaGUgc291cmNlIGJsb2IgbXVzdCBlaXRoZXIgYmUgcHVibGljIG9yIG11c3QgYmUgYXV0aGVudGljYXRlZCB2aWEgYSBzaGFyZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhY2Nlc3Mgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY29weUZyb21VUkwoY29weVNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb3B5U291cmNlLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGNvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBBYm9ydCBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbiBhYm9ydHMgYSBwZW5kaW5nIENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uLCBhbmQgbGVhdmVzIGEgZGVzdGluYXRpb25cbiAgICAgKiBibG9iIHdpdGggemVybyBsZW5ndGggYW5kIGZ1bGwgbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIGNvcHlJZCBUaGUgY29weSBpZGVudGlmaWVyIHByb3ZpZGVkIGluIHRoZSB4LW1zLWNvcHktaWQgaGVhZGVyIG9mIHRoZSBvcmlnaW5hbCBDb3B5IEJsb2JcbiAgICAgKiAgICAgICAgICAgICAgIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGFib3J0Q29weUZyb21VUkwoY29weUlkLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGNvcHlJZCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBhYm9ydENvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTZXQgVGllciBvcGVyYXRpb24gc2V0cyB0aGUgdGllciBvbiBhIGJsb2IuIFRoZSBvcGVyYXRpb24gaXMgYWxsb3dlZCBvbiBhIHBhZ2UgYmxvYiBpbiBhIHByZW1pdW1cbiAgICAgKiBzdG9yYWdlIGFjY291bnQgYW5kIG9uIGEgYmxvY2sgYmxvYiBpbiBhIGJsb2Igc3RvcmFnZSBhY2NvdW50IChsb2NhbGx5IHJlZHVuZGFudCBzdG9yYWdlIG9ubHkpLiBBXG4gICAgICogcHJlbWl1bSBwYWdlIGJsb2IncyB0aWVyIGRldGVybWluZXMgdGhlIGFsbG93ZWQgc2l6ZSwgSU9QUywgYW5kIGJhbmR3aWR0aCBvZiB0aGUgYmxvYi4gQSBibG9ja1xuICAgICAqIGJsb2IncyB0aWVyIGRldGVybWluZXMgSG90L0Nvb2wvQXJjaGl2ZSBzdG9yYWdlIHR5cGUuIFRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IHVwZGF0ZSB0aGUgYmxvYidzXG4gICAgICogRVRhZy5cbiAgICAgKiBAcGFyYW0gdGllciBJbmRpY2F0ZXMgdGhlIHRpZXIgdG8gYmUgc2V0IG9uIHRoZSBibG9iLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2V0VGllcih0aWVyLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIHRpZXIsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc2V0VGllck9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBza3UgbmFtZSBhbmQgYWNjb3VudCBraW5kXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRBY2NvdW50SW5mbyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBnZXRBY2NvdW50SW5mb09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgUXVlcnkgb3BlcmF0aW9uIGVuYWJsZXMgdXNlcnMgdG8gc2VsZWN0L3Byb2plY3Qgb24gYmxvYiBkYXRhIGJ5IHByb3ZpZGluZyBzaW1wbGUgcXVlcnlcbiAgICAgKiBleHByZXNzaW9ucy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHF1ZXJ5KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHF1ZXJ5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBHZXQgVGFncyBvcGVyYXRpb24gZW5hYmxlcyB1c2VycyB0byBnZXQgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldFRhZ3Mob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0VGFnc09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU2V0IFRhZ3Mgb3BlcmF0aW9uIGVuYWJsZXMgdXNlcnMgdG8gc2V0IHRhZ3Mgb24gYSBibG9iLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2V0VGFncyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzZXRUYWdzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxufVxuLy8gT3BlcmF0aW9uIFNwZWNpZmljYXRpb25zXG5jb25zdCB4bWxTZXJpYWxpemVyID0gbmV3IGNvcmVIdHRwLlNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gdHJ1ZSk7XG5jb25zdCBkb3dubG9hZE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHsgbmFtZTogXCJTdHJlYW1cIiB9LFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInBhcnNlZFJlc3BvbnNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JEb3dubG9hZEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgMjA2OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogeyBuYW1lOiBcIlN0cmVhbVwiIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicGFyc2VkUmVzcG9uc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkRvd25sb2FkSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkRvd25sb2FkRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnNuYXBzaG90LFxuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb25JZFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5yYW5nZSxcbiAgICAgICAgUGFyYW1ldGVycy5yYW5nZUdldENvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMucmFuZ2VHZXRDb250ZW50Q1JDNjQsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3NcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJIRUFEXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iR2V0UHJvcGVydGllc0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnNuYXBzaG90LFxuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb25JZFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGRlbGV0ZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iRGVsZXRlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5zbmFwc2hvdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkRlbGV0ZVR5cGVcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuZGVsZXRlU25hcHNob3RzXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgdW5kZWxldGVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlVuZGVsZXRlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlVuZGVsZXRlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDhdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBzZXRFeHBpcnlPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldEV4cGlyeUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRFeHBpcnlFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMTFdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuZXhwaXJ5T3B0aW9ucyxcbiAgICAgICAgUGFyYW1ldGVycy5leHBpcmVzT25cbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBzZXRIdHRwSGVhZGVyc09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0SHR0cEhlYWRlcnNIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0SHR0cEhlYWRlcnNFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMuY29tcCwgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDYWNoZUNvbnRyb2wsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50RW5jb2RpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudERpc3Bvc2l0aW9uXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc2V0SW1tdXRhYmlsaXR5UG9saWN5T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDEyXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmltbXV0YWJpbGl0eVBvbGljeUV4cGlyeSxcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lNb2RlXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJERUxFVEVcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iRGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDEyXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc2V0TGVnYWxIb2xkT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRMZWdhbEhvbGRIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0TGVnYWxIb2xkRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDEzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlZ2FsSG9sZFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHNldE1ldGFkYXRhT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRNZXRhZGF0YUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXA2XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLm1ldGFkYXRhLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGFjcXVpcmVMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iQWNxdWlyZUxlYXNlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxMF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYWN0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLmR1cmF0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnByb3Bvc2VkTGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHJlbGVhc2VMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iUmVsZWFzZUxlYXNlSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxMF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYWN0aW9uMSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkMSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHJlbmV3TGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlJlbmV3TGVhc2VIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iUmVuZXdMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxMF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZDEsXG4gICAgICAgIFBhcmFtZXRlcnMuYWN0aW9uMixcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGNoYW5nZUxlYXNlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JDaGFuZ2VMZWFzZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JDaGFuZ2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAxMF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZDEsXG4gICAgICAgIFBhcmFtZXRlcnMuYWN0aW9uNCxcbiAgICAgICAgUGFyYW1ldGVycy5wcm9wb3NlZExlYXNlSWQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgYnJlYWtMZWFzZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iQnJlYWtMZWFzZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JCcmVha0xlYXNlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDEwXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5hY3Rpb24zLFxuICAgICAgICBQYXJhbWV0ZXJzLmJyZWFrUGVyaW9kLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgY3JlYXRlU25hcHNob3RPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkNyZWF0ZVNuYXBzaG90SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkNyZWF0ZVNuYXBzaG90RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDE0XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLm1ldGFkYXRhLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHN0YXJ0Q29weUZyb21VUkxPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlN0YXJ0Q29weUZyb21VUkxIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU3RhcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLm1ldGFkYXRhLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmltbXV0YWJpbGl0eVBvbGljeUV4cGlyeSxcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lNb2RlLFxuICAgICAgICBQYXJhbWV0ZXJzLnRpZXIsXG4gICAgICAgIFBhcmFtZXRlcnMucmVoeWRyYXRlUHJpb3JpdHksXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlTb3VyY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMuc2VhbEJsb2IsXG4gICAgICAgIFBhcmFtZXRlcnMubGVnYWxIb2xkMVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGNvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JDb3B5RnJvbVVSTEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLm1ldGFkYXRhLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmltbXV0YWJpbGl0eVBvbGljeUV4cGlyeSxcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lNb2RlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy50aWVyLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlTb3VyY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMubGVnYWxIb2xkMSxcbiAgICAgICAgUGFyYW1ldGVycy54TXNSZXF1aXJlc1N5bmMsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlQXV0aG9yaXphdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGFib3J0Q29weUZyb21VUkxPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDQ6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkFib3J0Q29weUZyb21VUkxIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iQWJvcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMTUsXG4gICAgICAgIFBhcmFtZXRlcnMuY29weUlkXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29weUFjdGlvbkFib3J0Q29uc3RhbnRcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBzZXRUaWVyT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JTZXRUaWVySGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldFRpZXJIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0VGllckV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5zbmFwc2hvdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDE2XG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlaHlkcmF0ZVByaW9yaXR5LFxuICAgICAgICBQYXJhbWV0ZXJzLnRpZXIxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZ2V0QWNjb3VudEluZm9PcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkdldEFjY291bnRJbmZvSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLmNvbXAsIFBhcmFtZXRlcnMucmVzdHlwZTFdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudmVyc2lvbiwgUGFyYW1ldGVycy5hY2NlcHQxXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgcXVlcnlPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBPU1RcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogeyBuYW1lOiBcIlN0cmVhbVwiIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicGFyc2VkUmVzcG9uc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlF1ZXJ5SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICAyMDY6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7IG5hbWU6IFwiU3RyZWFtXCIgfSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJwYXJzZWRSZXNwb25zZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iUXVlcnlIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iUXVlcnlFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBQYXJhbWV0ZXJzLnF1ZXJ5UmVxdWVzdCxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnNuYXBzaG90LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAxN1xuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudFR5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0LFxuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBtZWRpYVR5cGU6IFwieG1sXCIsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGdldFRhZ3NPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuQmxvYlRhZ3MsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2JHZXRUYWdzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYkdldFRhZ3NFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuc25hcHNob3QsXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbklkLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAxOFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHNldFRhZ3NPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDQ6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvYlNldFRhZ3NIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9iU2V0VGFnc0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMudGFncyxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb25JZCxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMThcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudENyYzY0XG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBtZWRpYVR5cGU6IFwieG1sXCIsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJsb2IuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBnZW5lcmF0ZVV1aWQgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgU3RvcmFnZUNsaWVudENvbnRleHQgfSBmcm9tIFwiLi9nZW5lcmF0ZWQvc3JjL2luZGV4XCI7XG5pbXBvcnQgeyBTcGFuU3RhdHVzQ29kZSB9IGZyb20gXCJAYXp1cmUvY29yZS10cmFjaW5nXCI7XG5pbXBvcnQgeyBCbG9iIGFzIFN0b3JhZ2VCbG9iLCBDb250YWluZXIgfSBmcm9tIFwiLi9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IEVUYWdOb25lIH0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlLCBjcmVhdGVTcGFuIH0gZnJvbSBcIi4vdXRpbHMvdHJhY2luZ1wiO1xuLyoqXG4gKiBBIGNsaWVudCB0aGF0IG1hbmFnZXMgbGVhc2VzIGZvciBhIHtAbGluayBDb250YWluZXJDbGllbnR9IG9yIGEge0BsaW5rIEJsb2JDbGllbnR9LlxuICovXG5leHBvcnQgY2xhc3MgQmxvYkxlYXNlQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJsb2JMZWFzZUNsaWVudC5cbiAgICAgKiBAcGFyYW0gY2xpZW50IC0gVGhlIGNsaWVudCB0byBtYWtlIHRoZSBsZWFzZSBvcGVyYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHBhcmFtIGxlYXNlSWQgLSBJbml0aWFsIHByb3Bvc2VkIGxlYXNlIGlkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgbGVhc2VJZCkge1xuICAgICAgICBjb25zdCBjbGllbnRDb250ZXh0ID0gbmV3IFN0b3JhZ2VDbGllbnRDb250ZXh0KGNsaWVudC51cmwsIGNsaWVudC5waXBlbGluZS50b1NlcnZpY2VDbGllbnRPcHRpb25zKCkpO1xuICAgICAgICB0aGlzLl91cmwgPSBjbGllbnQudXJsO1xuICAgICAgICBpZiAoY2xpZW50Lm5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyT3JCbG9iT3BlcmF0aW9uID0gbmV3IENvbnRhaW5lcihjbGllbnRDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJPckJsb2JPcGVyYXRpb24gPSBuZXcgU3RvcmFnZUJsb2IoY2xpZW50Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsZWFzZUlkKSB7XG4gICAgICAgICAgICBsZWFzZUlkID0gZ2VuZXJhdGVVdWlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGVhc2VJZCA9IGxlYXNlSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxlYXNlIElkLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlYXNlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZWFzZUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1cmwuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBjb250YWluZXIgZm9yIGRlbGV0ZSBvcGVyYXRpb25zLCBvciBvbiBhIGJsb2JcbiAgICAgKiBmb3Igd3JpdGUgYW5kIGRlbGV0ZSBvcGVyYXRpb25zLlxuICAgICAqIFRoZSBsb2NrIGR1cmF0aW9uIGNhbiBiZSAxNSB0byA2MCBzZWNvbmRzLCBvciBjYW4gYmUgaW5maW5pdGUuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGVhc2UtY29udGFpbmVyXG4gICAgICogYW5kXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGVhc2UtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIGR1cmF0aW9uIC0gTXVzdCBiZSBiZXR3ZWVuIDE1IHRvIDYwIHNlY29uZHMsIG9yIGluZmluaXRlICgtMSlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbiB0byBjb25maWd1cmUgbGVhc2UgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIGFjcXVpcmUgbGVhc2Ugb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGFjcXVpcmVMZWFzZShkdXJhdGlvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkxlYXNlQ2xpZW50LWFjcXVpcmVMZWFzZVwiLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29udGFpbmVyICYmXG4gICAgICAgICAgICAoKCgoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZk1hdGNoKSAmJiAoKF9iID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoKF9jID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZOb25lTWF0Y2gpICYmICgoX2QgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoX2UgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50YWdDb25kaXRpb25zKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIElmTWF0Y2gsIElmTm9uZU1hdGNoIGFuZCB0YWdzIGFjY2VzcyBjb25kaXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzZXJ2aWNlLiBWYWx1ZXMgb3RoZXIgdGhhbiB1bmRlZmluZWQgb3IgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhY2NlcHRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbnRhaW5lck9yQmxvYk9wZXJhdGlvbi5hY3F1aXJlTGVhc2UoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBkdXJhdGlvbiwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2YgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi50YWdDb25kaXRpb25zIH0pLCBwcm9wb3NlZExlYXNlSWQ6IHRoaXMuX2xlYXNlSWQgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gY2hhbmdlIHRoZSBJRCBvZiB0aGUgbGVhc2UuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGVhc2UtY29udGFpbmVyXG4gICAgICogYW5kXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGVhc2UtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3Bvc2VkTGVhc2VJZCAtIHRoZSBwcm9wb3NlZCBuZXcgbGVhc2UgSWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb24gdG8gY29uZmlndXJlIGxlYXNlIG1hbmFnZW1lbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciBjaGFuZ2UgbGVhc2Ugb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGNoYW5nZUxlYXNlKHByb3Bvc2VkTGVhc2VJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkxlYXNlQ2xpZW50LWNoYW5nZUxlYXNlXCIsIG9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5faXNDb250YWluZXIgJiZcbiAgICAgICAgICAgICgoKChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlmTWF0Y2gpICYmICgoX2IgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZk1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKCgoX2MgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pZk5vbmVNYXRjaCkgJiYgKChfZCA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlmTm9uZU1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKChfZSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRhZ0NvbmRpdGlvbnMpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgSWZNYXRjaCwgSWZOb25lTWF0Y2ggYW5kIHRhZ3MgYWNjZXNzIGNvbmRpdGlvbnMgYXJlIGlnbm9yZWQgYnkgdGhlIHNlcnZpY2UuIFZhbHVlcyBvdGhlciB0aGFuIHVuZGVmaW5lZCBvciB0aGVpciBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IGFjY2VwdGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2NvbnRhaW5lck9yQmxvYk9wZXJhdGlvbi5jaGFuZ2VMZWFzZSh0aGlzLl9sZWFzZUlkLCBwcm9wb3NlZExlYXNlSWQsIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2YgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi50YWdDb25kaXRpb25zIH0pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgICAgICB0aGlzLl9sZWFzZUlkID0gcHJvcG9zZWRMZWFzZUlkO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUbyBmcmVlIHRoZSBsZWFzZSBpZiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHNvIHRoYXQgYW5vdGhlciBjbGllbnQgbWF5XG4gICAgICogaW1tZWRpYXRlbHkgYWNxdWlyZSBhIGxlYXNlIGFnYWluc3QgdGhlIGNvbnRhaW5lciBvciB0aGUgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9sZWFzZS1jb250YWluZXJcbiAgICAgKiBhbmRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9sZWFzZS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbiB0byBjb25maWd1cmUgbGVhc2UgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHJlbGVhc2UgbGVhc2Ugb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbGVhc2VMZWFzZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iTGVhc2VDbGllbnQtcmVsZWFzZUxlYXNlXCIsIG9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5faXNDb250YWluZXIgJiZcbiAgICAgICAgICAgICgoKChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlmTWF0Y2gpICYmICgoX2IgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZk1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKCgoX2MgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pZk5vbmVNYXRjaCkgJiYgKChfZCA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlmTm9uZU1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKChfZSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRhZ0NvbmRpdGlvbnMpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgSWZNYXRjaCwgSWZOb25lTWF0Y2ggYW5kIHRhZ3MgYWNjZXNzIGNvbmRpdGlvbnMgYXJlIGlnbm9yZWQgYnkgdGhlIHNlcnZpY2UuIFZhbHVlcyBvdGhlciB0aGFuIHVuZGVmaW5lZCBvciB0aGVpciBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IGFjY2VwdGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29udGFpbmVyT3JCbG9iT3BlcmF0aW9uLnJlbGVhc2VMZWFzZSh0aGlzLl9sZWFzZUlkLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9mID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUbyByZW5ldyB0aGUgbGVhc2UuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGVhc2UtY29udGFpbmVyXG4gICAgICogYW5kXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGVhc2UtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb24gdG8gY29uZmlndXJlIGxlYXNlIG1hbmFnZW1lbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciByZW5ldyBsZWFzZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgcmVuZXdMZWFzZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iTGVhc2VDbGllbnQtcmVuZXdMZWFzZVwiLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29udGFpbmVyICYmXG4gICAgICAgICAgICAoKCgoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZk1hdGNoKSAmJiAoKF9iID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoKF9jID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZOb25lTWF0Y2gpICYmICgoX2QgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoX2UgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50YWdDb25kaXRpb25zKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIElmTWF0Y2gsIElmTm9uZU1hdGNoIGFuZCB0YWdzIGFjY2VzcyBjb25kaXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzZXJ2aWNlLiBWYWx1ZXMgb3RoZXIgdGhhbiB1bmRlZmluZWQgb3IgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhY2NlcHRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbnRhaW5lck9yQmxvYk9wZXJhdGlvbi5yZW5ld0xlYXNlKHRoaXMuX2xlYXNlSWQsIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2YgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi50YWdDb25kaXRpb25zIH0pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIGVuZCB0aGUgbGVhc2UgYnV0IGVuc3VyZSB0aGF0IGFub3RoZXIgY2xpZW50IGNhbm5vdCBhY3F1aXJlIGEgbmV3IGxlYXNlXG4gICAgICogdW50aWwgdGhlIGN1cnJlbnQgbGVhc2UgcGVyaW9kIGhhcyBleHBpcmVkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWNvbnRhaW5lclxuICAgICAqIGFuZFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBicmVha1BlcmlvZCAtIEJyZWFrIHBlcmlvZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBjb25maWd1cmUgbGVhc2UgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIGJyZWFrIGxlYXNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBicmVha0xlYXNlKGJyZWFrUGVyaW9kLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iTGVhc2VDbGllbnQtYnJlYWtMZWFzZVwiLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29udGFpbmVyICYmXG4gICAgICAgICAgICAoKCgoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZk1hdGNoKSAmJiAoKF9iID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoKF9jID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZOb25lTWF0Y2gpICYmICgoX2QgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoX2UgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50YWdDb25kaXRpb25zKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIElmTWF0Y2gsIElmTm9uZU1hdGNoIGFuZCB0YWdzIGFjY2VzcyBjb25kaXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzZXJ2aWNlLiBWYWx1ZXMgb3RoZXIgdGhhbiB1bmRlZmluZWQgb3IgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhY2NlcHRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgYnJlYWtQZXJpb2QsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9mID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29udGFpbmVyT3JCbG9iT3BlcmF0aW9uLmJyZWFrTGVhc2Uob3BlcmF0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmxvYkxlYXNlQ2xpZW50LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tIFwic3RyZWFtXCI7XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBBIE5vZGUuanMgUmVhZGFibGVTdHJlYW0gd2lsbCBpbnRlcm5hbGx5IHJldHJ5IHdoZW4gaW50ZXJuYWwgUmVhZGFibGVTdHJlYW0gdW5leHBlY3RlZCBlbmRzLlxuICovXG5leHBvcnQgY2xhc3MgUmV0cmlhYmxlUmVhZGFibGVTdHJlYW0gZXh0ZW5kcyBSZWFkYWJsZSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXRyaWFibGVSZWFkYWJsZVN0cmVhbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY3VycmVudCBSZWFkYWJsZVN0cmVhbSByZXR1cm5lZCBmcm9tIGdldHRlclxuICAgICAqIEBwYXJhbSBnZXR0ZXIgLSBBIG1ldGhvZCBjYWxsaW5nIGRvd25sb2FkaW5nIHJlcXVlc3QgcmV0dXJuaW5nXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbmV3IFJlYWRhYmxlU3RyZWFtIGZyb20gc3BlY2lmaWVkIG9mZnNldFxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBPZmZzZXQgcG9zaXRpb24gaW4gb3JpZ2luYWwgZGF0YSBzb3VyY2UgdG8gcmVhZFxuICAgICAqIEBwYXJhbSBjb3VudCAtIEhvdyBtdWNoIGRhdGEgaW4gb3JpZ2luYWwgZGF0YSBzb3VyY2UgdG8gcmVhZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIGdldHRlciwgb2Zmc2V0LCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHsgaGlnaFdhdGVyTWFyazogb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIH0pO1xuICAgICAgICB0aGlzLnJldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLnNvdXJjZURhdGFIYW5kbGVyID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZG9JbmplY3RFcnJvck9uY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZG9JbmplY3RFcnJvck9uY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJkYXRhXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlLmVtaXQoXCJlbmRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBPZmZzZXQ6ICR7dGhpcy5vZmZzZXR9LCBSZWNlaXZlZCAke2RhdGEubGVuZ3RofSBmcm9tIGludGVybmFsIHN0cmVhbWBcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoeyBsb2FkZWRCeXRlczogdGhpcy5vZmZzZXQgLSB0aGlzLnN0YXJ0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnB1c2goZGF0YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNvdXJjZUVycm9yT3JFbmRIYW5kbGVyID0gKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFNvdXJjZSBzdHJlYW0gZW1pdHMgZW5kIG9yIGVycm9yLCBvZmZzZXQ6ICR7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5vZmZzZXRcbiAgICAgICAgICAgIC8vICAgfSwgZGVzdCBlbmQgOiAke3RoaXMuZW5kfWBcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNvdXJjZUV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCAtIDEgPT09IHRoaXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vZmZzZXQgPD0gdGhpcy5lbmQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAvLyAgIGByZXRyaWVzOiAke3RoaXMucmV0cmllc30sIG1heCByZXRyaWVzOiAke3RoaXMubWF4UmV0cmllc31gXG4gICAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXRyaWVzIDwgdGhpcy5tYXhSZXRyeVJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cmllcyArPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldHRlcih0aGlzLm9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChuZXdTb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3U291cmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTb3VyY2VFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveShuZXcgRXJyb3IoYERhdGEgY29ycnVwdGlvbiBmYWlsdXJlOiByZWNlaXZlZCBsZXNzIGRhdGEgdGhhbiByZXF1aXJlZCBhbmQgcmVhY2hlZCBtYXhSZXRpcmVzIGxpbWl0YXRpb24uIFJlY2VpdmVkIGRhdGEgb2Zmc2V0OiAke3RoaXMub2Zmc2V0IC0gMX0sIGRhdGEgbmVlZGVkIG9mZnNldDogJHt0aGlzLmVuZH0sIHJldHJpZXM6ICR7dGhpcy5yZXRyaWVzfSwgbWF4IHJldHJpZXM6ICR7dGhpcy5tYXhSZXRyeVJlcXVlc3RzfWApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3kobmV3IEVycm9yKGBEYXRhIGNvcnJ1cHRpb24gZmFpbHVyZTogUmVjZWl2ZWQgbW9yZSBkYXRhIHRoYW4gb3JpZ2luYWwgcmVxdWVzdCwgZGF0YSBuZWVkZWQgb2Zmc2V0IGlzICR7dGhpcy5lbmR9LCByZWNlaXZlZCBvZmZzZXQ6ICR7dGhpcy5vZmZzZXQgLSAxfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5lbmQgPSBvZmZzZXQgKyBjb3VudCAtIDE7XG4gICAgICAgIHRoaXMubWF4UmV0cnlSZXF1ZXN0cyA9XG4gICAgICAgICAgICBvcHRpb25zLm1heFJldHJ5UmVxdWVzdHMgJiYgb3B0aW9ucy5tYXhSZXRyeVJlcXVlc3RzID49IDAgPyBvcHRpb25zLm1heFJldHJ5UmVxdWVzdHMgOiAwO1xuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBvcHRpb25zLm9uUHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuc2V0U291cmNlRXZlbnRIYW5kbGVycygpO1xuICAgIH1cbiAgICBfcmVhZCgpIHtcbiAgICAgICAgdGhpcy5zb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICAgIHNldFNvdXJjZUV2ZW50SGFuZGxlcnMoKSB7XG4gICAgICAgIHRoaXMuc291cmNlLm9uKFwiZGF0YVwiLCB0aGlzLnNvdXJjZURhdGFIYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zb3VyY2Uub24oXCJlbmRcIiwgdGhpcy5zb3VyY2VFcnJvck9yRW5kSGFuZGxlcik7XG4gICAgICAgIHRoaXMuc291cmNlLm9uKFwiZXJyb3JcIiwgdGhpcy5zb3VyY2VFcnJvck9yRW5kSGFuZGxlcik7XG4gICAgfVxuICAgIHJlbW92ZVNvdXJjZUV2ZW50SGFuZGxlcnMoKSB7XG4gICAgICAgIHRoaXMuc291cmNlLnJlbW92ZUxpc3RlbmVyKFwiZGF0YVwiLCB0aGlzLnNvdXJjZURhdGFIYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zb3VyY2UucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIiwgdGhpcy5zb3VyY2VFcnJvck9yRW5kSGFuZGxlcik7XG4gICAgICAgIHRoaXMuc291cmNlLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgdGhpcy5zb3VyY2VFcnJvck9yRW5kSGFuZGxlcik7XG4gICAgfVxuICAgIF9kZXN0cm95KGVycm9yLCBjYWxsYmFjaykge1xuICAgICAgICAvLyByZW1vdmUgbGlzdGVuZXIgZnJvbSBzb3VyY2UgYW5kIHJlbGVhc2Ugc291cmNlXG4gICAgICAgIHRoaXMucmVtb3ZlU291cmNlRXZlbnRIYW5kbGVycygpO1xuICAgICAgICB0aGlzLnNvdXJjZS5kZXN0cm95KCk7XG4gICAgICAgIGNhbGxiYWNrKGVycm9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZXJyb3IpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJldHJpYWJsZVJlYWRhYmxlU3RyZWFtLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IFJldHJpYWJsZVJlYWRhYmxlU3RyZWFtLCB9IGZyb20gXCIuL3V0aWxzL1JldHJpYWJsZVJlYWRhYmxlU3RyZWFtXCI7XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBCbG9iRG93bmxvYWRSZXNwb25zZSBpbXBsZW1lbnRzIEJsb2JEb3dubG9hZFJlc3BvbnNlUGFyc2VkIGludGVyZmFjZSwgYW5kIGluIE5vZGUuanMgcnVudGltZSBpdCB3aWxsXG4gKiBhdXRvbWF0aWNhbGx5IHJldHJ5IHdoZW4gaW50ZXJuYWwgcmVhZCBzdHJlYW0gdW5leHBlY3RlZCBlbmRzLiAoVGhpcyBraW5kIG9mIHVuZXhwZWN0ZWQgZW5kcyBjYW5ub3RcbiAqIHRyaWdnZXIgcmV0cmllcyBkZWZpbmVkIGluIHBpcGVsaW5lIHJldHJ5IHBvbGljeS4pXG4gKlxuICogVGhlIHtAbGluayByZWFkYWJsZVN0cmVhbUJvZHl9IHN0cmVhbSB3aWxsIHJldHJ5IHVuZGVybGF5ZXIsIHlvdSBjYW4ganVzdCB1c2UgaXQgYXMgYSBub3JtYWwgTm9kZS5qc1xuICogUmVhZGFibGUgc3RyZWFtLlxuICovXG5leHBvcnQgY2xhc3MgQmxvYkRvd25sb2FkUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQmxvYkRvd25sb2FkUmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3JpZ2luYWxSZXNwb25zZSAtXG4gICAgICogQHBhcmFtIGdldHRlciAtXG4gICAgICogQHBhcmFtIG9mZnNldCAtXG4gICAgICogQHBhcmFtIGNvdW50IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3JpZ2luYWxSZXNwb25zZSwgZ2V0dGVyLCBvZmZzZXQsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFJlc3BvbnNlID0gb3JpZ2luYWxSZXNwb25zZTtcbiAgICAgICAgdGhpcy5ibG9iRG93bmxvYWRTdHJlYW0gPSBuZXcgUmV0cmlhYmxlUmVhZGFibGVTdHJlYW0odGhpcy5vcmlnaW5hbFJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSwgZ2V0dGVyLCBvZmZzZXQsIGNvdW50LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNlcnZpY2Ugc3VwcG9ydHNcbiAgICAgKiByZXF1ZXN0cyBmb3IgcGFydGlhbCBmaWxlIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYWNjZXB0UmFuZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmFjY2VwdFJhbmdlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiBpdCB3YXMgcHJldmlvdXNseSBzcGVjaWZpZWRcbiAgICAgKiBmb3IgdGhlIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY2FjaGVDb250cm9sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNhY2hlQ29udHJvbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoZSAneC1tcy1jb250ZW50LWRpc3Bvc2l0aW9uJyBoZWFkZXIgYW5kIHNwZWNpZmllcyBob3cgdG8gcHJvY2VzcyB0aGVcbiAgICAgKiByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50RGlzcG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudERpc3Bvc2l0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyBzcGVjaWZpZWRcbiAgICAgKiBmb3IgdGhlIENvbnRlbnQtRW5jb2RpbmcgcmVxdWVzdCBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudEVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRFbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoZSBDb250ZW50LUxhbmd1YWdlIHJlcXVlc3QgaGVhZGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRMYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50TGFuZ3VhZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNlcXVlbmNlIG51bWJlciBmb3IgYVxuICAgICAqIHBhZ2UgYmxvYi4gVGhpcyBoZWFkZXIgaXMgbm90IHJldHVybmVkIGZvciBibG9jayBibG9icyBvciBhcHBlbmQgYmxvYnMuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYmxvYlNlcXVlbmNlTnVtYmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmJsb2JTZXF1ZW5jZU51bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJsb2IncyB0eXBlLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgKiAnQmxvY2tCbG9iJywgJ1BhZ2VCbG9iJywgJ0FwcGVuZEJsb2InLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmJsb2JUeXBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHByZXNlbnQgaW4gdGhlXG4gICAgICogcmVzcG9uc2UgYm9keS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRMZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBmaWxlIGhhcyBhbiBNRDUgaGFzaCBhbmQgdGhlXG4gICAgICogcmVxdWVzdCBpcyB0byByZWFkIHRoZSBmdWxsIGZpbGUsIHRoaXMgcmVzcG9uc2UgaGVhZGVyIGlzIHJldHVybmVkIHNvIHRoYXRcbiAgICAgKiB0aGUgY2xpZW50IGNhbiBjaGVjayBmb3IgbWVzc2FnZSBjb250ZW50IGludGVncml0eS4gSWYgdGhlIHJlcXVlc3QgaXMgdG9cbiAgICAgKiByZWFkIGEgc3BlY2lmaWVkIHJhbmdlIGFuZCB0aGUgJ3gtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtbWQ1JyBpcyBzZXQgdG9cbiAgICAgKiB0cnVlLCB0aGVuIHRoZSByZXF1ZXN0IHJldHVybnMgYW4gTUQ1IGhhc2ggZm9yIHRoZSByYW5nZSwgYXMgbG9uZyBhcyB0aGVcbiAgICAgKiByYW5nZSBzaXplIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byA0IE1CLiBJZiBuZWl0aGVyIG9mIHRoZXNlIHNldHMgb2ZcbiAgICAgKiBjb25kaXRpb25zIGlzIHRydWUsIHRoZW4gbm8gdmFsdWUgaXMgcmV0dXJuZWQgZm9yIHRoZSAnQ29udGVudC1NRDUnXG4gICAgICogaGVhZGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRNRDUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudE1ENTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoZSByYW5nZSBvZiBieXRlcyByZXR1cm5lZCBpZlxuICAgICAqIHRoZSBjbGllbnQgcmVxdWVzdGVkIGEgc3Vic2V0IG9mIHRoZSBmaWxlIGJ5IHNldHRpbmcgdGhlIFJhbmdlIHJlcXVlc3RcbiAgICAgKiBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudFJhbmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRSYW5nZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBmaWxlLlxuICAgICAqIFRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZSBpcyAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRUeXBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25jbHVzaW9uIHRpbWUgb2YgdGhlIGxhc3QgYXR0ZW1wdGVkXG4gICAgICogQ29weSBGaWxlIG9wZXJhdGlvbiB3aGVyZSB0aGlzIGZpbGUgd2FzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLiBUaGlzIHZhbHVlXG4gICAgICogY2FuIHNwZWNpZnkgdGhlIHRpbWUgb2YgYSBjb21wbGV0ZWQsIGFib3J0ZWQsIG9yIGZhaWxlZCBjb3B5IGF0dGVtcHQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weUNvbXBsZXRlZE9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlDb21wbGV0ZWRPbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBsYXN0IGF0dGVtcHRlZCBDb3B5XG4gICAgICogRmlsZSBvcGVyYXRpb24gd2hlcmUgdGhpcyBmaWxlIHdhcyB0aGUgZGVzdGluYXRpb24gZmlsZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBhbmRcbiAgICAgKiB0aGUgdG90YWwgYnl0ZXMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgbGFzdCBhdHRlbXB0ZWQgQ29weSBGaWxlIG9wZXJhdGlvblxuICAgICAqIHdoZXJlIHRoaXMgZmlsZSB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuIENhbiBzaG93IGJldHdlZW4gMCBhbmRcbiAgICAgKiBDb250ZW50LUxlbmd0aCBieXRlcyBjb3BpZWQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVByb2dyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlQcm9ncmVzcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVVJMIHVwIHRvIDJLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgdGhlXG4gICAgICogc291cmNlIGZpbGUgdXNlZCBpbiB0aGUgbGFzdCBhdHRlbXB0ZWQgQ29weSBGaWxlIG9wZXJhdGlvbiB3aGVyZSB0aGlzIGZpbGVcbiAgICAgKiB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5U291cmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0ZSBvZiB0aGUgY29weSBvcGVyYXRpb25cbiAgICAgKiBpZGVudGlmaWVkIGJ5ICd4LW1zLWNvcHktaWQnLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogJ3BlbmRpbmcnLFxuICAgICAqICdzdWNjZXNzJywgJ2Fib3J0ZWQnLCAnZmFpbGVkJ1xuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlTdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVN0YXR1cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogT25seSBhcHBlYXJzIHdoZW5cbiAgICAgKiB4LW1zLWNvcHktc3RhdHVzIGlzIGZhaWxlZCBvciBwZW5kaW5nLiBEZXNjcmliZXMgY2F1c2Ugb2YgZmF0YWwgb3JcbiAgICAgKiBub24tZmF0YWwgY29weSBvcGVyYXRpb24gZmFpbHVyZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5U3RhdHVzRGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVN0YXR1c0Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgYmxvYiBpcyBsZWFzZWQsXG4gICAgICogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGxlYXNlIGlzIG9mIGluZmluaXRlIG9yIGZpeGVkIGR1cmF0aW9uLiBQb3NzaWJsZVxuICAgICAqIHZhbHVlcyBpbmNsdWRlOiAnaW5maW5pdGUnLCAnZml4ZWQnLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlYXNlRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGVhc2VEdXJhdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGVhc2Ugc3RhdGUgb2YgdGhlIGJsb2IuIFBvc3NpYmxlXG4gICAgICogdmFsdWVzIGluY2x1ZGU6ICdhdmFpbGFibGUnLCAnbGVhc2VkJywgJ2V4cGlyZWQnLCAnYnJlYWtpbmcnLCAnYnJva2VuJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsZWFzZVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxlYXNlU3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGxlYXNlIHN0YXR1cyBvZiB0aGVcbiAgICAgKiBibG9iLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogJ2xvY2tlZCcsICd1bmxvY2tlZCcuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGVhc2VTdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGVhc2VTdGF0dXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgVVRDIGRhdGUvdGltZSB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZpY2UgdGhhdFxuICAgICAqIGluZGljYXRlcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgcmVzcG9uc2Ugd2FzIGluaXRpYXRlZC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmRhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY29tbWl0dGVkIGJsb2Nrc1xuICAgICAqIHByZXNlbnQgaW4gdGhlIGJsb2IuIFRoaXMgaGVhZGVyIGlzIHJldHVybmVkIG9ubHkgZm9yIGFwcGVuZCBibG9icy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iQ29tbWl0dGVkQmxvY2tDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iQ29tbWl0dGVkQmxvY2tDb3VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEVUYWcgY29udGFpbnMgYSB2YWx1ZSB0aGF0IHlvdSBjYW4gdXNlIHRvXG4gICAgICogcGVyZm9ybSBvcGVyYXRpb25zIGNvbmRpdGlvbmFsbHksIGluIHF1b3Rlcy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBldGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmV0YWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGJsb2JcbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCB0YWdDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS50YWdDb3VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgZXJyb3JDb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmVycm9yQ29kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIGlzIHNldCB0b1xuICAgICAqIHRydWUgaWYgdGhlIGZpbGUgZGF0YSBhbmQgYXBwbGljYXRpb24gbWV0YWRhdGEgYXJlIGNvbXBsZXRlbHkgZW5jcnlwdGVkXG4gICAgICogdXNpbmcgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0uIE90aGVyd2lzZSwgdGhlIHZhbHVlIGlzIHNldCB0byBmYWxzZSAod2hlblxuICAgICAqIHRoZSBmaWxlIGlzIHVuZW5jcnlwdGVkLCBvciBpZiBvbmx5IHBhcnRzIG9mIHRoZSBmaWxlL2FwcGxpY2F0aW9uIG1ldGFkYXRhXG4gICAgICogYXJlIGVuY3J5cHRlZCkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgaXNTZXJ2ZXJFbmNyeXB0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuaXNTZXJ2ZXJFbmNyeXB0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBibG9iIGhhcyBhIE1ENSBoYXNoLCBhbmQgaWZcbiAgICAgKiByZXF1ZXN0IGNvbnRhaW5zIHJhbmdlIGhlYWRlciAoUmFuZ2Ugb3IgeC1tcy1yYW5nZSksIHRoaXMgcmVzcG9uc2UgaGVhZGVyXG4gICAgICogaXMgcmV0dXJuZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHdob2xlIGJsb2IncyBNRDUgdmFsdWUuIFRoaXMgdmFsdWUgbWF5XG4gICAgICogb3IgbWF5IG5vdCBiZSBlcXVhbCB0byB0aGUgdmFsdWUgcmV0dXJuZWQgaW4gQ29udGVudC1NRDUgaGVhZGVyLCB3aXRoIHRoZVxuICAgICAqIGxhdHRlciBjYWxjdWxhdGVkIGZyb20gdGhlIHJlcXVlc3RlZCByYW5nZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iQ29udGVudE1ENSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iQ29udGVudE1ENTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0ZSBhbmQgdGltZSB0aGUgZmlsZSB3YXMgbGFzdFxuICAgICAqIG1vZGlmaWVkLiBBbnkgb3BlcmF0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGZpbGUgb3IgaXRzIHByb3BlcnRpZXMgdXBkYXRlc1xuICAgICAqIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGFzdE1vZGlmaWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxhc3RNb2RpZmllZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgVVRDIGRhdGUgYW5kIHRpbWUgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2aWNlIHRoYXQgaW5kaWNhdGVzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBibG9iIHdhc1xuICAgICAqIGxhc3QgcmVhZCBvciB3cml0dGVuIHRvLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxhc3RBY2Nlc3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sYXN0QWNjZXNzZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgdGhlIGJsb2Igd2FzIGNyZWF0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY3JlYXRlZE9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNyZWF0ZWRPbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBuYW1lLXZhbHVlIHBhaXJcbiAgICAgKiB0byBhc3NvY2lhdGUgd2l0aCBhIGZpbGUgc3RvcmFnZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubWV0YWRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaGVhZGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlcXVlc3RcbiAgICAgKiB0aGF0IHdhcyBtYWRlIGFuZCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHJlcXVlc3RJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5yZXF1ZXN0SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGEgY2xpZW50IHJlcXVlc3QgaWQgaGVhZGVyIGlzIHNlbnQgaW4gdGhlIHJlcXVlc3QsIHRoaXMgaGVhZGVyIHdpbGwgYmUgcHJlc2VudCBpbiB0aGVcbiAgICAgKiByZXNwb25zZSB3aXRoIHRoZSBzYW1lIHZhbHVlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNsaWVudFJlcXVlc3RJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jbGllbnRSZXF1ZXN0SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgQmxvYiBzZXJ2aWNlIHVzZWRcbiAgICAgKiB0byBleGVjdXRlIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UudmVyc2lvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoZSB2ZXJzaW9uSWQgb2YgdGhlIGRvd25sb2FkZWQgYmxvYiB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHZlcnNpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS52ZXJzaW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHZlcnNpb24gb2YgdGhpcyBibG9iIGlzIGEgY3VycmVudCB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGlzQ3VycmVudFZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuaXNDdXJyZW50VmVyc2lvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNIQS0yNTYgaGFzaCBvZiB0aGUgZW5jcnlwdGlvbiBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBibG9iLiBUaGlzIHZhbHVlIGlzIG9ubHkgcmV0dXJuZWRcbiAgICAgKiB3aGVuIHRoZSBibG9iIHdhcyBlbmNyeXB0ZWQgd2l0aCBhIGN1c3RvbWVyLXByb3ZpZGVkIGtleS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBlbmNyeXB0aW9uS2V5U2hhMjU2KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmVuY3J5cHRpb25LZXlTaGEyNTY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSByZXF1ZXN0IGlzIHRvIHJlYWQgYSBzcGVjaWZpZWQgcmFuZ2UgYW5kIHRoZSB4LW1zLXJhbmdlLWdldC1jb250ZW50LWNyYzY0IGlzIHNldCB0b1xuICAgICAqIHRydWUsIHRoZW4gdGhlIHJlcXVlc3QgcmV0dXJucyBhIGNyYzY0IGZvciB0aGUgcmFuZ2UsIGFzIGxvbmcgYXMgdGhlIHJhbmdlIHNpemUgaXMgbGVzcyB0aGFuXG4gICAgICogb3IgZXF1YWwgdG8gNCBNQi4gSWYgYm90aCB4LW1zLXJhbmdlLWdldC1jb250ZW50LWNyYzY0ICYgeC1tcy1yYW5nZS1nZXQtY29udGVudC1tZDUgaXNcbiAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIHNhbWUgcmVxdWVzdCwgaXQgd2lsbCBmYWlsIHdpdGggNDAwKEJhZCBSZXF1ZXN0KVxuICAgICAqL1xuICAgIGdldCBjb250ZW50Q3JjNjQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudENyYzY0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPYmplY3QgUmVwbGljYXRpb24gUG9saWN5IElkIG9mIHRoZSBkZXN0aW5hdGlvbiBibG9iLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IG9iamVjdFJlcGxpY2F0aW9uRGVzdGluYXRpb25Qb2xpY3lJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5vYmplY3RSZXBsaWNhdGlvbkRlc3RpbmF0aW9uUG9saWN5SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlZCBPYmplY3QgUmVwbGljYXRpb24gUG9saWN5IElkLCBSdWxlIElkKHMpIGFuZCBzdGF0dXMgb2YgdGhlIHNvdXJjZSBibG9iLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IG9iamVjdFJlcGxpY2F0aW9uU291cmNlUHJvcGVydGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5vYmplY3RSZXBsaWNhdGlvblNvdXJjZVByb3BlcnRpZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgYmxvYiBoYXMgYmVlbiBzZWFsZWQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgaXNTZWFsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuaXNTZWFsZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVUQyBkYXRlL3RpbWUgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2aWNlIHRoYXQgaW5kaWNhdGVzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBibG9iIGltbXV0YWJpbGl0eSBwb2xpY3kgd2lsbCBleHBpcmUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJlc09uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmltbXV0YWJpbGl0eVBvbGljeUV4cGlyZXNPbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGltbXV0YWJpbGl0eSBwb2xpY3kgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBpbW11dGFiaWxpdHlQb2xpY3lNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmltbXV0YWJpbGl0eVBvbGljeU1vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBhIGxlZ2FsIGhvbGQgaXMgcHJlc2VudCBvbiB0aGUgYmxvYi5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsZWdhbEhvbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGVnYWxIb2xkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVzcG9uc2UgYm9keSBhcyBhIGJyb3dzZXIgQmxvYi5cbiAgICAgKiBBbHdheXMgdW5kZWZpbmVkIGluIG5vZGUuanMuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudEFzQmxvYigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iQm9keTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlc3BvbnNlIGJvZHkgYXMgYSBub2RlLmpzIFJlYWRhYmxlIHN0cmVhbS5cbiAgICAgKiBBbHdheXMgdW5kZWZpbmVkIGluIHRoZSBicm93c2VyLlxuICAgICAqXG4gICAgICogSXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJldHJ5IHdoZW4gaW50ZXJuYWwgcmVhZCBzdHJlYW0gdW5leHBlY3RlZCBlbmRzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHJlYWRhYmxlU3RyZWFtQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIGlzTm9kZSA/IHRoaXMuYmxvYkRvd25sb2FkU3RyZWFtIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBnZXQgX3Jlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLl9yZXNwb25zZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CbG9iRG93bmxvYWRSZXNwb25zZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmV4cG9ydCBjb25zdCBBVlJPX1NZTkNfTUFSS0VSX1NJWkUgPSAxNjtcbmV4cG9ydCBjb25zdCBBVlJPX0lOSVRfQllURVMgPSBuZXcgVWludDhBcnJheShbNzksIDk4LCAxMDYsIDFdKTtcbmV4cG9ydCBjb25zdCBBVlJPX0NPREVDX0tFWSA9IFwiYXZyby5jb2RlY1wiO1xuZXhwb3J0IGNvbnN0IEFWUk9fU0NIRU1BX0tFWSA9IFwiYXZyby5zY2hlbWFcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2cm9Db25zdGFudHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQgY2xhc3MgQXZyb1BhcnNlciB7XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmVhbSAtXG4gICAgICogQHBhcmFtIGxlbmd0aCAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyByZWFkRml4ZWRCeXRlcyhzdHJlYW0sIGxlbmd0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgc3RyZWFtLnJlYWQobGVuZ3RoLCB7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0pO1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhpdCBzdHJlYW0gZW5kLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmVhbSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyByZWFkQnl0ZShzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBidWYgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRGaXhlZEJ5dGVzKHN0cmVhbSwgMSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBidWZbMF07XG4gICAgfVxuICAgIC8vIGludCBhbmQgbG9uZyBhcmUgc3RvcmVkIGluIHZhcmlhYmxlLWxlbmd0aCB6aWctemFnIGNvZGluZy5cbiAgICAvLyB2YXJpYWJsZS1sZW5ndGg6IGh0dHBzOi8vbHVjZW5lLmFwYWNoZS5vcmcvY29yZS8zXzVfMC9maWxlZm9ybWF0cy5odG1sI1ZJbnRcbiAgICAvLyB6aWctemFnOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2Rpbmc/Y3N3PTEjdHlwZXNcbiAgICBzdGF0aWMgYXN5bmMgcmVhZFppZ1phZ0xvbmcoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHppZ1phZ0VuY29kZWQgPSAwO1xuICAgICAgICBsZXQgc2lnbmlmaWNhbmNlSW5CaXQgPSAwO1xuICAgICAgICBsZXQgYnl0ZSwgaGF2ZU1vcmVCeXRlLCBzaWduaWZpY2FuY2VJbkZsb2F0O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBieXRlID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkQnl0ZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgaGF2ZU1vcmVCeXRlID0gYnl0ZSAmIDB4ODA7XG4gICAgICAgICAgICB6aWdaYWdFbmNvZGVkIHw9IChieXRlICYgMHg3ZikgPDwgc2lnbmlmaWNhbmNlSW5CaXQ7XG4gICAgICAgICAgICBzaWduaWZpY2FuY2VJbkJpdCArPSA3O1xuICAgICAgICB9IHdoaWxlIChoYXZlTW9yZUJ5dGUgJiYgc2lnbmlmaWNhbmNlSW5CaXQgPCAyOCk7IC8vIGJpdHdpc2Ugb3BlcmF0aW9uIG9ubHkgd29ya3MgZm9yIDMyLWJpdCBpbnRlZ2Vyc1xuICAgICAgICBpZiAoaGF2ZU1vcmVCeXRlKSB7XG4gICAgICAgICAgICAvLyBTd2l0Y2ggdG8gZmxvYXQgYXJpdGhtZXRpY1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtYXNzaWduXG4gICAgICAgICAgICB6aWdaYWdFbmNvZGVkID0gemlnWmFnRW5jb2RlZDtcbiAgICAgICAgICAgIHNpZ25pZmljYW5jZUluRmxvYXQgPSAyNjg0MzU0NTY7IC8vIDIgKiogMjguXG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgYnl0ZSA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEJ5dGUoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB6aWdaYWdFbmNvZGVkICs9IChieXRlICYgMHg3ZikgKiBzaWduaWZpY2FuY2VJbkZsb2F0O1xuICAgICAgICAgICAgICAgIHNpZ25pZmljYW5jZUluRmxvYXQgKj0gMTI4OyAvLyAyICoqIDdcbiAgICAgICAgICAgIH0gd2hpbGUgKGJ5dGUgJiAweDgwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9ICh6aWdaYWdFbmNvZGVkICUgMiA/IC0oemlnWmFnRW5jb2RlZCArIDEpIDogemlnWmFnRW5jb2RlZCkgLyAyO1xuICAgICAgICAgICAgaWYgKHJlcyA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSIHx8IHJlcyA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW50ZWdlciBvdmVyZmxvdy5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoemlnWmFnRW5jb2RlZCA+PiAxKSBeIC0oemlnWmFnRW5jb2RlZCAmIDEpO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgcmVhZExvbmcoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZFppZ1phZ0xvbmcoc3RyZWFtLCBvcHRpb25zKTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRJbnQoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZFppZ1phZ0xvbmcoc3RyZWFtLCBvcHRpb25zKTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWROdWxsKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRCb29sZWFuKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGIgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRCeXRlKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChiID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCeXRlIHdhcyBub3QgYSBib29sZWFuLlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgcmVhZEZsb2F0KHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHU4YXJyID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkRml4ZWRCeXRlcyhzdHJlYW0sIDQsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KHU4YXJyLmJ1ZmZlciwgdThhcnIuYnl0ZU9mZnNldCwgdThhcnIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB2aWV3LmdldEZsb2F0MzIoMCwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWREb3VibGUoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgdThhcnIgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRGaXhlZEJ5dGVzKHN0cmVhbSwgOCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcodThhcnIuYnVmZmVyLCB1OGFyci5ieXRlT2Zmc2V0LCB1OGFyci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHZpZXcuZ2V0RmxvYXQ2NCgwLCB0cnVlKTsgLy8gbGl0dGxlRW5kaWFuID0gdHJ1ZVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgcmVhZEJ5dGVzKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRMb25nKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnl0ZXMgc2l6ZSB3YXMgbmVnYXRpdmUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJlYW0ucmVhZChzaXplLCB7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgcmVhZFN0cmluZyhzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB1OGFyciA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEJ5dGVzKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHV0ZjhkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgIHJldHVybiB1dGY4ZGVjb2Rlci5kZWNvZGUodThhcnIpO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgcmVhZE1hcFBhaXIoc3RyZWFtLCByZWFkSXRlbU1ldGhvZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZFN0cmluZyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAvLyBGVVRVUkU6IHRoaXMgd29uJ3Qgd29yayB3aXRoIHJlYWRGaXhlZCAoY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQpIHdoaWNoIG5lZWRzIGEgbGVuZ3RoIGFzIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcmVhZEl0ZW1NZXRob2Qoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgcmVhZE1hcChzdHJlYW0sIHJlYWRJdGVtTWV0aG9kLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgcmVhZFBhaXJNZXRob2QgPSAocywgb3B0cyA9IHt9KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkTWFwUGFpcihzLCByZWFkSXRlbU1ldGhvZCwgb3B0cyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBhaXJzID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkQXJyYXkoc3RyZWFtLCByZWFkUGFpck1ldGhvZCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRpY3QgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICBkaWN0W3BhaXIua2V5XSA9IHBhaXIudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpY3Q7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkQXJyYXkoc3RyZWFtLCByZWFkSXRlbU1ldGhvZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIGZvciAobGV0IGNvdW50ID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyhzdHJlYW0sIG9wdGlvbnMpOyBjb3VudCAhPT0gMDsgY291bnQgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRMb25nKHN0cmVhbSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYmxvY2sgc2l6ZXNcbiAgICAgICAgICAgICAgICBhd2FpdCBBdnJvUGFyc2VyLnJlYWRMb25nKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgY291bnQgPSAtY291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY291bnQtLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCByZWFkSXRlbU1ldGhvZChzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbn1cbnZhciBBdnJvQ29tcGxleDtcbihmdW5jdGlvbiAoQXZyb0NvbXBsZXgpIHtcbiAgICBBdnJvQ29tcGxleFtcIlJFQ09SRFwiXSA9IFwicmVjb3JkXCI7XG4gICAgQXZyb0NvbXBsZXhbXCJFTlVNXCJdID0gXCJlbnVtXCI7XG4gICAgQXZyb0NvbXBsZXhbXCJBUlJBWVwiXSA9IFwiYXJyYXlcIjtcbiAgICBBdnJvQ29tcGxleFtcIk1BUFwiXSA9IFwibWFwXCI7XG4gICAgQXZyb0NvbXBsZXhbXCJVTklPTlwiXSA9IFwidW5pb25cIjtcbiAgICBBdnJvQ29tcGxleFtcIkZJWEVEXCJdID0gXCJmaXhlZFwiO1xufSkoQXZyb0NvbXBsZXggfHwgKEF2cm9Db21wbGV4ID0ge30pKTtcbnZhciBBdnJvUHJpbWl0aXZlO1xuKGZ1bmN0aW9uIChBdnJvUHJpbWl0aXZlKSB7XG4gICAgQXZyb1ByaW1pdGl2ZVtcIk5VTExcIl0gPSBcIm51bGxcIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiQk9PTEVBTlwiXSA9IFwiYm9vbGVhblwiO1xuICAgIEF2cm9QcmltaXRpdmVbXCJJTlRcIl0gPSBcImludFwiO1xuICAgIEF2cm9QcmltaXRpdmVbXCJMT05HXCJdID0gXCJsb25nXCI7XG4gICAgQXZyb1ByaW1pdGl2ZVtcIkZMT0FUXCJdID0gXCJmbG9hdFwiO1xuICAgIEF2cm9QcmltaXRpdmVbXCJET1VCTEVcIl0gPSBcImRvdWJsZVwiO1xuICAgIEF2cm9QcmltaXRpdmVbXCJCWVRFU1wiXSA9IFwiYnl0ZXNcIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiU1RSSU5HXCJdID0gXCJzdHJpbmdcIjtcbn0pKEF2cm9QcmltaXRpdmUgfHwgKEF2cm9QcmltaXRpdmUgPSB7fSkpO1xuZXhwb3J0IGNsYXNzIEF2cm9UeXBlIHtcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHRoZSBBdnJvVHlwZSBmcm9tIHRoZSBBdnJvIFNjaGVtYS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBBdnJvVHlwZS5mcm9tU3RyaW5nU2NoZW1hKHNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICAgICAgICByZXR1cm4gQXZyb1R5cGUuZnJvbUFycmF5U2NoZW1hKHNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gQXZyb1R5cGUuZnJvbU9iamVjdFNjaGVtYShzY2hlbWEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tU3RyaW5nU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICBzd2l0Y2ggKHNjaGVtYSkge1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLk5VTEw6XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuQk9PTEVBTjpcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5JTlQ6XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuTE9ORzpcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5GTE9BVDpcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5ET1VCTEU6XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuQllURVM6XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXZyb1ByaW1pdGl2ZVR5cGUoc2NoZW1hKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIEF2cm8gdHlwZSAke3NjaGVtYX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZnJvbUFycmF5U2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IEF2cm9VbmlvblR5cGUoc2NoZW1hLm1hcChBdnJvVHlwZS5mcm9tU2NoZW1hKSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tT2JqZWN0U2NoZW1hKHNjaGVtYSkge1xuICAgICAgICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG4gICAgICAgIC8vIFByaW1pdGl2ZXMgY2FuIGJlIGRlZmluZWQgYXMgc3RyaW5ncyBvciBvYmplY3RzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gQXZyb1R5cGUuZnJvbVN0cmluZ1NjaGVtYSh0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEF2cm9Db21wbGV4LlJFQ09SRDpcbiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLmFsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhbGlhc2VzIGN1cnJlbnRseSBpcyBub3Qgc3VwcG9ydGVkLCBzY2hlbWE6ICR7c2NoZW1hfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgYXR0cmlidXRlICduYW1lJyBkb2Vzbid0IGV4aXN0IG9uIHNjaGVtYTogJHtzY2hlbWF9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9uc1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVpcmVkIGF0dHJpYnV0ZSAnZmllbGRzJyBkb2Vzbid0IGV4aXN0IG9uIHNjaGVtYTogJHtzY2hlbWF9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZmllbGQubmFtZV0gPSBBdnJvVHlwZS5mcm9tU2NoZW1hKGZpZWxkLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF2cm9SZWNvcmRUeXBlKGZpZWxkcywgc2NoZW1hLm5hbWUpO1xuICAgICAgICAgICAgY2FzZSBBdnJvQ29tcGxleC5FTlVNOlxuICAgICAgICAgICAgICAgIGlmIChzY2hlbWEuYWxpYXNlcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFsaWFzZXMgY3VycmVudGx5IGlzIG5vdCBzdXBwb3J0ZWQsIHNjaGVtYTogJHtzY2hlbWF9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hLnN5bWJvbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhdHRyaWJ1dGUgJ3N5bWJvbHMnIGRvZXNuJ3QgZXhpc3Qgb24gc2NoZW1hOiAke3NjaGVtYX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdnJvRW51bVR5cGUoc2NoZW1hLnN5bWJvbHMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvQ29tcGxleC5NQVA6XG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgYXR0cmlidXRlICd2YWx1ZXMnIGRvZXNuJ3QgZXhpc3Qgb24gc2NoZW1hOiAke3NjaGVtYX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdnJvTWFwVHlwZShBdnJvVHlwZS5mcm9tU2NoZW1hKHNjaGVtYS52YWx1ZXMpKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb0NvbXBsZXguQVJSQVk6IC8vIFVudXNlZCB0b2RheVxuICAgICAgICAgICAgY2FzZSBBdnJvQ29tcGxleC5GSVhFRDogLy8gVW51c2VkIHRvZGF5XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBBdnJvIHR5cGUgJHt0eXBlfSBpbiAke3NjaGVtYX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEF2cm9QcmltaXRpdmVUeXBlIGV4dGVuZHMgQXZyb1R5cGUge1xuICAgIGNvbnN0cnVjdG9yKHByaW1pdGl2ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wcmltaXRpdmUgPSBwcmltaXRpdmU7XG4gICAgfVxuICAgIHJlYWQoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9wcmltaXRpdmUpIHtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5OVUxMOlxuICAgICAgICAgICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWROdWxsKCk7XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuQk9PTEVBTjpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkQm9vbGVhbihzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLklOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkSW50KHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuTE9ORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkTG9uZyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRGbG9hdChzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkRPVUJMRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkRG91YmxlKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuQllURVM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZEJ5dGVzKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRTdHJpbmcoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBBdnJvIFByaW1pdGl2ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEF2cm9FbnVtVHlwZSBleHRlbmRzIEF2cm9UeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihzeW1ib2xzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3N5bWJvbHMgPSBzeW1ib2xzO1xuICAgIH1cbiAgICBhc3luYyByZWFkKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkSW50KHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zeW1ib2xzW3ZhbHVlXTtcbiAgICB9XG59XG5jbGFzcyBBdnJvVW5pb25UeXBlIGV4dGVuZHMgQXZyb1R5cGUge1xuICAgIGNvbnN0cnVjdG9yKHR5cGVzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3R5cGVzID0gdHlwZXM7XG4gICAgfVxuICAgIGFzeW5jIHJlYWQoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgICAgIGNvbnN0IHR5cGVJbmRleCA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEludChzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZXNbdHlwZUluZGV4XS5yZWFkKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgfVxufVxuY2xhc3MgQXZyb01hcFR5cGUgZXh0ZW5kcyBBdnJvVHlwZSB7XG4gICAgY29uc3RydWN0b3IoaXRlbVR5cGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5faXRlbVR5cGUgPSBpdGVtVHlwZTtcbiAgICB9XG4gICAgcmVhZChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCByZWFkSXRlbU1ldGhvZCA9IChzLCBvcHRzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXRlbVR5cGUucmVhZChzLCBvcHRzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZE1hcChzdHJlYW0sIHJlYWRJdGVtTWV0aG9kLCBvcHRpb25zKTtcbiAgICB9XG59XG5jbGFzcyBBdnJvUmVjb3JkVHlwZSBleHRlbmRzIEF2cm9UeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihmaWVsZHMsIG5hbWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gZmllbGRzO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB7fTtcbiAgICAgICAgcmVjb3JkW1wiJHNjaGVtYVwiXSA9IHRoaXMuX25hbWU7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9maWVsZHMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGF3YWl0IHRoaXMuX2ZpZWxkc1trZXldLnJlYWQoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2cm9QYXJzZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlzRXF1YWwoYSwgYikge1xuICAgIGlmIChhID09PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmNvbW1vbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IF9fYXN5bmNHZW5lcmF0b3IsIF9fYXdhaXQgfSBmcm9tIFwidHNsaWJcIjtcbi8vIFRPRE86IERvIGEgcmV2aWV3IG9mIG5vbi1pbnRlcmZhY2VzXG4vKiBlc2xpbnQtZGlzYWJsZSBAYXp1cmUvYXp1cmUtc2RrL3RzLXVzZS1pbnRlcmZhY2UtcGFyYW1ldGVycyAqL1xuaW1wb3J0IFwiQGF6dXJlL2NvcmUtcGFnaW5nXCI7XG5pbXBvcnQgeyBBVlJPX0NPREVDX0tFWSwgQVZST19JTklUX0JZVEVTLCBBVlJPX1NDSEVNQV9LRVksIEFWUk9fU1lOQ19NQVJLRVJfU0laRSwgfSBmcm9tIFwiLi9BdnJvQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdnJvUGFyc2VyLCBBdnJvVHlwZSB9IGZyb20gXCIuL0F2cm9QYXJzZXJcIjtcbmltcG9ydCB7IGFycmF5c0VxdWFsIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG5leHBvcnQgY2xhc3MgQXZyb1JlYWRlciB7XG4gICAgY29uc3RydWN0b3IoZGF0YVN0cmVhbSwgaGVhZGVyU3RyZWFtLCBjdXJyZW50QmxvY2tPZmZzZXQsIGluZGV4V2l0aGluQ3VycmVudEJsb2NrKSB7XG4gICAgICAgIHRoaXMuX2RhdGFTdHJlYW0gPSBkYXRhU3RyZWFtO1xuICAgICAgICB0aGlzLl9oZWFkZXJTdHJlYW0gPSBoZWFkZXJTdHJlYW0gfHwgZGF0YVN0cmVhbTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYmxvY2tPZmZzZXQgPSBjdXJyZW50QmxvY2tPZmZzZXQgfHwgMDtcbiAgICAgICAgdGhpcy5fb2JqZWN0SW5kZXggPSBpbmRleFdpdGhpbkN1cnJlbnRCbG9jayB8fCAwO1xuICAgICAgICB0aGlzLl9pbml0aWFsQmxvY2tPZmZzZXQgPSBjdXJyZW50QmxvY2tPZmZzZXQgfHwgMDtcbiAgICB9XG4gICAgZ2V0IGJsb2NrT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2tPZmZzZXQ7XG4gICAgfVxuICAgIGdldCBvYmplY3RJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29iamVjdEluZGV4O1xuICAgIH1cbiAgICBhc3luYyBpbml0aWFsaXplKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRGaXhlZEJ5dGVzKHRoaXMuX2hlYWRlclN0cmVhbSwgQVZST19JTklUX0JZVEVTLmxlbmd0aCwge1xuICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWFycmF5c0VxdWFsKGhlYWRlciwgQVZST19JTklUX0JZVEVTKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIGlzIG5vdCBhbiBBdnJvIGZpbGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGUgbWV0YWRhdGEgaXMgd3JpdHRlbiBhcyBpZiBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgbWFwIHNjaGVtYTpcbiAgICAgICAgLy8geyBcInR5cGVcIjogXCJtYXBcIiwgXCJ2YWx1ZXNcIjogXCJieXRlc1wifVxuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZE1hcCh0aGlzLl9oZWFkZXJTdHJlYW0sIEF2cm9QYXJzZXIucmVhZFN0cmluZywge1xuICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBWYWxpZGF0ZSBjb2RlY1xuICAgICAgICBjb25zdCBjb2RlYyA9IHRoaXMuX21ldGFkYXRhW0FWUk9fQ09ERUNfS0VZXTtcbiAgICAgICAgaWYgKCEoY29kZWMgPT09IHVuZGVmaW5lZCB8fCBjb2RlYyA9PT0gbnVsbCB8fCBjb2RlYyA9PT0gXCJudWxsXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb2RlY3MgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIDE2LWJ5dGUsIHJhbmRvbWx5LWdlbmVyYXRlZCBzeW5jIG1hcmtlciBmb3IgdGhpcyBmaWxlLlxuICAgICAgICB0aGlzLl9zeW5jTWFya2VyID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkRml4ZWRCeXRlcyh0aGlzLl9oZWFkZXJTdHJlYW0sIEFWUk9fU1lOQ19NQVJLRVJfU0laRSwge1xuICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBQYXJzZSB0aGUgc2NoZW1hXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IEpTT04ucGFyc2UodGhpcy5fbWV0YWRhdGFbQVZST19TQ0hFTUFfS0VZXSk7XG4gICAgICAgIHRoaXMuX2l0ZW1UeXBlID0gQXZyb1R5cGUuZnJvbVNjaGVtYShzY2hlbWEpO1xuICAgICAgICBpZiAodGhpcy5fYmxvY2tPZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2Jsb2NrT2Zmc2V0ID0gdGhpcy5faW5pdGlhbEJsb2NrT2Zmc2V0ICsgdGhpcy5fZGF0YVN0cmVhbS5wb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2sgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRMb25nKHRoaXMuX2RhdGFTdHJlYW0sIHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gc2tpcCBibG9jayBsZW5ndGhcbiAgICAgICAgYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyh0aGlzLl9kYXRhU3RyZWFtLCB7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0pO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLl9vYmplY3RJbmRleCAmJiB0aGlzLl9vYmplY3RJbmRleCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fb2JqZWN0SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2l0ZW1UeXBlLnJlYWQodGhpcy5fZGF0YVN0cmVhbSwgeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2stLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNOZXh0KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2luaXRpYWxpemVkIHx8IHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jayA+IDA7XG4gICAgfVxuICAgIHBhcnNlT2JqZWN0cyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogcGFyc2VPYmplY3RzXzEoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgX19hd2FpdCh0aGlzLmluaXRpYWxpemUob3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHRoaXMuaGFzTmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgX19hd2FpdCh0aGlzLl9pdGVtVHlwZS5yZWFkKHRoaXMuX2RhdGFTdHJlYW0sIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jay0tO1xuICAgICAgICAgICAgICAgIHRoaXMuX29iamVjdEluZGV4Kys7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jayA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXIgPSB5aWVsZCBfX2F3YWl0KEF2cm9QYXJzZXIucmVhZEZpeGVkQnl0ZXModGhpcy5fZGF0YVN0cmVhbSwgQVZST19TWU5DX01BUktFUl9TSVpFLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ibG9ja09mZnNldCA9IHRoaXMuX2luaXRpYWxCbG9ja09mZnNldCArIHRoaXMuX2RhdGFTdHJlYW0ucG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29iamVjdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheXNFcXVhbCh0aGlzLl9zeW5jTWFya2VyLCBtYXJrZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJlYW0gaXMgbm90IGEgdmFsaWQgQXZybyBmaWxlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXRlbXNSZW1haW5pbmdJbkJsb2NrID0geWllbGQgX19hd2FpdChBdnJvUGFyc2VyLnJlYWRMb25nKHRoaXMuX2RhdGFTdHJlYW0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoaXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXRlbXNSZW1haW5pbmdJbkJsb2NrID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXRlbXNSZW1haW5pbmdJbkJsb2NrID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGJsb2NrIHNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQoQXZyb1BhcnNlci5yZWFkTG9uZyh0aGlzLl9kYXRhU3RyZWFtLCB7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2cm9SZWFkZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQgY2xhc3MgQXZyb1JlYWRhYmxlIHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2cm9SZWFkYWJsZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEF2cm9SZWFkYWJsZSB9IGZyb20gXCIuL0F2cm9SZWFkYWJsZVwiO1xuaW1wb3J0IHsgQWJvcnRFcnJvciB9IGZyb20gXCJAYXp1cmUvYWJvcnQtY29udHJvbGxlclwiO1xuY29uc3QgQUJPUlRfRVJST1IgPSBuZXcgQWJvcnRFcnJvcihcIlJlYWRpbmcgZnJvbSB0aGUgYXZybyBzdHJlYW0gd2FzIGFib3J0ZWQuXCIpO1xuZXhwb3J0IGNsYXNzIEF2cm9SZWFkYWJsZUZyb21TdHJlYW0gZXh0ZW5kcyBBdnJvUmVhZGFibGUge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRhYmxlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3JlYWRhYmxlID0gcmVhZGFibGU7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gMDtcbiAgICB9XG4gICAgdG9VaW50OEFycmF5KGRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGdldCBwb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICAgIH1cbiAgICBhc3luYyByZWFkKHNpemUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgoX2EgPSBvcHRpb25zLmFib3J0U2lnbmFsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgQUJPUlRfRVJST1I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNpemUgcGFyYW1ldGVyIHNob3VsZCBiZSBwb3NpdGl2ZTogJHtzaXplfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3JlYWRhYmxlLnJlYWRhYmxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJlYW0gbm8gbG9uZ2VyIHJlYWRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYWxyZWFkeSBlbm91Z2ggZGF0YS5cbiAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZS5yZWFkKHNpemUpO1xuICAgICAgICBpZiAoY2h1bmspIHtcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIGNodW5rLmxlbmd0aCBtYXliZSBsZXNzIHRoYW4gZGVzaXJlZCBzaXplIGlmIHRoZSBzdHJlYW0gZW5kcy5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvVWludDhBcnJheShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyByZWdpc3RlciBjYWxsYmFjayB0byB3YWl0IGZvciBlbm91Z2ggZGF0YSB0byByZWFkXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuVXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLnJlbW92ZUxpc3RlbmVyKFwicmVhZGFibGVcIiwgcmVhZGFibGVDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgcmVqZWN0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkYWJsZS5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLCByZWplY3RDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgcmVqZWN0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGFibGVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tDaHVuayA9IHRoaXMuX3JlYWRhYmxlLnJlYWQoc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja0NodW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiArPSBjYWxsYmFja0NodW5rLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrQ2h1bmsubGVuZ3RoIG1heWJlIGxlc3MgdGhhbiBkZXNpcmVkIHNpemUgaWYgdGhlIHN0cmVhbSBlbmRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnRvVWludDhBcnJheShjYWxsYmFja0NodW5rKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgYWJvcnRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChBQk9SVF9FUlJPUik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkYWJsZS5vbihcInJlYWRhYmxlXCIsIHJlYWRhYmxlQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLm9uY2UoXCJlcnJvclwiLCByZWplY3RDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGUub25jZShcImVuZFwiLCByZWplY3RDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGUub25jZShcImNsb3NlXCIsIHJlamVjdENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSAqL1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdnJvUmVhZGFibGVGcm9tU3RyZWFtLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tIFwic3RyZWFtXCI7XG5pbXBvcnQgeyBBdnJvUmVhZGFibGVGcm9tU3RyZWFtLCBBdnJvUmVhZGVyIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3JhZ2UtaW50ZXJuYWwtYXZyby9zcmNcIjtcbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIEEgTm9kZS5qcyBCbG9iUXVpY2tRdWVyeVN0cmVhbSB3aWxsIGludGVybmFsbHkgcGFyc2UgYXZybyBkYXRhIHN0cmVhbSBmb3IgYmxvYiBxdWVyeS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJsb2JRdWlja1F1ZXJ5U3RyZWFtIGV4dGVuZHMgUmVhZGFibGUge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQmxvYlF1aWNrUXVlcnlTdHJlYW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIGN1cnJlbnQgUmVhZGFibGVTdHJlYW0gcmV0dXJuZWQgZnJvbSBnZXR0ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hdnJvUGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMub25Qcm9ncmVzcyA9IG9wdGlvbnMub25Qcm9ncmVzcztcbiAgICAgICAgdGhpcy5vbkVycm9yID0gb3B0aW9ucy5vbkVycm9yO1xuICAgICAgICB0aGlzLmF2cm9SZWFkZXIgPSBuZXcgQXZyb1JlYWRlcihuZXcgQXZyb1JlYWRhYmxlRnJvbVN0cmVhbSh0aGlzLnNvdXJjZSkpO1xuICAgICAgICB0aGlzLmF2cm9JdGVyID0gdGhpcy5hdnJvUmVhZGVyLnBhcnNlT2JqZWN0cyh7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0pO1xuICAgIH1cbiAgICBfcmVhZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXZyb1BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5yZWFkSW50ZXJuYWwoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlYWRJbnRlcm5hbCgpIHtcbiAgICAgICAgdGhpcy5hdnJvUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBhdnJvTmV4dDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgYXZyb05leHQgPSBhd2FpdCB0aGlzLmF2cm9JdGVyLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChhdnJvTmV4dC5kb25lKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvYmogPSBhdnJvTmV4dC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IG9iai4kc2NoZW1hO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIk1pc3Npbmcgc2NoZW1hIGluIGF2cm8gcmVjb3JkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAoc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5yZXN1bHREYXRhXCI6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBvYmouZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgZGF0YSBpbiBhdnJvIHJlc3VsdCByZWNvcmQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnB1c2goQnVmZmVyLmZyb20oZGF0YSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdnJvUGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLnByb2dyZXNzXCI6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGVzU2Nhbm5lZCA9IG9iai5ieXRlc1NjYW5uZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGJ5dGVzU2Nhbm5lZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBieXRlc1NjYW5uZWQgaW4gYXZybyBwcm9ncmVzcyByZWNvcmQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyh7IGxvYWRlZEJ5dGVzOiBieXRlc1NjYW5uZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5lbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxCeXRlcyA9IG9iai50b3RhbEJ5dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b3RhbEJ5dGVzICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIHRvdGFsQnl0ZXMgaW4gYXZybyBlbmQgcmVjb3JkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyh7IGxvYWRlZEJ5dGVzOiB0b3RhbEJ5dGVzIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5lcnJvclwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmYXRhbCA9IG9iai5mYXRhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmF0YWwgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGZhdGFsIGluIGF2cm8gZXJyb3IgcmVjb3JkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBvYmoubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBuYW1lIGluIGF2cm8gZXJyb3IgcmVjb3JkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gb2JqLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdGlvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBkZXNjcmlwdGlvbiBpbiBhdnJvIGVycm9yIHJlY29yZC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG9iai5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgcG9zaXRpb24gaW4gYXZybyBlcnJvciByZWNvcmQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmF0YWw6IGZhdGFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFVua25vd24gc2NoZW1hICR7c2NoZW1hfSBpbiBhdnJvIHByb2dyZXNzIHJlY29yZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoIWF2cm9OZXh0LmRvbmUgJiYgIXRoaXMuYXZyb1BhdXNlZCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmxvYlF1aWNrUXVlcnlTdHJlYW0uanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgQmxvYlF1aWNrUXVlcnlTdHJlYW0gfSBmcm9tIFwiLi91dGlscy9CbG9iUXVpY2tRdWVyeVN0cmVhbVwiO1xuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogQmxvYlF1ZXJ5UmVzcG9uc2UgaW1wbGVtZW50cyBCbG9iRG93bmxvYWRSZXNwb25zZU1vZGVsIGludGVyZmFjZSwgYW5kIGluIE5vZGUuanMgcnVudGltZSBpdCB3aWxsXG4gKiBwYXJzZSBhdm9yIGRhdGEgcmV0dXJuZWQgYnkgYmxvYiBxdWVyeS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJsb2JRdWVyeVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJsb2JRdWVyeVJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9yaWdpbmFsUmVzcG9uc2UgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcmlnaW5hbFJlc3BvbnNlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFJlc3BvbnNlID0gb3JpZ2luYWxSZXNwb25zZTtcbiAgICAgICAgdGhpcy5ibG9iRG93bmxvYWRTdHJlYW0gPSBuZXcgQmxvYlF1aWNrUXVlcnlTdHJlYW0odGhpcy5vcmlnaW5hbFJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzZXJ2aWNlIHN1cHBvcnRzXG4gICAgICogcmVxdWVzdHMgZm9yIHBhcnRpYWwgZmlsZSBjb250ZW50LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGFjY2VwdFJhbmdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5hY2NlcHRSYW5nZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgaXQgd2FzIHByZXZpb3VzbHkgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoZSBmaWxlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNhY2hlQ29udHJvbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jYWNoZUNvbnRyb2w7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgJ3gtbXMtY29udGVudC1kaXNwb3NpdGlvbicgaGVhZGVyIGFuZCBzcGVjaWZpZXMgaG93IHRvIHByb2Nlc3MgdGhlXG4gICAgICogcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudERpc3Bvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnREaXNwb3NpdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoZSBDb250ZW50LUVuY29kaW5nIHJlcXVlc3QgaGVhZGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRFbmNvZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50RW5jb2Rpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgQ29udGVudC1MYW5ndWFnZSByZXF1ZXN0IGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50TGFuZ3VhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudExhbmd1YWdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIgZm9yIGFcbiAgICAgKiBwYWdlIGJsb2IuIFRoaXMgaGVhZGVyIGlzIG5vdCByZXR1cm5lZCBmb3IgYmxvY2sgYmxvYnMgb3IgYXBwZW5kIGJsb2JzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JTZXF1ZW5jZU51bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iU2VxdWVuY2VOdW1iZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBibG9iJ3MgdHlwZS4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6XG4gICAgICogJ0Jsb2NrQmxvYicsICdQYWdlQmxvYicsICdBcHBlbmRCbG9iJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBieXRlcyBwcmVzZW50IGluIHRoZVxuICAgICAqIHJlc3BvbnNlIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50TGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZmlsZSBoYXMgYW4gTUQ1IGhhc2ggYW5kIHRoZVxuICAgICAqIHJlcXVlc3QgaXMgdG8gcmVhZCB0aGUgZnVsbCBmaWxlLCB0aGlzIHJlc3BvbnNlIGhlYWRlciBpcyByZXR1cm5lZCBzbyB0aGF0XG4gICAgICogdGhlIGNsaWVudCBjYW4gY2hlY2sgZm9yIG1lc3NhZ2UgY29udGVudCBpbnRlZ3JpdHkuIElmIHRoZSByZXF1ZXN0IGlzIHRvXG4gICAgICogcmVhZCBhIHNwZWNpZmllZCByYW5nZSBhbmQgdGhlICd4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNScgaXMgc2V0IHRvXG4gICAgICogdHJ1ZSwgdGhlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGFuIE1ENSBoYXNoIGZvciB0aGUgcmFuZ2UsIGFzIGxvbmcgYXMgdGhlXG4gICAgICogcmFuZ2Ugc2l6ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCBNQi4gSWYgbmVpdGhlciBvZiB0aGVzZSBzZXRzIG9mXG4gICAgICogY29uZGl0aW9ucyBpcyB0cnVlLCB0aGVuIG5vIHZhbHVlIGlzIHJldHVybmVkIGZvciB0aGUgJ0NvbnRlbnQtTUQ1J1xuICAgICAqIGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50TUQ1KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRNRDU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgcmFuZ2Ugb2YgYnl0ZXMgcmV0dXJuZWQgaWZcbiAgICAgKiB0aGUgY2xpZW50IHJlcXVlc3RlZCBhIHN1YnNldCBvZiB0aGUgZmlsZSBieSBzZXR0aW5nIHRoZSBSYW5nZSByZXF1ZXN0XG4gICAgICogaGVhZGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRSYW5nZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50UmFuZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgZmlsZS5cbiAgICAgKiBUaGUgZGVmYXVsdCBjb250ZW50IHR5cGUgaXMgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50VHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uY2x1c2lvbiB0aW1lIG9mIHRoZSBsYXN0IGF0dGVtcHRlZFxuICAgICAqIENvcHkgRmlsZSBvcGVyYXRpb24gd2hlcmUgdGhpcyBmaWxlIHdhcyB0aGUgZGVzdGluYXRpb24gZmlsZS4gVGhpcyB2YWx1ZVxuICAgICAqIGNhbiBzcGVjaWZ5IHRoZSB0aW1lIG9mIGEgY29tcGxldGVkLCBhYm9ydGVkLCBvciBmYWlsZWQgY29weSBhdHRlbXB0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlDb21wbGV0ZWRPbigpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBsYXN0IGF0dGVtcHRlZCBDb3B5XG4gICAgICogRmlsZSBvcGVyYXRpb24gd2hlcmUgdGhpcyBmaWxlIHdhcyB0aGUgZGVzdGluYXRpb24gZmlsZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBhbmRcbiAgICAgKiB0aGUgdG90YWwgYnl0ZXMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgbGFzdCBhdHRlbXB0ZWQgQ29weSBGaWxlIG9wZXJhdGlvblxuICAgICAqIHdoZXJlIHRoaXMgZmlsZSB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuIENhbiBzaG93IGJldHdlZW4gMCBhbmRcbiAgICAgKiBDb250ZW50LUxlbmd0aCBieXRlcyBjb3BpZWQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVByb2dyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlQcm9ncmVzcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVVJMIHVwIHRvIDJLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgdGhlXG4gICAgICogc291cmNlIGZpbGUgdXNlZCBpbiB0aGUgbGFzdCBhdHRlbXB0ZWQgQ29weSBGaWxlIG9wZXJhdGlvbiB3aGVyZSB0aGlzIGZpbGVcbiAgICAgKiB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5U291cmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0ZSBvZiB0aGUgY29weSBvcGVyYXRpb25cbiAgICAgKiBpZGVudGlmaWVkIGJ5ICd4LW1zLWNvcHktaWQnLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogJ3BlbmRpbmcnLFxuICAgICAqICdzdWNjZXNzJywgJ2Fib3J0ZWQnLCAnZmFpbGVkJ1xuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlTdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVN0YXR1cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogT25seSBhcHBlYXJzIHdoZW5cbiAgICAgKiB4LW1zLWNvcHktc3RhdHVzIGlzIGZhaWxlZCBvciBwZW5kaW5nLiBEZXNjcmliZXMgY2F1c2Ugb2YgZmF0YWwgb3JcbiAgICAgKiBub24tZmF0YWwgY29weSBvcGVyYXRpb24gZmFpbHVyZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5U3RhdHVzRGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVN0YXR1c0Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgYmxvYiBpcyBsZWFzZWQsXG4gICAgICogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGxlYXNlIGlzIG9mIGluZmluaXRlIG9yIGZpeGVkIGR1cmF0aW9uLiBQb3NzaWJsZVxuICAgICAqIHZhbHVlcyBpbmNsdWRlOiAnaW5maW5pdGUnLCAnZml4ZWQnLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlYXNlRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGVhc2VEdXJhdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGVhc2Ugc3RhdGUgb2YgdGhlIGJsb2IuIFBvc3NpYmxlXG4gICAgICogdmFsdWVzIGluY2x1ZGU6ICdhdmFpbGFibGUnLCAnbGVhc2VkJywgJ2V4cGlyZWQnLCAnYnJlYWtpbmcnLCAnYnJva2VuJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsZWFzZVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxlYXNlU3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGxlYXNlIHN0YXR1cyBvZiB0aGVcbiAgICAgKiBibG9iLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogJ2xvY2tlZCcsICd1bmxvY2tlZCcuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGVhc2VTdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGVhc2VTdGF0dXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgVVRDIGRhdGUvdGltZSB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZpY2UgdGhhdFxuICAgICAqIGluZGljYXRlcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgcmVzcG9uc2Ugd2FzIGluaXRpYXRlZC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmRhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY29tbWl0dGVkIGJsb2Nrc1xuICAgICAqIHByZXNlbnQgaW4gdGhlIGJsb2IuIFRoaXMgaGVhZGVyIGlzIHJldHVybmVkIG9ubHkgZm9yIGFwcGVuZCBibG9icy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iQ29tbWl0dGVkQmxvY2tDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iQ29tbWl0dGVkQmxvY2tDb3VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEVUYWcgY29udGFpbnMgYSB2YWx1ZSB0aGF0IHlvdSBjYW4gdXNlIHRvXG4gICAgICogcGVyZm9ybSBvcGVyYXRpb25zIGNvbmRpdGlvbmFsbHksIGluIHF1b3Rlcy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBldGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmV0YWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGVycm9yQ29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5lcnJvckNvZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBpcyBzZXQgdG9cbiAgICAgKiB0cnVlIGlmIHRoZSBmaWxlIGRhdGEgYW5kIGFwcGxpY2F0aW9uIG1ldGFkYXRhIGFyZSBjb21wbGV0ZWx5IGVuY3J5cHRlZFxuICAgICAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UgKHdoZW5cbiAgICAgKiB0aGUgZmlsZSBpcyB1bmVuY3J5cHRlZCwgb3IgaWYgb25seSBwYXJ0cyBvZiB0aGUgZmlsZS9hcHBsaWNhdGlvbiBtZXRhZGF0YVxuICAgICAqIGFyZSBlbmNyeXB0ZWQpLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGlzU2VydmVyRW5jcnlwdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmlzU2VydmVyRW5jcnlwdGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgYmxvYiBoYXMgYSBNRDUgaGFzaCwgYW5kIGlmXG4gICAgICogcmVxdWVzdCBjb250YWlucyByYW5nZSBoZWFkZXIgKFJhbmdlIG9yIHgtbXMtcmFuZ2UpLCB0aGlzIHJlc3BvbnNlIGhlYWRlclxuICAgICAqIGlzIHJldHVybmVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSB3aG9sZSBibG9iJ3MgTUQ1IHZhbHVlLiBUaGlzIHZhbHVlIG1heVxuICAgICAqIG9yIG1heSBub3QgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIGluIENvbnRlbnQtTUQ1IGhlYWRlciwgd2l0aCB0aGVcbiAgICAgKiBsYXR0ZXIgY2FsY3VsYXRlZCBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYmxvYkNvbnRlbnRNRDUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYkNvbnRlbnRNRDU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgdGhlIGZpbGUgd2FzIGxhc3RcbiAgICAgKiBtb2RpZmllZC4gQW55IG9wZXJhdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBmaWxlIG9yIGl0cyBwcm9wZXJ0aWVzIHVwZGF0ZXNcbiAgICAgKiB0aGUgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxhc3RNb2RpZmllZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sYXN0TW9kaWZpZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgbmFtZS12YWx1ZSBwYWlyXG4gICAgICogdG8gYXNzb2NpYXRlIHdpdGggYSBmaWxlIHN0b3JhZ2Ugb2JqZWN0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLm1ldGFkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGhlYWRlciB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSByZXF1ZXN0XG4gICAgICogdGhhdCB3YXMgbWFkZSBhbmQgY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCByZXF1ZXN0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UucmVxdWVzdElkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBhIGNsaWVudCByZXF1ZXN0IGlkIGhlYWRlciBpcyBzZW50IGluIHRoZSByZXF1ZXN0LCB0aGlzIGhlYWRlciB3aWxsIGJlIHByZXNlbnQgaW4gdGhlXG4gICAgICogcmVzcG9uc2Ugd2l0aCB0aGUgc2FtZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjbGllbnRSZXF1ZXN0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY2xpZW50UmVxdWVzdElkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgdGhlIEZpbGUgc2VydmljZSB1c2VkXG4gICAgICogdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLnZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTSEEtMjU2IGhhc2ggb2YgdGhlIGVuY3J5cHRpb24ga2V5IHVzZWQgdG8gZW5jcnlwdCB0aGUgYmxvYi4gVGhpcyB2YWx1ZSBpcyBvbmx5IHJldHVybmVkXG4gICAgICogd2hlbiB0aGUgYmxvYiB3YXMgZW5jcnlwdGVkIHdpdGggYSBjdXN0b21lci1wcm92aWRlZCBrZXkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgZW5jcnlwdGlvbktleVNoYTI1NigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5lbmNyeXB0aW9uS2V5U2hhMjU2O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcmVxdWVzdCBpcyB0byByZWFkIGEgc3BlY2lmaWVkIHJhbmdlIGFuZCB0aGUgeC1tcy1yYW5nZS1nZXQtY29udGVudC1jcmM2NCBpcyBzZXQgdG9cbiAgICAgKiB0cnVlLCB0aGVuIHRoZSByZXF1ZXN0IHJldHVybnMgYSBjcmM2NCBmb3IgdGhlIHJhbmdlLCBhcyBsb25nIGFzIHRoZSByYW5nZSBzaXplIGlzIGxlc3MgdGhhblxuICAgICAqIG9yIGVxdWFsIHRvIDQgTUIuIElmIGJvdGggeC1tcy1yYW5nZS1nZXQtY29udGVudC1jcmM2NCAmIHgtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtbWQ1IGlzXG4gICAgICogc3BlY2lmaWVkIGluIHRoZSBzYW1lIHJlcXVlc3QsIGl0IHdpbGwgZmFpbCB3aXRoIDQwMChCYWQgUmVxdWVzdClcbiAgICAgKi9cbiAgICBnZXQgY29udGVudENyYzY0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRDcmM2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlc3BvbnNlIGJvZHkgYXMgYSBicm93c2VyIEJsb2IuXG4gICAgICogQWx3YXlzIHVuZGVmaW5lZCBpbiBub2RlLmpzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JCb2R5KCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVzcG9uc2UgYm9keSBhcyBhIG5vZGUuanMgUmVhZGFibGUgc3RyZWFtLlxuICAgICAqIEFsd2F5cyB1bmRlZmluZWQgaW4gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBJdCB3aWxsIHBhcnNlIGF2b3IgZGF0YSByZXR1cm5lZCBieSBibG9iIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHJlYWRhYmxlU3RyZWFtQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIGlzTm9kZSA/IHRoaXMuYmxvYkRvd25sb2FkU3RyZWFtIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBnZXQgX3Jlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLl9yZXNwb25zZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CbG9iUXVlcnlSZXNwb25zZS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKlxuICogQ29kZSBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IChSKSBBdXRvUmVzdCBDb2RlIEdlbmVyYXRvci5cbiAqIENoYW5nZXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLlxuICovXG5pbXBvcnQgKiBhcyBjb3JlSHR0cCBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0ICogYXMgTWFwcGVycyBmcm9tIFwiLi4vbW9kZWxzL21hcHBlcnNcIjtcbmltcG9ydCAqIGFzIFBhcmFtZXRlcnMgZnJvbSBcIi4uL21vZGVscy9wYXJhbWV0ZXJzXCI7XG4vKiogQ2xhc3MgcmVwcmVzZW50aW5nIGEgQXBwZW5kQmxvYi4gKi9cbmV4cG9ydCBjbGFzcyBBcHBlbmRCbG9iIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBBcHBlbmRCbG9iIGNsYXNzLlxuICAgICAqIEBwYXJhbSBjbGllbnQgUmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlIGNsaWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENyZWF0ZSBBcHBlbmQgQmxvYiBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBhcHBlbmQgYmxvYi5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY3JlYXRlKGNvbnRlbnRMZW5ndGgsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBjcmVhdGVPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEFwcGVuZCBCbG9jayBvcGVyYXRpb24gY29tbWl0cyBhIG5ldyBibG9jayBvZiBkYXRhIHRvIHRoZSBlbmQgb2YgYW4gZXhpc3RpbmcgYXBwZW5kIGJsb2IuIFRoZVxuICAgICAqIEFwcGVuZCBCbG9jayBvcGVyYXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaWYgdGhlIGJsb2Igd2FzIGNyZWF0ZWQgd2l0aCB4LW1zLWJsb2ItdHlwZSBzZXQgdG9cbiAgICAgKiBBcHBlbmRCbG9iLiBBcHBlbmQgQmxvY2sgaXMgc3VwcG9ydGVkIG9ubHkgb24gdmVyc2lvbiAyMDE1LTAyLTIxIHZlcnNpb24gb3IgbGF0ZXIuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYm9keSBJbml0aWFsIGRhdGFcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGFwcGVuZEJsb2NrKGNvbnRlbnRMZW5ndGgsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgYXBwZW5kQmxvY2tPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEFwcGVuZCBCbG9jayBvcGVyYXRpb24gY29tbWl0cyBhIG5ldyBibG9jayBvZiBkYXRhIHRvIHRoZSBlbmQgb2YgYW4gZXhpc3RpbmcgYXBwZW5kIGJsb2Igd2hlcmVcbiAgICAgKiB0aGUgY29udGVudHMgYXJlIHJlYWQgZnJvbSBhIHNvdXJjZSB1cmwuIFRoZSBBcHBlbmQgQmxvY2sgb3BlcmF0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGlmIHRoZSBibG9iXG4gICAgICogd2FzIGNyZWF0ZWQgd2l0aCB4LW1zLWJsb2ItdHlwZSBzZXQgdG8gQXBwZW5kQmxvYi4gQXBwZW5kIEJsb2NrIGlzIHN1cHBvcnRlZCBvbmx5IG9uIHZlcnNpb25cbiAgICAgKiAyMDE1LTAyLTIxIHZlcnNpb24gb3IgbGF0ZXIuXG4gICAgICogQHBhcmFtIHNvdXJjZVVybCBTcGVjaWZ5IGEgVVJMIHRvIHRoZSBjb3B5IHNvdXJjZS5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgYXBwZW5kQmxvY2tGcm9tVXJsKHNvdXJjZVVybCwgY29udGVudExlbmd0aCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBzb3VyY2VVcmwsXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGFwcGVuZEJsb2NrRnJvbVVybE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU2VhbCBvcGVyYXRpb24gc2VhbHMgdGhlIEFwcGVuZCBCbG9iIHRvIG1ha2UgaXQgcmVhZC1vbmx5LiBTZWFsIGlzIHN1cHBvcnRlZCBvbmx5IG9uIHZlcnNpb25cbiAgICAgKiAyMDE5LTEyLTEyIHZlcnNpb24gb3IgbGF0ZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZWFsKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHNlYWxPcGVyYXRpb25TcGVjKTtcbiAgICB9XG59XG4vLyBPcGVyYXRpb24gU3BlY2lmaWNhdGlvbnNcbmNvbnN0IHhtbFNlcmlhbGl6ZXIgPSBuZXcgY29yZUh0dHAuU2VyaWFsaXplcihNYXBwZXJzLCAvKiBpc1htbCAqLyB0cnVlKTtcbmNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgY29yZUh0dHAuU2VyaWFsaXplcihNYXBwZXJzLCAvKiBpc1htbCAqLyBmYWxzZSk7XG5jb25zdCBjcmVhdGVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQXBwZW5kQmxvYkNyZWF0ZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkFwcGVuZEJsb2JDcmVhdGVFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLm1ldGFkYXRhLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDYWNoZUNvbnRyb2wsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50RW5jb2RpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudERpc3Bvc2l0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLmltbXV0YWJpbGl0eVBvbGljeUV4cGlyeSxcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lNb2RlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iVGFnc1N0cmluZyxcbiAgICAgICAgUGFyYW1ldGVycy5sZWdhbEhvbGQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JUeXBlMVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGFwcGVuZEJsb2NrT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkFwcGVuZEJsb2JBcHBlbmRCbG9ja0hlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkFwcGVuZEJsb2JBcHBlbmRCbG9ja0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMuYm9keTEsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAyMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NCxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZTEsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MixcbiAgICAgICAgUGFyYW1ldGVycy5tYXhTaXplLFxuICAgICAgICBQYXJhbWV0ZXJzLmFwcGVuZFBvc2l0aW9uXG4gICAgXSxcbiAgICBtZWRpYVR5cGU6IFwiYmluYXJ5XCIsXG4gICAgc2VyaWFsaXplclxufTtcbmNvbnN0IGFwcGVuZEJsb2NrRnJvbVVybE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5BcHBlbmRCbG9iQXBwZW5kQmxvY2tGcm9tVXJsSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLCBQYXJhbWV0ZXJzLmNvbXAyMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlTb3VyY2VBdXRob3JpemF0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZVVybCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VDb250ZW50Q3JjNjQsXG4gICAgICAgIFBhcmFtZXRlcnMubWF4U2l6ZSxcbiAgICAgICAgUGFyYW1ldGVycy5hcHBlbmRQb3NpdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VSYW5nZTFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBzZWFsT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkFwcGVuZEJsb2JTZWFsSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQXBwZW5kQmxvYlNlYWxFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMjNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5hcHBlbmRQb3NpdGlvblxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwcGVuZEJsb2IuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuaW1wb3J0ICogYXMgY29yZUh0dHAgZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCAqIGFzIE1hcHBlcnMgZnJvbSBcIi4uL21vZGVscy9tYXBwZXJzXCI7XG5pbXBvcnQgKiBhcyBQYXJhbWV0ZXJzIGZyb20gXCIuLi9tb2RlbHMvcGFyYW1ldGVyc1wiO1xuLyoqIENsYXNzIHJlcHJlc2VudGluZyBhIEJsb2NrQmxvYi4gKi9cbmV4cG9ydCBjbGFzcyBCbG9ja0Jsb2Ige1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIEJsb2NrQmxvYiBjbGFzcy5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFJlZmVyZW5jZSB0byB0aGUgc2VydmljZSBjbGllbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVcGxvYWQgQmxvY2sgQmxvYiBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY29udGVudCBvZiBhbiBleGlzdGluZyBibG9jayBibG9iLiBVcGRhdGluZyBhbiBleGlzdGluZ1xuICAgICAqIGJsb2NrIGJsb2Igb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgbWV0YWRhdGEgb24gdGhlIGJsb2IuIFBhcnRpYWwgdXBkYXRlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFB1dFxuICAgICAqIEJsb2I7IHRoZSBjb250ZW50IG9mIHRoZSBleGlzdGluZyBibG9iIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIG5ldyBibG9iLiBUbyBwZXJmb3JtIGFcbiAgICAgKiBwYXJ0aWFsIHVwZGF0ZSBvZiB0aGUgY29udGVudCBvZiBhIGJsb2NrIGJsb2IsIHVzZSB0aGUgUHV0IEJsb2NrIExpc3Qgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGJvZHkgSW5pdGlhbCBkYXRhXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICB1cGxvYWQoY29udGVudExlbmd0aCwgYm9keSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCB1cGxvYWRPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFB1dCBCbG9iIGZyb20gVVJMIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IEJsb2NrIEJsb2Igd2hlcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9iIGFyZSByZWFkXG4gICAgICogZnJvbSBhIGdpdmVuIFVSTC4gIFRoaXMgQVBJIGlzIHN1cHBvcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgMjAyMC0wNC0wOCB2ZXJzaW9uLiBQYXJ0aWFsIHVwZGF0ZXMgYXJlXG4gICAgICogbm90IHN1cHBvcnRlZCB3aXRoIFB1dCBCbG9iIGZyb20gVVJMOyB0aGUgY29udGVudCBvZiBhbiBleGlzdGluZyBibG9iIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlXG4gICAgICogY29udGVudCBvZiB0aGUgbmV3IGJsb2IuICBUbyBwZXJmb3JtIHBhcnRpYWwgdXBkYXRlcyB0byBhIGJsb2NrIGJsb2LigJlzIGNvbnRlbnRzIHVzaW5nIGEgc291cmNlIFVSTCxcbiAgICAgKiB1c2UgdGhlIFB1dCBCbG9jayBmcm9tIFVSTCBBUEkgaW4gY29uanVuY3Rpb24gd2l0aCBQdXQgQmxvY2sgTGlzdC5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBjb3B5U291cmNlIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIHBhZ2UgYmxvYiBzbmFwc2hvdC4gVGhpcyB2YWx1ZSBpcyBhIFVSTCBvZiB1cCB0b1xuICAgICAqICAgICAgICAgICAgICAgICAgIDIgS0IgaW4gbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIGEgcGFnZSBibG9iIHNuYXBzaG90LiBUaGUgdmFsdWUgc2hvdWxkIGJlIFVSTC1lbmNvZGVkIGFzIGl0IHdvdWxkXG4gICAgICogICAgICAgICAgICAgICAgICAgYXBwZWFyIGluIGEgcmVxdWVzdCBVUkkuIFRoZSBzb3VyY2UgYmxvYiBtdXN0IGVpdGhlciBiZSBwdWJsaWMgb3IgbXVzdCBiZSBhdXRoZW50aWNhdGVkIHZpYSBhIHNoYXJlZFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFjY2VzcyBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBwdXRCbG9iRnJvbVVybChjb250ZW50TGVuZ3RoLCBjb3B5U291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBjb3B5U291cmNlLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHB1dEJsb2JGcm9tVXJsT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTdGFnZSBCbG9jayBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBibG9jayB0byBiZSBjb21taXR0ZWQgYXMgcGFydCBvZiBhIGJsb2JcbiAgICAgKiBAcGFyYW0gYmxvY2tJZCBBIHZhbGlkIEJhc2U2NCBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBibG9jay4gUHJpb3IgdG8gZW5jb2RpbmcsIHRoZSBzdHJpbmdcbiAgICAgKiAgICAgICAgICAgICAgICBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA2NCBieXRlcyBpbiBzaXplLiBGb3IgYSBnaXZlbiBibG9iLCB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBzcGVjaWZpZWRcbiAgICAgKiAgICAgICAgICAgICAgICBmb3IgdGhlIGJsb2NraWQgcGFyYW1ldGVyIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBmb3IgZWFjaCBibG9jay5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBib2R5IEluaXRpYWwgZGF0YVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc3RhZ2VCbG9jayhibG9ja0lkLCBjb250ZW50TGVuZ3RoLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIGJsb2NrSWQsXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBzdGFnZUJsb2NrT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTdGFnZSBCbG9jayBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBibG9jayB0byBiZSBjb21taXR0ZWQgYXMgcGFydCBvZiBhIGJsb2Igd2hlcmUgdGhlIGNvbnRlbnRzXG4gICAgICogYXJlIHJlYWQgZnJvbSBhIFVSTC5cbiAgICAgKiBAcGFyYW0gYmxvY2tJZCBBIHZhbGlkIEJhc2U2NCBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBibG9jay4gUHJpb3IgdG8gZW5jb2RpbmcsIHRoZSBzdHJpbmdcbiAgICAgKiAgICAgICAgICAgICAgICBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA2NCBieXRlcyBpbiBzaXplLiBGb3IgYSBnaXZlbiBibG9iLCB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBzcGVjaWZpZWRcbiAgICAgKiAgICAgICAgICAgICAgICBmb3IgdGhlIGJsb2NraWQgcGFyYW1ldGVyIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBmb3IgZWFjaCBibG9jay5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBzb3VyY2VVcmwgU3BlY2lmeSBhIFVSTCB0byB0aGUgY29weSBzb3VyY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdGFnZUJsb2NrRnJvbVVSTChibG9ja0lkLCBjb250ZW50TGVuZ3RoLCBzb3VyY2VVcmwsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgYmxvY2tJZCxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBzb3VyY2VVcmwsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgc3RhZ2VCbG9ja0Zyb21VUkxPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENvbW1pdCBCbG9jayBMaXN0IG9wZXJhdGlvbiB3cml0ZXMgYSBibG9iIGJ5IHNwZWNpZnlpbmcgdGhlIGxpc3Qgb2YgYmxvY2sgSURzIHRoYXQgbWFrZSB1cCB0aGVcbiAgICAgKiBibG9iLiBJbiBvcmRlciB0byBiZSB3cml0dGVuIGFzIHBhcnQgb2YgYSBibG9iLCBhIGJsb2NrIG11c3QgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSB3cml0dGVuIHRvIHRoZVxuICAgICAqIHNlcnZlciBpbiBhIHByaW9yIFB1dCBCbG9jayBvcGVyYXRpb24uIFlvdSBjYW4gY2FsbCBQdXQgQmxvY2sgTGlzdCB0byB1cGRhdGUgYSBibG9iIGJ5IHVwbG9hZGluZ1xuICAgICAqIG9ubHkgdGhvc2UgYmxvY2tzIHRoYXQgaGF2ZSBjaGFuZ2VkLCB0aGVuIGNvbW1pdHRpbmcgdGhlIG5ldyBhbmQgZXhpc3RpbmcgYmxvY2tzIHRvZ2V0aGVyLiBZb3UgY2FuXG4gICAgICogZG8gdGhpcyBieSBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gY29tbWl0IGEgYmxvY2sgZnJvbSB0aGUgY29tbWl0dGVkIGJsb2NrIGxpc3Qgb3IgZnJvbSB0aGVcbiAgICAgKiB1bmNvbW1pdHRlZCBibG9jayBsaXN0LCBvciB0byBjb21taXQgdGhlIG1vc3QgcmVjZW50bHkgdXBsb2FkZWQgdmVyc2lvbiBvZiB0aGUgYmxvY2ssIHdoaWNoZXZlciBsaXN0XG4gICAgICogaXQgbWF5IGJlbG9uZyB0by5cbiAgICAgKiBAcGFyYW0gYmxvY2tzIEJsb2IgQmxvY2tzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY29tbWl0QmxvY2tMaXN0KGJsb2Nrcywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBibG9ja3MsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgY29tbWl0QmxvY2tMaXN0T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBHZXQgQmxvY2sgTGlzdCBvcGVyYXRpb24gcmV0cmlldmVzIHRoZSBsaXN0IG9mIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiB1cGxvYWRlZCBhcyBwYXJ0IG9mIGEgYmxvY2tcbiAgICAgKiBibG9iXG4gICAgICogQHBhcmFtIGxpc3RUeXBlIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGUgbGlzdCBvZiBjb21taXR0ZWQgYmxvY2tzLCB0aGUgbGlzdCBvZiB1bmNvbW1pdHRlZFxuICAgICAqICAgICAgICAgICAgICAgICBibG9ja3MsIG9yIGJvdGggbGlzdHMgdG9nZXRoZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRCbG9ja0xpc3QobGlzdFR5cGUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgbGlzdFR5cGUsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0QmxvY2tMaXN0T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxufVxuLy8gT3BlcmF0aW9uIFNwZWNpZmljYXRpb25zXG5jb25zdCB4bWxTZXJpYWxpemVyID0gbmV3IGNvcmVIdHRwLlNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gdHJ1ZSk7XG5jb25zdCBzZXJpYWxpemVyID0gbmV3IGNvcmVIdHRwLlNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gZmFsc2UpO1xuY29uc3QgdXBsb2FkT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYlVwbG9hZEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYlVwbG9hZEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMuYm9keTEsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLm1ldGFkYXRhLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDYWNoZUNvbnRyb2wsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50RW5jb2RpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudERpc3Bvc2l0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLmltbXV0YWJpbGl0eVBvbGljeUV4cGlyeSxcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lNb2RlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy50aWVyLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JUYWdzU3RyaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlZ2FsSG9sZDEsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMudHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NCxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50VHlwZTEsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MixcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iVHlwZTJcbiAgICBdLFxuICAgIG1lZGlhVHlwZTogXCJiaW5hcnlcIixcbiAgICBzZXJpYWxpemVyXG59O1xuY29uc3QgcHV0QmxvYkZyb21VcmxPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvY2tCbG9iUHV0QmxvYkZyb21VcmxIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIFBhcmFtZXRlcnMubWV0YWRhdGEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNhY2hlQ29udHJvbCxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudFR5cGUsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnRFbmNvZGluZyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudExhbmd1YWdlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBQYXJhbWV0ZXJzLnRpZXIsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlTb3VyY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlQXV0aG9yaXphdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iVHlwZTIsXG4gICAgICAgIFBhcmFtZXRlcnMuY29weVNvdXJjZUJsb2JQcm9wZXJ0aWVzXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3Qgc3RhZ2VCbG9ja09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5CbG9ja0Jsb2JTdGFnZUJsb2NrSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvY2tCbG9iU3RhZ2VCbG9ja0V4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMuYm9keTEsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5jb21wMjQsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvY2tJZFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlMSxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQyXG4gICAgXSxcbiAgICBtZWRpYVR5cGU6IFwiYmluYXJ5XCIsXG4gICAgc2VyaWFsaXplclxufTtcbmNvbnN0IHN0YWdlQmxvY2tGcm9tVVJMT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYlN0YWdlQmxvY2tGcm9tVVJMSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvY2tCbG9iU3RhZ2VCbG9ja0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDI0LFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2NrSWRcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlSWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvcHlTb3VyY2VBdXRob3JpemF0aW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZVVybCxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VDb250ZW50Q3JjNjQsXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlUmFuZ2UxXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgY29tbWl0QmxvY2tMaXN0T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYkNvbW1pdEJsb2NrTGlzdEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLkJsb2NrQmxvYkNvbW1pdEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IFBhcmFtZXRlcnMuYmxvY2tzLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcywgUGFyYW1ldGVycy5jb21wMjVdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdCxcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ2FjaGVDb250cm9sLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudEVuY29kaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TGFuZ3VhZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5TW9kZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMudGllcixcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iVGFnc1N0cmluZyxcbiAgICAgICAgUGFyYW1ldGVycy5sZWdhbEhvbGQxLFxuICAgICAgICBQYXJhbWV0ZXJzLnRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LFxuICAgICAgICBQYXJhbWV0ZXJzLnRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjRcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJ4bWxcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgZ2V0QmxvY2tMaXN0T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLkJsb2NrTGlzdCxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvY2tCbG9iR2V0QmxvY2tMaXN0SGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuQmxvY2tCbG9iR2V0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBQYXJhbWV0ZXJzLnNuYXBzaG90LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAyNSxcbiAgICAgICAgUGFyYW1ldGVycy5saXN0VHlwZVxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJsb2NrQmxvYi5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKlxuICogQ29kZSBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IChSKSBBdXRvUmVzdCBDb2RlIEdlbmVyYXRvci5cbiAqIENoYW5nZXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLlxuICovXG5pbXBvcnQgKiBhcyBjb3JlSHR0cCBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0ICogYXMgTWFwcGVycyBmcm9tIFwiLi4vbW9kZWxzL21hcHBlcnNcIjtcbmltcG9ydCAqIGFzIFBhcmFtZXRlcnMgZnJvbSBcIi4uL21vZGVscy9wYXJhbWV0ZXJzXCI7XG4vKiogQ2xhc3MgcmVwcmVzZW50aW5nIGEgUGFnZUJsb2IuICovXG5leHBvcnQgY2xhc3MgUGFnZUJsb2Ige1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIFBhZ2VCbG9iIGNsYXNzLlxuICAgICAqIEBwYXJhbSBjbGllbnQgUmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlIGNsaWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENyZWF0ZSBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBwYWdlIGJsb2IuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYmxvYkNvbnRlbnRMZW5ndGggVGhpcyBoZWFkZXIgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgZm9yIHRoZSBwYWdlIGJsb2IsIHVwIHRvIDEgVEIuIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGJsb2Igc2l6ZSBtdXN0IGJlIGFsaWduZWQgdG8gYSA1MTItYnl0ZSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNyZWF0ZShjb250ZW50TGVuZ3RoLCBibG9iQ29udGVudExlbmd0aCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgICAgYmxvYkNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgY3JlYXRlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVcGxvYWQgUGFnZXMgb3BlcmF0aW9uIHdyaXRlcyBhIHJhbmdlIG9mIHBhZ2VzIHRvIGEgcGFnZSBibG9iXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYm9keSBJbml0aWFsIGRhdGFcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHVwbG9hZFBhZ2VzKGNvbnRlbnRMZW5ndGgsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgdXBsb2FkUGFnZXNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENsZWFyIFBhZ2VzIG9wZXJhdGlvbiBjbGVhcnMgYSBzZXQgb2YgcGFnZXMgZnJvbSBhIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjbGVhclBhZ2VzKGNvbnRlbnRMZW5ndGgsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvcmVIdHRwLm9wZXJhdGlvbk9wdGlvbnNUb1JlcXVlc3RPcHRpb25zQmFzZShvcHRpb25zIHx8IHt9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBjbGVhclBhZ2VzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVcGxvYWQgUGFnZXMgb3BlcmF0aW9uIHdyaXRlcyBhIHJhbmdlIG9mIHBhZ2VzIHRvIGEgcGFnZSBibG9iIHdoZXJlIHRoZSBjb250ZW50cyBhcmUgcmVhZCBmcm9tIGFcbiAgICAgKiBVUkxcbiAgICAgKiBAcGFyYW0gc291cmNlVXJsIFNwZWNpZnkgYSBVUkwgdG8gdGhlIGNvcHkgc291cmNlLlxuICAgICAqIEBwYXJhbSBzb3VyY2VSYW5nZSBCeXRlcyBvZiBzb3VyY2UgZGF0YSBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiBUaGUgbGVuZ3RoIG9mIHRoaXMgcmFuZ2Ugc2hvdWxkXG4gICAgICogICAgICAgICAgICAgICAgICAgIG1hdGNoIHRoZSBDb250ZW50TGVuZ3RoIGhlYWRlciBhbmQgeC1tcy1yYW5nZS9SYW5nZSBkZXN0aW5hdGlvbiByYW5nZSBoZWFkZXIuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIGJ5dGVzIHRvIHdoaWNoIHRoZSBzb3VyY2UgcmFuZ2Ugd291bGQgYmUgd3JpdHRlbi4gVGhlIHJhbmdlIHNob3VsZCBiZSA1MTJcbiAgICAgKiAgICAgICAgICAgICAgYWxpZ25lZCBhbmQgcmFuZ2UtZW5kIGlzIHJlcXVpcmVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgdXBsb2FkUGFnZXNGcm9tVVJMKHNvdXJjZVVybCwgc291cmNlUmFuZ2UsIGNvbnRlbnRMZW5ndGgsIHJhbmdlLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgIHNvdXJjZVVybCxcbiAgICAgICAgICAgIHNvdXJjZVJhbmdlLFxuICAgICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIHVwbG9hZFBhZ2VzRnJvbVVSTE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgR2V0IFBhZ2UgUmFuZ2VzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIHZhbGlkIHBhZ2UgcmFuZ2VzIGZvciBhIHBhZ2UgYmxvYiBvciBzbmFwc2hvdCBvZiBhXG4gICAgICogcGFnZSBibG9iXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRQYWdlUmFuZ2VzKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGdldFBhZ2VSYW5nZXNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEdldCBQYWdlIFJhbmdlcyBEaWZmIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIHZhbGlkIHBhZ2UgcmFuZ2VzIGZvciBhIHBhZ2UgYmxvYiB0aGF0IHdlcmVcbiAgICAgKiBjaGFuZ2VkIGJldHdlZW4gdGFyZ2V0IGJsb2IgYW5kIHByZXZpb3VzIHNuYXBzaG90LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0UGFnZVJhbmdlc0RpZmYob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgZ2V0UGFnZVJhbmdlc0RpZmZPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoZSBCbG9iXG4gICAgICogQHBhcmFtIGJsb2JDb250ZW50TGVuZ3RoIFRoaXMgaGVhZGVyIHNwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIGZvciB0aGUgcGFnZSBibG9iLCB1cCB0byAxIFRCLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBibG9iIHNpemUgbXVzdCBiZSBhbGlnbmVkIHRvIGEgNTEyLWJ5dGUgYm91bmRhcnkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICByZXNpemUoYmxvYkNvbnRlbnRMZW5ndGgsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgYmxvYkNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgcmVzaXplT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBibG9iXG4gICAgICogQHBhcmFtIHNlcXVlbmNlTnVtYmVyQWN0aW9uIFJlcXVpcmVkIGlmIHRoZSB4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyIGhlYWRlciBpcyBzZXQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb3BlcnR5IGFwcGxpZXMgdG8gcGFnZSBibG9icyBvbmx5LiBUaGlzIHByb3BlcnR5IGluZGljYXRlcyBob3cgdGhlIHNlcnZpY2Ugc2hvdWxkIG1vZGlmeSB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYidzIHNlcXVlbmNlIG51bWJlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgdXBkYXRlU2VxdWVuY2VOdW1iZXIoc2VxdWVuY2VOdW1iZXJBY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0ge1xuICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXJBY3Rpb24sXG4gICAgICAgICAgICBvcHRpb25zOiBjb3JlSHR0cC5vcGVyYXRpb25PcHRpb25zVG9SZXF1ZXN0T3B0aW9uc0Jhc2Uob3B0aW9ucyB8fCB7fSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgdXBkYXRlU2VxdWVuY2VOdW1iZXJPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENvcHkgSW5jcmVtZW50YWwgb3BlcmF0aW9uIGNvcGllcyBhIHNuYXBzaG90IG9mIHRoZSBzb3VyY2UgcGFnZSBibG9iIHRvIGEgZGVzdGluYXRpb24gcGFnZSBibG9iLlxuICAgICAqIFRoZSBzbmFwc2hvdCBpcyBjb3BpZWQgc3VjaCB0aGF0IG9ubHkgdGhlIGRpZmZlcmVudGlhbCBjaGFuZ2VzIGJldHdlZW4gdGhlIHByZXZpb3VzbHkgY29waWVkXG4gICAgICogc25hcHNob3QgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBkZXN0aW5hdGlvbi4gVGhlIGNvcGllZCBzbmFwc2hvdHMgYXJlIGNvbXBsZXRlIGNvcGllcyBvZiB0aGVcbiAgICAgKiBvcmlnaW5hbCBzbmFwc2hvdCBhbmQgY2FuIGJlIHJlYWQgb3IgY29waWVkIGZyb20gYXMgdXN1YWwuIFRoaXMgQVBJIGlzIHN1cHBvcnRlZCBzaW5jZSBSRVNUIHZlcnNpb25cbiAgICAgKiAyMDE2LTA1LTMxLlxuICAgICAqIEBwYXJhbSBjb3B5U291cmNlIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIHBhZ2UgYmxvYiBzbmFwc2hvdC4gVGhpcyB2YWx1ZSBpcyBhIFVSTCBvZiB1cCB0b1xuICAgICAqICAgICAgICAgICAgICAgICAgIDIgS0IgaW4gbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIGEgcGFnZSBibG9iIHNuYXBzaG90LiBUaGUgdmFsdWUgc2hvdWxkIGJlIFVSTC1lbmNvZGVkIGFzIGl0IHdvdWxkXG4gICAgICogICAgICAgICAgICAgICAgICAgYXBwZWFyIGluIGEgcmVxdWVzdCBVUkkuIFRoZSBzb3VyY2UgYmxvYiBtdXN0IGVpdGhlciBiZSBwdWJsaWMgb3IgbXVzdCBiZSBhdXRoZW50aWNhdGVkIHZpYSBhIHNoYXJlZFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFjY2VzcyBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjb3B5SW5jcmVtZW50YWwoY29weVNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25Bcmd1bWVudHMgPSB7XG4gICAgICAgICAgICBjb3B5U291cmNlLFxuICAgICAgICAgICAgb3B0aW9uczogY29yZUh0dHAub3BlcmF0aW9uT3B0aW9uc1RvUmVxdWVzdE9wdGlvbnNCYXNlKG9wdGlvbnMgfHwge30pXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdChvcGVyYXRpb25Bcmd1bWVudHMsIGNvcHlJbmNyZW1lbnRhbE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbn1cbi8vIE9wZXJhdGlvbiBTcGVjaWZpY2F0aW9uc1xuY29uc3QgeG1sU2VyaWFsaXplciA9IG5ldyBjb3JlSHR0cC5TZXJpYWxpemVyKE1hcHBlcnMsIC8qIGlzWG1sICovIHRydWUpO1xuY29uc3Qgc2VyaWFsaXplciA9IG5ldyBjb3JlSHR0cC5TZXJpYWxpemVyKE1hcHBlcnMsIC8qIGlzWG1sICovIGZhbHNlKTtcbmNvbnN0IGNyZWF0ZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYkNyZWF0ZUhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iQ3JlYXRlRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMuY29udGVudExlbmd0aCxcbiAgICAgICAgUGFyYW1ldGVycy5tZXRhZGF0YSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ2FjaGVDb250cm9sLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50VHlwZSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iQ29udGVudEVuY29kaW5nLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TGFuZ3VhZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMuYmxvYkNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgUGFyYW1ldGVycy5pbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIFBhcmFtZXRlcnMuaW1tdXRhYmlsaXR5UG9saWN5TW9kZSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIFBhcmFtZXRlcnMudGllcixcbiAgICAgICAgUGFyYW1ldGVycy5ibG9iVGFnc1N0cmluZyxcbiAgICAgICAgUGFyYW1ldGVycy5sZWdhbEhvbGQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JUeXBlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JTZXF1ZW5jZU51bWJlclxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHVwbG9hZFBhZ2VzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iVXBsb2FkUGFnZXNIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYlVwbG9hZFBhZ2VzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogUGFyYW1ldGVycy5ib2R5MSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDE5XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5jb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLnJhbmdlLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgUGFyYW1ldGVycy50cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRUeXBlMSxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQyLFxuICAgICAgICBQYXJhbWV0ZXJzLnBhZ2VXcml0ZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5PckVxdWFsVG8sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZTZXF1ZW5jZU51bWJlckxlc3NUaGFuLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmU2VxdWVuY2VOdW1iZXJFcXVhbFRvXG4gICAgXSxcbiAgICBtZWRpYVR5cGU6IFwiYmluYXJ5XCIsXG4gICAgc2VyaWFsaXplclxufTtcbmNvbnN0IGNsZWFyUGFnZXNPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JDbGVhclBhZ2VzSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JDbGVhclBhZ2VzRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDE5XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMucmFuZ2UsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmU2VxdWVuY2VOdW1iZXJMZXNzVGhhbk9yRXF1YWxUbyxcbiAgICAgICAgUGFyYW1ldGVycy5pZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW4sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZTZXF1ZW5jZU51bWJlckVxdWFsVG8sXG4gICAgICAgIFBhcmFtZXRlcnMucGFnZVdyaXRlMVxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IHVwbG9hZFBhZ2VzRnJvbVVSTE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYlVwbG9hZFBhZ2VzRnJvbVVSTEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iVXBsb2FkUGFnZXNGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDE5XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbnRlbnRMZW5ndGgsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5zb3VyY2VJZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUNvbnRlbnRNRDUsXG4gICAgICAgIFBhcmFtZXRlcnMuY29weVNvdXJjZUF1dGhvcml6YXRpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucGFnZVdyaXRlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmU2VxdWVuY2VOdW1iZXJMZXNzVGhhbk9yRXF1YWxUbyxcbiAgICAgICAgUGFyYW1ldGVycy5pZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW4sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZTZXF1ZW5jZU51bWJlckVxdWFsVG8sXG4gICAgICAgIFBhcmFtZXRlcnMuc291cmNlVXJsLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZVJhbmdlLFxuICAgICAgICBQYXJhbWV0ZXJzLnNvdXJjZUNvbnRlbnRDcmM2NCxcbiAgICAgICAgUGFyYW1ldGVycy5yYW5nZTFcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCBnZXRQYWdlUmFuZ2VzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlBhZ2VMaXN0LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYkdldFBhZ2VSYW5nZXNIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYkdldFBhZ2VSYW5nZXNFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIFBhcmFtZXRlcnMubWFya2VyLFxuICAgICAgICBQYXJhbWV0ZXJzLm1heFBhZ2VTaXplLFxuICAgICAgICBQYXJhbWV0ZXJzLnNuYXBzaG90LFxuICAgICAgICBQYXJhbWV0ZXJzLmNvbXAyMFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5yYW5nZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFnc1xuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGdldFBhZ2VSYW5nZXNEaWZmT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlBhZ2VMaXN0LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmSGVhZGVyc1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBNYXBwZXJzLlN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRGlmZkV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgUGFyYW1ldGVycy5tYXJrZXIsXG4gICAgICAgIFBhcmFtZXRlcnMubWF4UGFnZVNpemUsXG4gICAgICAgIFBhcmFtZXRlcnMuc25hcHNob3QsXG4gICAgICAgIFBhcmFtZXRlcnMuY29tcDIwLFxuICAgICAgICBQYXJhbWV0ZXJzLnByZXZzbmFwc2hvdFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW1BhcmFtZXRlcnMudXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlcnMudmVyc2lvbixcbiAgICAgICAgUGFyYW1ldGVycy5yZXF1ZXN0SWQsXG4gICAgICAgIFBhcmFtZXRlcnMuYWNjZXB0MSxcbiAgICAgICAgUGFyYW1ldGVycy5sZWFzZUlkLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5yYW5nZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5wcmV2U25hcHNob3RVcmxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXJcbn07XG5jb25zdCByZXNpemVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JSZXNpemVIZWFkZXJzXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IE1hcHBlcnMuU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYlJlc2l6ZUV4Y2VwdGlvbkhlYWRlcnNcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy5jb21wLCBQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnVybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXJzLnZlcnNpb24sXG4gICAgICAgIFBhcmFtZXRlcnMucmVxdWVzdElkLFxuICAgICAgICBQYXJhbWV0ZXJzLmFjY2VwdDEsXG4gICAgICAgIFBhcmFtZXRlcnMubGVhc2VJZCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgUGFyYW1ldGVycy5lbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBQYXJhbWV0ZXJzLmVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZk5vbmVNYXRjaCxcbiAgICAgICAgUGFyYW1ldGVycy5pZlRhZ3MsXG4gICAgICAgIFBhcmFtZXRlcnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JDb250ZW50TGVuZ3RoXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuY29uc3QgdXBkYXRlU2VxdWVuY2VOdW1iZXJPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IE1hcHBlcnMuUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iVXBkYXRlU2VxdWVuY2VOdW1iZXJFeGNlcHRpb25IZWFkZXJzXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1BhcmFtZXRlcnMuY29tcCwgUGFyYW1ldGVycy50aW1lb3V0SW5TZWNvbmRzXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmxlYXNlSWQsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZOb25lTWF0Y2gsXG4gICAgICAgIFBhcmFtZXRlcnMuaWZUYWdzLFxuICAgICAgICBQYXJhbWV0ZXJzLmJsb2JTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgUGFyYW1ldGVycy5zZXF1ZW5jZU51bWJlckFjdGlvblxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplclxufTtcbmNvbnN0IGNvcHlJbmNyZW1lbnRhbE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogTWFwcGVycy5QYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTWFwcGVycy5TdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBNYXBwZXJzLlBhZ2VCbG9iQ29weUluY3JlbWVudGFsRXhjZXB0aW9uSGVhZGVyc1xuICAgICAgICB9XG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtQYXJhbWV0ZXJzLnRpbWVvdXRJblNlY29uZHMsIFBhcmFtZXRlcnMuY29tcDIxXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbUGFyYW1ldGVycy51cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgUGFyYW1ldGVycy52ZXJzaW9uLFxuICAgICAgICBQYXJhbWV0ZXJzLnJlcXVlc3RJZCxcbiAgICAgICAgUGFyYW1ldGVycy5hY2NlcHQxLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgUGFyYW1ldGVycy5pZk1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmTm9uZU1hdGNoLFxuICAgICAgICBQYXJhbWV0ZXJzLmlmVGFncyxcbiAgICAgICAgUGFyYW1ldGVycy5jb3B5U291cmNlXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFnZUJsb2IuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBFbmNyeXB0aW9uQWxnb3JpdGhtQUVTMjUgfSBmcm9tIFwiLi91dGlscy9jb25zdGFudHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYWNjZXNzIHRpZXIgb24gYSBibG9iLlxuICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGJsb2NrIGJsb2IgbGV2ZWwgdGllcmluZyBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2F6dXJlL3N0b3JhZ2UvYmxvYnMvc3RvcmFnZS1ibG9iLXN0b3JhZ2UtdGllcnN8SG90LCBjb29sIGFuZCBhcmNoaXZlIHN0b3JhZ2UgdGllcnMufVxuICovXG5leHBvcnQgdmFyIEJsb2NrQmxvYlRpZXI7XG4oZnVuY3Rpb24gKEJsb2NrQmxvYlRpZXIpIHtcbiAgICAvKipcbiAgICAgKiBPcHRpbWl6ZWQgZm9yIHN0b3JpbmcgZGF0YSB0aGF0IGlzIGFjY2Vzc2VkIGZyZXF1ZW50bHkuXG4gICAgICovXG4gICAgQmxvY2tCbG9iVGllcltcIkhvdFwiXSA9IFwiSG90XCI7XG4gICAgLyoqXG4gICAgICogT3B0aW1pemVkIGZvciBzdG9yaW5nIGRhdGEgdGhhdCBpcyBpbmZyZXF1ZW50bHkgYWNjZXNzZWQgYW5kIHN0b3JlZCBmb3IgYXQgbGVhc3QgMzAgZGF5cy5cbiAgICAgKi9cbiAgICBCbG9ja0Jsb2JUaWVyW1wiQ29vbFwiXSA9IFwiQ29vbFwiO1xuICAgIC8qKlxuICAgICAqIE9wdGltaXplZCBmb3Igc3RvcmluZyBkYXRhIHRoYXQgaXMgcmFyZWx5IGFjY2Vzc2VkLlxuICAgICAqL1xuICAgIEJsb2NrQmxvYlRpZXJbXCJDb2xkXCJdID0gXCJDb2xkXCI7XG4gICAgLyoqXG4gICAgICogT3B0aW1pemVkIGZvciBzdG9yaW5nIGRhdGEgdGhhdCBpcyByYXJlbHkgYWNjZXNzZWQgYW5kIHN0b3JlZCBmb3IgYXQgbGVhc3QgMTgwIGRheXNcbiAgICAgKiB3aXRoIGZsZXhpYmxlIGxhdGVuY3kgcmVxdWlyZW1lbnRzIChvbiB0aGUgb3JkZXIgb2YgaG91cnMpLlxuICAgICAqL1xuICAgIEJsb2NrQmxvYlRpZXJbXCJBcmNoaXZlXCJdID0gXCJBcmNoaXZlXCI7XG59KShCbG9ja0Jsb2JUaWVyIHx8IChCbG9ja0Jsb2JUaWVyID0ge30pKTtcbi8qKlxuICogU3BlY2lmaWVzIHRoZSBwYWdlIGJsb2IgdGllciB0byBzZXQgdGhlIGJsb2IgdG8uIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIHBhZ2UgYmxvYnMgb24gcHJlbWl1bSBzdG9yYWdlIGFjY291bnRzLlxuICogUGxlYXNlIHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vYXp1cmUvc3RvcmFnZS9zdG9yYWdlLXByZW1pdW0tc3RvcmFnZSNzY2FsYWJpbGl0eS1hbmQtcGVyZm9ybWFuY2UtdGFyZ2V0c3xoZXJlfVxuICogZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBjb3JyZXNwb25kaW5nIElPUFMgYW5kIHRocm91Z2hwdXQgcGVyIFBhZ2VCbG9iVGllci5cbiAqL1xuZXhwb3J0IHZhciBQcmVtaXVtUGFnZUJsb2JUaWVyO1xuKGZ1bmN0aW9uIChQcmVtaXVtUGFnZUJsb2JUaWVyKSB7XG4gICAgLyoqXG4gICAgICogUDQgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDRcIl0gPSBcIlA0XCI7XG4gICAgLyoqXG4gICAgICogUDYgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDZcIl0gPSBcIlA2XCI7XG4gICAgLyoqXG4gICAgICogUDEwIFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlAxMFwiXSA9IFwiUDEwXCI7XG4gICAgLyoqXG4gICAgICogUDE1IFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlAxNVwiXSA9IFwiUDE1XCI7XG4gICAgLyoqXG4gICAgICogUDIwIFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlAyMFwiXSA9IFwiUDIwXCI7XG4gICAgLyoqXG4gICAgICogUDMwIFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlAzMFwiXSA9IFwiUDMwXCI7XG4gICAgLyoqXG4gICAgICogUDQwIFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlA0MFwiXSA9IFwiUDQwXCI7XG4gICAgLyoqXG4gICAgICogUDUwIFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlA1MFwiXSA9IFwiUDUwXCI7XG4gICAgLyoqXG4gICAgICogUDYwIFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlA2MFwiXSA9IFwiUDYwXCI7XG4gICAgLyoqXG4gICAgICogUDcwIFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlA3MFwiXSA9IFwiUDcwXCI7XG4gICAgLyoqXG4gICAgICogUDgwIFRpZXIuXG4gICAgICovXG4gICAgUHJlbWl1bVBhZ2VCbG9iVGllcltcIlA4MFwiXSA9IFwiUDgwXCI7XG59KShQcmVtaXVtUGFnZUJsb2JUaWVyIHx8IChQcmVtaXVtUGFnZUJsb2JUaWVyID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiB0b0FjY2Vzc1RpZXIodGllcikge1xuICAgIGlmICh0aWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRpZXI7IC8vIE5vIG1vcmUgY2hlY2sgaWYgc3RyaW5nIGlzIGEgdmFsaWQgQWNjZXNzVGllciwgYW5kIGxlZnQgdGhpcyB0byB1bmRlcmxheSBsb2dpYyB0byBkZWNpZGUoc2VydmljZSkuXG59XG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlQ3BrSWZTcGVjaWZpZWQoY3BrLCBpc0h0dHBzKSB7XG4gICAgaWYgKGNwayAmJiAhaXNIdHRwcykge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkN1c3RvbWVyLXByb3ZpZGVkIGVuY3J5cHRpb24ga2V5IG11c3QgYmUgdXNlZCBvdmVyIEhUVFBTLlwiKTtcbiAgICB9XG4gICAgaWYgKGNwayAmJiAhY3BrLmVuY3J5cHRpb25BbGdvcml0aG0pIHtcbiAgICAgICAgY3BrLmVuY3J5cHRpb25BbGdvcml0aG0gPSBFbmNyeXB0aW9uQWxnb3JpdGhtQUVTMjU7XG4gICAgfVxufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSBrbm93biBjbG91ZCBhdWRpZW5jZXMgZm9yIFN0b3JhZ2UuXG4gKi9cbmV4cG9ydCB2YXIgU3RvcmFnZUJsb2JBdWRpZW5jZTtcbihmdW5jdGlvbiAoU3RvcmFnZUJsb2JBdWRpZW5jZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBPQXV0aCBzY29wZSB0byB1c2UgdG8gcmV0cmlldmUgYW4gQUFEIHRva2VuIGZvciBBenVyZSBTdG9yYWdlLlxuICAgICAqL1xuICAgIFN0b3JhZ2VCbG9iQXVkaWVuY2VbXCJTdG9yYWdlT0F1dGhTY29wZXNcIl0gPSBcImh0dHBzOi8vc3RvcmFnZS5henVyZS5jb20vLmRlZmF1bHRcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgT0F1dGggc2NvcGUgdG8gdXNlIHRvIHJldHJpZXZlIGFuIEFBRCB0b2tlbiBmb3IgQXp1cmUgRGlzay5cbiAgICAgKi9cbiAgICBTdG9yYWdlQmxvYkF1ZGllbmNlW1wiRGlza0NvbXB1dGVPQXV0aFNjb3Blc1wiXSA9IFwiaHR0cHM6Ly9kaXNrLmNvbXB1dGUuYXp1cmUuY29tLy5kZWZhdWx0XCI7XG59KShTdG9yYWdlQmxvYkF1ZGllbmNlIHx8IChTdG9yYWdlQmxvYkF1ZGllbmNlID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRCbG9iU2VydmljZUFjY291bnRBdWRpZW5jZShzdG9yYWdlQWNjb3VudE5hbWUpIHtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHtzdG9yYWdlQWNjb3VudE5hbWV9LmJsb2IuY29yZS53aW5kb3dzLm5ldC8uZGVmYXVsdGA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RlbHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgY29udmVydHMgUGFnZVJhbmdlIGFuZCBDbGVhclJhbmdlIHRvIGEgY29tbW9uIFJhbmdlIG9iamVjdC5cbiAqIFBhZ2VSYW5nZSBhbmQgQ2xlYXJSYW5nZSBoYXZlIHN0YXJ0IGFuZCBlbmQgd2hpbGUgUmFuZ2Ugb2Zmc2V0IGFuZCBjb3VudFxuICogdGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIHRvIFJhbmdlLlxuICogQHBhcmFtIHJlc3BvbnNlIC0gTW9kZWwgUGFnZUJsb2IgUmFuZ2UgcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlUmVzcG9uc2VGcm9tTW9kZWwocmVzcG9uc2UpIHtcbiAgICBjb25zdCBwYWdlUmFuZ2UgPSAocmVzcG9uc2UuX3Jlc3BvbnNlLnBhcnNlZEJvZHkucGFnZVJhbmdlIHx8IFtdKS5tYXAoKHgpID0+ICh7XG4gICAgICAgIG9mZnNldDogeC5zdGFydCxcbiAgICAgICAgY291bnQ6IHguZW5kIC0geC5zdGFydCxcbiAgICB9KSk7XG4gICAgY29uc3QgY2xlYXJSYW5nZSA9IChyZXNwb25zZS5fcmVzcG9uc2UucGFyc2VkQm9keS5jbGVhclJhbmdlIHx8IFtdKS5tYXAoKHgpID0+ICh7XG4gICAgICAgIG9mZnNldDogeC5zdGFydCxcbiAgICAgICAgY291bnQ6IHguZW5kIC0geC5zdGFydCxcbiAgICB9KSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2UpLCB7IHBhZ2VSYW5nZSxcbiAgICAgICAgY2xlYXJSYW5nZSwgX3Jlc3BvbnNlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlLl9yZXNwb25zZSksIHsgcGFyc2VkQm9keToge1xuICAgICAgICAgICAgICAgIHBhZ2VSYW5nZSxcbiAgICAgICAgICAgICAgICBjbGVhclJhbmdlLFxuICAgICAgICAgICAgfSB9KSB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZ2VCbG9iUmFuZ2VSZXNwb25zZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGNyZWF0ZUNsaWVudExvZ2dlciB9IGZyb20gXCJAYXp1cmUvbG9nZ2VyXCI7XG4vKipcbiAqIFRoZSBgQGF6dXJlL2xvZ2dlcmAgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBwYWNrYWdlLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBjcmVhdGVDbGllbnRMb2dnZXIoXCJjb3JlLWxyb1wiKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2dlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKlxuICogVGhlIGRlZmF1bHQgdGltZSBpbnRlcnZhbCB0byB3YWl0IGJlZm9yZSBzZW5kaW5nIHRoZSBuZXh0IHBvbGxpbmcgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBPTExfSU5URVJWQUxfSU5fTVMgPSAyMDAwO1xuLyoqXG4gKiBUaGUgY2xvc2VkIHNldCBvZiB0ZXJtaW5hbCBzdGF0ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCB0ZXJtaW5hbFN0YXRlcyA9IFtcInN1Y2NlZWRlZFwiLCBcImNhbmNlbGVkXCIsIFwiZmFpbGVkXCJdO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgdGVybWluYWxTdGF0ZXMgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcbi8qKlxuICogRGVzZXJpYWxpemVzIHRoZSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVTdGF0ZShzZXJpYWxpemVkU3RhdGUpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzZXJpYWxpemVkU3RhdGUpLnN0YXRlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXNlcmlhbGl6ZSBpbnB1dCBzdGF0ZTogJHtzZXJpYWxpemVkU3RhdGV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0U3RhdGVFcnJvcihpbnB1dHMpIHtcbiAgICBjb25zdCB7IHN0YXRlLCBzdGF0ZVByb3h5LCBpc09wZXJhdGlvbkVycm9yIH0gPSBpbnB1dHM7XG4gICAgcmV0dXJuIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoaXNPcGVyYXRpb25FcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgIHN0YXRlUHJveHkuc2V0RXJyb3Ioc3RhdGUsIGVycm9yKTtcbiAgICAgICAgICAgIHN0YXRlUHJveHkuc2V0RmFpbGVkKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9O1xufVxuZnVuY3Rpb24gYXBwZW5kUmVhZGFibGVFcnJvck1lc3NhZ2UoY3VycmVudE1lc3NhZ2UsIGlubmVyTWVzc2FnZSkge1xuICAgIGxldCBtZXNzYWdlID0gY3VycmVudE1lc3NhZ2U7XG4gICAgaWYgKG1lc3NhZ2Uuc2xpY2UoLTEpICE9PSBcIi5cIikge1xuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSArIFwiLlwiO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZSArIFwiIFwiICsgaW5uZXJNZXNzYWdlO1xufVxuZnVuY3Rpb24gc2ltcGxpZnlFcnJvcihlcnIpIHtcbiAgICBsZXQgbWVzc2FnZSA9IGVyci5tZXNzYWdlO1xuICAgIGxldCBjb2RlID0gZXJyLmNvZGU7XG4gICAgbGV0IGN1ckVyciA9IGVycjtcbiAgICB3aGlsZSAoY3VyRXJyLmlubmVyZXJyb3IpIHtcbiAgICAgICAgY3VyRXJyID0gY3VyRXJyLmlubmVyZXJyb3I7XG4gICAgICAgIGNvZGUgPSBjdXJFcnIuY29kZTtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZFJlYWRhYmxlRXJyb3JNZXNzYWdlKG1lc3NhZ2UsIGN1ckVyci5tZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICB9O1xufVxuZnVuY3Rpb24gcHJvY2Vzc09wZXJhdGlvblN0YXR1cyhyZXN1bHQpIHtcbiAgICBjb25zdCB7IHN0YXRlLCBzdGF0ZVByb3h5LCBzdGF0dXMsIGlzRG9uZSwgcHJvY2Vzc1Jlc3VsdCwgZ2V0RXJyb3IsIHJlc3BvbnNlLCBzZXRFcnJvckFzUmVzdWx0IH0gPSByZXN1bHQ7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSBcInN1Y2NlZWRlZFwiOiB7XG4gICAgICAgICAgICBzdGF0ZVByb3h5LnNldFN1Y2NlZWRlZChzdGF0ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZmFpbGVkXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGdldEVycm9yID09PSBudWxsIHx8IGdldEVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnZXRFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICBsZXQgcG9zdGZpeCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlIH0gPSBzaW1wbGlmeUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcG9zdGZpeCA9IGAuICR7Y29kZX0uICR7bWVzc2FnZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXJyU3RyID0gYFRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGhhcyBmYWlsZWQke3Bvc3RmaXh9YDtcbiAgICAgICAgICAgIHN0YXRlUHJveHkuc2V0RXJyb3Ioc3RhdGUsIG5ldyBFcnJvcihlcnJTdHIpKTtcbiAgICAgICAgICAgIHN0YXRlUHJveHkuc2V0RmFpbGVkKHN0YXRlKTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGVyclN0cik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiY2FuY2VsZWRcIjoge1xuICAgICAgICAgICAgc3RhdGVQcm94eS5zZXRDYW5jZWxlZChzdGF0ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoKGlzRG9uZSA9PT0gbnVsbCB8fCBpc0RvbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlzRG9uZShyZXNwb25zZSwgc3RhdGUpKSB8fFxuICAgICAgICAoaXNEb25lID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIFtcInN1Y2NlZWRlZFwiLCBcImNhbmNlbGVkXCJdLmNvbmNhdChzZXRFcnJvckFzUmVzdWx0ID8gW10gOiBbXCJmYWlsZWRcIl0pLmluY2x1ZGVzKHN0YXR1cykpKSB7XG4gICAgICAgIHN0YXRlUHJveHkuc2V0UmVzdWx0KHN0YXRlLCBidWlsZFJlc3VsdCh7XG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdCxcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJ1aWxkUmVzdWx0KGlucHV0cykge1xuICAgIGNvbnN0IHsgcHJvY2Vzc1Jlc3VsdCwgcmVzcG9uc2UsIHN0YXRlIH0gPSBpbnB1dHM7XG4gICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQgPyBwcm9jZXNzUmVzdWx0KHJlc3BvbnNlLCBzdGF0ZSkgOiByZXNwb25zZTtcbn1cbi8qKlxuICogSW5pdGlhdGVzIHRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdE9wZXJhdGlvbihpbnB1dHMpIHtcbiAgICBjb25zdCB7IGluaXQsIHN0YXRlUHJveHksIHByb2Nlc3NSZXN1bHQsIGdldE9wZXJhdGlvblN0YXR1cywgd2l0aE9wZXJhdGlvbkxvY2F0aW9uLCBzZXRFcnJvckFzUmVzdWx0LCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgb3BlcmF0aW9uTG9jYXRpb24sIHJlc291cmNlTG9jYXRpb24sIG1ldGFkYXRhLCByZXNwb25zZSB9ID0gYXdhaXQgaW5pdCgpO1xuICAgIGlmIChvcGVyYXRpb25Mb2NhdGlvbilcbiAgICAgICAgd2l0aE9wZXJhdGlvbkxvY2F0aW9uID09PSBudWxsIHx8IHdpdGhPcGVyYXRpb25Mb2NhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2l0aE9wZXJhdGlvbkxvY2F0aW9uKG9wZXJhdGlvbkxvY2F0aW9uLCBmYWxzZSk7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgb3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgIHJlc291cmNlTG9jYXRpb24sXG4gICAgfTtcbiAgICBsb2dnZXIudmVyYm9zZShgTFJPOiBPcGVyYXRpb24gZGVzY3JpcHRpb246YCwgY29uZmlnKTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0YXRlUHJveHkuaW5pdFN0YXRlKGNvbmZpZyk7XG4gICAgY29uc3Qgc3RhdHVzID0gZ2V0T3BlcmF0aW9uU3RhdHVzKHsgcmVzcG9uc2UsIHN0YXRlLCBvcGVyYXRpb25Mb2NhdGlvbiB9KTtcbiAgICBwcm9jZXNzT3BlcmF0aW9uU3RhdHVzKHsgc3RhdGUsIHN0YXR1cywgc3RhdGVQcm94eSwgcmVzcG9uc2UsIHNldEVycm9yQXNSZXN1bHQsIHByb2Nlc3NSZXN1bHQgfSk7XG4gICAgcmV0dXJuIHN0YXRlO1xufVxuYXN5bmMgZnVuY3Rpb24gcG9sbE9wZXJhdGlvbkhlbHBlcihpbnB1dHMpIHtcbiAgICBjb25zdCB7IHBvbGwsIHN0YXRlLCBzdGF0ZVByb3h5LCBvcGVyYXRpb25Mb2NhdGlvbiwgZ2V0T3BlcmF0aW9uU3RhdHVzLCBnZXRSZXNvdXJjZUxvY2F0aW9uLCBpc09wZXJhdGlvbkVycm9yLCBvcHRpb25zLCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9sbChvcGVyYXRpb25Mb2NhdGlvbiwgb3B0aW9ucykuY2F0Y2goc2V0U3RhdGVFcnJvcih7XG4gICAgICAgIHN0YXRlLFxuICAgICAgICBzdGF0ZVByb3h5LFxuICAgICAgICBpc09wZXJhdGlvbkVycm9yLFxuICAgIH0pKTtcbiAgICBjb25zdCBzdGF0dXMgPSBnZXRPcGVyYXRpb25TdGF0dXMocmVzcG9uc2UsIHN0YXRlKTtcbiAgICBsb2dnZXIudmVyYm9zZShgTFJPOiBTdGF0dXM6XFxuXFx0UG9sbGluZyBmcm9tOiAke3N0YXRlLmNvbmZpZy5vcGVyYXRpb25Mb2NhdGlvbn1cXG5cXHRPcGVyYXRpb24gc3RhdHVzOiAke3N0YXR1c31cXG5cXHRQb2xsaW5nIHN0YXR1czogJHt0ZXJtaW5hbFN0YXRlcy5pbmNsdWRlcyhzdGF0dXMpID8gXCJTdG9wcGVkXCIgOiBcIlJ1bm5pbmdcIn1gKTtcbiAgICBpZiAoc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiKSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlTG9jYXRpb24gPSBnZXRSZXNvdXJjZUxvY2F0aW9uKHJlc3BvbnNlLCBzdGF0ZSk7XG4gICAgICAgIGlmIChyZXNvdXJjZUxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IGF3YWl0IHBvbGwocmVzb3VyY2VMb2NhdGlvbikuY2F0Y2goc2V0U3RhdGVFcnJvcih7IHN0YXRlLCBzdGF0ZVByb3h5LCBpc09wZXJhdGlvbkVycm9yIH0pKSxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJlc3BvbnNlLCBzdGF0dXMgfTtcbn1cbi8qKiBQb2xscyB0aGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb2xsT3BlcmF0aW9uKGlucHV0cykge1xuICAgIGNvbnN0IHsgcG9sbCwgc3RhdGUsIHN0YXRlUHJveHksIG9wdGlvbnMsIGdldE9wZXJhdGlvblN0YXR1cywgZ2V0UmVzb3VyY2VMb2NhdGlvbiwgZ2V0T3BlcmF0aW9uTG9jYXRpb24sIGlzT3BlcmF0aW9uRXJyb3IsIHdpdGhPcGVyYXRpb25Mb2NhdGlvbiwgZ2V0UG9sbGluZ0ludGVydmFsLCBwcm9jZXNzUmVzdWx0LCBnZXRFcnJvciwgdXBkYXRlU3RhdGUsIHNldERlbGF5LCBpc0RvbmUsIHNldEVycm9yQXNSZXN1bHQsIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBvcGVyYXRpb25Mb2NhdGlvbiB9ID0gc3RhdGUuY29uZmlnO1xuICAgIGlmIChvcGVyYXRpb25Mb2NhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIHN0YXR1cyB9ID0gYXdhaXQgcG9sbE9wZXJhdGlvbkhlbHBlcih7XG4gICAgICAgICAgICBwb2xsLFxuICAgICAgICAgICAgZ2V0T3BlcmF0aW9uU3RhdHVzLFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBzdGF0ZVByb3h5LFxuICAgICAgICAgICAgb3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uLFxuICAgICAgICAgICAgaXNPcGVyYXRpb25FcnJvcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgICBwcm9jZXNzT3BlcmF0aW9uU3RhdHVzKHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBzdGF0ZVByb3h5LFxuICAgICAgICAgICAgaXNEb25lLFxuICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdCxcbiAgICAgICAgICAgIGdldEVycm9yLFxuICAgICAgICAgICAgc2V0RXJyb3JBc1Jlc3VsdCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGVybWluYWxTdGF0ZXMuaW5jbHVkZXMoc3RhdHVzKSkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWxJbk1zID0gZ2V0UG9sbGluZ0ludGVydmFsID09PSBudWxsIHx8IGdldFBvbGxpbmdJbnRlcnZhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2V0UG9sbGluZ0ludGVydmFsKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGlmIChpbnRlcnZhbEluTXMpXG4gICAgICAgICAgICAgICAgc2V0RGVsYXkoaW50ZXJ2YWxJbk1zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZ2V0T3BlcmF0aW9uTG9jYXRpb24gPT09IG51bGwgfHwgZ2V0T3BlcmF0aW9uTG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdldE9wZXJhdGlvbkxvY2F0aW9uKHJlc3BvbnNlLCBzdGF0ZSk7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzVXBkYXRlZCA9IG9wZXJhdGlvbkxvY2F0aW9uICE9PSBsb2NhdGlvbjtcbiAgICAgICAgICAgICAgICBzdGF0ZS5jb25maWcub3BlcmF0aW9uTG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICAgICAgICAgICAgICB3aXRoT3BlcmF0aW9uTG9jYXRpb24gPT09IG51bGwgfHwgd2l0aE9wZXJhdGlvbkxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aXRoT3BlcmF0aW9uTG9jYXRpb24obG9jYXRpb24sIGlzVXBkYXRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgd2l0aE9wZXJhdGlvbkxvY2F0aW9uID09PSBudWxsIHx8IHdpdGhPcGVyYXRpb25Mb2NhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2l0aE9wZXJhdGlvbkxvY2F0aW9uKG9wZXJhdGlvbkxvY2F0aW9uLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlU3RhdGUgPT09IG51bGwgfHwgdXBkYXRlU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwZGF0ZVN0YXRlKHN0YXRlLCByZXNwb25zZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlcmF0aW9uLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaW5pdE9wZXJhdGlvbiwgcG9sbE9wZXJhdGlvbiB9IGZyb20gXCIuLi9wb2xsZXIvb3BlcmF0aW9uLmpzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2VyLmpzXCI7XG5mdW5jdGlvbiBnZXRPcGVyYXRpb25Mb2NhdGlvblBvbGxpbmdVcmwoaW5wdXRzKSB7XG4gICAgY29uc3QgeyBhenVyZUFzeW5jT3BlcmF0aW9uLCBvcGVyYXRpb25Mb2NhdGlvbiB9ID0gaW5wdXRzO1xuICAgIHJldHVybiBvcGVyYXRpb25Mb2NhdGlvbiAhPT0gbnVsbCAmJiBvcGVyYXRpb25Mb2NhdGlvbiAhPT0gdm9pZCAwID8gb3BlcmF0aW9uTG9jYXRpb24gOiBhenVyZUFzeW5jT3BlcmF0aW9uO1xufVxuZnVuY3Rpb24gZ2V0TG9jYXRpb25IZWFkZXIocmF3UmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmF3UmVzcG9uc2UuaGVhZGVyc1tcImxvY2F0aW9uXCJdO1xufVxuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uTG9jYXRpb25IZWFkZXIocmF3UmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmF3UmVzcG9uc2UuaGVhZGVyc1tcIm9wZXJhdGlvbi1sb2NhdGlvblwiXTtcbn1cbmZ1bmN0aW9uIGdldEF6dXJlQXN5bmNPcGVyYXRpb25IZWFkZXIocmF3UmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmF3UmVzcG9uc2UuaGVhZGVyc1tcImF6dXJlLWFzeW5jb3BlcmF0aW9uXCJdO1xufVxuZnVuY3Rpb24gZmluZFJlc291cmNlTG9jYXRpb24oaW5wdXRzKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHsgbG9jYXRpb24sIHJlcXVlc3RNZXRob2QsIHJlcXVlc3RQYXRoLCByZXNvdXJjZUxvY2F0aW9uQ29uZmlnIH0gPSBpbnB1dHM7XG4gICAgc3dpdGNoIChyZXF1ZXN0TWV0aG9kKSB7XG4gICAgICAgIGNhc2UgXCJQVVRcIjoge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJERUxFVEVcIjoge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiUEFUQ0hcIjoge1xuICAgICAgICAgICAgcmV0dXJuIChfYSA9IGdldERlZmF1bHQoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogcmVxdWVzdFBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXREZWZhdWx0KCkge1xuICAgICAgICBzd2l0Y2ggKHJlc291cmNlTG9jYXRpb25Db25maWcpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhenVyZS1hc3luYy1vcGVyYXRpb25cIjoge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwib3JpZ2luYWwtdXJpXCI6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdFBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwibG9jYXRpb25cIjpcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaW5mZXJMcm9Nb2RlKGlucHV0cykge1xuICAgIGNvbnN0IHsgcmF3UmVzcG9uc2UsIHJlcXVlc3RNZXRob2QsIHJlcXVlc3RQYXRoLCByZXNvdXJjZUxvY2F0aW9uQ29uZmlnIH0gPSBpbnB1dHM7XG4gICAgY29uc3Qgb3BlcmF0aW9uTG9jYXRpb24gPSBnZXRPcGVyYXRpb25Mb2NhdGlvbkhlYWRlcihyYXdSZXNwb25zZSk7XG4gICAgY29uc3QgYXp1cmVBc3luY09wZXJhdGlvbiA9IGdldEF6dXJlQXN5bmNPcGVyYXRpb25IZWFkZXIocmF3UmVzcG9uc2UpO1xuICAgIGNvbnN0IHBvbGxpbmdVcmwgPSBnZXRPcGVyYXRpb25Mb2NhdGlvblBvbGxpbmdVcmwoeyBvcGVyYXRpb25Mb2NhdGlvbiwgYXp1cmVBc3luY09wZXJhdGlvbiB9KTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGdldExvY2F0aW9uSGVhZGVyKHJhd1Jlc3BvbnNlKTtcbiAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdE1ldGhvZCA9IHJlcXVlc3RNZXRob2QgPT09IG51bGwgfHwgcmVxdWVzdE1ldGhvZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVxdWVzdE1ldGhvZC50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuICAgIGlmIChwb2xsaW5nVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGU6IFwiT3BlcmF0aW9uTG9jYXRpb25cIixcbiAgICAgICAgICAgIG9wZXJhdGlvbkxvY2F0aW9uOiBwb2xsaW5nVXJsLFxuICAgICAgICAgICAgcmVzb3VyY2VMb2NhdGlvbjogZmluZFJlc291cmNlTG9jYXRpb24oe1xuICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2Q6IG5vcm1hbGl6ZWRSZXF1ZXN0TWV0aG9kLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoLFxuICAgICAgICAgICAgICAgIHJlc291cmNlTG9jYXRpb25Db25maWcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAobG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW9kZTogXCJSZXNvdXJjZUxvY2F0aW9uXCIsXG4gICAgICAgICAgICBvcGVyYXRpb25Mb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vcm1hbGl6ZWRSZXF1ZXN0TWV0aG9kID09PSBcIlBVVFwiICYmIHJlcXVlc3RQYXRoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb2RlOiBcIkJvZHlcIixcbiAgICAgICAgICAgIG9wZXJhdGlvbkxvY2F0aW9uOiByZXF1ZXN0UGF0aCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNmb3JtU3RhdHVzKGlucHV0cykge1xuICAgIGNvbnN0IHsgc3RhdHVzLCBzdGF0dXNDb2RlIH0gPSBpbnB1dHM7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXMgIT09IFwic3RyaW5nXCIgJiYgc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb2xsaW5nIHdhcyB1bnN1Y2Nlc3NmdWwuIEV4cGVjdGVkIHN0YXR1cyB0byBoYXZlIGEgc3RyaW5nIHZhbHVlIG9yIG5vIHZhbHVlIGJ1dCBpdCBoYXMgaW5zdGVhZDogJHtzdGF0dXN9LiBUaGlzIGRvZXNuJ3QgbmVjZXNzYXJpbHkgaW5kaWNhdGUgdGhlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLiBDaGVjayB5b3VyIEF6dXJlIHN1YnNjcmlwdGlvbiBvciByZXNvdXJjZSBzdGF0dXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uYCk7XG4gICAgfVxuICAgIHN3aXRjaCAoc3RhdHVzID09PSBudWxsIHx8IHN0YXR1cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhdHVzLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICByZXR1cm4gdG9PcGVyYXRpb25TdGF0dXMoc3RhdHVzQ29kZSk7XG4gICAgICAgIGNhc2UgXCJzdWNjZWVkZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN1Y2NlZWRlZFwiO1xuICAgICAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICAgICAgY2FzZSBcInJ1bm5pbmdcIjpcbiAgICAgICAgY2FzZSBcImFjY2VwdGVkXCI6XG4gICAgICAgIGNhc2UgXCJzdGFydGVkXCI6XG4gICAgICAgIGNhc2UgXCJjYW5jZWxpbmdcIjpcbiAgICAgICAgY2FzZSBcImNhbmNlbGxpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgICAgICAgY2FzZSBcImNhbmNlbGVkXCI6XG4gICAgICAgIGNhc2UgXCJjYW5jZWxsZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImNhbmNlbGVkXCI7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBMUk86IHVucmVjb2duaXplZCBvcGVyYXRpb24gc3RhdHVzOiAke3N0YXR1c31gKTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTdGF0dXMocmF3UmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IChfYSA9IHJhd1Jlc3BvbnNlLmJvZHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgIHJldHVybiB0cmFuc2Zvcm1TdGF0dXMoeyBzdGF0dXMsIHN0YXR1c0NvZGU6IHJhd1Jlc3BvbnNlLnN0YXR1c0NvZGUgfSk7XG59XG5mdW5jdGlvbiBnZXRQcm92aXNpb25pbmdTdGF0ZShyYXdSZXNwb25zZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgeyBwcm9wZXJ0aWVzLCBwcm92aXNpb25pbmdTdGF0ZSB9ID0gKF9hID0gcmF3UmVzcG9uc2UuYm9keSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgY29uc3Qgc3RhdHVzID0gKF9iID0gcHJvcGVydGllcyA9PT0gbnVsbCB8fCBwcm9wZXJ0aWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9wZXJ0aWVzLnByb3Zpc2lvbmluZ1N0YXRlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBwcm92aXNpb25pbmdTdGF0ZTtcbiAgICByZXR1cm4gdHJhbnNmb3JtU3RhdHVzKHsgc3RhdHVzLCBzdGF0dXNDb2RlOiByYXdSZXNwb25zZS5zdGF0dXNDb2RlIH0pO1xufVxuZnVuY3Rpb24gdG9PcGVyYXRpb25TdGF0dXMoc3RhdHVzQ29kZSkge1xuICAgIGlmIChzdGF0dXNDb2RlID09PSAyMDIpIHtcbiAgICAgICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICAgIH1cbiAgICBlbHNlIGlmIChzdGF0dXNDb2RlIDwgMzAwKSB7XG4gICAgICAgIHJldHVybiBcInN1Y2NlZWRlZFwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiZmFpbGVkXCI7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlcih7IHJhd1Jlc3BvbnNlIH0pIHtcbiAgICBjb25zdCByZXRyeUFmdGVyID0gcmF3UmVzcG9uc2UuaGVhZGVyc1tcInJldHJ5LWFmdGVyXCJdO1xuICAgIGlmIChyZXRyeUFmdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gUmV0cnktQWZ0ZXIgaGVhZGVyIHZhbHVlIGlzIGVpdGhlciBpbiBIVFRQIGRhdGUgZm9ybWF0LCBvciBpbiBzZWNvbmRzXG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJJblNlY29uZHMgPSBwYXJzZUludChyZXRyeUFmdGVyKTtcbiAgICAgICAgcmV0dXJuIGlzTmFOKHJldHJ5QWZ0ZXJJblNlY29uZHMpXG4gICAgICAgICAgICA/IGNhbGN1bGF0ZVBvbGxpbmdJbnRlcnZhbEZyb21EYXRlKG5ldyBEYXRlKHJldHJ5QWZ0ZXIpKVxuICAgICAgICAgICAgOiByZXRyeUFmdGVySW5TZWNvbmRzICogMTAwMDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvckZyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGNvbnN0IGVycm9yID0gYWNjZXNzQm9keVByb3BlcnR5KHJlc3BvbnNlLCBcImVycm9yXCIpO1xuICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm5pbmcoYFRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGZhaWxlZCBidXQgdGhlcmUgaXMgbm8gZXJyb3IgcHJvcGVydHkgaW4gdGhlIHJlc3BvbnNlJ3MgYm9keWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZXJyb3IuY29kZSB8fCAhZXJyb3IubWVzc2FnZSkge1xuICAgICAgICBsb2dnZXIud2FybmluZyhgVGhlIGxvbmctcnVubmluZyBvcGVyYXRpb24gZmFpbGVkIGJ1dCB0aGUgZXJyb3IgcHJvcGVydHkgaW4gdGhlIHJlc3BvbnNlJ3MgYm9keSBkb2Vzbid0IGNvbnRhaW4gY29kZSBvciBtZXNzYWdlYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yO1xufVxuZnVuY3Rpb24gY2FsY3VsYXRlUG9sbGluZ0ludGVydmFsRnJvbURhdGUocmV0cnlBZnRlckRhdGUpIHtcbiAgICBjb25zdCB0aW1lTm93ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG4gICAgY29uc3QgcmV0cnlBZnRlclRpbWUgPSByZXRyeUFmdGVyRGF0ZS5nZXRUaW1lKCk7XG4gICAgaWYgKHRpbWVOb3cgPCByZXRyeUFmdGVyVGltZSkge1xuICAgICAgICByZXR1cm4gcmV0cnlBZnRlclRpbWUgLSB0aW1lTm93O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXR1c0Zyb21Jbml0aWFsUmVzcG9uc2UoaW5wdXRzKSB7XG4gICAgY29uc3QgeyByZXNwb25zZSwgc3RhdGUsIG9wZXJhdGlvbkxvY2F0aW9uIH0gPSBpbnB1dHM7XG4gICAgZnVuY3Rpb24gaGVscGVyKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG1vZGUgPSAoX2EgPSBzdGF0ZS5jb25maWcubWV0YWRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVtcIm1vZGVcIl07XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvT3BlcmF0aW9uU3RhdHVzKHJlc3BvbnNlLnJhd1Jlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgY2FzZSBcIkJvZHlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T3BlcmF0aW9uU3RhdHVzKHJlc3BvbnNlLCBzdGF0ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzdGF0dXMgPSBoZWxwZXIoKTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBcInJ1bm5pbmdcIiAmJiBvcGVyYXRpb25Mb2NhdGlvbiA9PT0gdW5kZWZpbmVkID8gXCJzdWNjZWVkZWRcIiA6IHN0YXR1cztcbn1cbi8qKlxuICogSW5pdGlhdGVzIHRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdEh0dHBPcGVyYXRpb24oaW5wdXRzKSB7XG4gICAgY29uc3QgeyBzdGF0ZVByb3h5LCByZXNvdXJjZUxvY2F0aW9uQ29uZmlnLCBwcm9jZXNzUmVzdWx0LCBscm8sIHNldEVycm9yQXNSZXN1bHQgfSA9IGlucHV0cztcbiAgICByZXR1cm4gaW5pdE9wZXJhdGlvbih7XG4gICAgICAgIGluaXQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbHJvLnNlbmRJbml0aWFsUmVxdWVzdCgpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gaW5mZXJMcm9Nb2RlKHtcbiAgICAgICAgICAgICAgICByYXdSZXNwb25zZTogcmVzcG9uc2UucmF3UmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGg6IGxyby5yZXF1ZXN0UGF0aCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kOiBscm8ucmVxdWVzdE1ldGhvZCxcbiAgICAgICAgICAgICAgICByZXNvdXJjZUxvY2F0aW9uQ29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IHJlc3BvbnNlLCBvcGVyYXRpb25Mb2NhdGlvbjogY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm9wZXJhdGlvbkxvY2F0aW9uLCByZXNvdXJjZUxvY2F0aW9uOiBjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcucmVzb3VyY2VMb2NhdGlvbiB9LCAoKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5tb2RlKSA/IHsgbWV0YWRhdGE6IHsgbW9kZTogY29uZmlnLm1vZGUgfSB9IDoge30pKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgcHJvY2Vzc1Jlc3VsdDogcHJvY2Vzc1Jlc3VsdFxuICAgICAgICAgICAgPyAoeyBmbGF0UmVzcG9uc2UgfSwgc3RhdGUpID0+IHByb2Nlc3NSZXN1bHQoZmxhdFJlc3BvbnNlLCBzdGF0ZSlcbiAgICAgICAgICAgIDogKHsgZmxhdFJlc3BvbnNlIH0pID0+IGZsYXRSZXNwb25zZSxcbiAgICAgICAgZ2V0T3BlcmF0aW9uU3RhdHVzOiBnZXRTdGF0dXNGcm9tSW5pdGlhbFJlc3BvbnNlLFxuICAgICAgICBzZXRFcnJvckFzUmVzdWx0LFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9wZXJhdGlvbkxvY2F0aW9uKHsgcmF3UmVzcG9uc2UgfSwgc3RhdGUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbW9kZSA9IChfYSA9IHN0YXRlLmNvbmZpZy5tZXRhZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW1wibW9kZVwiXTtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgY2FzZSBcIk9wZXJhdGlvbkxvY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpb25Mb2NhdGlvblBvbGxpbmdVcmwoe1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxvY2F0aW9uOiBnZXRPcGVyYXRpb25Mb2NhdGlvbkhlYWRlcihyYXdSZXNwb25zZSksXG4gICAgICAgICAgICAgICAgYXp1cmVBc3luY09wZXJhdGlvbjogZ2V0QXp1cmVBc3luY09wZXJhdGlvbkhlYWRlcihyYXdSZXNwb25zZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiUmVzb3VyY2VMb2NhdGlvblwiOiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TG9jYXRpb25IZWFkZXIocmF3UmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJCb2R5XCI6XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0aW9uU3RhdHVzKHsgcmF3UmVzcG9uc2UgfSwgc3RhdGUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbW9kZSA9IChfYSA9IHN0YXRlLmNvbmZpZy5tZXRhZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW1wibW9kZVwiXTtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgY2FzZSBcIk9wZXJhdGlvbkxvY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRTdGF0dXMocmF3UmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJSZXNvdXJjZUxvY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIHJldHVybiB0b09wZXJhdGlvblN0YXR1cyhyYXdSZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiQm9keVwiOiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0UHJvdmlzaW9uaW5nU3RhdGUocmF3UmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIGVycm9yOiBVbmV4cGVjdGVkIG9wZXJhdGlvbiBtb2RlOiAke21vZGV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWNjZXNzQm9keVByb3BlcnR5KHsgZmxhdFJlc3BvbnNlLCByYXdSZXNwb25zZSB9LCBwcm9wKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9hID0gZmxhdFJlc3BvbnNlID09PSBudWxsIHx8IGZsYXRSZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmxhdFJlc3BvbnNlW3Byb3BdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoX2IgPSByYXdSZXNwb25zZS5ib2R5KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbcHJvcF07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzb3VyY2VMb2NhdGlvbihyZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgbG9jID0gYWNjZXNzQm9keVByb3BlcnR5KHJlcywgXCJyZXNvdXJjZUxvY2F0aW9uXCIpO1xuICAgIGlmIChsb2MgJiYgdHlwZW9mIGxvYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzdGF0ZS5jb25maWcucmVzb3VyY2VMb2NhdGlvbiA9IGxvYztcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmNvbmZpZy5yZXNvdXJjZUxvY2F0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlcmF0aW9uRXJyb3IoZSkge1xuICAgIHJldHVybiBlLm5hbWUgPT09IFwiUmVzdEVycm9yXCI7XG59XG4vKiogUG9sbHMgdGhlIGxvbmctcnVubmluZyBvcGVyYXRpb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9sbEh0dHBPcGVyYXRpb24oaW5wdXRzKSB7XG4gICAgY29uc3QgeyBscm8sIHN0YXRlUHJveHksIG9wdGlvbnMsIHByb2Nlc3NSZXN1bHQsIHVwZGF0ZVN0YXRlLCBzZXREZWxheSwgc3RhdGUsIHNldEVycm9yQXNSZXN1bHQsIH0gPSBpbnB1dHM7XG4gICAgcmV0dXJuIHBvbGxPcGVyYXRpb24oe1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgc2V0RGVsYXksXG4gICAgICAgIHByb2Nlc3NSZXN1bHQ6IHByb2Nlc3NSZXN1bHRcbiAgICAgICAgICAgID8gKHsgZmxhdFJlc3BvbnNlIH0sIGlucHV0U3RhdGUpID0+IHByb2Nlc3NSZXN1bHQoZmxhdFJlc3BvbnNlLCBpbnB1dFN0YXRlKVxuICAgICAgICAgICAgOiAoeyBmbGF0UmVzcG9uc2UgfSkgPT4gZmxhdFJlc3BvbnNlLFxuICAgICAgICBnZXRFcnJvcjogZ2V0RXJyb3JGcm9tUmVzcG9uc2UsXG4gICAgICAgIHVwZGF0ZVN0YXRlLFxuICAgICAgICBnZXRQb2xsaW5nSW50ZXJ2YWw6IHBhcnNlUmV0cnlBZnRlcixcbiAgICAgICAgZ2V0T3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgIGdldE9wZXJhdGlvblN0YXR1cyxcbiAgICAgICAgaXNPcGVyYXRpb25FcnJvcixcbiAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBleHBhbnNpb24gaGVyZSBpcyBpbnRlbnRpb25hbCBiZWNhdXNlIGBscm9gIGNvdWxkIGJlIGFuIG9iamVjdCB0aGF0XG4gICAgICAgICAqIHJlZmVyZW5jZXMgYW4gaW5uZXIgdGhpcywgc28gd2UgbmVlZCB0byBwcmVzZXJ2ZSBhIHJlZmVyZW5jZSB0byBpdC5cbiAgICAgICAgICovXG4gICAgICAgIHBvbGw6IGFzeW5jIChsb2NhdGlvbiwgaW5wdXRPcHRpb25zKSA9PiBscm8uc2VuZFBvbGxSZXF1ZXN0KGxvY2F0aW9uLCBpbnB1dE9wdGlvbnMpLFxuICAgICAgICBzZXRFcnJvckFzUmVzdWx0LFxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlcmF0aW9uLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgZGVzZXJpYWxpemVTdGF0ZSwgaW5pdE9wZXJhdGlvbiwgcG9sbE9wZXJhdGlvbiB9IGZyb20gXCIuL29wZXJhdGlvbi5qc1wiO1xuaW1wb3J0IHsgUE9MTF9JTlRFUlZBTF9JTl9NUyB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGF6dXJlL2NvcmUtdXRpbFwiO1xuY29uc3QgY3JlYXRlU3RhdGVQcm94eSA9ICgpID0+ICh7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIGF0IHRoaXMgcG9pbnQgaXMgY3JlYXRlZCB0byBiZSBvZiB0eXBlIE9wZXJhdGlvblN0YXRlPFRSZXN1bHQ+LlxuICAgICAqIEl0IHdpbGwgYmUgdXBkYXRlZCBsYXRlciB0byBiZSBvZiB0eXBlIFRTdGF0ZSB3aGVuIHRoZVxuICAgICAqIGN1c3RvbWVyLXByb3ZpZGVkIGNhbGxiYWNrLCBgdXBkYXRlU3RhdGVgLCBpcyBjYWxsZWQgZHVyaW5nIHBvbGxpbmcuXG4gICAgICovXG4gICAgaW5pdFN0YXRlOiAoY29uZmlnKSA9PiAoeyBzdGF0dXM6IFwicnVubmluZ1wiLCBjb25maWcgfSksXG4gICAgc2V0Q2FuY2VsZWQ6IChzdGF0ZSkgPT4gKHN0YXRlLnN0YXR1cyA9IFwiY2FuY2VsZWRcIiksXG4gICAgc2V0RXJyb3I6IChzdGF0ZSwgZXJyb3IpID0+IChzdGF0ZS5lcnJvciA9IGVycm9yKSxcbiAgICBzZXRSZXN1bHQ6IChzdGF0ZSwgcmVzdWx0KSA9PiAoc3RhdGUucmVzdWx0ID0gcmVzdWx0KSxcbiAgICBzZXRSdW5uaW5nOiAoc3RhdGUpID0+IChzdGF0ZS5zdGF0dXMgPSBcInJ1bm5pbmdcIiksXG4gICAgc2V0U3VjY2VlZGVkOiAoc3RhdGUpID0+IChzdGF0ZS5zdGF0dXMgPSBcInN1Y2NlZWRlZFwiKSxcbiAgICBzZXRGYWlsZWQ6IChzdGF0ZSkgPT4gKHN0YXRlLnN0YXR1cyA9IFwiZmFpbGVkXCIpLFxuICAgIGdldEVycm9yOiAoc3RhdGUpID0+IHN0YXRlLmVycm9yLFxuICAgIGdldFJlc3VsdDogKHN0YXRlKSA9PiBzdGF0ZS5yZXN1bHQsXG4gICAgaXNDYW5jZWxlZDogKHN0YXRlKSA9PiBzdGF0ZS5zdGF0dXMgPT09IFwiY2FuY2VsZWRcIixcbiAgICBpc0ZhaWxlZDogKHN0YXRlKSA9PiBzdGF0ZS5zdGF0dXMgPT09IFwiZmFpbGVkXCIsXG4gICAgaXNSdW5uaW5nOiAoc3RhdGUpID0+IHN0YXRlLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIsXG4gICAgaXNTdWNjZWVkZWQ6IChzdGF0ZSkgPT4gc3RhdGUuc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiLFxufSk7XG4vKipcbiAqIFJldHVybnMgYSBwb2xsZXIgZmFjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ3JlYXRlUG9sbGVyKGlucHV0cykge1xuICAgIGNvbnN0IHsgZ2V0T3BlcmF0aW9uTG9jYXRpb24sIGdldFN0YXR1c0Zyb21Jbml0aWFsUmVzcG9uc2UsIGdldFN0YXR1c0Zyb21Qb2xsUmVzcG9uc2UsIGlzT3BlcmF0aW9uRXJyb3IsIGdldFJlc291cmNlTG9jYXRpb24sIGdldFBvbGxpbmdJbnRlcnZhbCwgZ2V0RXJyb3IsIHJlc29sdmVPblVuc3VjY2Vzc2Z1bCwgfSA9IGlucHV0cztcbiAgICByZXR1cm4gYXN5bmMgKHsgaW5pdCwgcG9sbCB9LCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcHJvY2Vzc1Jlc3VsdCwgdXBkYXRlU3RhdGUsIHdpdGhPcGVyYXRpb25Mb2NhdGlvbjogd2l0aE9wZXJhdGlvbkxvY2F0aW9uQ2FsbGJhY2ssIGludGVydmFsSW5NcyA9IFBPTExfSU5URVJWQUxfSU5fTVMsIHJlc3RvcmVGcm9tLCB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3Qgc3RhdGVQcm94eSA9IGNyZWF0ZVN0YXRlUHJveHkoKTtcbiAgICAgICAgY29uc3Qgd2l0aE9wZXJhdGlvbkxvY2F0aW9uID0gd2l0aE9wZXJhdGlvbkxvY2F0aW9uQ2FsbGJhY2tcbiAgICAgICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChvcGVyYXRpb25Mb2NhdGlvbiwgaXNVcGRhdGVkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1VwZGF0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoT3BlcmF0aW9uTG9jYXRpb25DYWxsYmFjayhvcGVyYXRpb25Mb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjYWxsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoT3BlcmF0aW9uTG9jYXRpb25DYWxsYmFjayhvcGVyYXRpb25Mb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHJlc3RvcmVGcm9tXG4gICAgICAgICAgICA/IGRlc2VyaWFsaXplU3RhdGUocmVzdG9yZUZyb20pXG4gICAgICAgICAgICA6IGF3YWl0IGluaXRPcGVyYXRpb24oe1xuICAgICAgICAgICAgICAgIGluaXQsXG4gICAgICAgICAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzUmVzdWx0LFxuICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblN0YXR1czogZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZSxcbiAgICAgICAgICAgICAgICB3aXRoT3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgICAgICAgICAgc2V0RXJyb3JBc1Jlc3VsdDogIXJlc29sdmVPblVuc3VjY2Vzc2Z1bCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVzdWx0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlUHJvZ3Jlc3NFdmVudHMgPSBhc3luYyAoKSA9PiBoYW5kbGVycy5mb3JFYWNoKChoKSA9PiBoKHN0YXRlKSk7XG4gICAgICAgIGNvbnN0IGNhbmNlbEVyck1zZyA9IFwiT3BlcmF0aW9uIHdhcyBjYW5jZWxlZFwiO1xuICAgICAgICBsZXQgY3VycmVudFBvbGxJbnRlcnZhbEluTXMgPSBpbnRlcnZhbEluTXM7XG4gICAgICAgIGNvbnN0IHBvbGxlciA9IHtcbiAgICAgICAgICAgIGdldE9wZXJhdGlvblN0YXRlOiAoKSA9PiBzdGF0ZSxcbiAgICAgICAgICAgIGdldFJlc3VsdDogKCkgPT4gc3RhdGUucmVzdWx0LFxuICAgICAgICAgICAgaXNEb25lOiAoKSA9PiBbXCJzdWNjZWVkZWRcIiwgXCJmYWlsZWRcIiwgXCJjYW5jZWxlZFwiXS5pbmNsdWRlcyhzdGF0ZS5zdGF0dXMpLFxuICAgICAgICAgICAgaXNTdG9wcGVkOiAoKSA9PiByZXN1bHRQcm9taXNlID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdG9wUG9sbGluZzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvU3RyaW5nOiAoKSA9PiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBTeW1ib2woKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQocywgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiBoYW5kbGVycy5kZWxldGUocyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9sbFVudGlsRG9uZTogKHBvbGxPcHRpb25zKSA9PiAocmVzdWx0UHJvbWlzZSAhPT0gbnVsbCAmJiByZXN1bHRQcm9taXNlICE9PSB2b2lkIDAgPyByZXN1bHRQcm9taXNlIDogKHJlc3VsdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYWJvcnRTaWduYWw6IGlucHV0QWJvcnRTaWduYWwgfSA9IHBvbGxPcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBmdXR1cmUgd2UgY2FuIHVzZSBBYm9ydFNpZ25hbC5hbnkoKSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gYWJvcnRMaXN0ZW5lcigpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGFib3J0U2lnbmFsID0gYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRBYm9ydFNpZ25hbCA9PT0gbnVsbCB8fCBpbnB1dEFib3J0U2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbnB1dEFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0QWJvcnRTaWduYWwgPT09IG51bGwgfHwgaW5wdXRBYm9ydFNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRBYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvbGxlci5pc0RvbmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcG9sbGVyLnBvbGwoeyBhYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcG9sbGVyLmlzRG9uZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoY3VycmVudFBvbGxJbnRlcnZhbEluTXMsIHsgYWJvcnRTaWduYWwgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcG9sbGVyLnBvbGwoeyBhYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRBYm9ydFNpZ25hbCA9PT0gbnVsbCB8fCBpbnB1dEFib3J0U2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbnB1dEFib3J0U2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydExpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVPblVuc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9sbGVyLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdWNjZWVkZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9sbGVyLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNhbmNlbGVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNhbmNlbEVyck1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibm90U3RhcnRlZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJ1bm5pbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvbGxpbmcgY29tcGxldGVkIHdpdGhvdXQgc3VjY2VlZGluZyBvciBmYWlsaW5nYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KSkpLFxuICAgICAgICAgICAgYXN5bmMgcG9sbChwb2xsT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlT25VbnN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGxlci5pc0RvbmUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3VjY2VlZGVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNhbmNlbGVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNhbmNlbEVyck1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgcG9sbE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIHBvbGwsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZVByb3h5LFxuICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYXRpb25Mb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaXNPcGVyYXRpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgd2l0aE9wZXJhdGlvbkxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICBnZXRQb2xsaW5nSW50ZXJ2YWwsXG4gICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblN0YXR1czogZ2V0U3RhdHVzRnJvbVBvbGxSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBwb2xsT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgc2V0RGVsYXk6IChwb2xsSW50ZXJ2YWxJbk1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9sbEludGVydmFsSW5NcyA9IHBvbGxJbnRlcnZhbEluTXM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldEVycm9yQXNSZXN1bHQ6ICFyZXNvbHZlT25VbnN1Y2Nlc3NmdWwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlUHJvZ3Jlc3NFdmVudHMoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVPblVuc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNhbmNlbGVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNhbmNlbEVyck1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcG9sbGVyO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBnZXRFcnJvckZyb21SZXNwb25zZSwgZ2V0T3BlcmF0aW9uTG9jYXRpb24sIGdldE9wZXJhdGlvblN0YXR1cywgZ2V0UmVzb3VyY2VMb2NhdGlvbiwgZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZSwgaW5mZXJMcm9Nb2RlLCBpc09wZXJhdGlvbkVycm9yLCBwYXJzZVJldHJ5QWZ0ZXIsIH0gZnJvbSBcIi4vb3BlcmF0aW9uLmpzXCI7XG5pbXBvcnQgeyBidWlsZENyZWF0ZVBvbGxlciB9IGZyb20gXCIuLi9wb2xsZXIvcG9sbGVyLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xsZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBwb2xsIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBscm8gLSBEZXNjcmlwdGlvbiBvZiB0aGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgcG9sbGVyXG4gKiBAcmV0dXJucyBhbiBpbml0aWFsaXplZCBwb2xsZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUh0dHBQb2xsZXIobHJvLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyByZXNvdXJjZUxvY2F0aW9uQ29uZmlnLCBpbnRlcnZhbEluTXMsIHByb2Nlc3NSZXN1bHQsIHJlc3RvcmVGcm9tLCB1cGRhdGVTdGF0ZSwgd2l0aE9wZXJhdGlvbkxvY2F0aW9uLCByZXNvbHZlT25VbnN1Y2Nlc3NmdWwgPSBmYWxzZSwgfSA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIGJ1aWxkQ3JlYXRlUG9sbGVyKHtcbiAgICAgICAgZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZSxcbiAgICAgICAgZ2V0U3RhdHVzRnJvbVBvbGxSZXNwb25zZTogZ2V0T3BlcmF0aW9uU3RhdHVzLFxuICAgICAgICBpc09wZXJhdGlvbkVycm9yLFxuICAgICAgICBnZXRPcGVyYXRpb25Mb2NhdGlvbixcbiAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgZ2V0UG9sbGluZ0ludGVydmFsOiBwYXJzZVJldHJ5QWZ0ZXIsXG4gICAgICAgIGdldEVycm9yOiBnZXRFcnJvckZyb21SZXNwb25zZSxcbiAgICAgICAgcmVzb2x2ZU9uVW5zdWNjZXNzZnVsLFxuICAgIH0pKHtcbiAgICAgICAgaW5pdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBscm8uc2VuZEluaXRpYWxSZXF1ZXN0KCk7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBpbmZlckxyb01vZGUoe1xuICAgICAgICAgICAgICAgIHJhd1Jlc3BvbnNlOiByZXNwb25zZS5yYXdSZXNwb25zZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aDogbHJvLnJlcXVlc3RQYXRoLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2Q6IGxyby5yZXF1ZXN0TWV0aG9kLFxuICAgICAgICAgICAgICAgIHJlc291cmNlTG9jYXRpb25Db25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgcmVzcG9uc2UsIG9wZXJhdGlvbkxvY2F0aW9uOiBjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcub3BlcmF0aW9uTG9jYXRpb24sIHJlc291cmNlTG9jYXRpb246IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5yZXNvdXJjZUxvY2F0aW9uIH0sICgoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm1vZGUpID8geyBtZXRhZGF0YTogeyBtb2RlOiBjb25maWcubW9kZSB9IH0gOiB7fSkpO1xuICAgICAgICB9LFxuICAgICAgICBwb2xsOiBscm8uc2VuZFBvbGxSZXF1ZXN0LFxuICAgIH0sIHtcbiAgICAgICAgaW50ZXJ2YWxJbk1zLFxuICAgICAgICB3aXRoT3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgIHJlc3RvcmVGcm9tLFxuICAgICAgICB1cGRhdGVTdGF0ZSxcbiAgICAgICAgcHJvY2Vzc1Jlc3VsdDogcHJvY2Vzc1Jlc3VsdFxuICAgICAgICAgICAgPyAoeyBmbGF0UmVzcG9uc2UgfSwgc3RhdGUpID0+IHByb2Nlc3NSZXN1bHQoZmxhdFJlc3BvbnNlLCBzdGF0ZSlcbiAgICAgICAgICAgIDogKHsgZmxhdFJlc3BvbnNlIH0pID0+IGZsYXRSZXNwb25zZSxcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGluaXRIdHRwT3BlcmF0aW9uLCBwb2xsSHR0cE9wZXJhdGlvbiB9IGZyb20gXCIuLi8uLi9odHRwL29wZXJhdGlvbi5qc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiO1xuY29uc3QgY3JlYXRlU3RhdGVQcm94eSA9ICgpID0+ICh7XG4gICAgaW5pdFN0YXRlOiAoY29uZmlnKSA9PiAoeyBjb25maWcsIGlzU3RhcnRlZDogdHJ1ZSB9KSxcbiAgICBzZXRDYW5jZWxlZDogKHN0YXRlKSA9PiAoc3RhdGUuaXNDYW5jZWxsZWQgPSB0cnVlKSxcbiAgICBzZXRFcnJvcjogKHN0YXRlLCBlcnJvcikgPT4gKHN0YXRlLmVycm9yID0gZXJyb3IpLFxuICAgIHNldFJlc3VsdDogKHN0YXRlLCByZXN1bHQpID0+IChzdGF0ZS5yZXN1bHQgPSByZXN1bHQpLFxuICAgIHNldFJ1bm5pbmc6IChzdGF0ZSkgPT4gKHN0YXRlLmlzU3RhcnRlZCA9IHRydWUpLFxuICAgIHNldFN1Y2NlZWRlZDogKHN0YXRlKSA9PiAoc3RhdGUuaXNDb21wbGV0ZWQgPSB0cnVlKSxcbiAgICBzZXRGYWlsZWQ6ICgpID0+IHtcbiAgICAgICAgLyoqIGVtcHR5IGJvZHkgKi9cbiAgICB9LFxuICAgIGdldEVycm9yOiAoc3RhdGUpID0+IHN0YXRlLmVycm9yLFxuICAgIGdldFJlc3VsdDogKHN0YXRlKSA9PiBzdGF0ZS5yZXN1bHQsXG4gICAgaXNDYW5jZWxlZDogKHN0YXRlKSA9PiAhIXN0YXRlLmlzQ2FuY2VsbGVkLFxuICAgIGlzRmFpbGVkOiAoc3RhdGUpID0+ICEhc3RhdGUuZXJyb3IsXG4gICAgaXNSdW5uaW5nOiAoc3RhdGUpID0+ICEhc3RhdGUuaXNTdGFydGVkLFxuICAgIGlzU3VjY2VlZGVkOiAoc3RhdGUpID0+IEJvb2xlYW4oc3RhdGUuaXNDb21wbGV0ZWQgJiYgIXN0YXRlLmlzQ2FuY2VsbGVkICYmICFzdGF0ZS5lcnJvciksXG59KTtcbmV4cG9ydCBjbGFzcyBHZW5lcmljUG9sbE9wZXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc3RhdGUsIGxybywgc2V0RXJyb3JBc1Jlc3VsdCwgbHJvUmVzb3VyY2VMb2NhdGlvbkNvbmZpZywgcHJvY2Vzc1Jlc3VsdCwgdXBkYXRlU3RhdGUsIGlzRG9uZSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMubHJvID0gbHJvO1xuICAgICAgICB0aGlzLnNldEVycm9yQXNSZXN1bHQgPSBzZXRFcnJvckFzUmVzdWx0O1xuICAgICAgICB0aGlzLmxyb1Jlc291cmNlTG9jYXRpb25Db25maWcgPSBscm9SZXNvdXJjZUxvY2F0aW9uQ29uZmlnO1xuICAgICAgICB0aGlzLnByb2Nlc3NSZXN1bHQgPSBwcm9jZXNzUmVzdWx0O1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGU7XG4gICAgICAgIHRoaXMuaXNEb25lID0gaXNEb25lO1xuICAgIH1cbiAgICBzZXRQb2xsZXJDb25maWcocG9sbGVyQ29uZmlnKSB7XG4gICAgICAgIHRoaXMucG9sbGVyQ29uZmlnID0gcG9sbGVyQ29uZmlnO1xuICAgIH1cbiAgICBhc3luYyB1cGRhdGUob3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHN0YXRlUHJveHkgPSBjcmVhdGVTdGF0ZVByb3h5KCk7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5pc1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUpLCAoYXdhaXQgaW5pdEh0dHBPcGVyYXRpb24oe1xuICAgICAgICAgICAgICAgIGxybzogdGhpcy5scm8sXG4gICAgICAgICAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZUxvY2F0aW9uQ29uZmlnOiB0aGlzLmxyb1Jlc291cmNlTG9jYXRpb25Db25maWcsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdDogdGhpcy5wcm9jZXNzUmVzdWx0LFxuICAgICAgICAgICAgICAgIHNldEVycm9yQXNSZXN1bHQ6IHRoaXMuc2V0RXJyb3JBc1Jlc3VsdCxcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlU3RhdGUgPSB0aGlzLnVwZGF0ZVN0YXRlO1xuICAgICAgICBjb25zdCBpc0RvbmUgPSB0aGlzLmlzRG9uZTtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmlzQ29tcGxldGVkICYmIHRoaXMuc3RhdGUuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXdhaXQgcG9sbEh0dHBPcGVyYXRpb24oe1xuICAgICAgICAgICAgICAgIGxybzogdGhpcy5scm8sXG4gICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzUmVzdWx0OiB0aGlzLnByb2Nlc3NSZXN1bHQsXG4gICAgICAgICAgICAgICAgdXBkYXRlU3RhdGU6IHVwZGF0ZVN0YXRlXG4gICAgICAgICAgICAgICAgICAgID8gKHN0YXRlLCB7IHJhd1Jlc3BvbnNlIH0pID0+IHVwZGF0ZVN0YXRlKHN0YXRlLCByYXdSZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaXNEb25lOiBpc0RvbmVcbiAgICAgICAgICAgICAgICAgICAgPyAoeyBmbGF0UmVzcG9uc2UgfSwgc3RhdGUpID0+IGlzRG9uZShmbGF0UmVzcG9uc2UsIHN0YXRlKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIHNldERlbGF5OiAoaW50ZXJ2YWxJbk1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9sbGVyQ29uZmlnLmludGVydmFsSW5NcyA9IGludGVydmFsSW5NcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldEVycm9yQXNSZXN1bHQ6IHRoaXMuc2V0RXJyb3JBc1Jlc3VsdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5maXJlUHJvZ3Jlc3MpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKG9wdGlvbnMsIHRoaXMuc3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXCJgY2FuY2VsT3BlcmF0aW9uYCBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgd2Fzbid0IGltcGxlbWVudGVkXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyB0aGUgUG9sbGVyIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVyYXRpb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIFdoZW4gYSBwb2xsZXIgaXMgbWFudWFsbHkgc3RvcHBlZCB0aHJvdWdoIHRoZSBgc3RvcFBvbGxpbmdgIG1ldGhvZCxcbiAqIHRoZSBwb2xsZXIgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBQb2xsZXJTdG9wcGVkRXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2xsZXJTdG9wcGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJQb2xsZXJTdG9wcGVkRXJyb3JcIjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFBvbGxlclN0b3BwZWRFcnJvci5wcm90b3R5cGUpO1xuICAgIH1cbn1cbi8qKlxuICogV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNhbmNlbGxlZCwgdGhlIHBvbGxlciB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gaW5zdGFuY2VcbiAqIG9mIHRoZSBQb2xsZXJDYW5jZWxsZWRFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGxlckNhbmNlbGxlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUG9sbGVyQ2FuY2VsbGVkRXJyb3JcIjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFBvbGxlckNhbmNlbGxlZEVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxufVxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgZGVmaW5pdGlvbiBvZiBhIHByb2dyYW0gdGhhdCBwb2xscyB0aHJvdWdoIGNvbnNlY3V0aXZlIHJlcXVlc3RzXG4gKiB1bnRpbCBpdCByZWFjaGVzIGEgc3RhdGUgb2YgY29tcGxldGlvbi5cbiAqXG4gKiBBIHBvbGxlciBjYW4gYmUgZXhlY3V0ZWQgbWFudWFsbHksIGJ5IHBvbGxpbmcgcmVxdWVzdCBieSByZXF1ZXN0IGJ5IGNhbGxpbmcgdG8gdGhlIGBwb2xsKClgIG1ldGhvZCByZXBlYXRlZGx5LCB1bnRpbCBpdHMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC5cbiAqIEl0IGFsc28gcHJvdmlkZXMgYSB3YXkgdG8gd2FpdCB1bnRpbCB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcywgYnkgY2FsbGluZyBgcG9sbFVudGlsRG9uZSgpYCBhbmQgd2FpdGluZyB1bnRpbCB0aGUgb3BlcmF0aW9uIGZpbmlzaGVzLlxuICogUG9sbGVycyBjYW4gYWxzbyByZXF1ZXN0IHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIG9uZ29pbmcgcHJvY2VzcyB0byB3aG9tIGlzIHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBwb2xsZXIgPSBuZXcgTXlQb2xsZXIoKTtcbiAqXG4gKiAvLyBQb2xsaW5nIGp1c3Qgb25jZTpcbiAqIGF3YWl0IHBvbGxlci5wb2xsKCk7XG4gKlxuICogLy8gV2UgY2FuIHRyeSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaGVyZSwgYnkgY2FsbGluZzpcbiAqIC8vXG4gKiAvLyAgICAgYXdhaXQgcG9sbGVyLmNhbmNlbE9wZXJhdGlvbigpO1xuICogLy9cbiAqXG4gKiAvLyBHZXR0aW5nIHRoZSBmaW5hbCByZXN1bHQ6XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBwb2xsZXIucG9sbFVudGlsRG9uZSgpO1xuICogYGBgXG4gKlxuICogVGhlIFBvbGxlciBpcyBkZWZpbmVkIGJ5IHR3byB0eXBlcywgYSB0eXBlIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIHBvbGxlciwgd2hpY2hcbiAqIG11c3QgaW5jbHVkZSBhIGJhc2ljIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gYFBvbGxPcGVyYXRpb25TdGF0ZTxUUmVzdWx0PmAsXG4gKiBhbmQgYSByZXR1cm4gdHlwZSBkZWZpbmVkIGJ5IGBUUmVzdWx0YCwgd2hpY2ggY2FuIGJlIGFueXRoaW5nLlxuICpcbiAqIFRoZSBQb2xsZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgYFBvbGxlckxpa2VgIGludGVyZmFjZSwgd2hpY2ggYWxsb3dzIHBvbGxlciBpbXBsZW1lbnRhdGlvbnMgdG8gYXZvaWQgaGF2aW5nXG4gKiB0byBleHBvcnQgdGhlIFBvbGxlcidzIGNsYXNzIGRpcmVjdGx5LCBhbmQgaW5zdGVhZCBvbmx5IGV4cG9ydCB0aGUgYWxyZWFkeSBpbnN0YW50aWF0ZWQgcG9sbGVyIHdpdGggdGhlIFBvbGxlckxpa2UgdHlwZS5cbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgQ2xpZW50IHtcbiAqICAgcHVibGljIGFzeW5jIG1ha2VQb2xsZXI6IFBvbGxlckxpa2U8TXlPcGVyYXRpb25TdGF0ZSwgTXlSZXN1bHQ+IHtcbiAqICAgICBjb25zdCBwb2xsZXIgPSBuZXcgTXlQb2xsZXIoe30pO1xuICogICAgIC8vIEl0IG1pZ2h0IGJlIHByZWZlcnJlZCB0byByZXR1cm4gdGhlIHBvbGxlciBhZnRlciB0aGUgZmlyc3QgcmVxdWVzdCBpcyBtYWRlLFxuICogICAgIC8vIHNvIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBjYW4gYmUgb2J0YWluZWQgcmlnaHQgYXdheS5cbiAqICAgICBhd2FpdCBwb2xsZXIucG9sbCgpO1xuICogICAgIHJldHVybiBwb2xsZXI7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBwb2xsZXI6IFBvbGxlckxpa2U8TXlPcGVyYXRpb25TdGF0ZSwgTXlSZXN1bHQ+ID0gbXlDbGllbnQubWFrZVBvbGxlcigpO1xuICogYGBgXG4gKlxuICogQSBwb2xsZXIgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCBpdHMgY29uc3RydWN0b3IsIHRoZW4gaXQgY2FuIGJlIHBvbGxlZCB1bnRpbCBpdCdzIGNvbXBsZXRlZC5cbiAqIEF0IGFueSBwb2ludCBpbiB0aW1lLCB0aGUgc3RhdGUgb2YgdGhlIHBvbGxlciBjYW4gYmUgb2J0YWluZWQgd2l0aG91dCBkZWxheSB0aHJvdWdoIHRoZSBnZXRPcGVyYXRpb25TdGF0ZSBtZXRob2QuXG4gKiBBdCBhbnkgcG9pbnQgaW4gdGltZSwgdGhlIGludGVybWVkaWF0ZSBmb3JtcyBvZiB0aGUgcmVzdWx0IHR5cGUgY2FuIGJlIHJlcXVlc3RlZCB3aXRob3V0IGRlbGF5LlxuICogT25jZSB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24gaXMgbWFya2VkIGFzIGNvbXBsZXRlZCwgdGhlIHBvbGxlciB3aWxsIHN0b3AgYW5kIHRoZSBmaW5hbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBwb2xsZXIgPSBteUNsaWVudC5tYWtlUG9sbGVyKCk7XG4gKiBjb25zdCBzdGF0ZTogTXlPcGVyYXRpb25TdGF0ZSA9IHBvbGxlci5nZXRPcGVyYXRpb25TdGF0ZSgpO1xuICpcbiAqIC8vIFRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IGNhbiBiZSBvYnRhaW5lZCBhdCBhbnkgdGltZS5cbiAqIGNvbnN0IHJlc3VsdDogTXlSZXN1bHQgfCB1bmRlZmluZWQgPSBwb2xsZXIuZ2V0UmVzdWx0KCk7XG4gKlxuICogLy8gVGhlIGZpbmFsIHJlc3VsdCBjYW4gb25seSBiZSBvYnRhaW5lZCBhZnRlciB0aGUgcG9sbGVyIGZpbmlzaGVzLlxuICogY29uc3QgcmVzdWx0OiBNeVJlc3VsdCA9IGF3YWl0IHBvbGxlci5wb2xsVW50aWxEb25lKCk7XG4gKiBgYGBcbiAqXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuZXhwb3J0IGNsYXNzIFBvbGxlciB7XG4gICAgLyoqXG4gICAgICogQSBwb2xsZXIgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgcGFzc2luZyBpbiBhdCBsZWFzdCB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiB0aGUgYFBvbGxPcGVyYXRpb248VFN0YXRlLCBUUmVzdWx0PmAuXG4gICAgICpcbiAgICAgKiBXaGVuIHdyaXRpbmcgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBQb2xsZXIsIHRoaXMgaW1wbGVtZW50YXRpb24gbmVlZHMgdG8gZGVhbCB3aXRoIHRoZSBpbml0aWFsaXphdGlvblxuICAgICAqIG9mIGFueSBjdXN0b20gc3RhdGUgYmV5b25kIHRoZSBiYXNpYyBkZWZpbml0aW9uIG9mIHRoZSBwb2xsZXIuIFRoZSBiYXNpYyBwb2xsZXIgYXNzdW1lcyB0aGF0IHRoZSBwb2xsZXInc1xuICAgICAqIG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQsIGF0IGxlYXN0IGl0cyBiYXNpYyBwcm9wZXJ0aWVzLiBUaGUgY29kZSBiZWxvdyBzaG93cyBob3cgdG8gYXBwcm9hY2hcbiAgICAgKiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RydWN0b3Igb2YgYSBuZXcgY3VzdG9tIHBvbGxlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZXhwb3J0IGNsYXNzIE15UG9sbGVyIGV4dGVuZHMgUG9sbGVyPE15T3BlcmF0aW9uU3RhdGUsIHN0cmluZz4ge1xuICAgICAqICAgY29uc3RydWN0b3Ioe1xuICAgICAqICAgICAvLyBBbnl0aGluZyB5b3UgbWlnaHQgbmVlZCBvdXRzaWRlIG9mIHRoZSBiYXNpY3NcbiAgICAgKiAgIH0pIHtcbiAgICAgKiAgICAgbGV0IHN0YXRlOiBNeU9wZXJhdGlvblN0YXRlID0ge1xuICAgICAqICAgICAgIHByaXZhdGVQcm9wZXJ0eTogcHJpdmF0ZSxcbiAgICAgKiAgICAgICBwdWJsaWNQcm9wZXJ0eTogcHVibGljLFxuICAgICAqICAgICB9O1xuICAgICAqXG4gICAgICogICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgKiAgICAgICBzdGF0ZSxcbiAgICAgKiAgICAgICB1cGRhdGUsXG4gICAgICogICAgICAgY2FuY2VsLFxuICAgICAqICAgICAgIHRvU3RyaW5nXG4gICAgICogICAgIH1cbiAgICAgKlxuICAgICAqICAgICAvLyBTZW5kaW5nIHRoZSBvcGVyYXRpb24gdG8gdGhlIHBhcmVudCdzIGNvbnN0cnVjdG9yLlxuICAgICAqICAgICBzdXBlcihvcGVyYXRpb24pO1xuICAgICAqXG4gICAgICogICAgIC8vIFlvdSBjYW4gYXNzaWduIG1vcmUgbG9jYWwgcHJvcGVydGllcyBoZXJlLlxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluc2lkZSBvZiB0aGlzIGNvbnN0cnVjdG9yLCBhIG5ldyBwcm9taXNlIGlzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSB1c2VkIHRvXG4gICAgICogdGVsbCB0aGUgdXNlciB3aGVuIHRoZSBwb2xsZXIgZmluaXNoZXMgKHNlZSBgcG9sbFVudGlsRG9uZSgpYCkuIFRoZSBwcm9taXNlJ3NcbiAgICAgKiByZXNvbHZlIGFuZCByZWplY3QgbWV0aG9kcyBhcmUgYWxzbyB1c2VkIGludGVybmFsbHkgdG8gY29udHJvbCB3aGVuIHRvIHJlc29sdmVcbiAgICAgKiBvciByZWplY3QgYW55b25lIHdhaXRpbmcgZm9yIHRoZSBwb2xsZXIgdG8gZmluaXNoLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIGEgcG9sbGVyIGlzIHdoZXJlIGFueSBzZXJpYWxpemVkIHZlcnNpb24gb2ZcbiAgICAgKiBhIHByZXZpb3VzIHBvbGxlcidzIG9wZXJhdGlvbiBzaG91bGQgYmUgZGVzZXJpYWxpemVkIGludG8gdGhlIG9wZXJhdGlvbiBzZW50IHRvIHRoZVxuICAgICAqIGJhc2UgY29uc3RydWN0b3IuIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBleHBvcnQgY2xhc3MgTXlQb2xsZXIgZXh0ZW5kcyBQb2xsZXI8TXlPcGVyYXRpb25TdGF0ZSwgc3RyaW5nPiB7XG4gICAgICogICBjb25zdHJ1Y3RvcihcbiAgICAgKiAgICAgYmFzZU9wZXJhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICogICApIHtcbiAgICAgKiAgICAgbGV0IHN0YXRlOiBNeU9wZXJhdGlvblN0YXRlID0ge307XG4gICAgICogICAgIGlmIChiYXNlT3BlcmF0aW9uKSB7XG4gICAgICogICAgICAgc3RhdGUgPSB7XG4gICAgICogICAgICAgICAuLi5KU09OLnBhcnNlKGJhc2VPcGVyYXRpb24pLnN0YXRlLFxuICAgICAqICAgICAgICAgLi4uc3RhdGVcbiAgICAgKiAgICAgICB9O1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgKiAgICAgICBzdGF0ZSxcbiAgICAgKiAgICAgICAvLyAuLi5cbiAgICAgKiAgICAgfVxuICAgICAqICAgICBzdXBlcihvcGVyYXRpb24pO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb24gLSBNdXN0IGNvbnRhaW4gdGhlIGJhc2ljIHByb3BlcnRpZXMgb2YgYFBvbGxPcGVyYXRpb248U3RhdGUsIFRSZXN1bHQ+YC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcGVyYXRpb24pIHtcbiAgICAgICAgLyoqIGNvbnRyb2xzIHdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQgb3Igd2FzIGNhbmNlbGVkLiAqL1xuICAgICAgICB0aGlzLnJlc29sdmVPblVuc3VjY2Vzc2Z1bCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBvbGxQcm9ncmVzc0NhbGxiYWNrcyA9IFtdO1xuICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbldhcm5pbmcgaW4gbm9kZS5qcyBmcm9tIGJlaW5nIHRocm93bi5cbiAgICAgICAgLy8gVGhlIGFib3ZlIHdhcm5pbmcgd291bGQgZ2V0IHRocm93biBpZiBgcG9sbGVyLnBvbGxgIGlzIGNhbGxlZCwgaXQgcmV0dXJucyBhbiBlcnJvcixcbiAgICAgICAgLy8gYW5kIHB1bGxVbnRpbERvbmUgZGlkIG5vdCBoYXZlIGEgLmNhdGNoIG9yIGF3YWl0IHRyeS9jYXRjaCBvbiBpdCdzIHJldHVybiB2YWx1ZS5cbiAgICAgICAgdGhpcy5wcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIC8qIGludGVudGlvbmFsbHkgYmxhbmsgKi9cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIGxvb3AgdGhhdCB3aWxsIGJyZWFrIG9ubHkgaWYgdGhlIHBvbGxlciBpcyBkb25lXG4gICAgICogb3IgaWYgdGhlIHBvbGxlciBpcyBzdG9wcGVkLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0UG9sbGluZyhwb2xsT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghdGhpcy5pc1N0b3BwZWQoKSAmJiAhdGhpcy5pc0RvbmUoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2xsKHBvbGxPcHRpb25zKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBwb2xsT25jZSBkb2VzIG9uZSBwb2xsaW5nLCBieSBjYWxsaW5nIHRvIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nXG4gICAgICogcG9sbCBvcGVyYXRpb24gdG8gbWFrZSBhbnkgcmVsZXZhbnQgY2hhbmdlIGVmZmVjdGl2ZS5cbiAgICAgKlxuICAgICAqIEl0IG9ubHkgb3B0aW9uYWxseSByZWNlaXZlcyBhbiBvYmplY3Qgd2l0aCBhbiBhYm9ydFNpZ25hbCBwcm9wZXJ0eSwgZnJvbSBcXEBhenVyZS9hYm9ydC1jb250cm9sbGVyJ3MgQWJvcnRTaWduYWxMaWtlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgb3BlcmF0aW9uJ3MgdXBkYXRlIG1ldGhvZC5cbiAgICAgKi9cbiAgICBhc3luYyBwb2xsT25jZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IGF3YWl0IHRoaXMub3BlcmF0aW9uLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgZmlyZVByb2dyZXNzOiB0aGlzLmZpcmVQcm9ncmVzcy5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlZFN0YXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGZpcmVQcm9ncmVzcyBjYWxscyB0aGUgZnVuY3Rpb25zIHBhc3NlZCBpbiB2aWEgb25Qcm9ncmVzcyB0aGUgbWV0aG9kIG9mIHRoZSBwb2xsZXIuXG4gICAgICpcbiAgICAgKiBJdCBsb29wcyBvdmVyIGFsbCBvZiB0aGUgY2FsbGJhY2tzIHJlY2VpdmVkIGZyb20gb25Qcm9ncmVzcywgYW5kIGV4ZWN1dGVzIHRoZW0sIHNlbmRpbmcgdGhlbVxuICAgICAqIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBjdXJyZW50IG9wZXJhdGlvbiBzdGF0ZS5cbiAgICAgKi9cbiAgICBmaXJlUHJvZ3Jlc3Moc3RhdGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLnBvbGxQcm9ncmVzc0NhbGxiYWNrcykge1xuICAgICAgICAgICAgY2FsbGJhY2soc3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uJ3MgY2FuY2VsIG1ldGhvZC5cbiAgICAgKi9cbiAgICBhc3luYyBjYW5jZWxPbmNlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IGF3YWl0IHRoaXMub3BlcmF0aW9uLmNhbmNlbChvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgb25jZSBhIHNpbmdsZSBwb2xsaW5nIHJlcXVlc3QgZmluaXNoZXMuXG4gICAgICogSXQgZG9lcyB0aGlzIGJ5IGNhbGxpbmcgdGhlIHVwZGF0ZSBtZXRob2Qgb2YgdGhlIFBvbGxlcidzIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEl0IG9ubHkgb3B0aW9uYWxseSByZWNlaXZlcyBhbiBvYmplY3Qgd2l0aCBhbiBhYm9ydFNpZ25hbCBwcm9wZXJ0eSwgZnJvbSBcXEBhenVyZS9hYm9ydC1jb250cm9sbGVyJ3MgQWJvcnRTaWduYWxMaWtlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgb3BlcmF0aW9uJ3MgdXBkYXRlIG1ldGhvZC5cbiAgICAgKi9cbiAgICBwb2xsKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMucG9sbE9uY2VQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLnBvbGxPbmNlUHJvbWlzZSA9IHRoaXMucG9sbE9uY2Uob3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBjbGVhclBvbGxPbmNlUHJvbWlzZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvbGxPbmNlUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnBvbGxPbmNlUHJvbWlzZS50aGVuKGNsZWFyUG9sbE9uY2VQcm9taXNlLCBjbGVhclBvbGxPbmNlUHJvbWlzZSkuY2F0Y2godGhpcy5yZWplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBvbGxPbmNlUHJvbWlzZTtcbiAgICB9XG4gICAgcHJvY2Vzc1VwZGF0ZWRTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uLnN0YXRlLmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc29sdmVPblVuc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KHRoaXMub3BlcmF0aW9uLnN0YXRlLmVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm9wZXJhdGlvbi5zdGF0ZS5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24uc3RhdGUuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZU9uVW5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUG9sbGVyQ2FuY2VsbGVkRXJyb3IoXCJPcGVyYXRpb24gd2FzIGNhbmNlbGVkXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RvbmUoKSAmJiB0aGlzLnJlc29sdmUpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBwb2xsZXIgaGFzIGZpbmlzaGVkIHBvbGxpbmcsIHRoaXMgbWVhbnMgd2Ugbm93IGhhdmUgYSByZXN1bHQuXG4gICAgICAgICAgICAvLyBIb3dldmVyLCBpdCBjYW4gYmUgdGhlIGNhc2UgdGhhdCBUUmVzdWx0IGlzIGluc3RhbnRpYXRlZCB0byB2b2lkLCBzb1xuICAgICAgICAgICAgLy8gd2UgYXJlIG5vdCBleHBlY3RpbmcgYSByZXN1bHQgYW55d2F5LiBUbyBhc3NlcnQgdGhhdCB3ZSBtaWdodCBub3RcbiAgICAgICAgICAgIC8vIGhhdmUgYSByZXN1bHQgZXZlbnR1YWxseSBhZnRlciBmaW5pc2hpbmcgcG9sbGluZywgd2UgY2FzdCB0aGUgcmVzdWx0XG4gICAgICAgICAgICAvLyB0byBUUmVzdWx0LlxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKHRoaXMuZ2V0UmVzdWx0KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIG9uY2UgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBwb2xsVW50aWxEb25lKHBvbGxPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFBvbGxpbmcocG9sbE9wdGlvbnMpLmNhdGNoKHRoaXMucmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBzdGF0ZSBjb3VsZCBoYXZlIGJlZW4gdXBkYXRlZCBieVxuICAgICAgICAvLyBgY2FuY2VsT3BlcmF0aW9uYCwgZS5nLiB0aGUgb3BlcmF0aW9uIGlzIGNhbmNlbGVkIG9yIGFuIGVycm9yIG9jY3VycmVkLlxuICAgICAgICB0aGlzLnByb2Nlc3NVcGRhdGVkU3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgYWZ0ZXIgZWFjaCBwb2xsaW5nIGlzIGNvbXBsZXRlZCxcbiAgICAgKiBzZW5kaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb2xsZXIncyBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBJdCByZXR1cm5zIGEgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcCByZWNlaXZpbmcgdXBkYXRlcyBvbiB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICovXG4gICAgb25Qcm9ncmVzcyhjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBvbGxQcm9ncmVzc0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucG9sbFByb2dyZXNzQ2FsbGJhY2tzID0gdGhpcy5wb2xsUHJvZ3Jlc3NDYWxsYmFja3MuZmlsdGVyKChjKSA9PiBjICE9PSBjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9sbGVyIGhhcyBmaW5pc2hlZCBwb2xsaW5nLlxuICAgICAqL1xuICAgIGlzRG9uZSgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLm9wZXJhdGlvbi5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oc3RhdGUuaXNDb21wbGV0ZWQgfHwgc3RhdGUuaXNDYW5jZWxsZWQgfHwgc3RhdGUuZXJyb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgcG9sbGVyIGZyb20gY29udGludWluZyB0byBwb2xsLlxuICAgICAqL1xuICAgIHN0b3BQb2xsaW5nKCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KG5ldyBQb2xsZXJTdG9wcGVkRXJyb3IoXCJUaGlzIHBvbGxlciBpcyBhbHJlYWR5IHN0b3BwZWRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9sbGVyIGlzIHN0b3BwZWQuXG4gICAgICovXG4gICAgaXNTdG9wcGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9wcGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBjYW5jZWwgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogSXQgb25seSBvcHRpb25hbGx5IHJlY2VpdmVzIGFuIG9iamVjdCB3aXRoIGFuIGFib3J0U2lnbmFsIHByb3BlcnR5LCBmcm9tIFxcQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXIncyBBYm9ydFNpZ25hbExpa2UuXG4gICAgICpcbiAgICAgKiBJZiBpdCdzIGNhbGxlZCBhZ2FpbiBiZWZvcmUgaXQgZmluaXNoZXMsIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHByb3BlcnRpZXMgcGFzc2VkIHRvIHRoZSBvcGVyYXRpb24ncyB1cGRhdGUgbWV0aG9kLlxuICAgICAqL1xuICAgIGNhbmNlbE9wZXJhdGlvbihvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsUHJvbWlzZSA9IHRoaXMuY2FuY2VsT25jZShvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLmFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNhbmNlbCByZXF1ZXN0IGlzIGN1cnJlbnRseSBwZW5kaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbFByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBFdmVuIHRob3VnaCBUU3RhdGUgd2lsbCBiZSB0aGUgc2FtZSB0eXBlIGluc2lkZSBhbnkgb2YgdGhlIG1ldGhvZHMgb2YgYW55IGV4dGVuc2lvbiBvZiB0aGUgUG9sbGVyIGNsYXNzLFxuICAgICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcG9sbGVycyBjYW4gY3VzdG9taXplIHdoYXQncyBzaGFyZWQgd2l0aCB0aGUgcHVibGljIGJ5IHdyaXRpbmcgdGhlaXIgb3duXG4gICAgICogdmVyc2lvbiBvZiB0aGUgYGdldE9wZXJhdGlvblN0YXRlYCBtZXRob2QsIGFuZCBieSBkZWZpbmluZyB0d28gdHlwZXMsIG9uZSByZXByZXNlbnRpbmcgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBwb2xsZXJcbiAgICAgKiBhbmQgYSBwdWJsaWMgdHlwZSByZXByZXNlbnRpbmcgYSBzYWZlIHRvIHNoYXJlIHN1YnNldCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgaW50ZXJuYWwgc3RhdGUuXG4gICAgICogVGhlaXIgZGVmaW5pdGlvbiBvZiBnZXRPcGVyYXRpb25TdGF0ZSBjYW4gdGhlbiByZXR1cm4gdGhlaXIgcHVibGljIHR5cGUuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiAvLyBMZXQncyBzYXkgd2UgaGF2ZSBvdXIgcG9sbGVyJ3Mgb3BlcmF0aW9uIHN0YXRlIGRlZmluZWQgYXM6XG4gICAgICogaW50ZXJmYWNlIE15T3BlcmF0aW9uU3RhdGUgZXh0ZW5kcyBQb2xsT3BlcmF0aW9uU3RhdGU8UmVzdWx0VHlwZT4ge1xuICAgICAqICAgcHJpdmF0ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgICAqICAgcHVibGljUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gVG8gYWxsb3cgdXMgdG8gaGF2ZSBhIHRydWUgc2VwYXJhdGlvbiBvZiBwdWJsaWMgYW5kIHByaXZhdGUgc3RhdGUsIHdlIGhhdmUgdG8gZGVmaW5lIGFub3RoZXIgaW50ZXJmYWNlOlxuICAgICAqIGludGVyZmFjZSBQdWJsaWNTdGF0ZSBleHRlbmRzIFBvbGxPcGVyYXRpb25TdGF0ZTxSZXN1bHRUeXBlPiB7XG4gICAgICogICBwdWJsaWNQcm9wZXJ0eT86IHN0cmluZztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGVuLCB3ZSBkZWZpbmUgb3VyIFBvbGxlciBhcyBmb2xsb3dzOlxuICAgICAqIGV4cG9ydCBjbGFzcyBNeVBvbGxlciBleHRlbmRzIFBvbGxlcjxNeU9wZXJhdGlvblN0YXRlLCBSZXN1bHRUeXBlPiB7XG4gICAgICogICAvLyAuLi4gTW9yZSBjb250ZW50IGlzIG5lZWRlZCBoZXJlIC4uLlxuICAgICAqXG4gICAgICogICBwdWJsaWMgZ2V0T3BlcmF0aW9uU3RhdGUoKTogUHVibGljU3RhdGUge1xuICAgICAqICAgICBjb25zdCBzdGF0ZTogUHVibGljU3RhdGUgPSB0aGlzLm9wZXJhdGlvbi5zdGF0ZTtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICAvLyBQcm9wZXJ0aWVzIGZyb20gUG9sbE9wZXJhdGlvblN0YXRlPFRSZXN1bHQ+XG4gICAgICogICAgICAgaXNTdGFydGVkOiBzdGF0ZS5pc1N0YXJ0ZWQsXG4gICAgICogICAgICAgaXNDb21wbGV0ZWQ6IHN0YXRlLmlzQ29tcGxldGVkLFxuICAgICAqICAgICAgIGlzQ2FuY2VsbGVkOiBzdGF0ZS5pc0NhbmNlbGxlZCxcbiAgICAgKiAgICAgICBlcnJvcjogc3RhdGUuZXJyb3IsXG4gICAgICogICAgICAgcmVzdWx0OiBzdGF0ZS5yZXN1bHQsXG4gICAgICpcbiAgICAgKiAgICAgICAvLyBUaGUgb25seSBvdGhlciBwcm9wZXJ0eSBuZWVkZWQgYnkgUHVibGljU3RhdGUuXG4gICAgICogICAgICAgcHVibGljUHJvcGVydHk6IHN0YXRlLnB1YmxpY1Byb3BlcnR5XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHNlZSB0aGlzIGluIHRoZSB0ZXN0cyBvZiB0aGlzIHJlcG9zaXRvcnksIGdvIHRvIHRoZSBmaWxlOlxuICAgICAqIGAuLi90ZXN0L3V0aWxzL3Rlc3RQb2xsZXIudHNgXG4gICAgICogYW5kIGxvb2sgZm9yIHRoZSBnZXRPcGVyYXRpb25TdGF0ZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKi9cbiAgICBnZXRPcGVyYXRpb25TdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uLnN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgdmFsdWUgb2YgdGhlIG9wZXJhdGlvbixcbiAgICAgKiByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiB0aGUgcG9sbGVyLlxuICAgICAqIEl0IGNhbiByZXR1cm4gdW5kZWZpbmVkIG9yIGFuIGluY29tcGxldGUgZm9ybSBvZiB0aGUgZmluYWwgVFJlc3VsdCB2YWx1ZVxuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24uXG4gICAgICovXG4gICAgZ2V0UmVzdWx0KCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMub3BlcmF0aW9uLnN0YXRlO1xuICAgICAgICByZXR1cm4gc3RhdGUucmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBwb2xsZXIncyBvcGVyYXRpb25cbiAgICAgKiBieSBpbnZva2luZyB0aGUgb3BlcmF0aW9uJ3MgdG9TdHJpbmcgbWV0aG9kLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb24udG9TdHJpbmcoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBHZW5lcmljUG9sbE9wZXJhdGlvbiB9IGZyb20gXCIuL29wZXJhdGlvbi5qc1wiO1xuaW1wb3J0IHsgUE9MTF9JTlRFUlZBTF9JTl9NUyB9IGZyb20gXCIuLi8uLi9wb2xsZXIvY29uc3RhbnRzLmpzXCI7XG5pbXBvcnQgeyBQb2xsZXIgfSBmcm9tIFwiLi4vcG9sbGVyLmpzXCI7XG5pbXBvcnQgeyBkZXNlcmlhbGl6ZVN0YXRlIH0gZnJvbSBcIi4uLy4uL3BvbGxlci9vcGVyYXRpb24uanNcIjtcbi8qKlxuICogVGhlIExSTyBFbmdpbmUsIGEgY2xhc3MgdGhhdCBwZXJmb3JtcyBwb2xsaW5nLlxuICovXG5leHBvcnQgY2xhc3MgTHJvRW5naW5lIGV4dGVuZHMgUG9sbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihscm8sIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBpbnRlcnZhbEluTXMgPSBQT0xMX0lOVEVSVkFMX0lOX01TLCByZXN1bWVGcm9tLCByZXNvbHZlT25VbnN1Y2Nlc3NmdWwgPSBmYWxzZSwgaXNEb25lLCBscm9SZXNvdXJjZUxvY2F0aW9uQ29uZmlnLCBwcm9jZXNzUmVzdWx0LCB1cGRhdGVTdGF0ZSwgfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHN0YXRlID0gcmVzdW1lRnJvbVxuICAgICAgICAgICAgPyBkZXNlcmlhbGl6ZVN0YXRlKHJlc3VtZUZyb20pXG4gICAgICAgICAgICA6IHt9O1xuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBuZXcgR2VuZXJpY1BvbGxPcGVyYXRpb24oc3RhdGUsIGxybywgIXJlc29sdmVPblVuc3VjY2Vzc2Z1bCwgbHJvUmVzb3VyY2VMb2NhdGlvbkNvbmZpZywgcHJvY2Vzc1Jlc3VsdCwgdXBkYXRlU3RhdGUsIGlzRG9uZSk7XG4gICAgICAgIHN1cGVyKG9wZXJhdGlvbik7XG4gICAgICAgIHRoaXMucmVzb2x2ZU9uVW5zdWNjZXNzZnVsID0gcmVzb2x2ZU9uVW5zdWNjZXNzZnVsO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHsgaW50ZXJ2YWxJbk1zOiBpbnRlcnZhbEluTXMgfTtcbiAgICAgICAgb3BlcmF0aW9uLnNldFBvbGxlckNvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRob2QgdXNlZCBieSB0aGUgcG9sbGVyIHRvIHdhaXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXBkYXRlIGl0cyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgZGVsYXkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIHRoaXMuY29uZmlnLmludGVydmFsSW5NcykpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxyb0VuZ2luZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmV4cG9ydCB7IExyb0VuZ2luZSB9IGZyb20gXCIuL2xyb0VuZ2luZS5qc1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5leHBvcnQgeyBjcmVhdGVIdHRwUG9sbGVyIH0gZnJvbSBcIi4vaHR0cC9wb2xsZXIuanNcIjtcbi8qKlxuICogVGhpcyBjYW4gYmUgdW5jb21tZW50ZWQgdG8gZXhwb3NlIHRoZSBwcm90b2NvbC1hZ25vc3RpYyBwb2xsZXJcbiAqL1xuLy8gZXhwb3J0IHtcbi8vICAgQnVpbGRDcmVhdGVQb2xsZXJPcHRpb25zLFxuLy8gICBPcGVyYXRpb24sXG4vLyAgIENyZWF0ZVBvbGxlck9wdGlvbnMsXG4vLyAgIE9wZXJhdGlvbkNvbmZpZyxcbi8vICAgUmVzdG9yYWJsZU9wZXJhdGlvblN0YXRlLFxuLy8gfSBmcm9tIFwiLi9wb2xsZXIvbW9kZWxzXCI7XG4vLyBleHBvcnQgeyBidWlsZENyZWF0ZVBvbGxlciB9IGZyb20gXCIuL3BvbGxlci9wb2xsZXJcIjtcbi8qKiBsZWdhY3kgKi9cbmV4cG9ydCAqIGZyb20gXCIuL2xlZ2FjeS9scm9FbmdpbmUvaW5kZXguanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xlZ2FjeS9wb2xsZXIuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xlZ2FjeS9wb2xsT3BlcmF0aW9uLmpzXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IFBvbGxlciB9IGZyb20gXCJAYXp1cmUvY29yZS1scm9cIjtcbi8qKlxuICogVGhpcyBpcyB0aGUgcG9sbGVyIHJldHVybmVkIGJ5IHtAbGluayBCbG9iQ2xpZW50LmJlZ2luQ29weUZyb21VUkx9LlxuICogVGhpcyBjYW4gbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseSBvdXRzaWRlIG9mIHRoaXMgcGFja2FnZS5cbiAqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iQmVnaW5Db3B5RnJvbVVybFBvbGxlciBleHRlbmRzIFBvbGxlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGJsb2JDbGllbnQsIGNvcHlTb3VyY2UsIGludGVydmFsSW5NcyA9IDE1MDAwLCBvblByb2dyZXNzLCByZXN1bWVGcm9tLCBzdGFydENvcHlGcm9tVVJMT3B0aW9ucywgfSA9IG9wdGlvbnM7XG4gICAgICAgIGxldCBzdGF0ZTtcbiAgICAgICAgaWYgKHJlc3VtZUZyb20pIHtcbiAgICAgICAgICAgIHN0YXRlID0gSlNPTi5wYXJzZShyZXN1bWVGcm9tKS5zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBtYWtlQmxvYkJlZ2luQ29weUZyb21VUkxQb2xsT3BlcmF0aW9uKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGJsb2JDbGllbnQsXG4gICAgICAgICAgICBjb3B5U291cmNlLFxuICAgICAgICAgICAgc3RhcnRDb3B5RnJvbVVSTE9wdGlvbnMgfSkpO1xuICAgICAgICBzdXBlcihvcGVyYXRpb24pO1xuICAgICAgICBpZiAodHlwZW9mIG9uUHJvZ3Jlc3MgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzKG9uUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJ2YWxJbk1zID0gaW50ZXJ2YWxJbk1zO1xuICAgIH1cbiAgICBkZWxheSgpIHtcbiAgICAgICAgcmV0dXJuIGRlbGF5KHRoaXMuaW50ZXJ2YWxJbk1zKTtcbiAgICB9XG59XG4vKipcbiAqIE5vdGU6IEludGVudGlvbmFsbHkgdXNpbmcgZnVuY3Rpb24gZXhwcmVzc2lvbiBvdmVyIGFycm93IGZ1bmN0aW9uIGV4cHJlc3Npb25cbiAqIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbiBiZSBpbnZva2VkIHdpdGggYSBkaWZmZXJlbnQgY29udGV4dC5cbiAqIFRoaXMgYWZmZWN0cyB3aGF0IGB0aGlzYCByZWZlcnMgdG8uXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGNhbmNlbCA9IGFzeW5jIGZ1bmN0aW9uIGNhbmNlbChvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBjb3B5SWQgfSA9IHN0YXRlO1xuICAgIGlmIChzdGF0ZS5pc0NvbXBsZXRlZCkge1xuICAgICAgICByZXR1cm4gbWFrZUJsb2JCZWdpbkNvcHlGcm9tVVJMUG9sbE9wZXJhdGlvbihzdGF0ZSk7XG4gICAgfVxuICAgIGlmICghY29weUlkKSB7XG4gICAgICAgIHN0YXRlLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG1ha2VCbG9iQmVnaW5Db3B5RnJvbVVSTFBvbGxPcGVyYXRpb24oc3RhdGUpO1xuICAgIH1cbiAgICAvLyBpZiBhYm9ydENvcHlGcm9tVVJMIHRocm93cywgaXQgd2lsbCBidWJibGUgdXAgdG8gdXNlcidzIHBvbGxlci5jYW5jZWxPcGVyYXRpb24gY2FsbFxuICAgIGF3YWl0IHN0YXRlLmJsb2JDbGllbnQuYWJvcnRDb3B5RnJvbVVSTChjb3B5SWQsIHtcbiAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgfSk7XG4gICAgc3RhdGUuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgIHJldHVybiBtYWtlQmxvYkJlZ2luQ29weUZyb21VUkxQb2xsT3BlcmF0aW9uKHN0YXRlKTtcbn07XG4vKipcbiAqIE5vdGU6IEludGVudGlvbmFsbHkgdXNpbmcgZnVuY3Rpb24gZXhwcmVzc2lvbiBvdmVyIGFycm93IGZ1bmN0aW9uIGV4cHJlc3Npb25cbiAqIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbiBiZSBpbnZva2VkIHdpdGggYSBkaWZmZXJlbnQgY29udGV4dC5cbiAqIFRoaXMgYWZmZWN0cyB3aGF0IGB0aGlzYCByZWZlcnMgdG8uXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IHVwZGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBibG9iQ2xpZW50LCBjb3B5U291cmNlLCBzdGFydENvcHlGcm9tVVJMT3B0aW9ucyB9ID0gc3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5pc1N0YXJ0ZWQpIHtcbiAgICAgICAgc3RhdGUuaXNTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmxvYkNsaWVudC5zdGFydENvcHlGcm9tVVJMKGNvcHlTb3VyY2UsIHN0YXJ0Q29weUZyb21VUkxPcHRpb25zKTtcbiAgICAgICAgLy8gY29weUlkIGlzIG5lZWRlZCB0byBhYm9ydFxuICAgICAgICBzdGF0ZS5jb3B5SWQgPSByZXN1bHQuY29weUlkO1xuICAgICAgICBpZiAocmVzdWx0LmNvcHlTdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICBzdGF0ZS5pc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoIXN0YXRlLmlzQ29tcGxldGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGF0ZS5ibG9iQ2xpZW50LmdldFByb3BlcnRpZXMoeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgICAgIGNvbnN0IHsgY29weVN0YXR1cywgY29weVByb2dyZXNzIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2Q29weVByb2dyZXNzID0gc3RhdGUuY29weVByb2dyZXNzO1xuICAgICAgICAgICAgaWYgKGNvcHlQcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIHN0YXRlLmNvcHlQcm9ncmVzcyA9IGNvcHlQcm9ncmVzcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3B5U3RhdHVzID09PSBcInBlbmRpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcyAhPT0gcHJldkNvcHlQcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmZpcmVQcm9ncmVzcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBpbiBzZXRUaW1lb3V0LCBvciBzd2FsbG93IGVycm9yP1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlyZVByb2dyZXNzKHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvcHlTdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIHN0YXRlLmlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvcHlTdGF0dXMgPT09IFwiZmFpbGVkXCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvciA9IG5ldyBFcnJvcihgQmxvYiBjb3B5IGZhaWxlZCB3aXRoIHJlYXNvbjogXCIke3Jlc3VsdC5jb3B5U3RhdHVzRGVzY3JpcHRpb24gfHwgXCJ1bmtub3duXCJ9XCJgKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5pc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICBzdGF0ZS5pc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1ha2VCbG9iQmVnaW5Db3B5RnJvbVVSTFBvbGxPcGVyYXRpb24oc3RhdGUpO1xufTtcbi8qKlxuICogTm90ZTogSW50ZW50aW9uYWxseSB1c2luZyBmdW5jdGlvbiBleHByZXNzaW9uIG92ZXIgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvblxuICogc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgd2l0aCBhIGRpZmZlcmVudCBjb250ZXh0LlxuICogVGhpcyBhZmZlY3RzIHdoYXQgYHRoaXNgIHJlZmVycyB0by5cbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgdG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBzdGF0ZTogdGhpcy5zdGF0ZSB9LCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAvLyByZW1vdmUgYmxvYkNsaWVudCBmcm9tIHNlcmlhbGl6ZWQgc3RhdGUgc2luY2UgYSBjbGllbnQgY2FuJ3QgYmUgaHlkcmF0ZWQgZnJvbSB0aGlzIGluZm8uXG4gICAgICAgIGlmIChrZXkgPT09IFwiYmxvYkNsaWVudFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbn07XG4vKipcbiAqIENyZWF0ZXMgYSBwb2xsIG9wZXJhdGlvbiBnaXZlbiB0aGUgcHJvdmlkZWQgc3RhdGUuXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIG1ha2VCbG9iQmVnaW5Db3B5RnJvbVVSTFBvbGxPcGVyYXRpb24oc3RhdGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGF0ZTogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLFxuICAgICAgICBjYW5jZWwsXG4gICAgICAgIHRvU3RyaW5nLFxuICAgICAgICB1cGRhdGUsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJsb2JTdGFydENvcHlGcm9tVXJsUG9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJhbmdlIHN0cmluZy4gRm9yIGV4YW1wbGU6XG4gKlxuICogXCJieXRlcz0yNTUtXCIgb3IgXCJieXRlcz0wLTUxMVwiXG4gKlxuICogQHBhcmFtIGlSYW5nZSAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZVRvU3RyaW5nKGlSYW5nZSkge1xuICAgIGlmIChpUmFuZ2Uub2Zmc2V0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUmFuZ2Uub2Zmc2V0IGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMC5gKTtcbiAgICB9XG4gICAgaWYgKGlSYW5nZS5jb3VudCAmJiBpUmFuZ2UuY291bnQgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUmFuZ2UuY291bnQgbXVzdCBiZSBsYXJnZXIgdGhhbiAwLiBMZWF2ZSBpdCB1bmRlZmluZWQgaWYgeW91IHdhbnQgYSByYW5nZSBmcm9tIG9mZnNldCB0byB0aGUgZW5kLmApO1xuICAgIH1cbiAgICByZXR1cm4gaVJhbmdlLmNvdW50XG4gICAgICAgID8gYGJ5dGVzPSR7aVJhbmdlLm9mZnNldH0tJHtpUmFuZ2Uub2Zmc2V0ICsgaVJhbmdlLmNvdW50IC0gMX1gXG4gICAgICAgIDogYGJ5dGVzPSR7aVJhbmdlLm9mZnNldH0tYDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmdlLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLy8gSW4gYnJvd3NlciwgZHVyaW5nIHdlYnBhY2sgb3IgYnJvd3NlcmlmeSBidW5kbGluZywgdGhpcyBtb2R1bGUgd2lsbCBiZSByZXBsYWNlZCBieSAnZXZlbnRzJ1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL0dvemFsYS9ldmVudHNcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIjtcbi8qKlxuICogU3RhdGVzIGZvciBCYXRjaC5cbiAqL1xudmFyIEJhdGNoU3RhdGVzO1xuKGZ1bmN0aW9uIChCYXRjaFN0YXRlcykge1xuICAgIEJhdGNoU3RhdGVzW0JhdGNoU3RhdGVzW1wiR29vZFwiXSA9IDBdID0gXCJHb29kXCI7XG4gICAgQmF0Y2hTdGF0ZXNbQmF0Y2hTdGF0ZXNbXCJFcnJvclwiXSA9IDFdID0gXCJFcnJvclwiO1xufSkoQmF0Y2hTdGF0ZXMgfHwgKEJhdGNoU3RhdGVzID0ge30pKTtcbi8qKlxuICogQmF0Y2ggcHJvdmlkZXMgYmFzaWMgcGFyYWxsZWwgZXhlY3V0aW9uIHdpdGggY29uY3VycmVuY3kgbGltaXRzLlxuICogV2lsbCBzdG9wIGV4ZWN1dGUgbGVmdCBvcGVyYXRpb25zIHdoZW4gb25lIG9mIHRoZSBleGVjdXRlZCBvcGVyYXRpb24gdGhyb3dzIGFuIGVycm9yLlxuICogQnV0IEJhdGNoIGNhbm5vdCBjYW5jZWwgb25nb2luZyBvcGVyYXRpb25zLCB5b3UgbmVlZCB0byBjYW5jZWwgdGhlbSBieSB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhdGNoIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJhdGNoLlxuICAgICAqIEBwYXJhbSBjb25jdXJyZW5jeSAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uY3VycmVuY3kgPSA1KSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOdW1iZXIgb2YgYWN0aXZlIG9wZXJhdGlvbnMgdW5kZXIgZXhlY3V0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3RpdmVzID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE51bWJlciBvZiBjb21wbGV0ZWQgb3BlcmF0aW9ucyB1bmRlciBleGVjdXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPZmZzZXQgb2YgbmV4dCBvcGVyYXRpb24gdG8gYmUgZXhlY3V0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcGVyYXRpb24gYXJyYXkgdG8gYmUgZXhlY3V0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN0YXRlcyBvZiBCYXRjaC4gV2hlbiBhbiBlcnJvciBoYXBwZW5zLCBzdGF0ZSB3aWxsIHR1cm4gaW50byBlcnJvci5cbiAgICAgICAgICogQmF0Y2ggd2lsbCBzdG9wIGV4ZWN1dGUgbGVmdCBvcGVyYXRpb25zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGF0ZSA9IEJhdGNoU3RhdGVzLkdvb2Q7XG4gICAgICAgIGlmIChjb25jdXJyZW5jeSA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiY29uY3VycmVuY3kgbXVzdCBiZSBsYXJnZXIgdGhhbiAwXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBvcGVyYXRpb24gaW50byBxdWV1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb24gLVxuICAgICAqL1xuICAgIGFkZE9wZXJhdGlvbihvcGVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZXMrKztcbiAgICAgICAgICAgICAgICBhd2FpdCBvcGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZXMtLTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlZCsrO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyYWxsZWxFeGVjdXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGV4ZWN1dGUgb3BlcmF0aW9ucyBpbiB0aGUgcXVldWUuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBkbygpIHtcbiAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmFsbGVsRXhlY3V0ZSgpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLm9uKFwiZmluaXNoXCIsIHJlc29sdmUpO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEJhdGNoU3RhdGVzLkVycm9yO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBuZXh0IG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZC4gUmV0dXJuIG51bGwgd2hlbiByZWFjaGluZyBlbmRzLlxuICAgICAqXG4gICAgICovXG4gICAgbmV4dE9wZXJhdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0IDwgdGhpcy5vcGVyYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uc1t0aGlzLm9mZnNldCsrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgZXhlY3V0ZSBvcGVyYXRpb25zLiBPbmUgb25lIHRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlIGJldHdlZW5cbiAgICAgKiB0aGlzIG1ldGhvZCB3aXRoIGRvKCkgaXMgdGhhdCBkbygpIHdyYXBzIGFzIGFuIHN5bmMgbWV0aG9kLlxuICAgICAqXG4gICAgICovXG4gICAgcGFyYWxsZWxFeGVjdXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQmF0Y2hTdGF0ZXMuRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb21wbGV0ZWQgPj0gdGhpcy5vcGVyYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJmaW5pc2hcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuYWN0aXZlcyA8IHRoaXMuY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMubmV4dE9wZXJhdGlvbigpO1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbikge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2guanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbi8qKlxuICogVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYSByZWFkYWJsZSBzdHJlYW0gZnJvbSB0aGUgZGF0YSBpbiBhbiBhcnJheSBvZiBidWZmZXJzLlxuICovXG5leHBvcnQgY2xhc3MgQnVmZmVyc1N0cmVhbSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJ1ZmZlcnNTdHJlYW0gdGhhdCB3aWxsIGVtaXQgdGhlIGRhdGFcbiAgICAgKiBjb250YWluZWQgaW4gdGhlIGFycmF5IG9mIGJ1ZmZlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVmZmVycyAtIEFycmF5IG9mIGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgZGF0YVxuICAgICAqIEBwYXJhbSBieXRlTGVuZ3RoIC0gVGhlIHRvdGFsIGxlbmd0aCBvZiBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgYnVmZmVyc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcnMsIGJ5dGVMZW5ndGgsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYnVmZmVycyA9IGJ1ZmZlcnM7XG4gICAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlciA9IDA7XG4gICAgICAgIHRoaXMuYnVmZmVySW5kZXggPSAwO1xuICAgICAgICB0aGlzLnB1c2hlZEJ5dGVzTGVuZ3RoID0gMDtcbiAgICAgICAgLy8gY2hlY2sgYnl0ZUxlbmd0aCBpcyBubyBsYXJnZXIgdGhhbiBidWZmZXJzW10gdG90YWwgbGVuZ3RoXG4gICAgICAgIGxldCBidWZmZXJzTGVuZ3RoID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBidWYgb2YgdGhpcy5idWZmZXJzKSB7XG4gICAgICAgICAgICBidWZmZXJzTGVuZ3RoICs9IGJ1Zi5ieXRlTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmZXJzTGVuZ3RoIDwgdGhpcy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhIHNpemUgc2hvdWxkbid0IGJlIGxhcmdlciB0aGFuIHRoZSB0b3RhbCBsZW5ndGggb2YgYnVmZmVycy5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgX3JlYWQoKSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSB3YW50cyB0byBwdWxsIG1vcmUgZGF0YSBpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIC0gT3B0aW9uYWwuIFRoZSBzaXplIG9mIGRhdGEgdG8gYmUgcmVhZFxuICAgICAqL1xuICAgIF9yZWFkKHNpemUpIHtcbiAgICAgICAgaWYgKHRoaXMucHVzaGVkQnl0ZXNMZW5ndGggPj0gdGhpcy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaXplKSB7XG4gICAgICAgICAgICBzaXplID0gdGhpcy5yZWFkYWJsZUhpZ2hXYXRlck1hcms7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0QnVmZmVycyA9IFtdO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgc2l6ZSAmJiB0aGlzLnB1c2hlZEJ5dGVzTGVuZ3RoIDwgdGhpcy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBUaGUgbGFzdCBidWZmZXIgbWF5IGJlIGxvbmdlciB0aGFuIHRoZSBkYXRhIGl0IGNvbnRhaW5zLlxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nRGF0YUluQWxsQnVmZmVycyA9IHRoaXMuYnl0ZUxlbmd0aCAtIHRoaXMucHVzaGVkQnl0ZXNMZW5ndGg7XG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdDYXBhY2l0eUluVGhpc0J1ZmZlciA9IHRoaXMuYnVmZmVyc1t0aGlzLmJ1ZmZlckluZGV4XS5ieXRlTGVuZ3RoIC0gdGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyO1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gTWF0aC5taW4ocmVtYWluaW5nQ2FwYWNpdHlJblRoaXNCdWZmZXIsIHJlbWFpbmluZ0RhdGFJbkFsbEJ1ZmZlcnMpO1xuICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+IHNpemUgLSBpKSB7XG4gICAgICAgICAgICAgICAgLy8gY2h1bmtTaXplID0gc2l6ZSAtIGlcbiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXIgKyBzaXplIC0gaTtcbiAgICAgICAgICAgICAgICBvdXRCdWZmZXJzLnB1c2godGhpcy5idWZmZXJzW3RoaXMuYnVmZmVySW5kZXhdLnNsaWNlKHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlciwgZW5kKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoZWRCeXRlc0xlbmd0aCArPSBzaXplIC0gaTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXIgPSBlbmQ7XG4gICAgICAgICAgICAgICAgaSA9IHNpemU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaHVua1NpemUgPSByZW1haW5pbmdcbiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXIgKyByZW1haW5pbmc7XG4gICAgICAgICAgICAgICAgb3V0QnVmZmVycy5wdXNoKHRoaXMuYnVmZmVyc1t0aGlzLmJ1ZmZlckluZGV4XS5zbGljZSh0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXIsIGVuZCkpO1xuICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT09IHJlbWFpbmluZ0NhcGFjaXR5SW5UaGlzQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuYnVmZmVyc1t0aGlzLmJ1ZmZlckluZGV4XSB1c2VkIHVwLCBzaGlmdCB0byBuZXh0IG9uZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlckluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXIgPSBlbmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucHVzaGVkQnl0ZXNMZW5ndGggKz0gcmVtYWluaW5nO1xuICAgICAgICAgICAgICAgIGkgKz0gcmVtYWluaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRCdWZmZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChCdWZmZXIuY29uY2F0KG91dEJ1ZmZlcnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvdXRCdWZmZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5wdXNoKG91dEJ1ZmZlcnNbMF0pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnVmZmVyc1N0cmVhbS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEJ1ZmZlcnNTdHJlYW0gfSBmcm9tIFwiLi9CdWZmZXJzU3RyZWFtXCI7XG4vKipcbiAqIG1heEJ1ZmZlckxlbmd0aCBpcyBtYXggc2l6ZSBvZiBlYWNoIGJ1ZmZlciBpbiB0aGUgcG9vbGVkIGJ1ZmZlcnMuXG4gKi9cbi8vIENhbid0IHVzZSBpbXBvcnQgYXMgVHlwZXNjcmlwdCBkb2Vzbid0IHJlY29nbml6ZSBcImJ1ZmZlclwiLlxuY29uc3QgbWF4QnVmZmVyTGVuZ3RoID0gcmVxdWlyZShcImJ1ZmZlclwiKS5jb25zdGFudHMuTUFYX0xFTkdUSDtcbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGJ1ZmZlciBjb250YWluZXIgd2hpY2ggY29uY2VwdHVhbGx5IGhhcyBubyBoYXJkIHNpemUgbGltaXQuXG4gKiBJdCBhY2NlcHRzIGEgY2FwYWNpdHksIGFuIGFycmF5IG9mIGlucHV0IGJ1ZmZlcnMgYW5kIHRoZSB0b3RhbCBsZW5ndGggb2YgaW5wdXQgZGF0YS5cbiAqIEl0IHdpbGwgYWxsb2NhdGUgYW4gaW50ZXJuYWwgXCJidWZmZXJcIiBvZiB0aGUgY2FwYWNpdHkgYW5kIGZpbGwgdGhlIGRhdGEgaW4gdGhlIGlucHV0IGJ1ZmZlcnNcbiAqIGludG8gdGhlIGludGVybmFsIFwiYnVmZmVyXCIgc2VyaWFsbHkgd2l0aCByZXNwZWN0IHRvIHRoZSB0b3RhbCBsZW5ndGguXG4gKiBUaGVuIGJ5IGNhbGxpbmcgUG9vbGVkQnVmZmVyLmdldFJlYWRhYmxlU3RyZWFtKCksIHlvdSBjYW4gZ2V0IGEgcmVhZGFibGUgc3RyZWFtXG4gKiBhc3NlbWJsZWQgZnJvbSBhbGwgdGhlIGRhdGEgaW4gdGhlIGludGVybmFsIFwiYnVmZmVyXCIuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb29sZWRCdWZmZXIge1xuICAgIGNvbnN0cnVjdG9yKGNhcGFjaXR5LCBidWZmZXJzLCB0b3RhbExlbmd0aCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgYnVmZmVycyB1c2VkIHRvIGtlZXAgdGhlIGRhdGEuXG4gICAgICAgICAqIEVhY2ggYnVmZmVyIGhhcyBhIGxlbmd0aCBvZiB0aGUgbWF4QnVmZmVyTGVuZ3RoIGV4Y2VwdCBsYXN0IG9uZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYnVmZmVycyA9IFtdO1xuICAgICAgICB0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICAvLyBhbGxvY2F0ZVxuICAgICAgICBjb25zdCBidWZmZXJOdW0gPSBNYXRoLmNlaWwoY2FwYWNpdHkgLyBtYXhCdWZmZXJMZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlck51bTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gaSA9PT0gYnVmZmVyTnVtIC0gMSA/IGNhcGFjaXR5ICUgbWF4QnVmZmVyTGVuZ3RoIDogbWF4QnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxlbiA9IG1heEJ1ZmZlckxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnVmZmVycy5wdXNoKEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW4pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVmZmVycykge1xuICAgICAgICAgICAgdGhpcy5maWxsKGJ1ZmZlcnMsIHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHBvb2xlZCBidWZmZXJzLlxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgaW50ZXJuYWwgYnVmZmVycyB3aXRoIGRhdGEgaW4gdGhlIGlucHV0IGJ1ZmZlcnMgc2VyaWFsbHlcbiAgICAgKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHRvdGFsIGxlbmd0aCBhbmQgdGhlIHRvdGFsIGNhcGFjaXR5IG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzLlxuICAgICAqIERhdGEgY29waWVkIHdpbGwgYmUgc2hpZnQgb3V0IG9mIHRoZSBpbnB1dCBidWZmZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlcnMgLSBJbnB1dCBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgZmlsbGVkIGluIHRoZSBwb29sZWQgYnVmZmVyXG4gICAgICogQHBhcmFtIHRvdGFsTGVuZ3RoIC0gVG90YWwgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIGZpbGxlZCBpbi5cbiAgICAgKlxuICAgICAqL1xuICAgIGZpbGwoYnVmZmVycywgdG90YWxMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IE1hdGgubWluKHRoaXMuY2FwYWNpdHksIHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgbGV0IGkgPSAwLCBqID0gMCwgdGFyZ2V0T2Zmc2V0ID0gMCwgc291cmNlT2Zmc2V0ID0gMCwgdG90YWxDb3BpZWROdW0gPSAwO1xuICAgICAgICB3aGlsZSAodG90YWxDb3BpZWROdW0gPCB0aGlzLl9zaXplKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBidWZmZXJzW2ldO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5idWZmZXJzW2pdO1xuICAgICAgICAgICAgY29uc3QgY29waWVkTnVtID0gc291cmNlLmNvcHkodGFyZ2V0LCB0YXJnZXRPZmZzZXQsIHNvdXJjZU9mZnNldCk7XG4gICAgICAgICAgICB0b3RhbENvcGllZE51bSArPSBjb3BpZWROdW07XG4gICAgICAgICAgICBzb3VyY2VPZmZzZXQgKz0gY29waWVkTnVtO1xuICAgICAgICAgICAgdGFyZ2V0T2Zmc2V0ICs9IGNvcGllZE51bTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VPZmZzZXQgPT09IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgc291cmNlT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0YXJnZXRPZmZzZXQgPT09IHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICAgICAgdGFyZ2V0T2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhciBjb3BpZWQgZnJvbSBzb3VyY2UgYnVmZmVyc1xuICAgICAgICBidWZmZXJzLnNwbGljZSgwLCBpKTtcbiAgICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYnVmZmVyc1swXSA9IGJ1ZmZlcnNbMF0uc2xpY2Uoc291cmNlT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlYWRhYmxlIHN0cmVhbSBhc3NlbWJsZWQgZnJvbSBhbGwgdGhlIGRhdGEgaW4gdGhlIGludGVybmFsIGJ1ZmZlcnMuXG4gICAgICpcbiAgICAgKi9cbiAgICBnZXRSZWFkYWJsZVN0cmVhbSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJzU3RyZWFtKHRoaXMuYnVmZmVycywgdGhpcy5zaXplKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qb29sZWRCdWZmZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBQb29sZWRCdWZmZXIgfSBmcm9tIFwiLi9Qb29sZWRCdWZmZXJcIjtcbi8qKlxuICogVGhpcyBjbGFzcyBhY2NlcHRzIGEgTm9kZS5qcyBSZWFkYWJsZSBzdHJlYW0gYXMgaW5wdXQsIGFuZCBrZWVwcyByZWFkaW5nIGRhdGFcbiAqIGZyb20gdGhlIHN0cmVhbSBpbnRvIHRoZSBpbnRlcm5hbCBidWZmZXIgc3RydWN0dXJlLCB1bnRpbCBpdCByZWFjaGVzIG1heEJ1ZmZlcnMuXG4gKiBFdmVyeSBhdmFpbGFibGUgYnVmZmVyIHdpbGwgdHJ5IHRvIHRyaWdnZXIgb3V0Z29pbmdIYW5kbGVyLlxuICpcbiAqIFRoZSBpbnRlcm5hbCBidWZmZXIgc3RydWN0dXJlIGluY2x1ZGVzIGFuIGluY29taW5nIGJ1ZmZlciBhcnJheSwgYW5kIGEgb3V0Z29pbmdcbiAqIGJ1ZmZlciBhcnJheS4gVGhlIGluY29taW5nIGJ1ZmZlciBhcnJheSBpbmNsdWRlcyB0aGUgXCJlbXB0eVwiIGJ1ZmZlcnMgY2FuIGJlIGZpbGxlZFxuICogd2l0aCBuZXcgaW5jb21pbmcgZGF0YS4gVGhlIG91dGdvaW5nIGFycmF5IGluY2x1ZGVzIHRoZSBmaWxsZWQgYnVmZmVycyB0byBiZVxuICogaGFuZGxlZCBieSBvdXRnb2luZ0hhbmRsZXIuIEV2ZXJ5IGFib3ZlIGJ1ZmZlciBzaXplIGlzIGRlZmluZWQgYnkgcGFyYW1ldGVyIGJ1ZmZlclNpemUuXG4gKlxuICogTlVNX09GX0FMTF9CVUZGRVJTID0gQlVGRkVSU19JTl9JTkNPTUlORyArIEJVRkZFUlNfSU5fT1VUR09JTkcgKyBCVUZGRVJTX1VOREVSX0hBTkRMSU5HXG4gKlxuICogTlVNX09GX0FMTF9CVUZGRVJTIGxlc3NlciB0aGFuIG9yIGVxdWFsIHRvIG1heEJ1ZmZlcnNcbiAqXG4gKiBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVCBUSVBTOlxuICogMS4gSW5wdXQgc3RyZWFtIGhpZ2hXYXRlck1hcmsgaXMgYmV0dGVyIHRvIHNldCBhIHNhbWUgdmFsdWUgd2l0aCBidWZmZXJTaXplXG4gKiAgICBwYXJhbWV0ZXIsIHdoaWNoIHdpbGwgYXZvaWQgQnVmZmVyLmNvbmNhdCgpIG9wZXJhdGlvbnMuXG4gKiAyLiBjb25jdXJyZW5jeSBzaG91bGQgc2V0IGEgc21hbGxlciB2YWx1ZSB0aGFuIG1heEJ1ZmZlcnMsIHdoaWNoIGlzIGhlbHBmdWwgdG9cbiAqICAgIHJlZHVjZSB0aGUgcG9zc2liaWxpdHkgd2hlbiBhIG91dGdvaW5nIGhhbmRsZXIgd2FpdHMgZm9yIHRoZSBzdHJlYW0gZGF0YS5cbiAqICAgIGluIHRoaXMgc2l0dWF0aW9uLCBvdXRnb2luZyBoYW5kbGVycyBhcmUgYmxvY2tlZC5cbiAqICAgIE91dGdvaW5nIHF1ZXVlIHNob3VsZG4ndCBiZSBlbXB0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1ZmZlclNjaGVkdWxlciB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCdWZmZXJTY2hlZHVsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVhZGFibGUgLSBBIE5vZGUuanMgUmVhZGFibGUgc3RyZWFtXG4gICAgICogQHBhcmFtIGJ1ZmZlclNpemUgLSBCdWZmZXIgc2l6ZSBvZiBldmVyeSBtYWludGFpbmVkIGJ1ZmZlclxuICAgICAqIEBwYXJhbSBtYXhCdWZmZXJzIC0gSG93IG1hbnkgYnVmZmVycyBjYW4gYmUgYWxsb2NhdGVkXG4gICAgICogQHBhcmFtIG91dGdvaW5nSGFuZGxlciAtIEFuIGFzeW5jIGZ1bmN0aW9uIHNjaGVkdWxlZCB0byBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkIHdoZW4gYSBidWZmZXIgZnVsbHkgZmlsbGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHN0cmVhbSBkYXRhXG4gICAgICogQHBhcmFtIGNvbmN1cnJlbmN5IC0gQ29uY3VycmVuY3kgb2YgZXhlY3V0aW5nIG91dGdvaW5nSGFuZGxlcnMgKD4wKVxuICAgICAqIEBwYXJhbSBlbmNvZGluZyAtIFtPcHRpb25hbF0gRW5jb2Rpbmcgb2YgUmVhZGFibGUgc3RyZWFtIHdoZW4gaXQncyBhIHN0cmluZyBzdHJlYW1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZWFkYWJsZSwgYnVmZmVyU2l6ZSwgbWF4QnVmZmVycywgb3V0Z29pbmdIYW5kbGVyLCBjb25jdXJyZW5jeSwgZW5jb2RpbmcpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGludGVybmFsIGV2ZW50IGVtaXR0ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBvZmZzZXQgbWFya2VyIHRvIHRyYWNrIGRhdGEgb2Zmc2V0IGluIGJ5dGVzIG9mIG5leHQgb3V0Z29pbmdIYW5kbGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW50ZXJuYWwgbWFya2VyIHRvIHRyYWNrIHdoZXRoZXIgc3RyZWFtIGlzIGVuZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNTdHJlYW1FbmQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGludGVybmFsIG1hcmtlciB0byB0cmFjayB3aGV0aGVyIHN0cmVhbSBvciBvdXRnb2luZ0hhbmRsZXIgcmV0dXJucyBlcnJvci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSG93IG1hbnkgaGFuZGxlcnMgYXJlIGV4ZWN1dGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb3cgbWFueSBidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm51bUJ1ZmZlcnMgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQmVjYXVzZSB0aGlzIGNsYXNzIGRvZXNuJ3Qga25vdyBob3cgbXVjaCBkYXRhIGV2ZXJ5IHRpbWUgc3RyZWFtIHBvcHMsIHdoaWNoXG4gICAgICAgICAqIGlzIGRlZmluZWQgYnkgaGlnaFdhdGVyTWFya2VyIG9mIHRoZSBzdHJlYW0uIFNvIEJ1ZmZlclNjaGVkdWxlciB3aWxsIGNhY2hlXG4gICAgICAgICAqIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc3RyZWFtLCB3aGVuIGRhdGEgaW4gdW5yZXNvbHZlZERhdGFBcnJheSBleGNlZWRzIHRoZVxuICAgICAgICAgKiBibG9ja1NpemUgZGVmaW5lZCwgaXQgd2lsbCB0cnkgdG8gY29uY2F0IGEgYmxvY2tTaXplIG9mIGJ1ZmZlciwgZmlsbCBpbnRvIGF2YWlsYWJsZVxuICAgICAgICAgKiBidWZmZXJzIGZyb20gaW5jb21pbmcgYW5kIHB1c2ggdG8gb3V0Z29pbmcgYXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVucmVzb2x2ZWREYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdyBtdWNoIGRhdGEgY29uc2lzdGVkIGluIHVucmVzb2x2ZWREYXRhQXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVucmVzb2x2ZWRMZW5ndGggPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFycmF5IGluY2x1ZGVzIGFsbCB0aGUgYXZhaWxhYmxlIGJ1ZmZlcnMgY2FuIGJlIHVzZWQgdG8gZmlsbCBkYXRhIGZyb20gc3RyZWFtLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmNvbWluZyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFycmF5IChxdWV1ZSkgaW5jbHVkZXMgYWxsIHRoZSBidWZmZXJzIGZpbGxlZCBmcm9tIHN0cmVhbSBkYXRhLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vdXRnb2luZyA9IFtdO1xuICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgYnVmZmVyU2l6ZSBtdXN0IGJlIGxhcmdlciB0aGFuIDAsIGN1cnJlbnQgaXMgJHtidWZmZXJTaXplfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhCdWZmZXJzIDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBtYXhCdWZmZXJzIG11c3QgYmUgbGFyZ2VyIHRoYW4gMCwgY3VycmVudCBpcyAke21heEJ1ZmZlcnN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmN1cnJlbmN5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBjb25jdXJyZW5jeSBtdXN0IGJlIGxhcmdlciB0aGFuIDAsIGN1cnJlbnQgaXMgJHtjb25jdXJyZW5jeX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplO1xuICAgICAgICB0aGlzLm1heEJ1ZmZlcnMgPSBtYXhCdWZmZXJzO1xuICAgICAgICB0aGlzLnJlYWRhYmxlID0gcmVhZGFibGU7XG4gICAgICAgIHRoaXMub3V0Z29pbmdIYW5kbGVyID0gb3V0Z29pbmdIYW5kbGVyO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIHNjaGVkdWxlciwgd2lsbCByZXR1cm4gZXJyb3Igd2hlbiBzdHJlYW0gb2YgYW55IG9mIHRoZSBvdXRnb2luZ0hhbmRsZXJzXG4gICAgICogcmV0dXJucyBlcnJvci5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIGRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCB0aGlzLmVuY29kaW5nKSA6IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRVbnJlc29sdmVkRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZURhdGEoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRhYmxlLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlYWRhYmxlLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1N0cmVhbUVuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJjaGVja0VuZFwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIub24oXCJjaGVja0VuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3V0Z29pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJPdXRnb2luZ0hhbmRsZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdHJlYW1FbmQgJiYgdGhpcy5leGVjdXRpbmdPdXRnb2luZ0hhbmRsZXJzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVucmVzb2x2ZWRMZW5ndGggPiAwICYmIHRoaXMudW5yZXNvbHZlZExlbmd0aCA8IHRoaXMuYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5zaGlmdEJ1ZmZlckZyb21VbnJlc29sdmVkRGF0YUFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGdvaW5nSGFuZGxlcigoKSA9PiBidWZmZXIuZ2V0UmVhZGFibGVTdHJlYW0oKSwgYnVmZmVyLnNpemUsIHRoaXMub2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy51bnJlc29sdmVkTGVuZ3RoID49IHRoaXMuYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSBuZXcgZGF0YSBpbnRvIHVucmVzb2x2ZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YSAtXG4gICAgICovXG4gICAgYXBwZW5kVW5yZXNvbHZlZERhdGEoZGF0YSkge1xuICAgICAgICB0aGlzLnVucmVzb2x2ZWREYXRhQXJyYXkucHVzaChkYXRhKTtcbiAgICAgICAgdGhpcy51bnJlc29sdmVkTGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gc2hpZnQgYSBidWZmZXIgd2l0aCBzaXplIGluIGJsb2NrU2l6ZS4gVGhlIGJ1ZmZlciByZXR1cm5lZCBtYXkgYmUgbGVzc1xuICAgICAqIHRoYW4gYmxvY2tTaXplIHdoZW4gZGF0YSBpbiB1bnJlc29sdmVkRGF0YUFycmF5IGlzIGxlc3MgdGhhbiBidWZmZXJTaXplLlxuICAgICAqXG4gICAgICovXG4gICAgc2hpZnRCdWZmZXJGcm9tVW5yZXNvbHZlZERhdGFBcnJheShidWZmZXIpIHtcbiAgICAgICAgaWYgKCFidWZmZXIpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBQb29sZWRCdWZmZXIodGhpcy5idWZmZXJTaXplLCB0aGlzLnVucmVzb2x2ZWREYXRhQXJyYXksIHRoaXMudW5yZXNvbHZlZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZmZXIuZmlsbCh0aGlzLnVucmVzb2x2ZWREYXRhQXJyYXksIHRoaXMudW5yZXNvbHZlZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bnJlc29sdmVkTGVuZ3RoIC09IGJ1ZmZlci5zaXplO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGRhdGEgaW4gdW5yZXNvbHZlZERhdGFBcnJheS4gRm9yIGV2ZXJ5IGJ1ZmZlciB3aXRoIHNpemUgaW4gYmxvY2tTaXplXG4gICAgICogc2hpZnRlZCwgaXQgd2lsbCB0cnkgdG8gZ2V0IChvciBhbGxvY2F0ZSBhIGJ1ZmZlcikgZnJvbSBpbmNvbWluZywgYW5kIGZpbGwgaXQsXG4gICAgICogdGhlbiBwdXNoIGl0IGludG8gb3V0Z29pbmcgdG8gYmUgaGFuZGxlZCBieSBvdXRnb2luZyBoYW5kbGVyLlxuICAgICAqXG4gICAgICogUmV0dXJuIGZhbHNlIHdoZW4gYXZhaWxhYmxlIGJ1ZmZlcnMgaW4gaW5jb21pbmcgYXJlIG5vdCBlbm91Z2gsIGVsc2UgdHJ1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJldHVybiBmYWxzZSB3aGVuIGJ1ZmZlcnMgaW4gaW5jb21pbmcgYXJlIG5vdCBlbm91Z2gsIGVsc2UgdHJ1ZS5cbiAgICAgKi9cbiAgICByZXNvbHZlRGF0YSgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMudW5yZXNvbHZlZExlbmd0aCA+PSB0aGlzLmJ1ZmZlclNpemUpIHtcbiAgICAgICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmNvbWluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5pbmNvbWluZy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRCdWZmZXJGcm9tVW5yZXNvbHZlZERhdGFBcnJheShidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtQnVmZmVycyA8IHRoaXMubWF4QnVmZmVycykge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSB0aGlzLnNoaWZ0QnVmZmVyRnJvbVVucmVzb2x2ZWREYXRhQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1CdWZmZXJzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdmFpbGFibGUgYnVmZmVyLCB3YWl0IGZvciBidWZmZXIgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3V0Z29pbmcucHVzaChidWZmZXIpO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyT3V0Z29pbmdIYW5kbGVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gdHJpZ2dlciBhIG91dGdvaW5nIGhhbmRsZXIgZm9yIGV2ZXJ5IGJ1ZmZlciBpbiBvdXRnb2luZy4gU3RvcCB3aGVuXG4gICAgICogY29uY3VycmVuY3kgcmVhY2hlcy5cbiAgICAgKi9cbiAgICBhc3luYyB0cmlnZ2VyT3V0Z29pbmdIYW5kbGVycygpIHtcbiAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycyA+PSB0aGlzLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5vdXRnb2luZy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlck91dGdvaW5nSGFuZGxlcihidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChidWZmZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIGEgb3V0Z29pbmcgaGFuZGxlciBmb3IgYSBidWZmZXIgc2hpZnRlZCBmcm9tIG91dGdvaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlciAtXG4gICAgICovXG4gICAgYXN5bmMgdHJpZ2dlck91dGdvaW5nSGFuZGxlcihidWZmZXIpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gYnVmZmVyLnNpemU7XG4gICAgICAgIHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycysrO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBidWZmZXJMZW5ndGg7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm91dGdvaW5nSGFuZGxlcigoKSA9PiBidWZmZXIuZ2V0UmVhZGFibGVTdHJlYW0oKSwgYnVmZmVyTGVuZ3RoLCB0aGlzLm9mZnNldCAtIGJ1ZmZlckxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycy0tO1xuICAgICAgICB0aGlzLnJldXNlQnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KFwiY2hlY2tFbmRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBidWZmZXIgdXNlZCBieSBvdXRnb2luZyBoYW5kbGVyIGludG8gaW5jb21pbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVmZmVyIC1cbiAgICAgKi9cbiAgICByZXVzZUJ1ZmZlcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy5pbmNvbWluZy5wdXNoKGJ1ZmZlcik7XG4gICAgICAgIGlmICghdGhpcy5pc0Vycm9yICYmIHRoaXMucmVzb2x2ZURhdGEoKSAmJiAhdGhpcy5pc1N0cmVhbUVuZCkge1xuICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5yZXN1bWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJ1ZmZlclNjaGVkdWxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHsgUkVRVUVTVF9USU1FT1VUIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG4vKipcbiAqIFJlYWRzIGEgcmVhZGFibGUgc3RyZWFtIGludG8gYnVmZmVyLiBGaWxsIHRoZSBidWZmZXIgZnJvbSBvZmZzZXQgdG8gZW5kLlxuICpcbiAqIEBwYXJhbSBzdHJlYW0gLSBBIE5vZGUuanMgUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0gYnVmZmVyIC0gQnVmZmVyIHRvIGJlIGZpbGxlZCwgbGVuZ3RoIG11c3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG9mZnNldFxuICogQHBhcmFtIG9mZnNldCAtIEZyb20gd2hpY2ggcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciB0byBiZSBmaWxsZWQsIGluY2x1c2l2ZVxuICogQHBhcmFtIGVuZCAtIFRvIHdoaWNoIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgdG8gYmUgZmlsbGVkLCBleGNsdXNpdmVcbiAqIEBwYXJhbSBlbmNvZGluZyAtIEVuY29kaW5nIG9mIHRoZSBSZWFkYWJsZSBzdHJlYW1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRvQnVmZmVyKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgICBsZXQgcG9zID0gMDsgLy8gUG9zaXRpb24gaW4gc3RyZWFtXG4gICAgY29uc3QgY291bnQgPSBlbmQgLSBvZmZzZXQ7IC8vIFRvdGFsIGFtb3VudCBvZiBkYXRhIG5lZWRlZCBpbiBzdHJlYW1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGBUaGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQgaW4gdGltZW91dC5gKSksIFJFUVVFU1RfVElNRU9VVCk7XG4gICAgICAgIHN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwb3MgPj0gY291bnQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjaHVuayA9IHN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgICBpZiAoIWNodW5rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhvdyBtdWNoIGRhdGEgbmVlZGVkIGluIHRoaXMgY2h1bmtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rTGVuZ3RoID0gcG9zICsgY2h1bmsubGVuZ3RoID4gY291bnQgPyBjb3VudCAtIHBvcyA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIGJ1ZmZlci5maWxsKGNodW5rLnNsaWNlKDAsIGNodW5rTGVuZ3RoKSwgb2Zmc2V0ICsgcG9zLCBvZmZzZXQgKyBwb3MgKyBjaHVua0xlbmd0aCk7XG4gICAgICAgICAgICBwb3MgKz0gY2h1bmtMZW5ndGg7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGNvdW50KSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgU3RyZWFtIGRyYWlucyBiZWZvcmUgZ2V0dGluZyBlbm91Z2ggZGF0YSBuZWVkZWQuIERhdGEgcmVhZDogJHtwb3N9LCBkYXRhIG5lZWQ6ICR7Y291bnR9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgKG1zZykgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBSZWFkcyBhIHJlYWRhYmxlIHN0cmVhbSBpbnRvIGJ1ZmZlciBlbnRpcmVseS5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gQSBOb2RlLmpzIFJlYWRhYmxlIHN0cmVhbVxuICogQHBhcmFtIGJ1ZmZlciAtIEJ1ZmZlciB0byBiZSBmaWxsZWQsIGxlbmd0aCBtdXN0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBvZmZzZXRcbiAqIEBwYXJhbSBlbmNvZGluZyAtIEVuY29kaW5nIG9mIHRoZSBSZWFkYWJsZSBzdHJlYW1cbiAqIEByZXR1cm5zIHdpdGggdGhlIGNvdW50IG9mIGJ5dGVzIHJlYWQuXG4gKiBAdGhyb3dzIGBSYW5nZUVycm9yYCBJZiBidWZmZXIgc2l6ZSBpcyBub3QgYmlnIGVub3VnaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRvQnVmZmVyMihzdHJlYW0sIGJ1ZmZlciwgZW5jb2RpbmcpIHtcbiAgICBsZXQgcG9zID0gMDsgLy8gUG9zaXRpb24gaW4gc3RyZWFtXG4gICAgY29uc3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgc3RyZWFtLm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICAgICAgICAgIGlmICghY2h1bmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyArIGNodW5rLmxlbmd0aCA+IGJ1ZmZlclNpemUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBTdHJlYW0gZXhjZWVkcyBidWZmZXIgc2l6ZS4gQnVmZmVyIHNpemU6ICR7YnVmZmVyU2l6ZX1gKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyLmZpbGwoY2h1bmssIHBvcywgcG9zICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShwb3MpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmVhZHMgYSByZWFkYWJsZSBzdHJlYW0gaW50byBhIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gQSBOb2RlLmpzIFJlYWRhYmxlIHN0cmVhbVxuICogQHBhcmFtIGVuY29kaW5nIC0gRW5jb2Rpbmcgb2YgdGhlIFJlYWRhYmxlIHN0cmVhbVxuICogQHJldHVybnMgd2l0aCB0aGUgY291bnQgb2YgYnl0ZXMgcmVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRvQnVmZmVyMyhyZWFkYWJsZVN0cmVhbSwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgcmVhZGFibGVTdHJlYW0ub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjaHVua3MucHVzaChkYXRhIGluc3RhbmNlb2YgQnVmZmVyID8gZGF0YSA6IEJ1ZmZlci5mcm9tKGRhdGEsIGVuY29kaW5nKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgfSk7XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgYSByZWFkc3RyZWFtIHRvIGEgbG9jYWwgZmlsZS4gUmV0dXJucyBhIFByb21pc2Ugd2hpY2ggaXMgY29tcGxldGVkIGFmdGVyIHRoZSBmaWxlIGhhbmRsZSBpcyBjbG9zZWQuXG4gKlxuICogQHBhcmFtIHJzIC0gVGhlIHJlYWQgc3RyZWFtLlxuICogQHBhcmFtIGZpbGUgLSBEZXN0aW5hdGlvbiBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU3RyZWFtVG9Mb2NhbEZpbGUocnMsIGZpbGUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3cyA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZpbGUpO1xuICAgICAgICBycy5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgd3Mub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdzLm9uKFwiY2xvc2VcIiwgcmVzb2x2ZSk7XG4gICAgICAgIHJzLnBpcGUod3MpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogUHJvbWlzaWZpZWQgdmVyc2lvbiBvZiBmcy5zdGF0KCkuXG4gKi9cbmV4cG9ydCBjb25zdCBmc1N0YXQgPSB1dGlsLnByb21pc2lmeShmcy5zdGF0KTtcbmV4cG9ydCBjb25zdCBmc0NyZWF0ZVJlYWRTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMubm9kZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2FzeW5jRGVsZWdhdG9yLCBfX2FzeW5jR2VuZXJhdG9yLCBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVV1aWQsIGdldERlZmF1bHRQcm94eVNldHRpbmdzLCBpc05vZGUsIGlzVG9rZW5DcmVkZW50aWFsLCBVUkxCdWlsZGVyLCB9IGZyb20gXCJAYXp1cmUvY29yZS1odHRwXCI7XG5pbXBvcnQgeyBTcGFuU3RhdHVzQ29kZSB9IGZyb20gXCJAYXp1cmUvY29yZS10cmFjaW5nXCI7XG5pbXBvcnQgeyBCbG9iRG93bmxvYWRSZXNwb25zZSB9IGZyb20gXCIuL0Jsb2JEb3dubG9hZFJlc3BvbnNlXCI7XG5pbXBvcnQgeyBCbG9iUXVlcnlSZXNwb25zZSB9IGZyb20gXCIuL0Jsb2JRdWVyeVJlc3BvbnNlXCI7XG5pbXBvcnQgeyBBbm9ueW1vdXNDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvQW5vbnltb3VzQ3JlZGVudGlhbFwiO1xuaW1wb3J0IHsgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfSBmcm9tIFwiLi9jcmVkZW50aWFscy9TdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFwiO1xuaW1wb3J0IHsgQXBwZW5kQmxvYiwgQmxvYiBhcyBTdG9yYWdlQmxvYiwgQmxvY2tCbG9iLCBQYWdlQmxvYiB9IGZyb20gXCIuL2dlbmVyYXRlZC9zcmMvb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZW5zdXJlQ3BrSWZTcGVjaWZpZWQsIHRvQWNjZXNzVGllciwgfSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IHJhbmdlUmVzcG9uc2VGcm9tTW9kZWwsIH0gZnJvbSBcIi4vUGFnZUJsb2JSYW5nZVJlc3BvbnNlXCI7XG5pbXBvcnQgeyBuZXdQaXBlbGluZSwgaXNQaXBlbGluZUxpa2UgfSBmcm9tIFwiLi9QaXBlbGluZVwiO1xuaW1wb3J0IHsgQmxvYkJlZ2luQ29weUZyb21VcmxQb2xsZXIsIH0gZnJvbSBcIi4vcG9sbGVycy9CbG9iU3RhcnRDb3B5RnJvbVVybFBvbGxlclwiO1xuaW1wb3J0IHsgcmFuZ2VUb1N0cmluZyB9IGZyb20gXCIuL1JhbmdlXCI7XG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50IH0gZnJvbSBcIi4vU3RvcmFnZUNsaWVudFwiO1xuaW1wb3J0IHsgQmF0Y2ggfSBmcm9tIFwiLi91dGlscy9CYXRjaFwiO1xuaW1wb3J0IHsgQnVmZmVyU2NoZWR1bGVyIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2UtY29tbW9uL3NyY1wiO1xuaW1wb3J0IHsgQmxvYkRvZXNOb3RVc2VDdXN0b21lclNwZWNpZmllZEVuY3J5cHRpb24sIEJsb2JVc2VzQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uTXNnLCBCTE9DS19CTE9CX01BWF9CTE9DS1MsIEJMT0NLX0JMT0JfTUFYX1NUQUdFX0JMT0NLX0JZVEVTLCBCTE9DS19CTE9CX01BWF9VUExPQURfQkxPQl9CWVRFUywgREVGQVVMVF9CTE9CX0RPV05MT0FEX0JMT0NLX0JZVEVTLCBERUZBVUxUX0JMT0NLX0JVRkZFUl9TSVpFX0JZVEVTLCBERUZBVUxUX01BWF9ET1dOTE9BRF9SRVRSWV9SRVFVRVNUUywgRVRhZ0FueSwgVVJMQ29uc3RhbnRzLCB9IGZyb20gXCIuL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgY3JlYXRlU3BhbiwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSB9IGZyb20gXCIuL3V0aWxzL3RyYWNpbmdcIjtcbmltcG9ydCB7IGFwcGVuZFRvVVJMUGF0aCwgYXBwZW5kVG9VUkxRdWVyeSwgZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0cywgRXh0cmFjdFBhZ2VSYW5nZUluZm9JdGVtcywgZ2VuZXJhdGVCbG9ja0lELCBnZXRVUkxQYXJhbWV0ZXIsIGh0dHBBdXRob3JpemF0aW9uVG9TdHJpbmcsIGlzSXBFbmRwb2ludFN0eWxlLCBwYXJzZU9iamVjdFJlcGxpY2F0aW9uUmVjb3JkLCBzZXRVUkxQYXJhbWV0ZXIsIHRvQmxvYlRhZ3MsIHRvQmxvYlRhZ3NTdHJpbmcsIHRvUXVlcnlTZXJpYWxpemF0aW9uLCB0b1RhZ3MsIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG5pbXBvcnQgeyBmc0NyZWF0ZVJlYWRTdHJlYW0sIGZzU3RhdCwgcmVhZFN0cmVhbVRvTG9jYWxGaWxlLCBzdHJlYW1Ub0J1ZmZlciwgfSBmcm9tIFwiLi91dGlscy91dGlscy5ub2RlXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMgfSBmcm9tIFwiLi9zYXMvQmxvYlNBU1NpZ25hdHVyZVZhbHVlc1wiO1xuaW1wb3J0IHsgQmxvYkxlYXNlQ2xpZW50IH0gZnJvbSBcIi4vQmxvYkxlYXNlQ2xpZW50XCI7XG4vKipcbiAqIEEgQmxvYkNsaWVudCByZXByZXNlbnRzIGEgVVJMIHRvIGFuIEF6dXJlIFN0b3JhZ2UgYmxvYjsgdGhlIGJsb2IgbWF5IGJlIGEgYmxvY2sgYmxvYixcbiAqIGFwcGVuZCBibG9iLCBvciBwYWdlIGJsb2IuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iQ2xpZW50IGV4dGVuZHMgU3RvcmFnZUNsaWVudCB7XG4gICAgY29uc3RydWN0b3IodXJsT3JDb25uZWN0aW9uU3RyaW5nLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgYmxvYk5hbWVPck9wdGlvbnMsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCBwaXBlbGluZTtcbiAgICAgICAgbGV0IHVybDtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBwaXBlbGluZTogUGlwZWxpbmUpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChpc05vZGUgJiYgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbC5cbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIGlmIChibG9iTmFtZU9yT3B0aW9ucyAmJiB0eXBlb2YgYmxvYk5hbWVPck9wdGlvbnMgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIGJsb2JOYW1lT3JPcHRpb25zICYmXG4gICAgICAgICAgICB0eXBlb2YgYmxvYk5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIChjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmcsIGNvbnRhaW5lck5hbWU6IHN0cmluZywgYmxvYk5hbWU6IHN0cmluZywgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWU7XG4gICAgICAgICAgICBjb25zdCBibG9iTmFtZSA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkQ3JlZHMgPSBleHRyYWN0Q29ubmVjdGlvblN0cmluZ1BhcnRzKHVybE9yQ29ubmVjdGlvblN0cmluZyk7XG4gICAgICAgICAgICBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJBY2NvdW50Q29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRLZXlDcmVkZW50aWFsID0gbmV3IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKGV4dHJhY3RlZENyZWRzLmFjY291bnROYW1lLCBleHRyYWN0ZWRDcmVkcy5hY2NvdW50S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYXBwZW5kVG9VUkxQYXRoKGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSksIGVuY29kZVVSSUNvbXBvbmVudChibG9iTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucHJveHlPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByb3h5T3B0aW9ucyA9IGdldERlZmF1bHRQcm94eVNldHRpbmdzKGV4dHJhY3RlZENyZWRzLnByb3h5VXJpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKHNoYXJlZEtleUNyZWRlbnRpYWwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLmpzIGVudmlyb25tZW50XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiU0FTQ29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdXJsID1cbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9VUkxQYXRoKGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSksIGVuY29kZVVSSUNvbXBvbmVudChibG9iTmFtZSkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiP1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZENyZWRzLmFjY291bnRTYXM7XG4gICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gc3RyaW5nIG11c3QgYmUgZWl0aGVyIGFuIEFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgb3IgYSBTQVMgY29ubmVjdGlvbiBzdHJpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3Rpbmcgbm9uLWVtcHR5IHN0cmluZ3MgZm9yIGNvbnRhaW5lck5hbWUgYW5kIGJsb2JOYW1lIHBhcmFtZXRlcnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIodXJsLCBwaXBlbGluZSk7XG4gICAgICAgICh7IGJsb2JOYW1lOiB0aGlzLl9uYW1lLCBjb250YWluZXJOYW1lOiB0aGlzLl9jb250YWluZXJOYW1lIH0gPVxuICAgICAgICAgICAgdGhpcy5nZXRCbG9iQW5kQ29udGFpbmVyTmFtZXNGcm9tVXJsKCkpO1xuICAgICAgICB0aGlzLmJsb2JDb250ZXh0ID0gbmV3IFN0b3JhZ2VCbG9iKHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQpO1xuICAgICAgICB0aGlzLl9zbmFwc2hvdCA9IGdldFVSTFBhcmFtZXRlcih0aGlzLnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuU05BUFNIT1QpO1xuICAgICAgICB0aGlzLl92ZXJzaW9uSWQgPSBnZXRVUkxQYXJhbWV0ZXIodGhpcy51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlZFUlNJT05JRCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBibG9iLlxuICAgICAqL1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHN0b3JhZ2UgY29udGFpbmVyIHRoZSBibG9iIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAgKi9cbiAgICBnZXQgY29udGFpbmVyTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lck5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQmxvYkNsaWVudCBvYmplY3QgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2UgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogUHJvdmlkZSBcIlwiIHdpbGwgcmVtb3ZlIHRoZSBzbmFwc2hvdCBhbmQgcmV0dXJuIGEgQ2xpZW50IHRvIHRoZSBiYXNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQgc25hcHNob3QgdGltZXN0YW1wXG4gICAgICovXG4gICAgd2l0aFNuYXBzaG90KHNuYXBzaG90KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvYkNsaWVudChzZXRVUkxQYXJhbWV0ZXIodGhpcy51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlNOQVBTSE9ULCBzbmFwc2hvdC5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBzbmFwc2hvdCksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEJsb2JDbGllbnQgb2JqZWN0IHBvaW50aW5nIHRvIGEgdmVyc2lvbiBvZiB0aGlzIGJsb2IuXG4gICAgICogUHJvdmlkZSBcIlwiIHdpbGwgcmVtb3ZlIHRoZSB2ZXJzaW9uSWQgYW5kIHJldHVybiBhIENsaWVudCB0byB0aGUgYmFzZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb25JZCAtIFRoZSB2ZXJzaW9uSWQuXG4gICAgICogQHJldHVybnMgQSBuZXcgQmxvYkNsaWVudCBvYmplY3QgcG9pbnRpbmcgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBibG9iLlxuICAgICAqL1xuICAgIHdpdGhWZXJzaW9uKHZlcnNpb25JZCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JDbGllbnQoc2V0VVJMUGFyYW1ldGVyKHRoaXMudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5WRVJTSU9OSUQsIHZlcnNpb25JZC5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiB2ZXJzaW9uSWQpLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEFwcGVuZEJsb2JDbGllbnQgb2JqZWN0LlxuICAgICAqXG4gICAgICovXG4gICAgZ2V0QXBwZW5kQmxvYkNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHBlbmRCbG9iQ2xpZW50KHRoaXMudXJsLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEJsb2NrQmxvYkNsaWVudCBvYmplY3QuXG4gICAgICpcbiAgICAgKi9cbiAgICBnZXRCbG9ja0Jsb2JDbGllbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tCbG9iQ2xpZW50KHRoaXMudXJsLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFBhZ2VCbG9iQ2xpZW50IG9iamVjdC5cbiAgICAgKlxuICAgICAqL1xuICAgIGdldFBhZ2VCbG9iQ2xpZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IFBhZ2VCbG9iQ2xpZW50KHRoaXMudXJsLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgb3IgZG93bmxvYWRzIGEgYmxvYiBmcm9tIHRoZSBzeXN0ZW0sIGluY2x1ZGluZyBpdHMgbWV0YWRhdGEgYW5kIHByb3BlcnRpZXMuXG4gICAgICogWW91IGNhbiBhbHNvIGNhbGwgR2V0IEJsb2IgdG8gcmVhZCBhIHNuYXBzaG90LlxuICAgICAqXG4gICAgICogKiBJbiBOb2RlLmpzLCBkYXRhIHJldHVybnMgaW4gYSBSZWFkYWJsZSBzdHJlYW0gcmVhZGFibGVTdHJlYW1Cb2R5XG4gICAgICogKiBJbiBicm93c2VycywgZGF0YSByZXR1cm5zIGluIGEgcHJvbWlzZSBibG9iQm9keVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBGcm9tIHdoaWNoIHBvc2l0aW9uIG9mIHRoZSBibG9iIHRvIGRvd25sb2FkLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMFxuICAgICAqIEBwYXJhbSBjb3VudCAtIEhvdyBtdWNoIGRhdGEgdG8gYmUgZG93bmxvYWRlZCwgZ3JlYXRlciB0aGFuIDAuIFdpbGwgZG93bmxvYWQgdG8gdGhlIGVuZCB3aGVuIHVuZGVmaW5lZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBCbG9iIERvd25sb2FkIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZSAoTm9kZS5qcyk6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIERvd25sb2FkIGFuZCBjb252ZXJ0IGEgYmxvYiB0byBhIHN0cmluZ1xuICAgICAqIGNvbnN0IGRvd25sb2FkQmxvY2tCbG9iUmVzcG9uc2UgPSBhd2FpdCBibG9iQ2xpZW50LmRvd25sb2FkKCk7XG4gICAgICogY29uc3QgZG93bmxvYWRlZCA9IGF3YWl0IHN0cmVhbVRvQnVmZmVyKGRvd25sb2FkQmxvY2tCbG9iUmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5KTtcbiAgICAgKiBjb25zb2xlLmxvZyhcIkRvd25sb2FkZWQgYmxvYiBjb250ZW50OlwiLCBkb3dubG9hZGVkLnRvU3RyaW5nKCkpO1xuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gc3RyZWFtVG9CdWZmZXIocmVhZGFibGVTdHJlYW0pIHtcbiAgICAgKiByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAqIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAqIHJlYWRhYmxlU3RyZWFtLm9uKFwiZGF0YVwiLCAoZGF0YSkgPT4ge1xuICAgICAqIGNodW5rcy5wdXNoKGRhdGEgaW5zdGFuY2VvZiBCdWZmZXIgPyBkYXRhIDogQnVmZmVyLmZyb20oZGF0YSkpO1xuICAgICAqIH0pO1xuICAgICAqIHJlYWRhYmxlU3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgKiByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSk7XG4gICAgICogfSk7XG4gICAgICogcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgICAqIH0pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2UgKGJyb3dzZXIpOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBEb3dubG9hZCBhbmQgY29udmVydCBhIGJsb2IgdG8gYSBzdHJpbmdcbiAgICAgKiBjb25zdCBkb3dubG9hZEJsb2NrQmxvYlJlc3BvbnNlID0gYXdhaXQgYmxvYkNsaWVudC5kb3dubG9hZCgpO1xuICAgICAqIGNvbnN0IGRvd25sb2FkZWQgPSBhd2FpdCBibG9iVG9TdHJpbmcoYXdhaXQgZG93bmxvYWRCbG9ja0Jsb2JSZXNwb25zZS5ibG9iQm9keSk7XG4gICAgICogY29uc29sZS5sb2coXG4gICAgICogICBcIkRvd25sb2FkZWQgYmxvYiBjb250ZW50XCIsXG4gICAgICogICBkb3dubG9hZGVkXG4gICAgICogKTtcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGJsb2JUb1N0cmluZyhibG9iOiBCbG9iKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgKiAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAqICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAqICAgICBmaWxlUmVhZGVyLm9ubG9hZGVuZCA9IChldjogYW55KSA9PiB7XG4gICAgICogICAgICAgcmVzb2x2ZShldi50YXJnZXQhLnJlc3VsdCk7XG4gICAgICogICAgIH07XG4gICAgICogICAgIGZpbGVSZWFkZXIub25lcnJvciA9IHJlamVjdDtcbiAgICAgKiAgICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGJsb2IpO1xuICAgICAqICAgfSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkKG9mZnNldCA9IDAsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1kb3dubG9hZFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuZG93bmxvYWQoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCByZXF1ZXN0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IGlzTm9kZSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMub25Qcm9ncmVzcywgLy8gZm9yIE5vZGUuanMsIHByb2dyZXNzIGlzIHJlcG9ydGVkIGJ5IFJldHJpYWJsZVJlYWRhYmxlU3RyZWFtXG4gICAgICAgICAgICAgICAgfSwgcmFuZ2U6IG9mZnNldCA9PT0gMCAmJiAhY291bnQgPyB1bmRlZmluZWQgOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSwgcmFuZ2VHZXRDb250ZW50TUQ1OiBvcHRpb25zLnJhbmdlR2V0Q29udGVudE1ENSwgcmFuZ2VHZXRDb250ZW50Q1JDNjQ6IG9wdGlvbnMucmFuZ2VHZXRDb250ZW50Q3JjNjQsIHNuYXBzaG90OiBvcHRpb25zLnNuYXBzaG90LCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRSZXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlLCBvYmplY3RSZXBsaWNhdGlvbkRlc3RpbmF0aW9uUG9saWN5SWQ6IHJlcy5vYmplY3RSZXBsaWNhdGlvblBvbGljeUlkLCBvYmplY3RSZXBsaWNhdGlvblNvdXJjZVByb3BlcnRpZXM6IHBhcnNlT2JqZWN0UmVwbGljYXRpb25SZWNvcmQocmVzLm9iamVjdFJlcGxpY2F0aW9uUnVsZXMpIH0pO1xuICAgICAgICAgICAgLy8gUmV0dXJuIGJyb3dzZXIgcmVzcG9uc2UgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmICghaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBzdXBwb3J0IHJldHJ5aW5nIHdoZW4gZG93bmxvYWQgc3RyZWFtIHVuZXhwZWN0ZWQgZW5kcyBpbiBOb2RlLmpzIHJ1bnRpbWVcbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBjb2RlIHNob3VsZG4ndCBiZSBidW5kbGVkIGludG8gYnJvd3NlciBidWlsZCwgaG93ZXZlciBzb21lXG4gICAgICAgICAgICAvLyBidW5kbGVycyBtYXkgdHJ5IHRvIGJ1bmRsZSBmb2xsb3dpbmcgY29kZSBhbmQgXCJGaWxlUmVhZFJlc3BvbnNlLnRzXCIuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIFwiRmlsZURvd25sb2FkUmVzcG9uc2UuYnJvd3Nlci50c1wiIHdpbGwgYmUgdXNlZCBhcyBhIHNoaW0gb2YgXCJGaWxlRG93bmxvYWRSZXNwb25zZS50c1wiXG4gICAgICAgICAgICAvLyBUaGUgY29uZmlnIGlzIGluIHBhY2thZ2UuanNvbiBcImJyb3dzZXJcIiBmaWVsZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF4UmV0cnlSZXF1ZXN0cyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMubWF4UmV0cnlSZXF1ZXN0cyA8IDApIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBEZWZhdWx0IHZhbHVlIG9yIG1ha2UgaXQgYSByZXF1aXJlZCBwYXJhbWV0ZXI/XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5tYXhSZXRyeVJlcXVlc3RzID0gREVGQVVMVF9NQVhfRE9XTkxPQURfUkVUUllfUkVRVUVTVFM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzLmNvbnRlbnRMZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBGaWxlIGRvd25sb2FkIHJlc3BvbnNlIGRvZXNuJ3QgY29udGFpbiB2YWxpZCBjb250ZW50IGxlbmd0aCBoZWFkZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVzLmV0YWcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRmlsZSBkb3dubG9hZCByZXNwb25zZSBkb2Vzbid0IGNvbnRhaW4gdmFsaWQgZXRhZyBoZWFkZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYkRvd25sb2FkUmVzcG9uc2Uod3JhcHBlZFJlcywgYXN5bmMgKHN0YXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWREb3dubG9hZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmTWF0Y2g6IG9wdGlvbnMuY29uZGl0aW9ucy5pZk1hdGNoIHx8IHJlcy5ldGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZNb2RpZmllZFNpbmNlOiBvcHRpb25zLmNvbmRpdGlvbnMuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZOb25lTWF0Y2g6IG9wdGlvbnMuY29uZGl0aW9ucy5pZk5vbmVNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmVW5tb2RpZmllZFNpbmNlOiBvcHRpb25zLmNvbmRpdGlvbnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiByYW5nZVRvU3RyaW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBvZmZzZXQgKyByZXMuY29udGVudExlbmd0aCAtIHN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlR2V0Q29udGVudE1ENTogb3B0aW9ucy5yYW5nZUdldENvbnRlbnRNRDUsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlR2V0Q29udGVudENSQzY0OiBvcHRpb25zLnJhbmdlR2V0Q29udGVudENyYzY0LFxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdDogb3B0aW9ucy5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgICAgICAgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gRGVidWcgcHVycG9zZSBvbmx5XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgLy8gICBgUmVhZCBmcm9tIGludGVybmFsIHN0cmVhbSwgcmFuZ2U6ICR7XG4gICAgICAgICAgICAgICAgLy8gICAgIHVwZGF0ZWRPcHRpb25zLnJhbmdlXG4gICAgICAgICAgICAgICAgLy8gICB9LCBvcHRpb25zOiAke0pTT04uc3RyaW5naWZ5KHVwZGF0ZWRPcHRpb25zKX1gXG4gICAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuZG93bmxvYWQoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0sIHVwZGF0ZWREb3dubG9hZE9wdGlvbnMpKSkucmVhZGFibGVTdHJlYW1Cb2R5O1xuICAgICAgICAgICAgfSwgb2Zmc2V0LCByZXMuY29udGVudExlbmd0aCwge1xuICAgICAgICAgICAgICAgIG1heFJldHJ5UmVxdWVzdHM6IG9wdGlvbnMubWF4UmV0cnlSZXF1ZXN0cyxcbiAgICAgICAgICAgICAgICBvblByb2dyZXNzOiBvcHRpb25zLm9uUHJvZ3Jlc3MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBBenVyZSBibG9iIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xpZW50IGV4aXN0czsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogTk9URTogdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBjYXJlIHNpbmNlIGFuIGV4aXN0aW5nIGJsb2IgbWlnaHQgYmUgZGVsZXRlZCBieSBvdGhlciBjbGllbnRzIG9yXG4gICAgICogYXBwbGljYXRpb25zLiBWaWNlIHZlcnNhIG5ldyBibG9icyBtaWdodCBiZSBhZGRlZCBieSBvdGhlciBjbGllbnRzIG9yIGFwcGxpY2F0aW9ucyBhZnRlciB0aGlzXG4gICAgICogZnVuY3Rpb24gY29tcGxldGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb25zIHRvIEV4aXN0cyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZXhpc3RzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1leGlzdHNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldFByb3BlcnRpZXMoe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJvdmlkZWRLZXk6IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gY2hlY2tpbmcgYmxvYiBleGlzdGVuY2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLnN0YXR1c0NvZGUgPT09IDQwOSAmJlxuICAgICAgICAgICAgICAgIChlLmRldGFpbHMuZXJyb3JDb2RlID09PSBCbG9iVXNlc0N1c3RvbWVyU3BlY2lmaWVkRW5jcnlwdGlvbk1zZyB8fFxuICAgICAgICAgICAgICAgICAgICBlLmRldGFpbHMuZXJyb3JDb2RlID09PSBCbG9iRG9lc05vdFVzZUN1c3RvbWVyU3BlY2lmaWVkRW5jcnlwdGlvbikpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBleGNlcHRpb24gd2hlbiBjaGVja2luZyBibG9iIGV4aXN0ZW5jZVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgdXNlci1kZWZpbmVkIG1ldGFkYXRhLCBzdGFuZGFyZCBIVFRQIHByb3BlcnRpZXMsIGFuZCBzeXN0ZW0gcHJvcGVydGllc1xuICAgICAqIGZvciB0aGUgYmxvYi4gSXQgZG9lcyBub3QgcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1ibG9iLXByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIFdBUk5JTkc6IFRoZSBgbWV0YWRhdGFgIG9iamVjdCByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIGl0cyBrZXlzIGluIGxvd2VyY2FzZSwgZXZlbiBpZlxuICAgICAqIHRoZXkgb3JpZ2luYWxseSBjb250YWluZWQgdXBwZXJjYXNlIGNoYXJhY3RlcnMuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBtZXRhZGF0YSBrZXlzIHJldHVybmVkIGJ5XG4gICAgICogdGhlIG1ldGhvZHMgb2Yge0BsaW5rIENvbnRhaW5lckNsaWVudH0gdGhhdCBsaXN0IGJsb2JzIHVzaW5nIHRoZSBgaW5jbHVkZU1ldGFkYXRhYCBvcHRpb24sIHdoaWNoXG4gICAgICogd2lsbCByZXRhaW4gdGhlaXIgb3JpZ2luYWwgY2FzaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIEdldCBQcm9wZXJ0aWVzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LWdldFByb3BlcnRpZXNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmdldFByb3BlcnRpZXMoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlLCBvYmplY3RSZXBsaWNhdGlvbkRlc3RpbmF0aW9uUG9saWN5SWQ6IHJlcy5vYmplY3RSZXBsaWNhdGlvblBvbGljeUlkLCBvYmplY3RSZXBsaWNhdGlvblNvdXJjZVByb3BlcnRpZXM6IHBhcnNlT2JqZWN0UmVwbGljYXRpb25SZWNvcmQocmVzLm9iamVjdFJlcGxpY2F0aW9uUnVsZXMpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgc3BlY2lmaWVkIGJsb2Igb3Igc25hcHNob3QgZm9yIGRlbGV0aW9uLiBUaGUgYmxvYiBpcyBsYXRlciBkZWxldGVkXG4gICAgICogZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4gTm90ZSB0aGF0IGluIG9yZGVyIHRvIGRlbGV0ZSBhIGJsb2IsIHlvdSBtdXN0IGRlbGV0ZVxuICAgICAqIGFsbCBvZiBpdHMgc25hcHNob3RzLiBZb3UgY2FuIGRlbGV0ZSBib3RoIGF0IHRoZSBzYW1lIHRpbWUgd2l0aCB0aGUgRGVsZXRlXG4gICAgICogQmxvYiBvcGVyYXRpb24uXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZGVsZXRlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBCbG9iIERlbGV0ZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LWRlbGV0ZVwiLCBvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuZGVsZXRlKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgZGVsZXRlU25hcHNob3RzOiBvcHRpb25zLmRlbGV0ZVNuYXBzaG90cywgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgc3BlY2lmaWVkIGJsb2Igb3Igc25hcHNob3QgZm9yIGRlbGV0aW9uIGlmIGl0IGV4aXN0cy4gVGhlIGJsb2IgaXMgbGF0ZXIgZGVsZXRlZFxuICAgICAqIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uIE5vdGUgdGhhdCBpbiBvcmRlciB0byBkZWxldGUgYSBibG9iLCB5b3UgbXVzdCBkZWxldGVcbiAgICAgKiBhbGwgb2YgaXRzIHNuYXBzaG90cy4gWW91IGNhbiBkZWxldGUgYm90aCBhdCB0aGUgc2FtZSB0aW1lIHdpdGggdGhlIERlbGV0ZVxuICAgICAqIEJsb2Igb3BlcmF0aW9uLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2RlbGV0ZS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gQmxvYiBEZWxldGUgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUlmRXhpc3RzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1kZWxldGVJZkV4aXN0c1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZGVsZXRlKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IHRydWUgfSwgcmVzKSwgeyBfcmVzcG9uc2U6IHJlcy5fcmVzcG9uc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICgoKF9hID0gZS5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXJyb3JDb2RlKSA9PT0gXCJCbG9iTm90Rm91bmRcIikge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gZGVsZXRpbmcgYSBibG9iIG9yIHNuYXBzaG90IG9ubHkgaWYgaXQgZXhpc3RzLlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IGZhbHNlIH0sIChfYiA9IGUucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJzZWRIZWFkZXJzKSwgeyBfcmVzcG9uc2U6IGUucmVzcG9uc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgY29udGVudHMgYW5kIG1ldGFkYXRhIG9mIHNvZnQgZGVsZXRlZCBibG9iIGFuZCBhbnkgYXNzb2NpYXRlZFxuICAgICAqIHNvZnQgZGVsZXRlZCBzbmFwc2hvdHMuIFVuZGVsZXRlIEJsb2IgaXMgc3VwcG9ydGVkIG9ubHkgb24gdmVyc2lvbiAyMDE3LTA3LTI5XG4gICAgICogb3IgbGF0ZXIuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvdW5kZWxldGUtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIEJsb2IgVW5kZWxldGUgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVuZGVsZXRlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC11bmRlbGV0ZVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnVuZGVsZXRlKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogSWYgbm8gdmFsdWUgcHJvdmlkZWQsIG9yIG5vIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgc3BlY2lmaWVkIGJsb2IgSFRUUCBoZWFkZXJzLFxuICAgICAqIHRoZXNlIGJsb2IgSFRUUCBoZWFkZXJzIHdpdGhvdXQgYSB2YWx1ZSB3aWxsIGJlIGNsZWFyZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvc2V0LWJsb2ItcHJvcGVydGllc1xuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2JIVFRQSGVhZGVycyAtIElmIG5vIHZhbHVlIHByb3ZpZGVkLCBvciBubyB2YWx1ZSBwcm92aWRlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmxvYiBIVFRQIGhlYWRlcnMsIHRoZXNlIGJsb2IgSFRUUFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyB3aXRob3V0IGEgdmFsdWUgd2lsbCBiZSBjbGVhcmVkLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBjb21tb24gaGVhZGVyIHRvIHNldCBpcyBgYmxvYkNvbnRlbnRUeXBlYFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxpbmcgdGhlIGJyb3dzZXIgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBmaWxlIHR5cGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIEJsb2IgU2V0IEhUVFAgSGVhZGVycyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgc2V0SFRUUEhlYWRlcnMoYmxvYkhUVFBIZWFkZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1zZXRIVFRQSGVhZGVyc1wiLCBvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuc2V0SHR0cEhlYWRlcnMoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBibG9iSHR0cEhlYWRlcnM6IGJsb2JIVFRQSGVhZGVycywgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBibG9iIGFzIG9uZSBvciBtb3JlIG5hbWUtdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBJZiBubyBvcHRpb24gcHJvdmlkZWQsIG9yIG5vIG1ldGFkYXRhIGRlZmluZWQgaW4gdGhlIHBhcmFtZXRlciwgdGhlIGJsb2JcbiAgICAgKiBtZXRhZGF0YSB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvc2V0LWJsb2ItbWV0YWRhdGFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSAtIFJlcGxhY2UgZXhpc3RpbmcgbWV0YWRhdGEgd2l0aCB0aGlzIHZhbHVlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vIHZhbHVlIHByb3ZpZGVkIHRoZSBleGlzdGluZyBtZXRhZGF0YSB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIFNldCBNZXRhZGF0YSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgc2V0TWV0YWRhdGEobWV0YWRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LXNldE1ldGFkYXRhXCIsIG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5zZXRNZXRhZGF0YShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtZXRhZGF0YSwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0YWdzIG9uIHRoZSB1bmRlcmx5aW5nIGJsb2IuXG4gICAgICogQSBibG9iIGNhbiBoYXZlIHVwIHRvIDEwIHRhZ3MuIFRhZyBrZXlzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjggY2hhcmFjdGVycy4gIFRhZyB2YWx1ZXMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NiBjaGFyYWN0ZXJzLlxuICAgICAqIFZhbGlkIHRhZyBrZXkgYW5kIHZhbHVlIGNoYXJhY3RlcnMgaW5jbHVkZSBsb3dlciBhbmQgdXBwZXIgY2FzZSBsZXR0ZXJzLCBkaWdpdHMgKDAtOSksXG4gICAgICogc3BhY2UgKCcgJyksIHBsdXMgKCcrJyksIG1pbnVzICgnLScpLCBwZXJpb2QgKCcuJyksIGZvd2FyZCBzbGFzaCAoJy8nKSwgY29sb24gKCc6JyksIGVxdWFscyAoJz0nKSwgYW5kIHVuZGVyc2NvcmUgKCdfJykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFncyAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIHNldFRhZ3ModGFncywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtc2V0VGFnc1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnNldFRhZ3MoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpLCB7IHRhZ3M6IHRvQmxvYlRhZ3ModGFncykgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdW5kZXJseWluZyBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIGdldFRhZ3Mob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtZ2V0VGFnc1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5nZXRUYWdzKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSksIHsgX3Jlc3BvbnNlOiByZXNwb25zZS5fcmVzcG9uc2UsIHRhZ3M6IHRvVGFncyh7IGJsb2JUYWdTZXQ6IHJlc3BvbnNlLmJsb2JUYWdTZXQgfSkgfHwge30gfSk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlZFJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSB7QGxpbmsgQmxvYkxlYXNlQ2xpZW50fSB0aGF0IG1hbmFnZXMgbGVhc2VzIG9uIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3Bvc2VMZWFzZUlkIC0gSW5pdGlhbCBwcm9wb3NlZCBsZWFzZSBJZC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBCbG9iTGVhc2VDbGllbnQgb2JqZWN0IGZvciBtYW5hZ2luZyBsZWFzZXMgb24gdGhlIGJsb2IuXG4gICAgICovXG4gICAgZ2V0QmxvYkxlYXNlQ2xpZW50KHByb3Bvc2VMZWFzZUlkKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvYkxlYXNlQ2xpZW50KHRoaXMsIHByb3Bvc2VMZWFzZUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBzbmFwc2hvdCBvZiBhIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvc25hcHNob3QtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHRoZSBCbG9iIENyZWF0ZSBTbmFwc2hvdCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlU25hcHNob3Qob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtY3JlYXRlU25hcHNob3RcIiwgb3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmNyZWF0ZVNuYXBzaG90KE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXNseSBjb3BpZXMgYSBibG9iIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIHRoZSBzdG9yYWdlIGFjY291bnQuXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxvbmcgcnVubmluZyBvcGVyYXRpb24gcG9sbGVyIHRoYXQgYWxsb3dzIHlvdSB0byB3YWl0XG4gICAgICogaW5kZWZpbml0ZWx5IHVudGlsIHRoZSBjb3B5IGlzIGNvbXBsZXRlZC5cbiAgICAgKiBZb3UgY2FuIGFsc28gY2FuY2VsIGEgY29weSBiZWZvcmUgaXQgaXMgY29tcGxldGVkIGJ5IGNhbGxpbmcgYGNhbmNlbE9wZXJhdGlvbmAgb24gdGhlIHBvbGxlci5cbiAgICAgKiBOb3RlIHRoYXQgdGhlIG9uUHJvZ3Jlc3MgY2FsbGJhY2sgd2lsbCBub3QgYmUgaW52b2tlZCBpZiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbiB0aGUgZmlyc3RcbiAgICAgKiByZXF1ZXN0LCBhbmQgYXR0ZW1wdGluZyB0byBjYW5jZWwgYSBjb21wbGV0ZWQgY29weSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24uXG4gICAgICpcbiAgICAgKiBJbiB2ZXJzaW9uIDIwMTItMDItMTIgYW5kIGxhdGVyLCB0aGUgc291cmNlIGZvciBhIENvcHkgQmxvYiBvcGVyYXRpb24gY2FuIGJlXG4gICAgICogYSBjb21taXR0ZWQgYmxvYiBpbiBhbnkgQXp1cmUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIEJlZ2lubmluZyB3aXRoIHZlcnNpb24gMjAxNS0wMi0yMSwgdGhlIHNvdXJjZSBmb3IgYSBDb3B5IEJsb2Igb3BlcmF0aW9uIGNhbiBiZVxuICAgICAqIGFuIEF6dXJlIGZpbGUgaW4gYW55IEF6dXJlIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBPbmx5IHN0b3JhZ2UgYWNjb3VudHMgY3JlYXRlZCBvbiBvciBhZnRlciBKdW5lIDd0aCwgMjAxMiBhbGxvdyB0aGUgQ29weSBCbG9iXG4gICAgICogb3BlcmF0aW9uIHRvIGNvcHkgZnJvbSBhbm90aGVyIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb3B5LWJsb2JcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYXV0b21hdGljIHBvbGxpbmc6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvcHlQb2xsZXIgPSBhd2FpdCBibG9iQ2xpZW50LmJlZ2luQ29weUZyb21VUkwoJ3VybCcpO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvcHlQb2xsZXIucG9sbFVudGlsRG9uZSgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBtYW51YWwgcG9sbGluZzpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29weVBvbGxlciA9IGF3YWl0IGJsb2JDbGllbnQuYmVnaW5Db3B5RnJvbVVSTCgndXJsJyk7XG4gICAgICogd2hpbGUgKCFwb2xsZXIuaXNEb25lKCkpIHtcbiAgICAgKiAgICBhd2FpdCBwb2xsZXIucG9sbCgpO1xuICAgICAqIH1cbiAgICAgKiBjb25zdCByZXN1bHQgPSBjb3B5UG9sbGVyLmdldFJlc3VsdCgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBwcm9ncmVzcyB1cGRhdGVzOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb3B5UG9sbGVyID0gYXdhaXQgYmxvYkNsaWVudC5iZWdpbkNvcHlGcm9tVVJMKCd1cmwnLCB7XG4gICAgICogICBvblByb2dyZXNzKHN0YXRlKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBQcm9ncmVzczogJHtzdGF0ZS5jb3B5UHJvZ3Jlc3N9YCk7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY29weVBvbGxlci5wb2xsVW50aWxEb25lKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGEgY2hhbmdpbmcgcG9sbGluZyBpbnRlcnZhbCAoZGVmYXVsdCAxNSBzZWNvbmRzKTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29weVBvbGxlciA9IGF3YWl0IGJsb2JDbGllbnQuYmVnaW5Db3B5RnJvbVVSTCgndXJsJywge1xuICAgICAqICAgaW50ZXJ2YWxJbk1zOiAxMDAwIC8vIHBvbGwgYmxvYiBldmVyeSAxIHNlY29uZCBmb3IgY29weSBwcm9ncmVzc1xuICAgICAqIH0pO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvcHlQb2xsZXIucG9sbFVudGlsRG9uZSgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBjb3B5IGNhbmNlbGxhdGlvbjpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29weVBvbGxlciA9IGF3YWl0IGJsb2JDbGllbnQuYmVnaW5Db3B5RnJvbVVSTCgndXJsJyk7XG4gICAgICogLy8gY2FuY2VsIG9wZXJhdGlvbiBhZnRlciBzdGFydGluZyBpdC5cbiAgICAgKiB0cnkge1xuICAgICAqICAgYXdhaXQgY29weVBvbGxlci5jYW5jZWxPcGVyYXRpb24oKTtcbiAgICAgKiAgIC8vIGNhbGxzIHRvIGdldCB0aGUgcmVzdWx0IG5vdyB0aHJvdyBQb2xsZXJDYW5jZWxsZWRFcnJvclxuICAgICAqICAgYXdhaXQgY29weVBvbGxlci5nZXRSZXN1bHQoKTtcbiAgICAgKiB9IGNhdGNoIChlcnIpIHtcbiAgICAgKiAgIGlmIChlcnIubmFtZSA9PT0gJ1BvbGxlckNhbmNlbGxlZEVycm9yJykge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnVGhlIGNvcHkgd2FzIGNhbmNlbGxlZC4nKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29weVNvdXJjZSAtIHVybCB0byB0aGUgc291cmNlIEF6dXJlIEJsb2IvRmlsZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gdGhlIEJsb2IgU3RhcnQgQ29weSBGcm9tIFVSTCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgYmVnaW5Db3B5RnJvbVVSTChjb3B5U291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0ge1xuICAgICAgICAgICAgYWJvcnRDb3B5RnJvbVVSTDogKC4uLmFyZ3MpID0+IHRoaXMuYWJvcnRDb3B5RnJvbVVSTCguLi5hcmdzKSxcbiAgICAgICAgICAgIGdldFByb3BlcnRpZXM6ICguLi5hcmdzKSA9PiB0aGlzLmdldFByb3BlcnRpZXMoLi4uYXJncyksXG4gICAgICAgICAgICBzdGFydENvcHlGcm9tVVJMOiAoLi4uYXJncykgPT4gdGhpcy5zdGFydENvcHlGcm9tVVJMKC4uLmFyZ3MpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2xsZXIgPSBuZXcgQmxvYkJlZ2luQ29weUZyb21VcmxQb2xsZXIoe1xuICAgICAgICAgICAgYmxvYkNsaWVudDogY2xpZW50LFxuICAgICAgICAgICAgY29weVNvdXJjZSxcbiAgICAgICAgICAgIGludGVydmFsSW5Nczogb3B0aW9ucy5pbnRlcnZhbEluTXMsXG4gICAgICAgICAgICBvblByb2dyZXNzOiBvcHRpb25zLm9uUHJvZ3Jlc3MsXG4gICAgICAgICAgICByZXN1bWVGcm9tOiBvcHRpb25zLnJlc3VtZUZyb20sXG4gICAgICAgICAgICBzdGFydENvcHlGcm9tVVJMT3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRyaWdnZXIgdGhlIHN0YXJ0Q29weUZyb21VUkwgY2FsbCBieSBjYWxsaW5nIHBvbGwuXG4gICAgICAgIC8vIEFueSBlcnJvcnMgZnJvbSB0aGlzIG1ldGhvZCBzaG91bGQgYmUgc3VyZmFjZWQgdG8gdGhlIHVzZXIuXG4gICAgICAgIGF3YWl0IHBvbGxlci5wb2xsKCk7XG4gICAgICAgIHJldHVybiBwb2xsZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFib3J0cyBhIHBlbmRpbmcgYXN5bmNocm9ub3VzIENvcHkgQmxvYiBvcGVyYXRpb24sIGFuZCBsZWF2ZXMgYSBkZXN0aW5hdGlvbiBibG9iIHdpdGggemVyb1xuICAgICAqIGxlbmd0aCBhbmQgZnVsbCBtZXRhZGF0YS4gVmVyc2lvbiAyMDEyLTAyLTEyIGFuZCBuZXdlci5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9hYm9ydC1jb3B5LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb3B5SWQgLSBJZCBvZiB0aGUgQ29weSBGcm9tIFVSTCBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHRoZSBCbG9iIEFib3J0IENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGFib3J0Q29weUZyb21VUkwoY29weUlkLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtYWJvcnRDb3B5RnJvbVVSTFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmFib3J0Q29weUZyb21VUkwoY29weUlkLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzeW5jaHJvbm91cyBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbiBjb3BpZXMgYSBibG9iIG9yIGFuIGludGVybmV0IHJlc291cmNlIHRvIGEgbmV3IGJsb2IuIEl0IHdpbGwgbm90XG4gICAgICogcmV0dXJuIGEgcmVzcG9uc2UgdW50aWwgdGhlIGNvcHkgaXMgY29tcGxldGUuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29weS1ibG9iLWZyb20tdXJsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29weVNvdXJjZSAtIFRoZSBzb3VyY2UgVVJMIHRvIGNvcHkgZnJvbSwgU2hhcmVkIEFjY2VzcyBTaWduYXR1cmUoU0FTKSBtYXliZSBuZWVkZWQgZm9yIGF1dGhlbnRpY2F0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIHN5bmNDb3B5RnJvbVVSTChjb3B5U291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LXN5bmNDb3B5RnJvbVVSTFwiLCBvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5jb3B5RnJvbVVSTChjb3B5U291cmNlLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNYXRjaDogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLmlmTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTW9kaWZpZWRTaW5jZTogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZOb25lTWF0Y2g6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk5vbmVNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZVbm1vZGlmaWVkU2luY2U6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICB9LCBzb3VyY2VDb250ZW50TUQ1OiBvcHRpb25zLnNvdXJjZUNvbnRlbnRNRDUsIGNvcHlTb3VyY2VBdXRob3JpemF0aW9uOiBodHRwQXV0aG9yaXphdGlvblRvU3RyaW5nKG9wdGlvbnMuc291cmNlQXV0aG9yaXphdGlvbiksIHRpZXI6IHRvQWNjZXNzVGllcihvcHRpb25zLnRpZXIpLCBibG9iVGFnc1N0cmluZzogdG9CbG9iVGFnc1N0cmluZyhvcHRpb25zLnRhZ3MpLCBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnk6IChfYiA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZXhwaXJpZXNPbiwgaW1tdXRhYmlsaXR5UG9saWN5TW9kZTogKF9jID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5wb2xpY3lNb2RlLCBsZWdhbEhvbGQ6IG9wdGlvbnMubGVnYWxIb2xkLCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLCBjb3B5U291cmNlVGFnczogb3B0aW9ucy5jb3B5U291cmNlVGFncyB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0aWVyIG9uIGEgYmxvYi4gVGhlIG9wZXJhdGlvbiBpcyBhbGxvd2VkIG9uIGEgcGFnZSBibG9iIGluIGEgcHJlbWl1bVxuICAgICAqIHN0b3JhZ2UgYWNjb3VudCBhbmQgb24gYSBibG9jayBibG9iIGluIGEgYmxvYiBzdG9yYWdlIGFjY291bnQgKGxvY2FsbHkgcmVkdW5kYW50XG4gICAgICogc3RvcmFnZSBvbmx5KS4gQSBwcmVtaXVtIHBhZ2UgYmxvYidzIHRpZXIgZGV0ZXJtaW5lcyB0aGUgYWxsb3dlZCBzaXplLCBJT1BTLFxuICAgICAqIGFuZCBiYW5kd2lkdGggb2YgdGhlIGJsb2IuIEEgYmxvY2sgYmxvYidzIHRpZXIgZGV0ZXJtaW5lcyBIb3QvQ29vbC9BcmNoaXZlXG4gICAgICogc3RvcmFnZSB0eXBlLiBUaGlzIG9wZXJhdGlvbiBkb2VzIG5vdCB1cGRhdGUgdGhlIGJsb2IncyBFVGFnLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NldC1ibG9iLXRpZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aWVyIC0gVGhlIHRpZXIgdG8gYmUgc2V0IG9uIHRoZSBibG9iLiBWYWxpZCB2YWx1ZXMgYXJlIEhvdCwgQ29vbCwgb3IgQXJjaGl2ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gdGhlIEJsb2IgU2V0IFRpZXIgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHNldEFjY2Vzc1RpZXIodGllciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtc2V0QWNjZXNzVGllclwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnNldFRpZXIodG9BY2Nlc3NUaWVyKHRpZXIpLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIHJlaHlkcmF0ZVByaW9yaXR5OiBvcHRpb25zLnJlaHlkcmF0ZVByaW9yaXR5IH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGRvd25sb2FkVG9CdWZmZXIocGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00ID0ge30pIHtcbiAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGxldCBvcHRpb25zID0gcGFyYW00O1xuICAgICAgICBpZiAocGFyYW0xIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgICAgICBidWZmZXIgPSBwYXJhbTE7XG4gICAgICAgICAgICBvZmZzZXQgPSBwYXJhbTIgfHwgMDtcbiAgICAgICAgICAgIGNvdW50ID0gdHlwZW9mIHBhcmFtMyA9PT0gXCJudW1iZXJcIiA/IHBhcmFtMyA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0eXBlb2YgcGFyYW0xID09PSBcIm51bWJlclwiID8gcGFyYW0xIDogMDtcbiAgICAgICAgICAgIGNvdW50ID0gdHlwZW9mIHBhcmFtMiA9PT0gXCJudW1iZXJcIiA/IHBhcmFtMiA6IDA7XG4gICAgICAgICAgICBvcHRpb25zID0gcGFyYW0zIHx8IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iQ2xpZW50LWRvd25sb2FkVG9CdWZmZXJcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYmxvY2tTaXplKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ibG9ja1NpemUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tTaXplIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiYmxvY2tTaXplIG9wdGlvbiBtdXN0IGJlID49IDBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9ja1NpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmJsb2NrU2l6ZSA9IERFRkFVTFRfQkxPQl9ET1dOTE9BRF9CTE9DS19CWVRFUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvZmZzZXQgb3B0aW9uIG11c3QgYmUgPj0gMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3VudCAmJiBjb3VudCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJjb3VudCBvcHRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDdXN0b21lciBkb2Vzbid0IHNwZWNpZnkgbGVuZ3RoLCBnZXQgaXRcbiAgICAgICAgICAgIGlmICghY291bnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0UHJvcGVydGllcyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMudHJhY2luZ09wdGlvbnMpLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkgfSkpO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gcmVzcG9uc2UuY29udGVudExlbmd0aCAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBvZmZzZXQgJHtvZmZzZXR9IHNob3VsZG4ndCBiZSBsYXJnZXIgdGhhbiBibG9iIHNpemUgJHtyZXNwb25zZS5jb250ZW50TGVuZ3RofWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBidWZmZXIgb2Ygc2l6ZSA9IGNvdW50IGlmIHRoZSBidWZmZXIgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhjb3VudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIG9mIHNpemU6ICR7Y291bnR9KGluIGJ5dGVzKS4gUGxlYXNlIHRyeSBwYXNzaW5nIHlvdXIgb3duIGJ1ZmZlciB0byB0aGUgXCJkb3dubG9hZFRvQnVmZmVyXCIgbWV0aG9kIG9yIHRyeSB1c2luZyBvdGhlciBtZXRob2RzIGxpa2UgXCJkb3dubG9hZFwiIG9yIFwiZG93bmxvYWRUb0ZpbGVcIi5cXHQgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIGJ1ZmZlcidzIHNpemUgc2hvdWxkIGJlIGVxdWFsIHRvIG9yIGxhcmdlciB0aGFuIHRoZSByZXF1ZXN0IGNvdW50IG9mIGJ5dGVzOiAke2NvdW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRyYW5zZmVyUHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBuZXcgQmF0Y2gob3B0aW9ucy5jb25jdXJyZW5jeSk7XG4gICAgICAgICAgICBmb3IgKGxldCBvZmYgPSBvZmZzZXQ7IG9mZiA8IG9mZnNldCArIGNvdW50OyBvZmYgPSBvZmYgKyBvcHRpb25zLmJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgICAgIGJhdGNoLmFkZE9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1c2l2ZSBjaHVuayBlbmQgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rRW5kID0gb2Zmc2V0ICsgY291bnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmYgKyBvcHRpb25zLmJsb2NrU2l6ZSA8IGNodW5rRW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVua0VuZCA9IG9mZiArIG9wdGlvbnMuYmxvY2tTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5kb3dubG9hZChvZmYsIGNodW5rRW5kIC0gb2ZmLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFJldHJ5UmVxdWVzdHM6IG9wdGlvbnMubWF4UmV0cnlSZXF1ZXN0c1BlckJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJQcm92aWRlZEtleTogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy50cmFjaW5nT3B0aW9ucyksIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RyZWFtVG9CdWZmZXIoc3RyZWFtLCBidWZmZXIsIG9mZiAtIG9mZnNldCwgY2h1bmtFbmQgLSBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcHJvZ3Jlc3MgYWZ0ZXIgYmxvY2sgaXMgZG93bmxvYWRlZCwgaW4gY2FzZSBvZiBibG9jayB0cnlpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gQ291bGQgcHJvdmlkZSBmaW5lciBncmFpbmVkIHByb2dyZXNzIHVwZGF0aW5nIGluc2lkZSBIVFRQIHJlcXVlc3RzLFxuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIGNvbnZlbmllbmNlIGxheWVyIGRvd25sb2FkIHRyeSBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyUHJvZ3Jlc3MgKz0gY2h1bmtFbmQgLSBvZmY7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25Qcm9ncmVzcyh7IGxvYWRlZEJ5dGVzOiB0cmFuc2ZlclByb2dyZXNzIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBiYXRjaC5kbygpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICAgICAqXG4gICAgICogRG93bmxvYWRzIGFuIEF6dXJlIEJsb2IgdG8gYSBsb2NhbCBmaWxlLlxuICAgICAqIEZhaWxzIGlmIHRoZSB0aGUgZ2l2ZW4gZmlsZSBwYXRoIGFscmVhZHkgZXhpdHMuXG4gICAgICogT2Zmc2V0IGFuZCBjb3VudCBhcmUgb3B0aW9uYWwsIHBhc3MgMCBhbmQgdW5kZWZpbmVkIHJlc3BlY3RpdmVseSB0byBkb3dubG9hZCB0aGUgZW50aXJlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggLVxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBGcm9tIHdoaWNoIHBvc2l0aW9uIG9mIHRoZSBibG9jayBibG9iIHRvIGRvd25sb2FkLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIEhvdyBtdWNoIGRhdGEgdG8gYmUgZG93bmxvYWRlZC4gV2lsbCBkb3dubG9hZCB0byB0aGUgZW5kIHdoZW4gcGFzc2luZyB1bmRlZmluZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIEJsb2IgZG93bmxvYWQgb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzcG9uc2UgZGF0YSBmb3IgYmxvYiBkb3dubG9hZCBvcGVyYXRpb24sXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHdpdGggcmVhZGFibGVTdHJlYW1Cb2R5IHNldCB0byB1bmRlZmluZWQgc2luY2UgaXRzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCBpcyBhbHJlYWR5IHJlYWQgYW5kIHdyaXR0ZW4gaW50byBhIGxvY2FsIGZpbGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWRUb0ZpbGUoZmlsZVBhdGgsIG9mZnNldCA9IDAsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtZG93bmxvYWRUb0ZpbGVcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZG93bmxvYWQob2Zmc2V0LCBjb3VudCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyB0cmFjaW5nT3B0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnRyYWNpbmdPcHRpb25zKSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpIH0pKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCByZWFkU3RyZWFtVG9Mb2NhbEZpbGUocmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5LCBmaWxlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgc3RyZWFtIGlzIG5vIGxvbmdlciBhY2Nlc3NpYmxlIHNvIHNldHRpbmcgaXQgdG8gdW5kZWZpbmVkLlxuICAgICAgICAgICAgcmVzcG9uc2UuYmxvYkRvd25sb2FkU3RyZWFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRCbG9iQW5kQ29udGFpbmVyTmFtZXNGcm9tVXJsKCkge1xuICAgICAgICBsZXQgY29udGFpbmVyTmFtZTtcbiAgICAgICAgbGV0IGJsb2JOYW1lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gIFVSTCBtYXkgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmdcbiAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyL2Jsb2I/c2FzU3RyaW5nXCI7XG4gICAgICAgICAgICAvLyBcImh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9ibG9iXCI7XG4gICAgICAgICAgICAvLyBcImh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9ibG9iL2EudHh0P3Nhc1N0cmluZ1wiO1xuICAgICAgICAgICAgLy8gXCJodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvYmxvYi9hLnR4dFwiO1xuICAgICAgICAgICAgLy8gSVB2NC9JUHY2IGFkZHJlc3MgaG9zdHMsIEVuZHBvaW50cyAtIGBodHRwOi8vMTI3LjAuMC4xOjEwMDAwL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZS9ibG9iYFxuICAgICAgICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdDoxMDAwMS9kZXZzdG9yZWFjY291bnQxL2NvbnRhaW5lcm5hbWUvYmxvYlxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gVVJMQnVpbGRlci5wYXJzZSh0aGlzLnVybCk7XG4gICAgICAgICAgICBpZiAocGFyc2VkVXJsLmdldEhvc3QoKS5zcGxpdChcIi5cIilbMV0gPT09IFwiYmxvYlwiKSB7XG4gICAgICAgICAgICAgICAgLy8gXCJodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29udGFpbmVybmFtZS9ibG9iXCIuXG4gICAgICAgICAgICAgICAgLy8gLmdldFBhdGgoKSAtPiAvY29udGFpbmVybmFtZS9ibG9iXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBwYXJzZWRVcmwuZ2V0UGF0aCgpLm1hdGNoKFwiLyhbXi9dKikoLyguKikpP1wiKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lID0gcGF0aENvbXBvbmVudHNbMV07XG4gICAgICAgICAgICAgICAgYmxvYk5hbWUgPSBwYXRoQ29tcG9uZW50c1szXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzSXBFbmRwb2ludFN0eWxlKHBhcnNlZFVybCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJUHY0L0lQdjYgYWRkcmVzcyBob3N0cy4uLiBFeGFtcGxlIC0gaHR0cDovLzE5Mi4wLjAuMTA6MTAwMDEvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lL2Jsb2JcbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgd29yZCBkb21haW4gd2l0aG91dCBhIFtkb3RdIGluIHRoZSBlbmRwb2ludC4uLiBFeGFtcGxlIC0gaHR0cDovL2xvY2FsaG9zdDoxMDAwMS9kZXZzdG9yZWFjY291bnQxL2NvbnRhaW5lcm5hbWUvYmxvYlxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZS9ibG9iXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBwYXJzZWRVcmwuZ2V0UGF0aCgpLm1hdGNoKFwiLyhbXi9dKikvKFteL10qKSgvKC4qKSk/XCIpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lck5hbWUgPSBwYXRoQ29tcG9uZW50c1syXTtcbiAgICAgICAgICAgICAgICBibG9iTmFtZSA9IHBhdGhDb21wb25lbnRzWzRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gXCJodHRwczovL2N1c3RvbWRvbWFpbi5jb20vY29udGFpbmVybmFtZS9ibG9iXCIuXG4gICAgICAgICAgICAgICAgLy8gLmdldFBhdGgoKSAtPiAvY29udGFpbmVybmFtZS9ibG9iXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBwYXJzZWRVcmwuZ2V0UGF0aCgpLm1hdGNoKFwiLyhbXi9dKikoLyguKikpP1wiKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lID0gcGF0aENvbXBvbmVudHNbMV07XG4gICAgICAgICAgICAgICAgYmxvYk5hbWUgPSBwYXRoQ29tcG9uZW50c1szXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRlY29kZSB0aGUgZW5jb2RlZCBibG9iTmFtZSwgY29udGFpbmVyTmFtZSAtIHRvIGdldCBhbGwgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlbVxuICAgICAgICAgICAgY29udGFpbmVyTmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIGJsb2JOYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKTtcbiAgICAgICAgICAgIC8vIEF6dXJlIFN0b3JhZ2UgU2VydmVyIHdpbGwgcmVwbGFjZSBcIlxcXCIgd2l0aCBcIi9cIiBpbiB0aGUgYmxvYiBuYW1lc1xuICAgICAgICAgICAgLy8gICBkb2luZyB0aGUgc2FtZSBpbiB0aGUgU0RLIHNpZGUgc28gdGhhdCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdG8gcmVwbGFjZSBcIlxcXCIgaW5zdGFuY2VzIGluIHRoZSBibG9iTmFtZVxuICAgICAgICAgICAgYmxvYk5hbWUgPSBibG9iTmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb3ZpZGVkIGNvbnRhaW5lck5hbWUgaXMgaW52YWxpZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBibG9iTmFtZSwgY29udGFpbmVyTmFtZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGV4dHJhY3QgYmxvYk5hbWUgYW5kIGNvbnRhaW5lck5hbWUgd2l0aCBwcm92aWRlZCBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzbHkgY29waWVzIGEgYmxvYiB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiB0aGUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIEluIHZlcnNpb24gMjAxMi0wMi0xMiBhbmQgbGF0ZXIsIHRoZSBzb3VyY2UgZm9yIGEgQ29weSBCbG9iIG9wZXJhdGlvbiBjYW4gYmVcbiAgICAgKiBhIGNvbW1pdHRlZCBibG9iIGluIGFueSBBenVyZSBzdG9yYWdlIGFjY291bnQuXG4gICAgICogQmVnaW5uaW5nIHdpdGggdmVyc2lvbiAyMDE1LTAyLTIxLCB0aGUgc291cmNlIGZvciBhIENvcHkgQmxvYiBvcGVyYXRpb24gY2FuIGJlXG4gICAgICogYW4gQXp1cmUgZmlsZSBpbiBhbnkgQXp1cmUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIE9ubHkgc3RvcmFnZSBhY2NvdW50cyBjcmVhdGVkIG9uIG9yIGFmdGVyIEp1bmUgN3RoLCAyMDEyIGFsbG93IHRoZSBDb3B5IEJsb2JcbiAgICAgKiBvcGVyYXRpb24gdG8gY29weSBmcm9tIGFub3RoZXIgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvcHktYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgLSB1cmwgdG8gdGhlIHNvdXJjZSBBenVyZSBCbG9iL0ZpbGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHRoZSBCbG9iIFN0YXJ0IENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0Q29weUZyb21VUkwoY29weVNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1zdGFydENvcHlGcm9tVVJMXCIsIG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucyA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnN0YXJ0Q29weUZyb21VUkwoY29weVNvdXJjZSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgc291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTWF0Y2g6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1hdGNoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk1vZGlmaWVkU2luY2U6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVGFnczogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLnRhZ0NvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgfSwgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiAoX2IgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4cGlyaWVzT24sIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IChfYyA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucG9saWN5TW9kZSwgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCwgcmVoeWRyYXRlUHJpb3JpdHk6IG9wdGlvbnMucmVoeWRyYXRlUHJpb3JpdHksIHRpZXI6IHRvQWNjZXNzVGllcihvcHRpb25zLnRpZXIpLCBibG9iVGFnc1N0cmluZzogdG9CbG9iVGFnc1N0cmluZyhvcHRpb25zLnRhZ3MpLCBzZWFsQmxvYjogb3B0aW9ucy5zZWFsQmxvYiB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgQmxvYkNsaWVudCBjb25zdHJ1Y3RlZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVzIGEgQmxvYiBTZXJ2aWNlIFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlIChTQVMpIFVSSSBiYXNlZCBvbiB0aGUgY2xpZW50IHByb3BlcnRpZXNcbiAgICAgKiBhbmQgcGFyYW1ldGVycyBwYXNzZWQgaW4uIFRoZSBTQVMgaXMgc2lnbmVkIGJ5IHRoZSBzaGFyZWQga2V5IGNyZWRlbnRpYWwgb2YgdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvbnN0cnVjdGluZy1hLXNlcnZpY2Utc2FzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybnMgVGhlIFNBUyBVUkkgY29uc2lzdGluZyBvZiB0aGUgVVJJIHRvIHRoZSByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIGNsaWVudCwgZm9sbG93ZWQgYnkgdGhlIGdlbmVyYXRlZCBTQVMgdG9rZW4uXG4gICAgICovXG4gICAgZ2VuZXJhdGVTYXNVcmwob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICghKHRoaXMuY3JlZGVudGlhbCBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ2FuIG9ubHkgZ2VuZXJhdGUgdGhlIFNBUyB3aGVuIHRoZSBjbGllbnQgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIHNoYXJlZCBrZXkgY3JlZGVudGlhbFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNhcyA9IGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVycyhPYmplY3QuYXNzaWduKHsgY29udGFpbmVyTmFtZTogdGhpcy5fY29udGFpbmVyTmFtZSwgYmxvYk5hbWU6IHRoaXMuX25hbWUsIHNuYXBzaG90VGltZTogdGhpcy5fc25hcHNob3QsIHZlcnNpb25JZDogdGhpcy5fdmVyc2lvbklkIH0sIG9wdGlvbnMpLCB0aGlzLmNyZWRlbnRpYWwpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICByZXNvbHZlKGFwcGVuZFRvVVJMUXVlcnkodGhpcy51cmwsIHNhcykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoZSBpbW11dGFibGlsaXR5IHBvbGljeSBvbiB0aGUgYmxvYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBkZWxldGUgaW1tdXRhYmlsaXR5IHBvbGljeSBvbiB0aGUgYmxvYi5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVJbW11dGFiaWxpdHlQb2xpY3kob3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkNsaWVudC1kZWxldGVJbW11dGFiaWxpdHlQb2xpY3lcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5kZWxldGVJbW11dGFiaWxpdHlQb2xpY3koT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGltbXV0YWJsaWxpdHkgcG9saWN5IG9uIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHNldCBpbW11dGFiaWxpdHkgcG9saWN5IG9uIHRoZSBibG9iLlxuICAgICAqL1xuICAgIGFzeW5jIHNldEltbXV0YWJpbGl0eVBvbGljeShpbW11dGFiaWxpdHlQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtc2V0SW1tdXRhYmlsaXR5UG9saWN5XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuc2V0SW1tdXRhYmlsaXR5UG9saWN5KE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFib3J0U2lnbmFsLCBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnk6IGltbXV0YWJpbGl0eVBvbGljeS5leHBpcmllc09uLCBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiBpbW11dGFiaWxpdHlQb2xpY3kucG9saWN5TW9kZSwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubW9kaWZpZWRBY2Nlc3NDb25kaXRpb24gfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGxlZ2FsIGhvbGQgb24gdGhlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gc2V0IGxlZ2FsIGhvbGQgb24gdGhlIGJsb2IuXG4gICAgICovXG4gICAgYXN5bmMgc2V0TGVnYWxIb2xkKGxlZ2FsSG9sZEVuYWJsZWQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JDbGllbnQtc2V0TGVnYWxIb2xkXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuc2V0TGVnYWxIb2xkKGxlZ2FsSG9sZEVuYWJsZWQsIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFib3J0U2lnbmFsIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBcHBlbmRCbG9iQ2xpZW50IGRlZmluZXMgYSBzZXQgb2Ygb3BlcmF0aW9ucyBhcHBsaWNhYmxlIHRvIGFwcGVuZCBibG9icy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcGVuZEJsb2JDbGllbnQgZXh0ZW5kcyBCbG9iQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmxPckNvbm5lY3Rpb25TdHJpbmcsIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lLCBibG9iTmFtZU9yT3B0aW9ucywgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICAvLyBJbiBUeXBlU2NyaXB0IHdlIGNhbm5vdCBzaW1wbHkgcGFzcyBhbGwgcGFyYW1ldGVycyB0byBzdXBlcigpIGxpa2UgYmVsb3cgc28gaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGNvZGUgaW5zdGVhZC5cbiAgICAgICAgLy8gICBzdXBlcihzLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZU9yT3B0aW9ucywgYmxvYk5hbWVPck9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBsZXQgcGlwZWxpbmU7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoaXNQaXBlbGluZUxpa2UoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIHBpcGVsaW5lOiBQaXBlbGluZSlcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGlzTm9kZSAmJiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsIHx8XG4gICAgICAgICAgICBpc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSkpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbC5cbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgYmxvYk5hbWVPck9wdGlvbnMgJiZcbiAgICAgICAgICAgIHR5cGVvZiBibG9iTmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZywgY29udGFpbmVyTmFtZTogc3RyaW5nLCBibG9iTmFtZTogc3RyaW5nLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2JOYW1lID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBleHRyYWN0ZWRDcmVkcyA9IGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHModXJsT3JDb25uZWN0aW9uU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIkFjY291bnRDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZEtleUNyZWRlbnRpYWwgPSBuZXcgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwoZXh0cmFjdGVkQ3JlZHMuYWNjb3VudE5hbWUsIGV4dHJhY3RlZENyZWRzLmFjY291bnRLZXkpO1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcm94eU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveHlPcHRpb25zID0gZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MoZXh0cmFjdGVkQ3JlZHMucHJveHlVcmkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoc2hhcmVkS2V5Q3JlZGVudGlhbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuanMgZW52aXJvbm1lbnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJTQVNDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB1cmwgPVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI/XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudFNhcztcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgYW4gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGluZyBub24tZW1wdHkgc3RyaW5ncyBmb3IgY29udGFpbmVyTmFtZSBhbmQgYmxvYk5hbWUgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmwsIHBpcGVsaW5lKTtcbiAgICAgICAgdGhpcy5hcHBlbmRCbG9iQ29udGV4dCA9IG5ldyBBcHBlbmRCbG9iKHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEFwcGVuZEJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZVxuICAgICAqIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogUHJvdmlkZSBcIlwiIHdpbGwgcmVtb3ZlIHRoZSBzbmFwc2hvdCBhbmQgcmV0dXJuIGEgQ2xpZW50IHRvIHRoZSBiYXNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEFwcGVuZEJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqL1xuICAgIHdpdGhTbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gbmV3IEFwcGVuZEJsb2JDbGllbnQoc2V0VVJMUGFyYW1ldGVyKHRoaXMudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5TTkFQU0hPVCwgc25hcHNob3QubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogc25hcHNob3QpLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIDAtbGVuZ3RoIGFwcGVuZCBibG9iLiBDYWxsIEFwcGVuZEJsb2NrIHRvIGFwcGVuZCBkYXRhIHRvIGFuIGFwcGVuZCBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIEFwcGVuZCBCbG9jayBDcmVhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBhcHBlbmRCbG9iQ2xpZW50ID0gY29udGFpbmVyQ2xpZW50LmdldEFwcGVuZEJsb2JDbGllbnQoXCI8YmxvYiBuYW1lPlwiKTtcbiAgICAgKiBhd2FpdCBhcHBlbmRCbG9iQ2xpZW50LmNyZWF0ZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJBcHBlbmRCbG9iQ2xpZW50LWNyZWF0ZVwiLCBvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwZW5kQmxvYkNvbnRleHQuY3JlYXRlKDAsIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgYmxvYkh0dHBIZWFkZXJzOiBvcHRpb25zLmJsb2JIVFRQSGVhZGVycywgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSwgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiAoX2IgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4cGlyaWVzT24sIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IChfYyA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucG9saWN5TW9kZSwgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCwgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgMC1sZW5ndGggYXBwZW5kIGJsb2IuIENhbGwgQXBwZW5kQmxvY2sgdG8gYXBwZW5kIGRhdGEgdG8gYW4gYXBwZW5kIGJsb2IuXG4gICAgICogSWYgdGhlIGJsb2Igd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGUgY29udGVudCBvZiB0aGUgZXhpc3RpbmcgYmxvYiB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVJZk5vdEV4aXN0cyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkFwcGVuZEJsb2JDbGllbnQtY3JlYXRlSWZOb3RFeGlzdHNcIiwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB7IGlmTm9uZU1hdGNoOiBFVGFnQW55IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNyZWF0ZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHVwZGF0ZWRPcHRpb25zKSwgeyBjb25kaXRpb25zIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IHRydWUgfSwgcmVzKSwgeyBfcmVzcG9uc2U6IHJlcy5fcmVzcG9uc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICgoKF9hID0gZS5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXJyb3JDb2RlKSA9PT0gXCJCbG9iQWxyZWFkeUV4aXN0c1wiKSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJFeHBlY3RlZCBleGNlcHRpb24gd2hlbiBjcmVhdGluZyBhIGJsb2Igb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IGZhbHNlIH0sIChfYiA9IGUucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJzZWRIZWFkZXJzKSwgeyBfcmVzcG9uc2U6IGUucmVzcG9uc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWFscyB0aGUgYXBwZW5kIGJsb2IsIG1ha2luZyBpdCByZWFkIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgc2VhbChvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQXBwZW5kQmxvYkNsaWVudC1zZWFsXCIsIG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBlbmRCbG9iQ29udGV4dC5zZWFsKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgYXBwZW5kUG9zaXRpb25BY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSkgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyBhIG5ldyBibG9jayBvZiBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlIGV4aXN0aW5nIGFwcGVuZCBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2FwcGVuZC1ibG9ja1xuICAgICAqXG4gICAgICogQHBhcmFtIGJvZHkgLSBEYXRhIHRvIGJlIGFwcGVuZGVkLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIC0gTGVuZ3RoIG9mIHRoZSBib2R5IGluIGJ5dGVzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgQXBwZW5kIEJsb2NrIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29udGVudCA9IFwiSGVsbG8gV29ybGQhXCI7XG4gICAgICpcbiAgICAgKiAvLyBDcmVhdGUgYSBuZXcgYXBwZW5kIGJsb2IgYW5kIGFwcGVuZCBkYXRhIHRvIHRoZSBibG9iLlxuICAgICAqIGNvbnN0IG5ld0FwcGVuZEJsb2JDbGllbnQgPSBjb250YWluZXJDbGllbnQuZ2V0QXBwZW5kQmxvYkNsaWVudChcIjxibG9iIG5hbWU+XCIpO1xuICAgICAqIGF3YWl0IG5ld0FwcGVuZEJsb2JDbGllbnQuY3JlYXRlKCk7XG4gICAgICogYXdhaXQgbmV3QXBwZW5kQmxvYkNsaWVudC5hcHBlbmRCbG9jayhjb250ZW50LCBjb250ZW50Lmxlbmd0aCk7XG4gICAgICpcbiAgICAgKiAvLyBBcHBlbmQgZGF0YSB0byBhbiBleGlzdGluZyBhcHBlbmQgYmxvYi5cbiAgICAgKiBjb25zdCBleGlzdGluZ0FwcGVuZEJsb2JDbGllbnQgPSBjb250YWluZXJDbGllbnQuZ2V0QXBwZW5kQmxvYkNsaWVudChcIjxibG9iIG5hbWU+XCIpO1xuICAgICAqIGF3YWl0IGV4aXN0aW5nQXBwZW5kQmxvYkNsaWVudC5hcHBlbmRCbG9jayhjb250ZW50LCBjb250ZW50Lmxlbmd0aCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXN5bmMgYXBwZW5kQmxvY2soYm9keSwgY29udGVudExlbmd0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkFwcGVuZEJsb2JDbGllbnQtYXBwZW5kQmxvY2tcIiwgb3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGVuZEJsb2JDb250ZXh0LmFwcGVuZEJsb2NrKGNvbnRlbnRMZW5ndGgsIGJvZHksIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgYXBwZW5kUG9zaXRpb25BY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIHJlcXVlc3RPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IG9wdGlvbnMub25Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICB9LCB0cmFuc2FjdGlvbmFsQ29udGVudE1ENTogb3B0aW9ucy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSwgdHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NDogb3B0aW9ucy50cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEFwcGVuZCBCbG9jayBvcGVyYXRpb24gY29tbWl0cyBhIG5ldyBibG9jayBvZiBkYXRhIHRvIHRoZSBlbmQgb2YgYW4gZXhpc3RpbmcgYXBwZW5kIGJsb2JcbiAgICAgKiB3aGVyZSB0aGUgY29udGVudHMgYXJlIHJlYWQgZnJvbSBhIHNvdXJjZSB1cmwuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYXBwZW5kLWJsb2NrLWZyb20tdXJsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc291cmNlVVJMIC1cbiAgICAgKiAgICAgICAgICAgICAgICAgVGhlIHVybCB0byB0aGUgYmxvYiB0aGF0IHdpbGwgYmUgdGhlIHNvdXJjZSBvZiB0aGUgY29weS4gQSBzb3VyY2UgYmxvYiBpbiB0aGUgc2FtZSBzdG9yYWdlIGFjY291bnQgY2FuXG4gICAgICogICAgICAgICAgICAgICAgIGJlIGF1dGhlbnRpY2F0ZWQgdmlhIFNoYXJlZCBLZXkuIEhvd2V2ZXIsIGlmIHRoZSBzb3VyY2UgaXMgYSBibG9iIGluIGFub3RoZXIgYWNjb3VudCwgdGhlIHNvdXJjZSBibG9iXG4gICAgICogICAgICAgICAgICAgICAgIG11c3QgZWl0aGVyIGJlIHB1YmxpYyBvciBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdmlhIGEgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUuIElmIHRoZSBzb3VyY2UgYmxvYiBpc1xuICAgICAqICAgICAgICAgICAgICAgICBwdWJsaWMsIG5vIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gc291cmNlT2Zmc2V0IC0gT2Zmc2V0IGluIHNvdXJjZSB0byBiZSBhcHBlbmRlZFxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBiZSBhcHBlbmRlZCBhcyBhIGJsb2NrXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIGFwcGVuZEJsb2NrRnJvbVVSTChzb3VyY2VVUkwsIHNvdXJjZU9mZnNldCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJBcHBlbmRCbG9iQ2xpZW50LWFwcGVuZEJsb2NrRnJvbVVSTFwiLCBvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBlbmRCbG9iQ29udGV4dC5hcHBlbmRCbG9ja0Zyb21Vcmwoc291cmNlVVJMLCAwLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIHNvdXJjZVJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0OiBzb3VyY2VPZmZzZXQsIGNvdW50IH0pLCBzb3VyY2VDb250ZW50TUQ1OiBvcHRpb25zLnNvdXJjZUNvbnRlbnRNRDUsIHNvdXJjZUNvbnRlbnRDcmM2NDogb3B0aW9ucy5zb3VyY2VDb250ZW50Q3JjNjQsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBhcHBlbmRQb3NpdGlvbkFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNYXRjaDogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLmlmTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTW9kaWZpZWRTaW5jZTogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZOb25lTWF0Y2g6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk5vbmVNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZVbm1vZGlmaWVkU2luY2U6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICB9LCBjb3B5U291cmNlQXV0aG9yaXphdGlvbjogaHR0cEF1dGhvcml6YXRpb25Ub1N0cmluZyhvcHRpb25zLnNvdXJjZUF1dGhvcml6YXRpb24pLCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEJsb2NrQmxvYkNsaWVudCBkZWZpbmVzIGEgc2V0IG9mIG9wZXJhdGlvbnMgYXBwbGljYWJsZSB0byBibG9jayBibG9icy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJsb2NrQmxvYkNsaWVudCBleHRlbmRzIEJsb2JDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVybE9yQ29ubmVjdGlvblN0cmluZywgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIGJsb2JOYW1lT3JPcHRpb25zLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIC8vIEluIFR5cGVTY3JpcHQgd2UgY2Fubm90IHNpbXBseSBwYXNzIGFsbCBwYXJhbWV0ZXJzIHRvIHN1cGVyKCkgbGlrZSBiZWxvdyBzbyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgY29kZSBpbnN0ZWFkLlxuICAgICAgICAvLyAgIHN1cGVyKHMsIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lT3JPcHRpb25zLCBibG9iTmFtZU9yT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIGxldCBwaXBlbGluZTtcbiAgICAgICAgbGV0IHVybDtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmIChpc1BpcGVsaW5lTGlrZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSkpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgcGlwZWxpbmU6IFBpcGVsaW5lKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoaXNOb2RlICYmIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpIHx8XG4gICAgICAgICAgICBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSBpbnN0YW5jZW9mIEFub255bW91c0NyZWRlbnRpYWwgfHxcbiAgICAgICAgICAgIGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBjcmVkZW50aWFsPzogU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfCBBbm9ueW1vdXNDcmVkZW50aWFsIHwgVG9rZW5DcmVkZW50aWFsLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnMgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgLy8gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiBVc2UgYW5vbnltb3VzIGNyZWRlbnRpYWwuXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBpZiAoYmxvYk5hbWVPck9wdGlvbnMgJiYgdHlwZW9mIGJsb2JOYW1lT3JPcHRpb25zICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBibG9iTmFtZU9yT3B0aW9ucyAmJlxuICAgICAgICAgICAgdHlwZW9mIGJsb2JOYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAoY29ubmVjdGlvblN0cmluZzogc3RyaW5nLCBjb250YWluZXJOYW1lOiBzdHJpbmcsIGJsb2JOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICAgICAgY29uc3QgYmxvYk5hbWUgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZENyZWRzID0gZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0cyh1cmxPckNvbm5lY3Rpb25TdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiQWNjb3VudENvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChleHRyYWN0ZWRDcmVkcy5hY2NvdW50TmFtZSwgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudEtleSk7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnByb3h5T3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcm94eU9wdGlvbnMgPSBnZXREZWZhdWx0UHJveHlTZXR0aW5ncyhleHRyYWN0ZWRDcmVkcy5wcm94eVVyaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShzaGFyZWRLZXlDcmVkZW50aWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS5qcyBlbnZpcm9ubWVudFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIlNBU0Nvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHVybCA9XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIj9cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWRDcmVkcy5hY2NvdW50U2FzO1xuICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIHN0cmluZyBtdXN0IGJlIGVpdGhlciBhbiBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIG9yIGEgU0FTIGNvbm5lY3Rpb24gc3RyaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0aW5nIG5vbi1lbXB0eSBzdHJpbmdzIGZvciBjb250YWluZXJOYW1lIGFuZCBibG9iTmFtZSBwYXJhbWV0ZXJzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHVybCwgcGlwZWxpbmUpO1xuICAgICAgICB0aGlzLmJsb2NrQmxvYkNvbnRleHQgPSBuZXcgQmxvY2tCbG9iKHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQpO1xuICAgICAgICB0aGlzLl9ibG9iQ29udGV4dCA9IG5ldyBTdG9yYWdlQmxvYih0aGlzLnN0b3JhZ2VDbGllbnRDb250ZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBCbG9ja0Jsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZVxuICAgICAqIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogUHJvdmlkZSBcIlwiIHdpbGwgcmVtb3ZlIHRoZSBzbmFwc2hvdCBhbmQgcmV0dXJuIGEgVVJMIHRvIHRoZSBiYXNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2NrQmxvYkNsaWVudCBvYmplY3QgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2UgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICovXG4gICAgd2l0aFNuYXBzaG90KHNuYXBzaG90KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tCbG9iQ2xpZW50KHNldFVSTFBhcmFtZXRlcih0aGlzLnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuU05BUFNIT1QsIHNuYXBzaG90Lmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNuYXBzaG90KSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAgICAgKlxuICAgICAqIFF1aWNrIHF1ZXJ5IGZvciBhIEpTT04gb3IgQ1NWIGZvcm1hdHRlZCBibG9iLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZSAoTm9kZS5qcyk6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIFF1ZXJ5IGFuZCBjb252ZXJ0IGEgYmxvYiB0byBhIHN0cmluZ1xuICAgICAqIGNvbnN0IHF1ZXJ5QmxvY2tCbG9iUmVzcG9uc2UgPSBhd2FpdCBibG9ja0Jsb2JDbGllbnQucXVlcnkoXCJzZWxlY3QgKiBmcm9tIEJsb2JTdG9yYWdlXCIpO1xuICAgICAqIGNvbnN0IGRvd25sb2FkZWQgPSAoYXdhaXQgc3RyZWFtVG9CdWZmZXIocXVlcnlCbG9ja0Jsb2JSZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHkpKS50b1N0cmluZygpO1xuICAgICAqIGNvbnNvbGUubG9nKFwiUXVlcnkgYmxvYiBjb250ZW50OlwiLCBkb3dubG9hZGVkKTtcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRvQnVmZmVyKHJlYWRhYmxlU3RyZWFtKSB7XG4gICAgICogICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAqICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgKiAgICAgcmVhZGFibGVTdHJlYW0ub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICogICAgICAgY2h1bmtzLnB1c2goZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlciA/IGRhdGEgOiBCdWZmZXIuZnJvbShkYXRhKSk7XG4gICAgICogICAgIH0pO1xuICAgICAqICAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICogICAgICAgcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykpO1xuICAgICAqICAgICB9KTtcbiAgICAgKiAgICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgICAqICAgfSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHF1ZXJ5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgcXVlcnkocXVlcnksIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2NrQmxvYkNsaWVudC1xdWVyeVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvcGVyYXRpb24gY3VycmVudGx5IGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuanMuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9ibG9iQ29udGV4dC5xdWVyeShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIHF1ZXJ5UmVxdWVzdDoge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFwiU1FMXCIsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBpbnB1dFNlcmlhbGl6YXRpb246IHRvUXVlcnlTZXJpYWxpemF0aW9uKG9wdGlvbnMuaW5wdXRUZXh0Q29uZmlndXJhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFNlcmlhbGl6YXRpb246IHRvUXVlcnlTZXJpYWxpemF0aW9uKG9wdGlvbnMub3V0cHV0VGV4dENvbmZpZ3VyYXRpb24pLFxuICAgICAgICAgICAgICAgIH0sIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9iUXVlcnlSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IG9wdGlvbnMub25Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBvbkVycm9yOiBvcHRpb25zLm9uRXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBibG9jayBibG9iLCBvciB1cGRhdGVzIHRoZSBjb250ZW50IG9mIGFuIGV4aXN0aW5nIGJsb2NrIGJsb2IuXG4gICAgICogVXBkYXRpbmcgYW4gZXhpc3RpbmcgYmxvY2sgYmxvYiBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBtZXRhZGF0YSBvbiB0aGUgYmxvYi5cbiAgICAgKiBQYXJ0aWFsIHVwZGF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQ7IHRoZSBjb250ZW50IG9mIHRoZSBleGlzdGluZyBibG9iIGlzXG4gICAgICogb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV3IGNvbnRlbnQuIFRvIHBlcmZvcm0gYSBwYXJ0aWFsIHVwZGF0ZSBvZiBhIGJsb2NrIGJsb2IncyxcbiAgICAgKiB1c2Uge0BsaW5rIHN0YWdlQmxvY2t9IGFuZCB7QGxpbmsgY29tbWl0QmxvY2tMaXN0fS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYSBub24tcGFyYWxsZWwgdXBsb2FkaW5nIG1ldGhvZCwgcGxlYXNlIHVzZSB7QGxpbmsgdXBsb2FkRmlsZX0sXG4gICAgICoge0BsaW5rIHVwbG9hZFN0cmVhbX0gb3Ige0BsaW5rIHVwbG9hZEJyb3dzZXJEYXRhfSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgICogd2l0aCBjb25jdXJyZW5jeSB1cGxvYWRpbmcuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIGJvZHkgLSBCbG9iLCBzdHJpbmcsIEFycmF5QnVmZmVyLCBBcnJheUJ1ZmZlclZpZXcgb3IgYSBmdW5jdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHJldHVybnMgYSBuZXcgUmVhZGFibGUgc3RyZWFtIHdob3NlIG9mZnNldCBpcyBmcm9tIGRhdGEgc291cmNlIGJlZ2lubmluZy5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCAtIExlbmd0aCBvZiBib2R5IGluIGJ5dGVzLiBVc2UgQnVmZmVyLmJ5dGVMZW5ndGgoKSB0byBjYWxjdWxhdGUgYm9keSBsZW5ndGggZm9yIGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5jbHVkaW5nIG5vbiBub24tQmFzZTY0L0hleC1lbmNvZGVkIGNoYXJhY3RlcnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBCbG9jayBCbG9iIFVwbG9hZCBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2NrIEJsb2IgVXBsb2FkIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2U6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvbnRlbnQgPSBcIkhlbGxvIHdvcmxkIVwiO1xuICAgICAqIGNvbnN0IHVwbG9hZEJsb2JSZXNwb25zZSA9IGF3YWl0IGJsb2NrQmxvYkNsaWVudC51cGxvYWQoY29udGVudCwgY29udGVudC5sZW5ndGgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZChib2R5LCBjb250ZW50TGVuZ3RoLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9ja0Jsb2JDb250ZXh0LnVwbG9hZChjb250ZW50TGVuZ3RoLCBib2R5LCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGJsb2JIdHRwSGVhZGVyczogb3B0aW9ucy5ibG9iSFRUUEhlYWRlcnMsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSwgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCByZXF1ZXN0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBvblVwbG9hZFByb2dyZXNzOiBvcHRpb25zLm9uUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgfSwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLCBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnk6IChfYiA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZXhwaXJpZXNPbiwgaW1tdXRhYmlsaXR5UG9saWN5TW9kZTogKF9jID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5wb2xpY3lNb2RlLCBsZWdhbEhvbGQ6IG9wdGlvbnMubGVnYWxIb2xkLCB0aWVyOiB0b0FjY2Vzc1RpZXIob3B0aW9ucy50aWVyKSwgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEJsb2NrIEJsb2Igd2hlcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9iIGFyZSByZWFkIGZyb20gYSBnaXZlbiBVUkwuXG4gICAgICogVGhpcyBBUEkgaXMgc3VwcG9ydGVkIGJlZ2lubmluZyB3aXRoIHRoZSAyMDIwLTA0LTA4IHZlcnNpb24uIFBhcnRpYWwgdXBkYXRlc1xuICAgICAqIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggUHV0IEJsb2IgZnJvbSBVUkw7IHRoZSBjb250ZW50IG9mIGFuIGV4aXN0aW5nIGJsb2IgaXMgb3ZlcndyaXR0ZW4gd2l0aFxuICAgICAqIHRoZSBjb250ZW50IG9mIHRoZSBuZXcgYmxvYi4gIFRvIHBlcmZvcm0gcGFydGlhbCB1cGRhdGVzIHRvIGEgYmxvY2sgYmxvYuKAmXMgY29udGVudHMgdXNpbmcgYVxuICAgICAqIHNvdXJjZSBVUkwsIHVzZSB7QGxpbmsgc3RhZ2VCbG9ja0Zyb21VUkx9IGFuZCB7QGxpbmsgY29tbWl0QmxvY2tMaXN0fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb3VyY2VVUkwgLSBTcGVjaWZpZXMgdGhlIFVSTCBvZiB0aGUgYmxvYi4gVGhlIHZhbHVlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgYSBVUkwgb2YgdXAgdG8gMiBLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgYSBibG9iLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIHNob3VsZCBiZSBVUkwtZW5jb2RlZCBhcyBpdCB3b3VsZCBhcHBlYXJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgcmVxdWVzdCBVUkkuIFRoZSBzb3VyY2UgYmxvYiBtdXN0IGVpdGhlciBiZSBwdWJsaWNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG11c3QgYmUgYXV0aGVudGljYXRlZCB2aWEgYSBzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzb3VyY2UgYmxvYiBpcyBwdWJsaWMsIG5vIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2Ygc291cmNlIG9iamVjdCBVUkxzOlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvbXlibG9iXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAtIGh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9teWJsb2I/c25hcHNob3Q9PERhdGVUaW1lPlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBhc3luYyBzeW5jVXBsb2FkRnJvbVVSTChzb3VyY2VVUkwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtc3luY1VwbG9hZEZyb21VUkxcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ibG9ja0Jsb2JDb250ZXh0LnB1dEJsb2JGcm9tVXJsKDAsIHNvdXJjZVVSTCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGJsb2JIdHRwSGVhZGVyczogb3B0aW9ucy5ibG9iSFRUUEhlYWRlcnMsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IG9wdGlvbnMuY29uZGl0aW9ucy50YWdDb25kaXRpb25zIH0pLCBzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNYXRjaDogKF9hID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaWZNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNb2RpZmllZFNpbmNlOiAoX2IgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoOiAoX2MgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pZk5vbmVNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZVbm1vZGlmaWVkU2luY2U6IChfZCA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZlRhZ3M6IChfZSA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRhZ0NvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgfSwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBjb3B5U291cmNlQXV0aG9yaXphdGlvbjogaHR0cEF1dGhvcml6YXRpb25Ub1N0cmluZyhvcHRpb25zLnNvdXJjZUF1dGhvcml6YXRpb24pLCB0aWVyOiB0b0FjY2Vzc1RpZXIob3B0aW9ucy50aWVyKSwgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSwgY29weVNvdXJjZVRhZ3M6IG9wdGlvbnMuY29weVNvdXJjZVRhZ3MgfSksIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwbG9hZHMgdGhlIHNwZWNpZmllZCBibG9jayB0byB0aGUgYmxvY2sgYmxvYidzIFwic3RhZ2luZyBhcmVhXCIgdG8gYmUgbGF0ZXJcbiAgICAgKiBjb21taXR0ZWQgYnkgYSBjYWxsIHRvIGNvbW1pdEJsb2NrTGlzdC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9ja0lkIC0gQSA2NC1ieXRlIHZhbHVlIHRoYXQgaXMgYmFzZTY0LWVuY29kZWRcbiAgICAgKiBAcGFyYW0gYm9keSAtIERhdGEgdG8gdXBsb2FkIHRvIHRoZSBzdGFnaW5nIGFyZWEuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggLSBOdW1iZXIgb2YgYnl0ZXMgdG8gdXBsb2FkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgQmxvY2sgQmxvYiBTdGFnZSBCbG9jayBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2NrIEJsb2IgU3RhZ2UgQmxvY2sgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YWdlQmxvY2soYmxvY2tJZCwgYm9keSwgY29udGVudExlbmd0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtc3RhZ2VCbG9ja1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2NrQmxvYkNvbnRleHQuc3RhZ2VCbG9jayhibG9ja0lkLCBjb250ZW50TGVuZ3RoLCBib2R5LCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCByZXF1ZXN0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBvblVwbG9hZFByb2dyZXNzOiBvcHRpb25zLm9uUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgfSwgdHJhbnNhY3Rpb25hbENvbnRlbnRNRDU6IG9wdGlvbnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsIHRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQ6IG9wdGlvbnMudHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NCwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTdGFnZSBCbG9jayBGcm9tIFVSTCBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBibG9jayB0byBiZSBjb21taXR0ZWQgYXMgcGFydFxuICAgICAqIG9mIGEgYmxvYiB3aGVyZSB0aGUgY29udGVudHMgYXJlIHJlYWQgZnJvbSBhIFVSTC5cbiAgICAgKiBUaGlzIEFQSSBpcyBhdmFpbGFibGUgc3RhcnRpbmcgaW4gdmVyc2lvbiAyMDE4LTAzLTI4LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9jay1mcm9tLXVybFxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2NrSWQgLSBBIDY0LWJ5dGUgdmFsdWUgdGhhdCBpcyBiYXNlNjQtZW5jb2RlZFxuICAgICAqIEBwYXJhbSBzb3VyY2VVUkwgLSBTcGVjaWZpZXMgdGhlIFVSTCBvZiB0aGUgYmxvYi4gVGhlIHZhbHVlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgYSBVUkwgb2YgdXAgdG8gMiBLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgYSBibG9iLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIHNob3VsZCBiZSBVUkwtZW5jb2RlZCBhcyBpdCB3b3VsZCBhcHBlYXJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgcmVxdWVzdCBVUkkuIFRoZSBzb3VyY2UgYmxvYiBtdXN0IGVpdGhlciBiZSBwdWJsaWNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG11c3QgYmUgYXV0aGVudGljYXRlZCB2aWEgYSBzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzb3VyY2UgYmxvYiBpcyBwdWJsaWMsIG5vIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2Ygc291cmNlIG9iamVjdCBVUkxzOlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvbXlibG9iXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAtIGh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9teWJsb2I/c25hcHNob3Q9PERhdGVUaW1lPlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBGcm9tIHdoaWNoIHBvc2l0aW9uIG9mIHRoZSBibG9iIHRvIGRvd25sb2FkLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMFxuICAgICAqIEBwYXJhbSBjb3VudCAtIEhvdyBtdWNoIGRhdGEgdG8gYmUgZG93bmxvYWRlZCwgZ3JlYXRlciB0aGFuIDAuIFdpbGwgZG93bmxvYWQgdG8gdGhlIGVuZCB3aGVuIHVuZGVmaW5lZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgQmxvY2sgQmxvYiBTdGFnZSBCbG9jayBGcm9tIFVSTCBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2NrIEJsb2IgU3RhZ2UgQmxvY2sgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YWdlQmxvY2tGcm9tVVJMKGJsb2NrSWQsIHNvdXJjZVVSTCwgb2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LXN0YWdlQmxvY2tGcm9tVVJMXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmxvY2tCbG9iQ29udGV4dC5zdGFnZUJsb2NrRnJvbVVSTChibG9ja0lkLCAwLCBzb3VyY2VVUkwsIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIHNvdXJjZUNvbnRlbnRNRDU6IG9wdGlvbnMuc291cmNlQ29udGVudE1ENSwgc291cmNlQ29udGVudENyYzY0OiBvcHRpb25zLnNvdXJjZUNvbnRlbnRDcmM2NCwgc291cmNlUmFuZ2U6IG9mZnNldCA9PT0gMCAmJiAhY291bnQgPyB1bmRlZmluZWQgOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLCBjb3B5U291cmNlQXV0aG9yaXphdGlvbjogaHR0cEF1dGhvcml6YXRpb25Ub1N0cmluZyhvcHRpb25zLnNvdXJjZUF1dGhvcml6YXRpb24pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIGJsb2IgYnkgc3BlY2lmeWluZyB0aGUgbGlzdCBvZiBibG9jayBJRHMgdGhhdCBtYWtlIHVwIHRoZSBibG9iLlxuICAgICAqIEluIG9yZGVyIHRvIGJlIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGJsb2IsIGEgYmxvY2sgbXVzdCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHdyaXR0ZW5cbiAgICAgKiB0byB0aGUgc2VydmVyIGluIGEgcHJpb3Ige0BsaW5rIHN0YWdlQmxvY2t9IG9wZXJhdGlvbi4gWW91IGNhbiBjYWxsIHtAbGluayBjb21taXRCbG9ja0xpc3R9IHRvXG4gICAgICogdXBkYXRlIGEgYmxvYiBieSB1cGxvYWRpbmcgb25seSB0aG9zZSBibG9ja3MgdGhhdCBoYXZlIGNoYW5nZWQsIHRoZW4gY29tbWl0dGluZyB0aGUgbmV3IGFuZCBleGlzdGluZ1xuICAgICAqIGJsb2NrcyB0b2dldGhlci4gQW55IGJsb2NrcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBibG9jayBsaXN0IGFuZCBwZXJtYW5lbnRseSBkZWxldGVkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9jay1saXN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvY2tzIC0gIEFycmF5IG9mIDY0LWJ5dGUgdmFsdWUgdGhhdCBpcyBiYXNlNjQtZW5jb2RlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgQmxvY2sgQmxvYiBDb21taXQgQmxvY2sgTGlzdCBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2NrIEJsb2IgQ29tbWl0IEJsb2NrIExpc3Qgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGNvbW1pdEJsb2NrTGlzdChibG9ja3MsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LWNvbW1pdEJsb2NrTGlzdFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJsb2NrQmxvYkNvbnRleHQuY29tbWl0QmxvY2tMaXN0KHsgbGF0ZXN0OiBibG9ja3MgfSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBibG9iSHR0cEhlYWRlcnM6IG9wdGlvbnMuYmxvYkhUVFBIZWFkZXJzLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLCBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnk6IChfYiA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZXhwaXJpZXNPbiwgaW1tdXRhYmlsaXR5UG9saWN5TW9kZTogKF9jID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5wb2xpY3lNb2RlLCBsZWdhbEhvbGQ6IG9wdGlvbnMubGVnYWxIb2xkLCB0aWVyOiB0b0FjY2Vzc1RpZXIob3B0aW9ucy50aWVyKSwgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiB1cGxvYWRlZCBhcyBwYXJ0IG9mIGEgYmxvY2sgYmxvYlxuICAgICAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmxvY2sgbGlzdCBmaWx0ZXIuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWJsb2NrLWxpc3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0VHlwZSAtIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGUgbGlzdCBvZiBjb21taXR0ZWQgYmxvY2tzLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIHVuY29tbWl0dGVkIGJsb2Nrcywgb3IgYm90aCBsaXN0cyB0b2dldGhlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIEJsb2NrIEJsb2IgR2V0IEJsb2NrIExpc3Qgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBCbG9jayBCbG9iIEdldCBCbG9jayBMaXN0IG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRCbG9ja0xpc3QobGlzdFR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtZ2V0QmxvY2tMaXN0XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ibG9ja0Jsb2JDb250ZXh0LmdldEJsb2NrTGlzdChsaXN0VHlwZSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgICAgICBpZiAoIXJlcy5jb21taXR0ZWRCbG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXMuY29tbWl0dGVkQmxvY2tzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlcy51bmNvbW1pdHRlZEJsb2Nrcykge1xuICAgICAgICAgICAgICAgIHJlcy51bmNvbW1pdHRlZEJsb2NrcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGlnaCBsZXZlbCBmdW5jdGlvbnNcbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIGEgQnVmZmVyKE5vZGUuanMpL0Jsb2IoYnJvd3NlcnMpL0FycmF5QnVmZmVyL0FycmF5QnVmZmVyVmlldyBvYmplY3QgdG8gYSBCbG9ja0Jsb2IuXG4gICAgICpcbiAgICAgKiBXaGVuIGRhdGEgbGVuZ3RoIGlzIG5vIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWxlZCB7QGxpbmsgQmxvY2tCbG9iUGFyYWxsZWxVcGxvYWRPcHRpb25zLm1heFNpbmdsZVNob3RTaXplfSAoZGVmYXVsdCBpc1xuICAgICAqIHtAbGluayBCTE9DS19CTE9CX01BWF9VUExPQURfQkxPQl9CWVRFU30pLCB0aGlzIG1ldGhvZCB3aWxsIHVzZSAxIHtAbGluayB1cGxvYWR9IGNhbGwgdG8gZmluaXNoIHRoZSB1cGxvYWQuXG4gICAgICogT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIGNhbGwge0BsaW5rIHN0YWdlQmxvY2t9IHRvIHVwbG9hZCBibG9ja3MsIGFuZCBmaW5hbGx5IGNhbGwge0BsaW5rIGNvbW1pdEJsb2NrTGlzdH1cbiAgICAgKiB0byBjb21taXQgdGhlIGJsb2NrIGxpc3QuXG4gICAgICpcbiAgICAgKiBBIGNvbW1vbiB7QGxpbmsgQmxvY2tCbG9iUGFyYWxsZWxVcGxvYWRPcHRpb25zLmJsb2JIVFRQSGVhZGVyc30gb3B0aW9uIHRvIHNldCBpc1xuICAgICAqIGBibG9iQ29udGVudFR5cGVgLCBlbmFibGluZyB0aGUgYnJvd3NlciB0byBwcm92aWRlXG4gICAgICogZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiBmaWxlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YSAtIEJ1ZmZlcihOb2RlLmpzKSwgQmxvYiwgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZERhdGEoZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtdXBsb2FkRGF0YVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgYnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRTZWVrYWJsZUludGVybmFsKChvZmZzZXQsIHNpemUpID0+IGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpLCBidWZmZXIuYnl0ZUxlbmd0aCwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnJvd3NlckJsb2IgPSBuZXcgQmxvYihbZGF0YV0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwbG9hZFNlZWthYmxlSW50ZXJuYWwoKG9mZnNldCwgc2l6ZSkgPT4gYnJvd3NlckJsb2Iuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplKSwgYnJvd3NlckJsb2Iuc2l6ZSwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBPTkxZIEFWQUlMQUJMRSBJTiBCUk9XU0VSUy5cbiAgICAgKlxuICAgICAqIFVwbG9hZHMgYSBicm93c2VyIEJsb2IvRmlsZS9BcnJheUJ1ZmZlci9BcnJheUJ1ZmZlclZpZXcgb2JqZWN0IHRvIGJsb2NrIGJsb2IuXG4gICAgICpcbiAgICAgKiBXaGVuIGJ1ZmZlciBsZW5ndGggbGVzc2VyIHRoYW4gb3IgZXF1YWwgdG8gMjU2TUIsIHRoaXMgbWV0aG9kIHdpbGwgdXNlIDEgdXBsb2FkIGNhbGwgdG8gZmluaXNoIHRoZSB1cGxvYWQuXG4gICAgICogT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIGNhbGwge0BsaW5rIHN0YWdlQmxvY2t9IHRvIHVwbG9hZCBibG9ja3MsIGFuZCBmaW5hbGx5IGNhbGxcbiAgICAgKiB7QGxpbmsgY29tbWl0QmxvY2tMaXN0fSB0byBjb21taXQgdGhlIGJsb2NrIGxpc3QuXG4gICAgICpcbiAgICAgKiBBIGNvbW1vbiB7QGxpbmsgQmxvY2tCbG9iUGFyYWxsZWxVcGxvYWRPcHRpb25zLmJsb2JIVFRQSGVhZGVyc30gb3B0aW9uIHRvIHNldCBpc1xuICAgICAqIGBibG9iQ29udGVudFR5cGVgLCBlbmFibGluZyB0aGUgYnJvd3NlciB0byBwcm92aWRlXG4gICAgICogZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiBmaWxlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHVwbG9hZERhdGF9IGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnJvd3NlckRhdGEgLSBCbG9iLCBGaWxlLCBBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXdcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdXBsb2FkIGJyb3dzZXIgZGF0YS5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZEJyb3dzZXJEYXRhKGJyb3dzZXJEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRCcm93c2VyRGF0YVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJCbG9iID0gbmV3IEJsb2IoW2Jyb3dzZXJEYXRhXSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51cGxvYWRTZWVrYWJsZUludGVybmFsKChvZmZzZXQsIHNpemUpID0+IGJyb3dzZXJCbG9iLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSksIGJyb3dzZXJCbG9iLnNpemUsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBVcGxvYWRzIGRhdGEgdG8gYmxvY2sgYmxvYi4gUmVxdWlyZXMgYSBib2R5RmFjdG9yeSBhcyB0aGUgZGF0YSBzb3VyY2UsXG4gICAgICogd2hpY2ggbmVlZCB0byByZXR1cm4gYSB7QGxpbmsgSHR0cFJlcXVlc3RCb2R5fSBvYmplY3Qgd2l0aCB0aGUgb2Zmc2V0IGFuZCBzaXplIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogV2hlbiBkYXRhIGxlbmd0aCBpcyBubyBtb3JlIHRoYW4gdGhlIHNwZWNpZmllZCB7QGxpbmsgQmxvY2tCbG9iUGFyYWxsZWxVcGxvYWRPcHRpb25zLm1heFNpbmdsZVNob3RTaXplfSAoZGVmYXVsdCBpc1xuICAgICAqIHtAbGluayBCTE9DS19CTE9CX01BWF9VUExPQURfQkxPQl9CWVRFU30pLCB0aGlzIG1ldGhvZCB3aWxsIHVzZSAxIHtAbGluayB1cGxvYWR9IGNhbGwgdG8gZmluaXNoIHRoZSB1cGxvYWQuXG4gICAgICogT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIGNhbGwge0BsaW5rIHN0YWdlQmxvY2t9IHRvIHVwbG9hZCBibG9ja3MsIGFuZCBmaW5hbGx5IGNhbGwge0BsaW5rIGNvbW1pdEJsb2NrTGlzdH1cbiAgICAgKiB0byBjb21taXQgdGhlIGJsb2NrIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYm9keUZhY3RvcnkgLVxuICAgICAqIEBwYXJhbSBzaXplIC0gc2l6ZSBvZiB0aGUgZGF0YSB0byB1cGxvYWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIFVwbG9hZCB0byBCbG9jayBCbG9iIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZFNlZWthYmxlSW50ZXJuYWwoYm9keUZhY3RvcnksIHNpemUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuYmxvY2tTaXplKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJsb2NrU2l6ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tTaXplIDwgMCB8fCBvcHRpb25zLmJsb2NrU2l6ZSA+IEJMT0NLX0JMT0JfTUFYX1NUQUdFX0JMT0NLX0JZVEVTKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgYmxvY2tTaXplIG9wdGlvbiBtdXN0IGJlID49IDAgYW5kIDw9ICR7QkxPQ0tfQkxPQl9NQVhfU1RBR0VfQkxPQ0tfQllURVN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4U2luZ2xlU2hvdFNpemUgIT09IDAgJiYgIW9wdGlvbnMubWF4U2luZ2xlU2hvdFNpemUpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubWF4U2luZ2xlU2hvdFNpemUgPSBCTE9DS19CTE9CX01BWF9VUExPQURfQkxPQl9CWVRFUztcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5tYXhTaW5nbGVTaG90U2l6ZSA8IDAgfHxcbiAgICAgICAgICAgIG9wdGlvbnMubWF4U2luZ2xlU2hvdFNpemUgPiBCTE9DS19CTE9CX01BWF9VUExPQURfQkxPQl9CWVRFUykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYG1heFNpbmdsZVNob3RTaXplIG9wdGlvbiBtdXN0IGJlID49IDAgYW5kIDw9ICR7QkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tTaXplID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IEJMT0NLX0JMT0JfTUFYX1NUQUdFX0JMT0NLX0JZVEVTICogQkxPQ0tfQkxPQl9NQVhfQkxPQ0tTKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCR7c2l6ZX0gaXMgdG9vIGxhcmdlciB0byB1cGxvYWQgdG8gYSBibG9jayBibG9iLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNpemUgPiBvcHRpb25zLm1heFNpbmdsZVNob3RTaXplKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ibG9ja1NpemUgPSBNYXRoLmNlaWwoc2l6ZSAvIEJMT0NLX0JMT0JfTUFYX0JMT0NLUyk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tTaXplIDwgREVGQVVMVF9CTE9CX0RPV05MT0FEX0JMT0NLX0JZVEVTKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYmxvY2tTaXplID0gREVGQVVMVF9CTE9CX0RPV05MT0FEX0JMT0NLX0JZVEVTO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMuYmxvYkhUVFBIZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJsb2JIVFRQSGVhZGVycyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LXVwbG9hZFNlZWthYmxlSW50ZXJuYWxcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2l6ZSA8PSBvcHRpb25zLm1heFNpbmdsZVNob3RTaXplKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXBsb2FkKGJvZHlGYWN0b3J5KDAsIHNpemUpLCBzaXplLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBudW1CbG9ja3MgPSBNYXRoLmZsb29yKChzaXplIC0gMSkgLyBvcHRpb25zLmJsb2NrU2l6ZSkgKyAxO1xuICAgICAgICAgICAgaWYgKG51bUJsb2NrcyA+IEJMT0NLX0JMT0JfTUFYX0JMT0NLUykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgYnVmZmVyJ3Mgc2l6ZSBpcyB0b28gYmlnIG9yIHRoZSBCbG9ja1NpemUgaXMgdG9vIHNtYWxsO2AgK1xuICAgICAgICAgICAgICAgICAgICBgdGhlIG51bWJlciBvZiBibG9ja3MgbXVzdCBiZSA8PSAke0JMT0NLX0JMT0JfTUFYX0JMT0NLU31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2NrTGlzdCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgYmxvY2tJRFByZWZpeCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgICAgICAgICAgbGV0IHRyYW5zZmVyUHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBuZXcgQmF0Y2gob3B0aW9ucy5jb25jdXJyZW5jeSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJsb2NrczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYmF0Y2guYWRkT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tJRCA9IGdlbmVyYXRlQmxvY2tJRChibG9ja0lEUHJlZml4LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBvcHRpb25zLmJsb2NrU2l6ZSAqIGk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IGkgPT09IG51bUJsb2NrcyAtIDEgPyBzaXplIDogc3RhcnQgKyBvcHRpb25zLmJsb2NrU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGVuZCAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBibG9ja0xpc3QucHVzaChibG9ja0lEKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGFnZUJsb2NrKGJsb2NrSUQsIGJvZHlGYWN0b3J5KHN0YXJ0LCBjb250ZW50TGVuZ3RoKSwgY29udGVudExlbmd0aCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHByb2dyZXNzIGFmdGVyIGJsb2NrIGlzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byBzZXJ2ZXIsIGluIGNhc2Ugb2YgYmxvY2sgdHJ5aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEhvb2sgd2l0aCBjb252ZW5pZW5jZSBsYXllciBwcm9ncmVzcyBldmVudCBpbiBmaW5lciBsZXZlbFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclByb2dyZXNzICs9IGNvbnRlbnRMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25Qcm9ncmVzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkQnl0ZXM6IHRyYW5zZmVyUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgYmF0Y2guZG8oKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1pdEJsb2NrTGlzdChibG9ja0xpc3QsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICAgICAqXG4gICAgICogVXBsb2FkcyBhIGxvY2FsIGZpbGUgaW4gYmxvY2tzIHRvIGEgYmxvY2sgYmxvYi5cbiAgICAgKlxuICAgICAqIFdoZW4gZmlsZSBzaXplIGxlc3NlciB0aGFuIG9yIGVxdWFsIHRvIDI1Nk1CLCB0aGlzIG1ldGhvZCB3aWxsIHVzZSAxIHVwbG9hZCBjYWxsIHRvIGZpbmlzaCB0aGUgdXBsb2FkLlxuICAgICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2Qgd2lsbCBjYWxsIHN0YWdlQmxvY2sgdG8gdXBsb2FkIGJsb2NrcywgYW5kIGZpbmFsbHkgY2FsbCBjb21taXRCbG9ja0xpc3RcbiAgICAgKiB0byBjb21taXQgdGhlIGJsb2NrIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggLSBGdWxsIHBhdGggb2YgbG9jYWwgZmlsZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBVcGxvYWQgdG8gQmxvY2sgQmxvYiBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2IgVXBsb2FkIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRGaWxlKGZpbGVQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRGaWxlXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IChhd2FpdCBmc1N0YXQoZmlsZVBhdGgpKS5zaXplO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXBsb2FkU2Vla2FibGVJbnRlcm5hbCgob2Zmc2V0LCBjb3VudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiBmc0NyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgsIHtcbiAgICAgICAgICAgICAgICAgICAgYXV0b0Nsb3NlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IGNvdW50ID8gb2Zmc2V0ICsgY291bnQgLSAxIDogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvZmZzZXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBzaXplLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMudHJhY2luZ09wdGlvbnMpLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gICAgICpcbiAgICAgKiBVcGxvYWRzIGEgTm9kZS5qcyBSZWFkYWJsZSBzdHJlYW0gaW50byBibG9jayBibG9iLlxuICAgICAqXG4gICAgICogUEVSRk9STUFOQ0UgSU1QUk9WRU1FTlQgVElQUzpcbiAgICAgKiAqIElucHV0IHN0cmVhbSBoaWdoV2F0ZXJNYXJrIGlzIGJldHRlciB0byBzZXQgYSBzYW1lIHZhbHVlIHdpdGggYnVmZmVyU2l6ZVxuICAgICAqICAgIHBhcmFtZXRlciwgd2hpY2ggd2lsbCBhdm9pZCBCdWZmZXIuY29uY2F0KCkgb3BlcmF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJlYW0gLSBOb2RlLmpzIFJlYWRhYmxlIHN0cmVhbVxuICAgICAqIEBwYXJhbSBidWZmZXJTaXplIC0gU2l6ZSBvZiBldmVyeSBidWZmZXIgYWxsb2NhdGVkLCBhbHNvIHRoZSBibG9jayBzaXplIGluIHRoZSB1cGxvYWRlZCBibG9jayBibG9iLiBEZWZhdWx0IHZhbHVlIGlzIDhNQlxuICAgICAqIEBwYXJhbSBtYXhDb25jdXJyZW5jeSAtICBNYXggY29uY3VycmVuY3kgaW5kaWNhdGVzIHRoZSBtYXggbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBtYXggdXBsb2FkaW5nIGNvbmN1cnJlbmN5LiBEZWZhdWx0IHZhbHVlIGlzIDVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gVXBsb2FkIFN0cmVhbSB0byBCbG9jayBCbG9iIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZFN0cmVhbShzdHJlYW0sIGJ1ZmZlclNpemUgPSBERUZBVUxUX0JMT0NLX0JVRkZFUl9TSVpFX0JZVEVTLCBtYXhDb25jdXJyZW5jeSA9IDUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuYmxvYkhUVFBIZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJsb2JIVFRQSGVhZGVycyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LXVwbG9hZFN0cmVhbVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBibG9ja051bSA9IDA7XG4gICAgICAgICAgICBjb25zdCBibG9ja0lEUHJlZml4ID0gZ2VuZXJhdGVVdWlkKCk7XG4gICAgICAgICAgICBsZXQgdHJhbnNmZXJQcm9ncmVzcyA9IDA7XG4gICAgICAgICAgICBjb25zdCBibG9ja0xpc3QgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IG5ldyBCdWZmZXJTY2hlZHVsZXIoc3RyZWFtLCBidWZmZXJTaXplLCBtYXhDb25jdXJyZW5jeSwgYXN5bmMgKGJvZHksIGxlbmd0aCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrSUQgPSBnZW5lcmF0ZUJsb2NrSUQoYmxvY2tJRFByZWZpeCwgYmxvY2tOdW0pO1xuICAgICAgICAgICAgICAgIGJsb2NrTGlzdC5wdXNoKGJsb2NrSUQpO1xuICAgICAgICAgICAgICAgIGJsb2NrTnVtKys7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGFnZUJsb2NrKGJsb2NrSUQsIGJvZHksIGxlbmd0aCwge1xuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcHJvZ3Jlc3MgYWZ0ZXIgYmxvY2sgaXMgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIHRvIHNlcnZlciwgaW4gY2FzZSBvZiBibG9jayB0cnlpbmdcbiAgICAgICAgICAgICAgICB0cmFuc2ZlclByb2dyZXNzICs9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25Qcm9ncmVzcyh7IGxvYWRlZEJ5dGVzOiB0cmFuc2ZlclByb2dyZXNzIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgLy8gY29uY3VycmVuY3kgc2hvdWxkIHNldCBhIHNtYWxsZXIgdmFsdWUgdGhhbiBtYXhDb25jdXJyZW5jeSwgd2hpY2ggaXMgaGVscGZ1bCB0b1xuICAgICAgICAgICAgLy8gcmVkdWNlIHRoZSBwb3NzaWJpbGl0eSB3aGVuIGEgb3V0Z29pbmcgaGFuZGxlciB3YWl0cyBmb3Igc3RyZWFtIGRhdGEsIGluXG4gICAgICAgICAgICAvLyB0aGlzIHNpdHVhdGlvbiwgb3V0Z29pbmcgaGFuZGxlcnMgYXJlIGJsb2NrZWQuXG4gICAgICAgICAgICAvLyBPdXRnb2luZyBxdWV1ZSBzaG91bGRuJ3QgYmUgZW1wdHkuXG4gICAgICAgICAgICBNYXRoLmNlaWwoKG1heENvbmN1cnJlbmN5IC8gNCkgKiAzKSk7XG4gICAgICAgICAgICBhd2FpdCBzY2hlZHVsZXIuZG8oKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbW1pdEJsb2NrTGlzdChibG9ja0xpc3QsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgdHJhY2luZ09wdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy50cmFjaW5nT3B0aW9ucyksIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBQYWdlQmxvYkNsaWVudCBkZWZpbmVzIGEgc2V0IG9mIG9wZXJhdGlvbnMgYXBwbGljYWJsZSB0byBwYWdlIGJsb2JzLlxuICovXG5leHBvcnQgY2xhc3MgUGFnZUJsb2JDbGllbnQgZXh0ZW5kcyBCbG9iQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmxPckNvbm5lY3Rpb25TdHJpbmcsIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lLCBibG9iTmFtZU9yT3B0aW9ucywgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICAvLyBJbiBUeXBlU2NyaXB0IHdlIGNhbm5vdCBzaW1wbHkgcGFzcyBhbGwgcGFyYW1ldGVycyB0byBzdXBlcigpIGxpa2UgYmVsb3cgc28gaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGNvZGUgaW5zdGVhZC5cbiAgICAgICAgLy8gICBzdXBlcihzLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZU9yT3B0aW9ucywgYmxvYk5hbWVPck9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBsZXQgcGlwZWxpbmU7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoaXNQaXBlbGluZUxpa2UoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIHBpcGVsaW5lOiBQaXBlbGluZSlcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGlzTm9kZSAmJiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsIHx8XG4gICAgICAgICAgICBpc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSkpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBvcHRpb25zID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBjcmVkZW50aWFsPzogU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfCBBbm9ueW1vdXNDcmVkZW50aWFsIHwgVG9rZW5DcmVkZW50aWFsLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIC8vIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4gVXNlIGFub255bW91cyBjcmVkZW50aWFsLlxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBibG9iTmFtZU9yT3B0aW9ucyAmJlxuICAgICAgICAgICAgdHlwZW9mIGJsb2JOYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAoY29ubmVjdGlvblN0cmluZzogc3RyaW5nLCBjb250YWluZXJOYW1lOiBzdHJpbmcsIGJsb2JOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICAgICAgY29uc3QgYmxvYk5hbWUgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZENyZWRzID0gZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0cyh1cmxPckNvbm5lY3Rpb25TdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiQWNjb3VudENvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChleHRyYWN0ZWRDcmVkcy5hY2NvdW50TmFtZSwgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudEtleSk7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnByb3h5T3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcm94eU9wdGlvbnMgPSBnZXREZWZhdWx0UHJveHlTZXR0aW5ncyhleHRyYWN0ZWRDcmVkcy5wcm94eVVyaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShzaGFyZWRLZXlDcmVkZW50aWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS5qcyBlbnZpcm9ubWVudFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIlNBU0Nvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHVybCA9XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIj9cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWRDcmVkcy5hY2NvdW50U2FzO1xuICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIHN0cmluZyBtdXN0IGJlIGVpdGhlciBhbiBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIG9yIGEgU0FTIGNvbm5lY3Rpb24gc3RyaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0aW5nIG5vbi1lbXB0eSBzdHJpbmdzIGZvciBjb250YWluZXJOYW1lIGFuZCBibG9iTmFtZSBwYXJhbWV0ZXJzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHVybCwgcGlwZWxpbmUpO1xuICAgICAgICB0aGlzLnBhZ2VCbG9iQ29udGV4dCA9IG5ldyBQYWdlQmxvYih0aGlzLnN0b3JhZ2VDbGllbnRDb250ZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBQYWdlQmxvYkNsaWVudCBvYmplY3QgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2UgYnV0IHdpdGggdGhlXG4gICAgICogc3BlY2lmaWVkIHNuYXBzaG90IHRpbWVzdGFtcC5cbiAgICAgKiBQcm92aWRlIFwiXCIgd2lsbCByZW1vdmUgdGhlIHNuYXBzaG90IGFuZCByZXR1cm4gYSBDbGllbnQgdG8gdGhlIGJhc2UgYmxvYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzbmFwc2hvdCAtIFRoZSBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogQHJldHVybnMgQSBuZXcgUGFnZUJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqL1xuICAgIHdpdGhTbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gbmV3IFBhZ2VCbG9iQ2xpZW50KHNldFVSTFBhcmFtZXRlcih0aGlzLnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuU05BUFNIT1QsIHNuYXBzaG90Lmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNuYXBzaG90KSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwYWdlIGJsb2Igb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguIENhbGwgdXBsb2FkUGFnZXMgdG8gdXBsb2FkIGRhdGFcbiAgICAgKiBkYXRhIHRvIGEgcGFnZSBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2l6ZSAtIHNpemUgb2YgdGhlIHBhZ2UgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBDcmVhdGUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBQYWdlIEJsb2IgQ3JlYXRlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGUoc2l6ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJQYWdlQmxvYkNsaWVudC1jcmVhdGVcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQuY3JlYXRlKDAsIHNpemUsIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgYmxvYkh0dHBIZWFkZXJzOiBvcHRpb25zLmJsb2JIVFRQSGVhZGVycywgYmxvYlNlcXVlbmNlTnVtYmVyOiBvcHRpb25zLmJsb2JTZXF1ZW5jZU51bWJlciwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSwgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiAoX2IgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4cGlyaWVzT24sIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IChfYyA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucG9saWN5TW9kZSwgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCwgdGllcjogdG9BY2Nlc3NUaWVyKG9wdGlvbnMudGllciksIGJsb2JUYWdzU3RyaW5nOiB0b0Jsb2JUYWdzU3RyaW5nKG9wdGlvbnMudGFncykgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHBhZ2UgYmxvYiBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4gQ2FsbCB1cGxvYWRQYWdlcyB0byB1cGxvYWQgZGF0YVxuICAgICAqIGRhdGEgdG8gYSBwYWdlIGJsb2IuIElmIHRoZSBibG9iIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlIGNvbnRlbnRcbiAgICAgKiBvZiB0aGUgZXhpc3RpbmcgYmxvYiB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIC0gc2l6ZSBvZiB0aGUgcGFnZSBibG9iLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVJZk5vdEV4aXN0cyhzaXplLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LWNyZWF0ZUlmTm90RXhpc3RzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IHsgaWZOb25lTWF0Y2g6IEVUYWdBbnkgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY3JlYXRlKHNpemUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgY29uZGl0aW9ucywgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IHRydWUgfSwgcmVzKSwgeyBfcmVzcG9uc2U6IHJlcy5fcmVzcG9uc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICgoKF9hID0gZS5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXJyb3JDb2RlKSA9PT0gXCJCbG9iQWxyZWFkeUV4aXN0c1wiKSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJFeHBlY3RlZCBleGNlcHRpb24gd2hlbiBjcmVhdGluZyBhIGJsb2Igb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IGZhbHNlIH0sIChfYiA9IGUucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJzZWRIZWFkZXJzKSwgeyBfcmVzcG9uc2U6IGUucmVzcG9uc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgMSBvciBtb3JlIHBhZ2VzIHRvIHRoZSBwYWdlIGJsb2IuIFRoZSBzdGFydCBhbmQgZW5kIG9mZnNldHMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDUxMi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtcGFnZVxuICAgICAqXG4gICAgICogQHBhcmFtIGJvZHkgLSBEYXRhIHRvIHVwbG9hZFxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBPZmZzZXQgb2YgZGVzdGluYXRpb24gcGFnZSBibG9iXG4gICAgICogQHBhcmFtIGNvdW50IC0gQ29udGVudCBsZW5ndGggb2YgdGhlIGJvZHksIGFsc28gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHVwbG9hZGVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgVXBsb2FkIFBhZ2VzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIFVwbG9hZCBQYWdlcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkUGFnZXMoYm9keSwgb2Zmc2V0LCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtdXBsb2FkUGFnZXNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQudXBsb2FkUGFnZXMoY291bnQsIGJvZHksIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25VcGxvYWRQcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIH0sIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSwgc2VxdWVuY2VOdW1iZXJBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIHRyYW5zYWN0aW9uYWxDb250ZW50TUQ1OiBvcHRpb25zLnRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LCB0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0OiBvcHRpb25zLnRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQsIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgVXBsb2FkIFBhZ2VzIG9wZXJhdGlvbiB3cml0ZXMgYSByYW5nZSBvZiBwYWdlcyB0byBhIHBhZ2UgYmxvYiB3aGVyZSB0aGVcbiAgICAgKiBjb250ZW50cyBhcmUgcmVhZCBmcm9tIGEgVVJMLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1wYWdlLWZyb20tdXJsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc291cmNlVVJMIC0gU3BlY2lmeSBhIFVSTCB0byB0aGUgY29weSBzb3VyY2UsIFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlKFNBUykgbWF5YmUgbmVlZGVkIGZvciBhdXRoZW50aWNhdGlvblxuICAgICAqIEBwYXJhbSBzb3VyY2VPZmZzZXQgLSBUaGUgc291cmNlIG9mZnNldCB0byBjb3B5IGZyb20uIFBhc3MgMCB0byBjb3B5IGZyb20gdGhlIGJlZ2lubmluZyBvZiBzb3VyY2UgcGFnZSBibG9iXG4gICAgICogQHBhcmFtIGRlc3RPZmZzZXQgLSBPZmZzZXQgb2YgZGVzdGluYXRpb24gcGFnZSBibG9iXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHVwbG9hZGVkIGZyb20gc291cmNlIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRQYWdlc0Zyb21VUkwoc291cmNlVVJMLCBzb3VyY2VPZmZzZXQsIGRlc3RPZmZzZXQsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucyA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LXVwbG9hZFBhZ2VzRnJvbVVSTFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBhZ2VCbG9iQ29udGV4dC51cGxvYWRQYWdlc0Zyb21VUkwoc291cmNlVVJMLCByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0OiBzb3VyY2VPZmZzZXQsIGNvdW50IH0pLCAwLCByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0OiBkZXN0T2Zmc2V0LCBjb3VudCB9KSwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBzb3VyY2VDb250ZW50TUQ1OiBvcHRpb25zLnNvdXJjZUNvbnRlbnRNRDUsIHNvdXJjZUNvbnRlbnRDcmM2NDogb3B0aW9ucy5zb3VyY2VDb250ZW50Q3JjNjQsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBzZXF1ZW5jZU51bWJlckFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNYXRjaDogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLmlmTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTW9kaWZpZWRTaW5jZTogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZOb25lTWF0Y2g6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk5vbmVNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZVbm1vZGlmaWVkU2luY2U6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICB9LCBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsIGNvcHlTb3VyY2VBdXRob3JpemF0aW9uOiBodHRwQXV0aG9yaXphdGlvblRvU3RyaW5nKG9wdGlvbnMuc291cmNlQXV0aG9yaXphdGlvbikgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRnJlZXMgdGhlIHNwZWNpZmllZCBwYWdlcyBmcm9tIHRoZSBwYWdlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LXBhZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlcyB0byBjbGVhci5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gY2xlYXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgQ2xlYXIgUGFnZXMgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBQYWdlIEJsb2IgQ2xlYXIgUGFnZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGNsZWFyUGFnZXMob2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LWNsZWFyUGFnZXNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQuY2xlYXJQYWdlcygwLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSwgc2VxdWVuY2VOdW1iZXJBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZhbGlkIHBhZ2UgcmFuZ2VzIGZvciBhIHBhZ2UgYmxvYiBvciBzbmFwc2hvdCBvZiBhIHBhZ2UgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtcGFnZS1yYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBSYW5nZXMgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBQYWdlIEJsb2IgR2V0IFJhbmdlcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UGFnZVJhbmdlcyhvZmZzZXQgPSAwLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtZ2V0UGFnZVJhbmdlc1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBhZ2VCbG9iQ29udGV4dFxuICAgICAgICAgICAgICAgIC5nZXRQYWdlUmFuZ2VzKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgcmFuZ2U6IHJhbmdlVG9TdHJpbmcoeyBvZmZzZXQsIGNvdW50IH0pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSlcbiAgICAgICAgICAgICAgICAudGhlbihyYW5nZVJlc3BvbnNlRnJvbU1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogZ2V0UGFnZVJhbmdlc1NlZ21lbnQgcmV0dXJucyBhIHNpbmdsZSBzZWdtZW50IG9mIHBhZ2UgcmFuZ2VzIHN0YXJ0aW5nIGZyb20gdGhlXG4gICAgICogc3BlY2lmaWVkIE1hcmtlci4gVXNlIGFuIGVtcHR5IE1hcmtlciB0byBzdGFydCBlbnVtZXJhdGlvbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogQWZ0ZXIgZ2V0dGluZyBhIHNlZ21lbnQsIHByb2Nlc3MgaXQsIGFuZCB0aGVuIGNhbGwgZ2V0UGFnZVJhbmdlc1NlZ21lbnQgYWdhaW5cbiAgICAgKiAocGFzc2luZyB0aGUgdGhlIHByZXZpb3VzbHktcmV0dXJuZWQgTWFya2VyKSB0byBnZXQgdGhlIG5leHQgc2VnbWVudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtcGFnZS1yYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2YgdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gUGFnZUJsb2IgR2V0IFBhZ2UgUmFuZ2VzIFNlZ21lbnQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RQYWdlUmFuZ2VzU2VnbWVudChvZmZzZXQgPSAwLCBjb3VudCwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtZ2V0UGFnZVJhbmdlc1NlZ21lbnRcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQuZ2V0UGFnZVJhbmdlcyhPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSwgbWFya2VyOiBtYXJrZXIsIG1heFBhZ2VTaXplOiBvcHRpb25zLm1heFBhZ2VTaXplIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciB7QGxpbmsgUGFnZUJsb2JHZXRQYWdlUmFuZ2VzUmVzcG9uc2VNb2RlbH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdldCBvZiBwYWdlIHJhbmdlcyB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGdldHRpbmcgb3BlcmF0aW9uLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIHJldHVybnMgdGhlIENvbnRpbnVhdGlvblRva2VuIHZhbHVlIHdpdGhpbiB0aGUgcmVzcG9uc2UgYm9keSBpZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGluZyBvcGVyYXRpb24gZGlkIG5vdCByZXR1cm4gYWxsIHBhZ2UgcmFuZ2VzIHJlbWFpbmluZyB3aXRoaW4gdGhlIGN1cnJlbnQgcGFnZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIENvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGdldFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy4gVGhlIG1hcmtlciB2YWx1ZSBpcyBvcGFxdWUgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gTGlzdCBQYWdlIFJhbmdlcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgbGlzdFBhZ2VSYW5nZUl0ZW1TZWdtZW50cyhvZmZzZXQgPSAwLCBjb3VudCwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFBhZ2VSYW5nZUl0ZW1TZWdtZW50c18xKCkge1xuICAgICAgICAgICAgbGV0IGdldFBhZ2VSYW5nZUl0ZW1TZWdtZW50c1Jlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKCEhbWFya2VyIHx8IG1hcmtlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYWdlUmFuZ2VJdGVtU2VnbWVudHNSZXNwb25zZSA9IHlpZWxkIF9fYXdhaXQodGhpcy5saXN0UGFnZVJhbmdlc1NlZ21lbnQob2Zmc2V0LCBjb3VudCwgbWFya2VyLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGdldFBhZ2VSYW5nZUl0ZW1TZWdtZW50c1Jlc3BvbnNlLmNvbnRpbnVhdGlvblRva2VuO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KHlpZWxkIF9fYXdhaXQoZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3Igb2Yge0BsaW5rIFBhZ2VSYW5nZUluZm99IG9iamVjdHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBMaXN0IFBhZ2UgUmFuZ2VzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0UGFnZVJhbmdlSXRlbXMob2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBsaXN0UGFnZVJhbmdlSXRlbXNfMSgpIHtcbiAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgbGV0IG1hcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX2FzeW5jVmFsdWVzKHRoaXMubGlzdFBhZ2VSYW5nZUl0ZW1TZWdtZW50cyhvZmZzZXQsIGNvdW50LCBtYXJrZXIsIG9wdGlvbnMpKSwgX2M7IF9jID0geWllbGQgX19hd2FpdChfYi5uZXh0KCkpLCAhX2MuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0UGFnZVJhbmdlc1NlZ21lbnQgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKEV4dHJhY3RQYWdlUmFuZ2VJbmZvSXRlbXMoZ2V0UGFnZVJhbmdlc1NlZ21lbnQpKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgeWllbGQgX19hd2FpdChfYS5jYWxsKF9iKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCBvZiBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiAgLmJ5UGFnZSgpIHJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCBvZiBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2IuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBmb3IgYXdhaXRgIHN5bnRheDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gR2V0IHRoZSBwYWdlQmxvYkNsaWVudCBiZWZvcmUgeW91IHJ1biB0aGVzZSBzbmlwcGV0cyxcbiAgICAgKiAvLyBDYW4gYmUgb2J0YWluZWQgZnJvbSBgYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPHlvdXItY29udGFpbmVyLW5hbWU+XCIpLmdldFBhZ2VCbG9iQ2xpZW50KFwiPHlvdXItYmxvYi1uYW1lPlwiKTtgXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcGFnZVJhbmdlIG9mIHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzKCkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyID0gcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXMoKTtcbiAgICAgKiBsZXQgcGFnZVJhbmdlSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghcGFnZVJhbmdlSXRlbS5kb25lKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgUGFnZSByYW5nZSAke2krK306ICR7cGFnZVJhbmdlSXRlbS52YWx1ZS5zdGFydH0gLSAke3BhZ2VSYW5nZUl0ZW0udmFsdWUuZW5kfSwgSXNDbGVhcjogJHtwYWdlUmFuZ2VJdGVtLnZhbHVlLmlzQ2xlYXJ9YCk7XG4gICAgICogICBwYWdlUmFuZ2VJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgYnlQYWdlKClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYXNzaW5nIG9wdGlvbmFsIG1heFBhZ2VTaXplIGluIHRoZSBwYWdlIHNldHRpbmdzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcmVzcG9uc2Ugb2YgcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXMoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMjAgfSkpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgcGFnZVJhbmdlIG9mIHJlc3BvbnNlKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcGFnaW5nIHdpdGggYSBtYXJrZXI6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlcmF0b3IgPSBwYWdlQmxvYkNsaWVudC5saXN0UGFnZVJhbmdlcygpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyIH0pO1xuICAgICAqIGxldCByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDIgcGFnZSByYW5nZXNcbiAgICAgKiBmb3IgKGNvbnN0IHBhZ2VSYW5nZSBvZiByZXNwb25zZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgcmFuZ2UgJHtpKyt9OiAke3BhZ2VSYW5nZS5zdGFydH0gLSAke3BhZ2VSYW5nZS5lbmR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKlxuICAgICAqIC8vIFBhc3NpbmcgbmV4dCBtYXJrZXIgYXMgY29udGludWF0aW9uVG9rZW5cbiAgICAgKlxuICAgICAqIGl0ZXJhdG9yID0gcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXMoKS5ieVBhZ2UoeyBjb250aW51YXRpb25Ub2tlbjogbWFya2VyLCBtYXhQYWdlU2l6ZTogMTAgfSk7XG4gICAgICogcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAxMCBwYWdlIHJhbmdlc1xuICAgICAqIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgcmFuZ2UgJHtpKyt9OiAke3BhZ2VSYW5nZS5zdGFydH0gLSAke3BhZ2VSYW5nZS5lbmR9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBSYW5nZXMgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIEFuIGFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHN1cHBvcnRzIHBhZ2luZy5cbiAgICAgKi9cbiAgICBsaXN0UGFnZVJhbmdlcyhvZmZzZXQgPSAwLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgLy8gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBibG9ic1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5saXN0UGFnZVJhbmdlSXRlbXMob2Zmc2V0LCBjb3VudCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0UGFnZVJhbmdlSXRlbVNlZ21lbnRzKG9mZnNldCwgY291bnQsIHNldHRpbmdzLmNvbnRpbnVhdGlvblRva2VuLCBPYmplY3QuYXNzaWduKHsgbWF4UGFnZVNpemU6IHNldHRpbmdzLm1heFBhZ2VTaXplIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbGxlY3Rpb24gb2YgcGFnZSByYW5nZXMgdGhhdCBkaWZmZXIgYmV0d2VlbiBhIHNwZWNpZmllZCBzbmFwc2hvdCBhbmQgdGhpcyBwYWdlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSBibG9iXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldCByYW5nZXMgZGlmZi5cbiAgICAgKiBAcGFyYW0gcHJldlNuYXBzaG90IC0gVGltZXN0YW1wIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlcyBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlIERpZmYgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhZ2VSYW5nZXNEaWZmKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtZ2V0UGFnZVJhbmdlc0RpZmZcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHRcbiAgICAgICAgICAgICAgICAuZ2V0UGFnZVJhbmdlc0RpZmYoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBwcmV2c25hcHNob3Q6IHByZXZTbmFwc2hvdCwgcmFuZ2U6IHJhbmdlVG9TdHJpbmcoeyBvZmZzZXQsIGNvdW50IH0pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSlcbiAgICAgICAgICAgICAgICAudGhlbihyYW5nZVJlc3BvbnNlRnJvbU1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogZ2V0UGFnZVJhbmdlc0RpZmZTZWdtZW50IHJldHVybnMgYSBzaW5nbGUgc2VnbWVudCBvZiBwYWdlIHJhbmdlcyBzdGFydGluZyBmcm9tIHRoZVxuICAgICAqIHNwZWNpZmllZCBNYXJrZXIgZm9yIGRpZmZlcmVuY2UgYmV0d2VlbiBwcmV2aW91cyBzbmFwc2hvdCBhbmQgdGhlIHRhcmdldCBwYWdlIGJsb2IuXG4gICAgICogVXNlIGFuIGVtcHR5IE1hcmtlciB0byBzdGFydCBlbnVtZXJhdGlvbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogQWZ0ZXIgZ2V0dGluZyBhIHNlZ21lbnQsIHByb2Nlc3MgaXQsIGFuZCB0aGVuIGNhbGwgZ2V0UGFnZVJhbmdlc0RpZmZTZWdtZW50IGFnYWluXG4gICAgICogKHBhc3NpbmcgdGhlIHRoZSBwcmV2aW91c2x5LXJldHVybmVkIE1hcmtlcikgdG8gZ2V0IHRoZSBuZXh0IHNlZ21lbnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gcHJldlNuYXBzaG90T3JVcmwgLSBUaW1lc3RhbXAgb2Ygc25hcHNob3QgdG8gcmV0cmlldmUgdGhlIGRpZmZlcmVuY2Ugb3IgVVJMIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2YgdGhlIGdldCB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGdldCBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgR2V0IFBhZ2UgUmFuZ2VzIERpZmYgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RQYWdlUmFuZ2VzRGlmZlNlZ21lbnQob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90T3JVcmwsIG1hcmtlciwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJQYWdlQmxvYkNsaWVudC1nZXRQYWdlUmFuZ2VzRGlmZlNlZ21lbnRcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQuZ2V0UGFnZVJhbmdlc0RpZmYoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIHByZXZzbmFwc2hvdDogcHJldlNuYXBzaG90T3JVcmwsIHJhbmdlOiByYW5nZVRvU3RyaW5nKHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBjb3VudCxcbiAgICAgICAgICAgICAgICB9KSwgbWFya2VyOiBtYXJrZXIsIG1heFBhZ2VTaXplOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWF4UGFnZVNpemUgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgZm9yIHtAbGluayBQYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmUmVzcG9uc2VNb2RlbH1cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgcmFuZ2VzLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQuXG4gICAgICogQHBhcmFtIHByZXZTbmFwc2hvdE9yVXJsIC0gVGltZXN0YW1wIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlIG9yIFVSTCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnZXQgb2YgcGFnZSByYW5nZXMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBnZXR0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBwYWdlIHJhbmdlcyByZW1haW5pbmcgd2l0aGluIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBnZXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgR2V0IFBhZ2UgUmFuZ2VzIERpZmYgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RQYWdlUmFuZ2VEaWZmSXRlbVNlZ21lbnRzKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdE9yVXJsLCBtYXJrZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFBhZ2VSYW5nZURpZmZJdGVtU2VnbWVudHNfMSgpIHtcbiAgICAgICAgICAgIGxldCBnZXRQYWdlUmFuZ2VJdGVtU2VnbWVudHNSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2UgPSB5aWVsZCBfX2F3YWl0KHRoaXMubGlzdFBhZ2VSYW5nZXNEaWZmU2VnbWVudChvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3RPclVybCwgbWFya2VyLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGdldFBhZ2VSYW5nZUl0ZW1TZWdtZW50c1Jlc3BvbnNlLmNvbnRpbnVhdGlvblRva2VuO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KHlpZWxkIF9fYXdhaXQoZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3Igb2Yge0BsaW5rIFBhZ2VSYW5nZUluZm99IG9iamVjdHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBwcmV2U25hcHNob3RPclVybCAtIFRpbWVzdGFtcCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZSBvciBVUkwgb2Ygc25hcHNob3QgdG8gcmV0cmlldmUgdGhlIGRpZmZlcmVuY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgR2V0IFBhZ2UgUmFuZ2VzIERpZmYgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RQYWdlUmFuZ2VEaWZmSXRlbXMob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90T3JVcmwsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFBhZ2VSYW5nZURpZmZJdGVtc18xKCkge1xuICAgICAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgICAgICBsZXQgbWFya2VyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fYXN5bmNWYWx1ZXModGhpcy5saXN0UGFnZVJhbmdlRGlmZkl0ZW1TZWdtZW50cyhvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3RPclVybCwgbWFya2VyLCBvcHRpb25zKSksIF9jOyBfYyA9IHlpZWxkIF9fYXdhaXQoX2IubmV4dCgpKSwgIV9jLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldFBhZ2VSYW5nZXNTZWdtZW50ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyhFeHRyYWN0UGFnZVJhbmdlSW5mb0l0ZW1zKGdldFBhZ2VSYW5nZXNTZWdtZW50KSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIHlpZWxkIF9fYXdhaXQoX2EuY2FsbChfYikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3Qgb2YgcGFnZSByYW5nZXMgdGhhdCBkaWZmZXIgYmV0d2VlbiBhIHNwZWNpZmllZCBzbmFwc2hvdCBhbmQgdGhpcyBwYWdlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiAgLmJ5UGFnZSgpIHJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCBvZiBwYWdlIHJhbmdlcyB0aGF0IGRpZmZlciBiZXR3ZWVuIGEgc3BlY2lmaWVkIHNuYXBzaG90IGFuZCB0aGlzIHBhZ2UgYmxvYi5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGZvciBhd2FpdGAgc3ludGF4OlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBHZXQgdGhlIHBhZ2VCbG9iQ2xpZW50IGJlZm9yZSB5b3UgcnVuIHRoZXNlIHNuaXBwZXRzLFxuICAgICAqIC8vIENhbiBiZSBvYnRhaW5lZCBmcm9tIGBibG9iU2VydmljZUNsaWVudC5nZXRDb250YWluZXJDbGllbnQoXCI8eW91ci1jb250YWluZXItbmFtZT5cIikuZ2V0UGFnZUJsb2JDbGllbnQoXCI8eW91ci1ibG9iLW5hbWU+XCIpO2BcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCBwYWdlUmFuZ2Ugb2YgcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXNEaWZmKCkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyID0gcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXNEaWZmKCk7XG4gICAgICogbGV0IHBhZ2VSYW5nZUl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB3aGlsZSAoIXBhZ2VSYW5nZUl0ZW0uZG9uZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgcmFuZ2UgJHtpKyt9OiAke3BhZ2VSYW5nZUl0ZW0udmFsdWUuc3RhcnR9IC0gJHtwYWdlUmFuZ2VJdGVtLnZhbHVlLmVuZH0sIElzQ2xlYXI6ICR7cGFnZVJhbmdlSXRlbS52YWx1ZS5pc0NsZWFyfWApO1xuICAgICAqICAgcGFnZVJhbmdlSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFzc2luZyBvcHRpb25hbCBtYXhQYWdlU2l6ZSBpbiB0aGUgcGFnZSBzZXR0aW5nc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzRGlmZigpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyMCB9KSkge1xuICAgICAqICAgZm9yIChjb25zdCBwYWdlUmFuZ2Ugb2YgcmVzcG9uc2UpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFBhZ2UgcmFuZ2UgJHtpKyt9OiAke3BhZ2VSYW5nZS5zdGFydH0gLSAke3BhZ2VSYW5nZS5lbmR9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBwYWdpbmcgd2l0aCBhIG1hcmtlcjpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyYXRvciA9IHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzRGlmZigpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyIH0pO1xuICAgICAqIGxldCByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDIgcGFnZSByYW5nZXNcbiAgICAgKiBmb3IgKGNvbnN0IHBhZ2VSYW5nZSBvZiByZXNwb25zZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgcmFuZ2UgJHtpKyt9OiAke3BhZ2VSYW5nZS5zdGFydH0gLSAke3BhZ2VSYW5nZS5lbmR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKlxuICAgICAqIC8vIFBhc3NpbmcgbmV4dCBtYXJrZXIgYXMgY29udGludWF0aW9uVG9rZW5cbiAgICAgKlxuICAgICAqIGl0ZXJhdG9yID0gcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXNEaWZmKCkuYnlQYWdlKHsgY29udGludWF0aW9uVG9rZW46IG1hcmtlciwgbWF4UGFnZVNpemU6IDEwIH0pO1xuICAgICAqIHJlc3BvbnNlID0gKGF3YWl0IGl0ZXJhdG9yLm5leHQoKSkudmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHMgMTAgcGFnZSByYW5nZXNcbiAgICAgKiBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2UpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gcHJldlNuYXBzaG90IC0gVGltZXN0YW1wIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBSYW5nZXMgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIEFuIGFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHN1cHBvcnRzIHBhZ2luZy5cbiAgICAgKi9cbiAgICBsaXN0UGFnZVJhbmdlc0RpZmYob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICAvLyBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIGJsb2JzXG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmxpc3RQYWdlUmFuZ2VEaWZmSXRlbXMob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90LCBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0UGFnZVJhbmdlRGlmZkl0ZW1TZWdtZW50cyhvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3QsIHNldHRpbmdzLmNvbnRpbnVhdGlvblRva2VuLCBPYmplY3QuYXNzaWduKHsgbWF4UGFnZVNpemU6IHNldHRpbmdzLm1heFBhZ2VTaXplIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbGxlY3Rpb24gb2YgcGFnZSByYW5nZXMgdGhhdCBkaWZmZXIgYmV0d2VlbiBhIHNwZWNpZmllZCBzbmFwc2hvdCBhbmQgdGhpcyBwYWdlIGJsb2IgZm9yIG1hbmFnZWQgZGlza3MuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSBibG9iXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldCByYW5nZXMgZGlmZi5cbiAgICAgKiBAcGFyYW0gcHJldlNuYXBzaG90VXJsIC0gVVJMIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlcyBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlIERpZmYgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhZ2VSYW5nZXNEaWZmRm9yTWFuYWdlZERpc2tzKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdFVybCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtR2V0UGFnZVJhbmdlc0RpZmZGb3JNYW5hZ2VkRGlza3NcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHRcbiAgICAgICAgICAgICAgICAuZ2V0UGFnZVJhbmdlc0RpZmYoT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLCBwcmV2U25hcHNob3RVcmwsIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmFuZ2VSZXNwb25zZUZyb21Nb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIHBhZ2UgYmxvYiB0byB0aGUgc3BlY2lmaWVkIHNpemUgKHdoaWNoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA1MTIpLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NldC1ibG9iLXByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIC0gVGFyZ2V0IHNpemVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBSZXNpemUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBQYWdlIEJsb2IgUmVzaXplIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyByZXNpemUoc2l6ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiUGFnZUJsb2JDbGllbnQtcmVzaXplXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LnJlc2l6ZShzaXplLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHBhZ2UgYmxvYidzIHNlcXVlbmNlIG51bWJlci5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtYmxvYi1wcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VxdWVuY2VOdW1iZXJBY3Rpb24gLSBJbmRpY2F0ZXMgaG93IHRoZSBzZXJ2aWNlIHNob3VsZCBtb2RpZnkgdGhlIGJsb2IncyBzZXF1ZW5jZSBudW1iZXIuXG4gICAgICogQHBhcmFtIHNlcXVlbmNlTnVtYmVyIC0gUmVxdWlyZWQgaWYgc2VxdWVuY2VOdW1iZXJBY3Rpb24gaXMgbWF4IG9yIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIFVwZGF0ZSBTZXF1ZW5jZSBOdW1iZXIgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBQYWdlIEJsb2IgVXBkYXRlIFNlcXVlbmNlIE51bWJlciBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU2VxdWVuY2VOdW1iZXIoc2VxdWVuY2VOdW1iZXJBY3Rpb24sIHNlcXVlbmNlTnVtYmVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJQYWdlQmxvYkNsaWVudC11cGRhdGVTZXF1ZW5jZU51bWJlclwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBhZ2VCbG9iQ29udGV4dC51cGRhdGVTZXF1ZW5jZU51bWJlcihzZXF1ZW5jZU51bWJlckFjdGlvbiwgT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLCBibG9iU2VxdWVuY2VOdW1iZXI6IHNlcXVlbmNlTnVtYmVyLCBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucywgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJlZ2lucyBhbiBvcGVyYXRpb24gdG8gc3RhcnQgYW4gaW5jcmVtZW50YWwgY29weSBmcm9tIG9uZSBwYWdlIGJsb2IncyBzbmFwc2hvdCB0byB0aGlzIHBhZ2UgYmxvYi5cbiAgICAgKiBUaGUgc25hcHNob3QgaXMgY29waWVkIHN1Y2ggdGhhdCBvbmx5IHRoZSBkaWZmZXJlbnRpYWwgY2hhbmdlcyBiZXR3ZWVuIHRoZSBwcmV2aW91c2x5XG4gICAgICogY29waWVkIHNuYXBzaG90IGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgZGVzdGluYXRpb24uXG4gICAgICogVGhlIGNvcGllZCBzbmFwc2hvdHMgYXJlIGNvbXBsZXRlIGNvcGllcyBvZiB0aGUgb3JpZ2luYWwgc25hcHNob3QgYW5kIGNhbiBiZSByZWFkIG9yIGNvcGllZCBmcm9tIGFzIHVzdWFsLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2luY3JlbWVudGFsLWNvcHktYmxvYlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvdmlydHVhbC1tYWNoaW5lcy93aW5kb3dzL2luY3JlbWVudGFsLXNuYXBzaG90c1xuICAgICAqXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgLSBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBwYWdlIGJsb2Igc25hcHNob3QuIEZvciBleGFtcGxlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9teWJsb2I/c25hcHNob3Q9PERhdGVUaW1lPlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIENvcHkgSW5jcmVtZW50YWwgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBQYWdlIEJsb2IgQ29weSBJbmNyZW1lbnRhbCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgc3RhcnRDb3B5SW5jcmVtZW50YWwoY29weVNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIlBhZ2VCbG9iQ2xpZW50LXN0YXJ0Q29weUluY3JlbWVudGFsXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmNvcHlJbmNyZW1lbnRhbChjb3B5U291cmNlLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaWVudHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBzdHJlYW1Ub0J1ZmZlcjIgfSBmcm9tIFwiLi91dGlscy91dGlscy5ub2RlXCI7XG5pbXBvcnQgeyBCQVRDSF9NQVhfUEFZTE9BRF9JTl9CWVRFUyB9IGZyb20gXCIuL3V0aWxzL2NvbnN0YW50c1wiO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJvZHlBc1RleHQoYmF0Y2hSZXNwb25zZSkge1xuICAgIGxldCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoQkFUQ0hfTUFYX1BBWUxPQURfSU5fQllURVMpO1xuICAgIGNvbnN0IHJlc3BvbnNlTGVuZ3RoID0gYXdhaXQgc3RyZWFtVG9CdWZmZXIyKGJhdGNoUmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5LCBidWZmZXIpO1xuICAgIC8vIFNsaWNlIHRoZSBidWZmZXIgdG8gdHJpbSB0aGUgZW1wdHkgZW5kaW5nLlxuICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgwLCByZXNwb25zZUxlbmd0aCk7XG4gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHV0ZjhCeXRlTGVuZ3RoKHN0cikge1xuICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hVdGlscy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IEhUVFBfVkVSU0lPTl8xXzEsIEhUVFBfTElORV9FTkRJTkcsIEhlYWRlckNvbnN0YW50cywgSFRUUFVSTENvbm5lY3Rpb24sIH0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRCb2R5QXNUZXh0IH0gZnJvbSBcIi4vQmF0Y2hVdGlsc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nXCI7XG5jb25zdCBIVFRQX0hFQURFUl9ERUxJTUlURVIgPSBcIjogXCI7XG5jb25zdCBTUEFDRV9ERUxJTUlURVIgPSBcIiBcIjtcbmNvbnN0IE5PVF9GT1VORCA9IC0xO1xuLyoqXG4gKiBVdGlsIGNsYXNzIGZvciBwYXJzaW5nIGJhdGNoIHJlc3BvbnNlLlxuICovXG5leHBvcnQgY2xhc3MgQmF0Y2hSZXNwb25zZVBhcnNlciB7XG4gICAgY29uc3RydWN0b3IoYmF0Y2hSZXNwb25zZSwgc3ViUmVxdWVzdHMpIHtcbiAgICAgICAgaWYgKCFiYXRjaFJlc3BvbnNlIHx8ICFiYXRjaFJlc3BvbnNlLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICAvLyBJbiBzcGVjaWFsIGNhc2UocmVwb3J0ZWQpLCBzZXJ2ZXIgbWF5IHJldHVybiBpbnZhbGlkIGNvbnRlbnQtdHlwZSB3aGljaCBjb3VsZCBub3QgYmUgcGFyc2VkLlxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJiYXRjaFJlc3BvbnNlIGlzIG1hbGZvcm1lZCBvciBkb2Vzbid0IGNvbnRhaW4gdmFsaWQgY29udGVudC10eXBlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YlJlcXVlc3RzIHx8IHN1YlJlcXVlc3RzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHByZXZlbnQgZHVyaW5nIGNvZGluZy5cbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBzdGF0ZTogc3ViUmVxdWVzdHMgaXMgbm90IHByb3ZpZGVkIG9yIHNpemUgaXMgMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXRjaFJlc3BvbnNlID0gYmF0Y2hSZXNwb25zZTtcbiAgICAgICAgdGhpcy5zdWJSZXF1ZXN0cyA9IHN1YlJlcXVlc3RzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlQmF0Y2hCb3VuZGFyeSA9IHRoaXMuYmF0Y2hSZXNwb25zZS5jb250ZW50VHlwZS5zcGxpdChcIj1cIilbMV07XG4gICAgICAgIHRoaXMucGVyUmVzcG9uc2VQcmVmaXggPSBgLS0ke3RoaXMucmVzcG9uc2VCYXRjaEJvdW5kYXJ5fSR7SFRUUF9MSU5FX0VORElOR31gO1xuICAgICAgICB0aGlzLmJhdGNoUmVzcG9uc2VFbmRpbmcgPSBgLS0ke3RoaXMucmVzcG9uc2VCYXRjaEJvdW5kYXJ5fS0tYDtcbiAgICB9XG4gICAgLy8gRm9yIGV4YW1wbGUgb2YgcmVzcG9uc2UsIHBsZWFzZSByZWZlciB0byBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYmxvYi1iYXRjaCNyZXNwb25zZVxuICAgIGFzeW5jIHBhcnNlQmF0Y2hSZXNwb25zZSgpIHtcbiAgICAgICAgLy8gV2hlbiBsb2dpYyByZWFjaCBoZXJlLCBzdXBwb3NlIGJhdGNoIHJlcXVlc3QgaGFzIGFscmVhZHkgc3VjY2VlZGVkIHdpdGggMjAyLCBzbyB3ZSBjYW4gZnVydGhlciBwYXJzZVxuICAgICAgICAvLyBzdWIgcmVxdWVzdCdzIHJlc3BvbnNlLlxuICAgICAgICBpZiAodGhpcy5iYXRjaFJlc3BvbnNlLl9yZXNwb25zZS5zdGF0dXMgIT09IEhUVFBVUkxDb25uZWN0aW9uLkhUVFBfQUNDRVBURUQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdGF0ZTogYmF0Y2ggcmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXM6ICcke3RoaXMuYmF0Y2hSZXNwb25zZS5fcmVzcG9uc2Uuc3RhdHVzfScuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5QXNUZXh0ID0gYXdhaXQgZ2V0Qm9keUFzVGV4dCh0aGlzLmJhdGNoUmVzcG9uc2UpO1xuICAgICAgICBjb25zdCBzdWJSZXNwb25zZXMgPSByZXNwb25zZUJvZHlBc1RleHRcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLmJhdGNoUmVzcG9uc2VFbmRpbmcpWzBdIC8vIHN0cmluZyBhZnRlciBlbmRpbmcgaXMgdXNlbGVzc1xuICAgICAgICAgICAgLnNwbGl0KHRoaXMucGVyUmVzcG9uc2VQcmVmaXgpXG4gICAgICAgICAgICAuc2xpY2UoMSk7IC8vIHN0cmluZyBiZWZvcmUgZmlyc3QgcmVzcG9uc2UgYm91bmRhcnkgaXMgdXNlbGVzc1xuICAgICAgICBjb25zdCBzdWJSZXNwb25zZUNvdW50ID0gc3ViUmVzcG9uc2VzLmxlbmd0aDtcbiAgICAgICAgLy8gRGVmZW5zaXZlIGNvZGluZyBpbiBjYXNlIG9mIHBvdGVudGlhbCBlcnJvciBwYXJzaW5nLlxuICAgICAgICAvLyBOb3RlOiBzdWJSZXNwb25zZUNvdW50ID09IDEgaXMgc3BlY2lhbCBjYXNlIHdoZXJlIHN1YiByZXF1ZXN0IGlzIGludmFsaWQuXG4gICAgICAgIC8vIFdlIHRyeSB0byBwcmV2ZW50IHN1Y2ggY2FzZXMgdGhyb3VnaCBlYXJseSB2YWxpZGF0aW9uLCBlLmcuIHZhbGlkYXRlIHN1YiByZXF1ZXN0IGNvdW50ID49IDEuXG4gICAgICAgIC8vIFdoaWxlIGluIHVuZXhwZWN0ZWQgc3ViIHJlcXVlc3QgaW52YWxpZCBjYXNlLCB3ZSBhbGxvdyBzdWIgcmVzcG9uc2UgdG8gYmUgcGFyc2VkIGFuZCByZXR1cm4gdG8gdXNlci5cbiAgICAgICAgaWYgKHN1YlJlc3BvbnNlQ291bnQgIT09IHRoaXMuc3ViUmVxdWVzdHMuc2l6ZSAmJiBzdWJSZXNwb25zZUNvdW50ICE9PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlOiBzdWIgcmVzcG9uc2VzJyBjb3VudCBpcyBub3QgZXF1YWwgdG8gc3ViIHJlcXVlc3RzJyBjb3VudC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2VzID0gbmV3IEFycmF5KHN1YlJlc3BvbnNlQ291bnQpO1xuICAgICAgICBsZXQgc3ViUmVzcG9uc2VzU3VjY2VlZGVkQ291bnQgPSAwO1xuICAgICAgICBsZXQgc3ViUmVzcG9uc2VzRmFpbGVkQ291bnQgPSAwO1xuICAgICAgICAvLyBQYXJzZSBzdWIgc3ViUmVzcG9uc2VzLlxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3ViUmVzcG9uc2VDb3VudDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ViUmVzcG9uc2UgPSBzdWJSZXNwb25zZXNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2UgPSB7fTtcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlTGluZXMgPSBzdWJSZXNwb25zZS5zcGxpdChgJHtIVFRQX0xJTkVfRU5ESU5HfWApO1xuICAgICAgICAgICAgbGV0IHN1YlJlc3BIZWFkZXJTdGFydEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgc3ViUmVzcEhlYWRlckVuZEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgc3ViUmVzcEZhaWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRJZCA9IE5PVF9GT1VORDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2VMaW5lIG9mIHJlc3BvbnNlTGluZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXN1YlJlc3BIZWFkZXJTdGFydEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlbnRpb24gbGluZSB0byBpbmRpY2F0ZSBjb250ZW50IElEXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUxpbmUuc3RhcnRzV2l0aChIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9JRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJZCA9IHBhcnNlSW50KHJlc3BvbnNlTGluZS5zcGxpdChIVFRQX0hFQURFUl9ERUxJTUlURVIpWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBIdHRwIHZlcnNpb24gbGluZSB3aXRoIHN0YXR1cyBjb2RlIGluZGljYXRlcyB0aGUgc3RhcnQgb2Ygc3ViIHJlcXVlc3QncyByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gRXhhbXBsZTogSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUxpbmUuc3RhcnRzV2l0aChIVFRQX1ZFUlNJT05fMV8xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVzcEhlYWRlclN0YXJ0Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gcmVzcG9uc2VMaW5lLnNwbGl0KFNQQUNFX0RFTElNSVRFUik7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5zdGF0dXMgPSBwYXJzZUludCh0b2tlbnNbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA9IHRva2Vucy5zbGljZSgyKS5qb2luKFNQQUNFX0RFTElNSVRFUik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgY29udmVudGlvbiBoZWFkZXJzIG5vdCBzcGVjaWZpY2FsbHkgZm9yIHN1YiByZXF1ZXN0IGkuZS4gQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9odHRwIGFuZCBDb250ZW50LUlEOiAqXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUxpbmUudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN1YiByZXNwb25zZSdzIGhlYWRlciBzdGFydCBsaW5lIGFscmVhZHkgZm91bmQsIGFuZCB0aGUgZmlyc3QgZW1wdHkgbGluZSBpbmRpY2F0ZXMgaGVhZGVyIGVuZCBsaW5lIGZvdW5kLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YlJlc3BIZWFkZXJFbmRGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVzcEhlYWRlckVuZEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSBsaW5lXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IHdoZW4gY29kZSByZWFjaCBoZXJlLCBpdCBpbmRpY2F0ZXMgc3ViUmVzcEhlYWRlclN0YXJ0Rm91bmQgPT0gdHJ1ZVxuICAgICAgICAgICAgICAgIGlmICghc3ViUmVzcEhlYWRlckVuZEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUxpbmUuaW5kZXhPZihIVFRQX0hFQURFUl9ERUxJTUlURVIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGNvZGluZyB0byBwcmV2ZW50IGZyb20gbWlzc2luZyB2YWx1YWJsZSBsaW5lcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdGF0ZTogZmluZCBub24tZW1wdHkgbGluZSAnJHtyZXNwb25zZUxpbmV9JyB3aXRob3V0IEhUVFAgaGVhZGVyIGRlbGltaXRlciAnJHtIVFRQX0hFQURFUl9ERUxJTUlURVJ9Jy5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSBoZWFkZXJzIG9mIHN1YiByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gcmVzcG9uc2VMaW5lLnNwbGl0KEhUVFBfSEVBREVSX0RFTElNSVRFUik7XG4gICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmhlYWRlcnMuc2V0KHRva2Vuc1swXSwgdG9rZW5zWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSA9PT0gSGVhZGVyQ29uc3RhbnRzLlhfTVNfRVJST1JfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2UuZXJyb3JDb2RlID0gdG9rZW5zWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVzcEZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzc2VtYmxlIGJvZHkgb2Ygc3ViIHJlc3BvbnNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmJvZHlBc1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmJvZHlBc1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmJvZHlBc1RleHQgKz0gcmVzcG9uc2VMaW5lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gSW5uZXIgZm9yIGVuZFxuICAgICAgICAgICAgLy8gVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0aGUgQ29udGVudC1JRCBoZWFkZXIgZm9yIGVhY2ggY29ycmVzcG9uZGluZyBzdWJyZXF1ZXN0IHJlc3BvbnNlIHRvIHVzZSBmb3IgdHJhY2tpbmcuXG4gICAgICAgICAgICAvLyBUaGUgQ29udGVudC1JRHMgYXJlIHNldCB0byBhIHZhbGlkIGluZGV4IGluIHRoZSBzdWJyZXF1ZXN0cyB3ZSBzZW50LiBJbiB0aGUgc3RhdHVzIGNvZGUgMjAyIHBhdGgsIHdlIGNvdWxkIGV4cGVjdCBpdFxuICAgICAgICAgICAgLy8gdG8gYmUgMS0xIG1hcHBpbmcgZnJvbSB0aGUgWzAsIHN1YlJlcXVlc3RzLnNpemUpIHRvIHRoZSBDb250ZW50LUlEcyByZXR1cm5lZC4gSWYgbm90LCB3ZSBzaW1wbHkgZG9uJ3QgcmV0dXJuIHRoYXRcbiAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgc3ViUmVzcG9uc2UgaW4gdGhlIHBhcnNlZCByZXBvbnNlIGFuZCB3ZSBjYW4gYWx3YXlzIGxvb2sgaXQgdXAgaW4gdGhlIHJhdyByZXNwb25zZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuXG4gICAgICAgICAgICBpZiAoY29udGVudElkICE9PSBOT1RfRk9VTkQgJiZcbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKGNvbnRlbnRJZCkgJiZcbiAgICAgICAgICAgICAgICBjb250ZW50SWQgPj0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbnRlbnRJZCA8IHRoaXMuc3ViUmVxdWVzdHMuc2l6ZSAmJlxuICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlc1tjb250ZW50SWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5fcmVxdWVzdCA9IHRoaXMuc3ViUmVxdWVzdHMuZ2V0KGNvbnRlbnRJZCk7XG4gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2VzW2NvbnRlbnRJZF0gPSBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgc3ViUmVzcG9uc2VzWyR7aW5kZXh9XSBpcyBkcm9wcGVkIGFzIHRoZSBDb250ZW50LUlEIGlzIG5vdCBmb3VuZCBvciBpbnZhbGlkLCBDb250ZW50LUlEOiAke2NvbnRlbnRJZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJSZXNwRmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgc3ViUmVzcG9uc2VzRmFpbGVkQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1YlJlc3BvbnNlczogZGVzZXJpYWxpemVkU3ViUmVzcG9uc2VzLFxuICAgICAgICAgICAgc3ViUmVzcG9uc2VzU3VjY2VlZGVkQ291bnQ6IHN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50LFxuICAgICAgICAgICAgc3ViUmVzcG9uc2VzRmFpbGVkQ291bnQ6IHN1YlJlc3BvbnNlc0ZhaWxlZENvdW50LFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoUmVzcG9uc2VQYXJzZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG52YXIgTXV0ZXhMb2NrU3RhdHVzO1xuKGZ1bmN0aW9uIChNdXRleExvY2tTdGF0dXMpIHtcbiAgICBNdXRleExvY2tTdGF0dXNbTXV0ZXhMb2NrU3RhdHVzW1wiTE9DS0VEXCJdID0gMF0gPSBcIkxPQ0tFRFwiO1xuICAgIE11dGV4TG9ja1N0YXR1c1tNdXRleExvY2tTdGF0dXNbXCJVTkxPQ0tFRFwiXSA9IDFdID0gXCJVTkxPQ0tFRFwiO1xufSkoTXV0ZXhMb2NrU3RhdHVzIHx8IChNdXRleExvY2tTdGF0dXMgPSB7fSkpO1xuLyoqXG4gKiBBbiBhc3luYyBtdXRleCBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgTXV0ZXgge1xuICAgIC8qKlxuICAgICAqIExvY2sgZm9yIGEgc3BlY2lmaWMga2V5LiBJZiB0aGUgbG9jayBoYXMgYmVlbiBhY3F1aXJlZCBieSBhbm90aGVyIGN1c3RvbWVyLCB0aGVuXG4gICAgICogd2lsbCB3YWl0IHVudGlsIGdldHRpbmcgdGhlIGxvY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gbG9jayBrZXlcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgbG9jayhrZXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5rZXlzW2tleV0gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmtleXNba2V5XSA9PT0gTXV0ZXhMb2NrU3RhdHVzLlVOTE9DS0VEKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlzW2tleV0gPSBNdXRleExvY2tTdGF0dXMuTE9DS0VEO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub25VbmxvY2tFdmVudChrZXksICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5rZXlzW2tleV0gPSBNdXRleExvY2tTdGF0dXMuTE9DS0VEO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbmxvY2sgYSBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgdW5sb2NrKGtleSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmtleXNba2V5XSA9PT0gTXV0ZXhMb2NrU3RhdHVzLkxPQ0tFRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFVubG9ja0V2ZW50KGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5rZXlzW2tleV07XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgb25VbmxvY2tFdmVudChrZXksIGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XSA9IFtoYW5kbGVyXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZW1pdFVubG9ja0V2ZW50KGtleSkge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XSAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGlzdGVuZXJzW2tleV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubGlzdGVuZXJzW2tleV0uc2hpZnQoKTtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5NdXRleC5rZXlzID0ge307XG5NdXRleC5saXN0ZW5lcnMgPSB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU11dGV4LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgQmFzZVJlcXVlc3RQb2xpY3ksIGRlc2VyaWFsaXphdGlvblBvbGljeSwgZ2VuZXJhdGVVdWlkLCBIdHRwSGVhZGVycywgV2ViUmVzb3VyY2UsIGlzVG9rZW5DcmVkZW50aWFsLCBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5LCBpc05vZGUsIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IFNwYW5TdGF0dXNDb2RlIH0gZnJvbSBcIkBhenVyZS9jb3JlLXRyYWNpbmdcIjtcbmltcG9ydCB7IEFub255bW91c0NyZWRlbnRpYWwgfSBmcm9tIFwiLi9jcmVkZW50aWFscy9Bbm9ueW1vdXNDcmVkZW50aWFsXCI7XG5pbXBvcnQgeyBCbG9iQ2xpZW50IH0gZnJvbSBcIi4vQ2xpZW50c1wiO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tIFwiLi91dGlscy9NdXRleFwiO1xuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9QaXBlbGluZVwiO1xuaW1wb3J0IHsgYXR0YWNoQ3JlZGVudGlhbCwgZ2V0VVJMUGF0aCwgZ2V0VVJMUGF0aEFuZFF1ZXJ5LCBpRXF1YWwgfSBmcm9tIFwiLi91dGlscy91dGlscy5jb21tb25cIjtcbmltcG9ydCB7IEhlYWRlckNvbnN0YW50cywgQkFUQ0hfTUFYX1JFUVVFU1QsIEhUVFBfVkVSU0lPTl8xXzEsIEhUVFBfTElORV9FTkRJTkcsIFN0b3JhZ2VPQXV0aFNjb3BlcywgfSBmcm9tIFwiLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcIjtcbmltcG9ydCB7IGNyZWF0ZVNwYW4gfSBmcm9tIFwiLi91dGlscy90cmFjaW5nXCI7XG4vKipcbiAqIEEgQmxvYkJhdGNoIHJlcHJlc2VudHMgYW4gYWdncmVnYXRlZCBzZXQgb2Ygb3BlcmF0aW9ucyBvbiBibG9icy5cbiAqIEN1cnJlbnRseSwgb25seSBgZGVsZXRlYCBhbmQgYHNldEFjY2Vzc1RpZXJgIGFyZSBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iQmF0Y2gge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJhdGNoID0gXCJiYXRjaFwiO1xuICAgICAgICB0aGlzLmJhdGNoUmVxdWVzdCA9IG5ldyBJbm5lckJhdGNoUmVxdWVzdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIENvbnRlbnQtVHlwZSBmb3IgYSBiYXRjaCByZXF1ZXN0LlxuICAgICAqIFRoZSB2YWx1ZSBtdXN0IGJlIG11bHRpcGFydC9taXhlZCB3aXRoIGEgYmF0Y2ggYm91bmRhcnkuXG4gICAgICogRXhhbXBsZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1iYXRjaF9hODE3ODZjOC1lMzAxLTRlNDItYTcyOS1hMzJjYTI0YWUyNTJcbiAgICAgKi9cbiAgICBnZXRNdWx0aVBhcnRDb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmF0Y2hSZXF1ZXN0LmdldE11bHRpcGFydENvbnRlbnRUeXBlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhc3NlbWJsZWQgSFRUUCByZXF1ZXN0IGJvZHkgZm9yIHN1YiByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBnZXRIdHRwUmVxdWVzdEJvZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhdGNoUmVxdWVzdC5nZXRIdHRwUmVxdWVzdEJvZHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHN1YiByZXF1ZXN0cyB0aGF0IGFyZSBhZGRlZCBpbnRvIHRoZSBiYXRjaCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGdldFN1YlJlcXVlc3RzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXRjaFJlcXVlc3QuZ2V0U3ViUmVxdWVzdHMoKTtcbiAgICB9XG4gICAgYXN5bmMgYWRkU3ViUmVxdWVzdEludGVybmFsKHN1YlJlcXVlc3QsIGFzc2VtYmxlU3ViUmVxdWVzdEZ1bmMpIHtcbiAgICAgICAgYXdhaXQgTXV0ZXgubG9jayh0aGlzLmJhdGNoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hSZXF1ZXN0LnByZUFkZFN1YlJlcXVlc3Qoc3ViUmVxdWVzdCk7XG4gICAgICAgICAgICBhd2FpdCBhc3NlbWJsZVN1YlJlcXVlc3RGdW5jKCk7XG4gICAgICAgICAgICB0aGlzLmJhdGNoUmVxdWVzdC5wb3N0QWRkU3ViUmVxdWVzdChzdWJSZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGF3YWl0IE11dGV4LnVubG9jayh0aGlzLmJhdGNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRCYXRjaFR5cGUoYmF0Y2hUeXBlKSB7XG4gICAgICAgIGlmICghdGhpcy5iYXRjaFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hUeXBlID0gYmF0Y2hUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJhdGNoVHlwZSAhPT0gYmF0Y2hUeXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQmxvYkJhdGNoIG9ubHkgc3VwcG9ydHMgb25lIG9wZXJhdGlvbiB0eXBlIHBlciBiYXRjaCBhbmQgaXQgYWxyZWFkeSBpcyBiZWluZyB1c2VkIGZvciAke3RoaXMuYmF0Y2hUeXBlfSBvcGVyYXRpb25zLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGRlbGV0ZUJsb2IodXJsT3JCbG9iQ2xpZW50LCBjcmVkZW50aWFsT3JPcHRpb25zLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIGxldCBjcmVkZW50aWFsO1xuICAgICAgICBpZiAodHlwZW9mIHVybE9yQmxvYkNsaWVudCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgKChpc05vZGUgJiYgY3JlZGVudGlhbE9yT3B0aW9ucyBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxPck9wdGlvbnMgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsIHx8XG4gICAgICAgICAgICAgICAgaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yT3B0aW9ucykpKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBvdmVybG9hZFxuICAgICAgICAgICAgdXJsID0gdXJsT3JCbG9iQ2xpZW50O1xuICAgICAgICAgICAgY3JlZGVudGlhbCA9IGNyZWRlbnRpYWxPck9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXJsT3JCbG9iQ2xpZW50IGluc3RhbmNlb2YgQmxvYkNsaWVudCkge1xuICAgICAgICAgICAgLy8gU2Vjb25kIG92ZXJsb2FkXG4gICAgICAgICAgICB1cmwgPSB1cmxPckJsb2JDbGllbnQudXJsO1xuICAgICAgICAgICAgY3JlZGVudGlhbCA9IHVybE9yQmxvYkNsaWVudC5jcmVkZW50aWFsO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGNyZWRlbnRpYWxPck9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgYXJndW1lbnRzLiBFaXRoZXIgdXJsIGFuZCBjcmVkZW50aWFsLCBvciBCbG9iQ2xpZW50IG5lZWQgYmUgcHJvdmlkZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCYXRjaERlbGV0ZVJlcXVlc3QtYWRkU3ViUmVxdWVzdFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmF0Y2hUeXBlKFwiZGVsZXRlXCIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRTdWJSZXF1ZXN0SW50ZXJuYWwoe1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWw6IGNyZWRlbnRpYWwsXG4gICAgICAgICAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IEJsb2JDbGllbnQodXJsLCB0aGlzLmJhdGNoUmVxdWVzdC5jcmVhdGVQaXBlbGluZShjcmVkZW50aWFsKSkuZGVsZXRlKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzZXRCbG9iQWNjZXNzVGllcih1cmxPckJsb2JDbGllbnQsIGNyZWRlbnRpYWxPclRpZXIsIHRpZXJPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHVybDtcbiAgICAgICAgbGV0IGNyZWRlbnRpYWw7XG4gICAgICAgIGxldCB0aWVyO1xuICAgICAgICBpZiAodHlwZW9mIHVybE9yQmxvYkNsaWVudCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgKChpc05vZGUgJiYgY3JlZGVudGlhbE9yVGllciBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxPclRpZXIgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsIHx8XG4gICAgICAgICAgICAgICAgaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yVGllcikpKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBvdmVybG9hZFxuICAgICAgICAgICAgdXJsID0gdXJsT3JCbG9iQ2xpZW50O1xuICAgICAgICAgICAgY3JlZGVudGlhbCA9IGNyZWRlbnRpYWxPclRpZXI7XG4gICAgICAgICAgICB0aWVyID0gdGllck9yT3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1cmxPckJsb2JDbGllbnQgaW5zdGFuY2VvZiBCbG9iQ2xpZW50KSB7XG4gICAgICAgICAgICAvLyBTZWNvbmQgb3ZlcmxvYWRcbiAgICAgICAgICAgIHVybCA9IHVybE9yQmxvYkNsaWVudC51cmw7XG4gICAgICAgICAgICBjcmVkZW50aWFsID0gdXJsT3JCbG9iQ2xpZW50LmNyZWRlbnRpYWw7XG4gICAgICAgICAgICB0aWVyID0gY3JlZGVudGlhbE9yVGllcjtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aWVyT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cy4gRWl0aGVyIHVybCBhbmQgY3JlZGVudGlhbCwgb3IgQmxvYkNsaWVudCBuZWVkIGJlIHByb3ZpZGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmF0Y2hTZXRUaWVyUmVxdWVzdC1hZGRTdWJSZXF1ZXN0XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zZXRCYXRjaFR5cGUoXCJzZXRBY2Nlc3NUaWVyXCIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRTdWJSZXF1ZXN0SW50ZXJuYWwoe1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWw6IGNyZWRlbnRpYWwsXG4gICAgICAgICAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IEJsb2JDbGllbnQodXJsLCB0aGlzLmJhdGNoUmVxdWVzdC5jcmVhdGVQaXBlbGluZShjcmVkZW50aWFsKSkuc2V0QWNjZXNzVGllcih0aWVyLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIElubmVyIGJhdGNoIHJlcXVlc3QgY2xhc3Mgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGFzc2VtYmxpbmcgYW5kIHNlcmlhbGl6aW5nIHN1YiByZXF1ZXN0cy5cbiAqIFNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYmxvYi1iYXRjaCNyZXF1ZXN0LWJvZHkgZm9yIGhvdyByZXF1ZXN0cyBhcmUgYXNzZW1ibGVkLlxuICovXG5jbGFzcyBJbm5lckJhdGNoUmVxdWVzdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmJvZHkgPSBcIlwiO1xuICAgICAgICBjb25zdCB0ZW1wR3VpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgICAgICAvLyBiYXRjaF97YmF0Y2hpZH1cbiAgICAgICAgdGhpcy5ib3VuZGFyeSA9IGBiYXRjaF8ke3RlbXBHdWlkfWA7XG4gICAgICAgIC8vIC0tYmF0Y2hfe2JhdGNoaWR9XG4gICAgICAgIC8vIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vaHR0cFxuICAgICAgICAvLyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcbiAgICAgICAgdGhpcy5zdWJSZXF1ZXN0UHJlZml4ID0gYC0tJHt0aGlzLmJvdW5kYXJ5fSR7SFRUUF9MSU5FX0VORElOR30ke0hlYWRlckNvbnN0YW50cy5DT05URU5UX1RZUEV9OiBhcHBsaWNhdGlvbi9odHRwJHtIVFRQX0xJTkVfRU5ESU5HfSR7SGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkd9OiBiaW5hcnlgO1xuICAgICAgICAvLyBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PWJhdGNoX3tiYXRjaGlkfVxuICAgICAgICB0aGlzLm11bHRpcGFydENvbnRlbnRUeXBlID0gYG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9JHt0aGlzLmJvdW5kYXJ5fWA7XG4gICAgICAgIC8vIC0tYmF0Y2hfe2JhdGNoaWR9LS1cbiAgICAgICAgdGhpcy5iYXRjaFJlcXVlc3RFbmRpbmcgPSBgLS0ke3RoaXMuYm91bmRhcnl9LS1gO1xuICAgICAgICB0aGlzLnN1YlJlcXVlc3RzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcGlwZWxpbmUgdG8gYXNzZW1ibGUgc3ViIHJlcXVlc3RzLiBUaGUgaWRlYSBoZXJlIGlzIHRvIHVzZSBleGlzdGluZ1xuICAgICAqIGNyZWRlbnRpYWwgYW5kIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBvbmVudHMsIHdpdGggYWRkaXRpb25hbCBwb2xpY2llcyB0b1xuICAgICAqIGZpbHRlciB1bm5lY2Vzc2FyeSBoZWFkZXJzLCBhc3NlbWJsZSBzdWIgcmVxdWVzdHMgaW50byByZXF1ZXN0J3MgYm9keVxuICAgICAqIGFuZCBpbnRlcmNlcHQgcmVxdWVzdCBmcm9tIGdvaW5nIHRvIHdpcmUuXG4gICAgICogQHBhcmFtIGNyZWRlbnRpYWwgLSAgU3VjaCBhcyBBbm9ueW1vdXNDcmVkZW50aWFsLCBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCBvciBhbnkgY3JlZGVudGlhbCBmcm9tIHRoZSBgQGF6dXJlL2lkZW50aXR5YCBwYWNrYWdlIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgc2VydmljZS4gWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgVG9rZW5DcmVkZW50aWFsIGludGVyZmFjZS4gSWYgbm90IHNwZWNpZmllZCwgQW5vbnltb3VzQ3JlZGVudGlhbCBpcyB1c2VkLlxuICAgICAqL1xuICAgIGNyZWF0ZVBpcGVsaW5lKGNyZWRlbnRpYWwpIHtcbiAgICAgICAgY29uc3QgaXNBbm9ueW1vdXNDcmVkcyA9IGNyZWRlbnRpYWwgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsO1xuICAgICAgICBjb25zdCBwb2xpY3lGYWN0b3J5TGVuZ3RoID0gMyArIChpc0Fub255bW91c0NyZWRzID8gMCA6IDEpOyAvLyBbZGVzZXJpYWxpemF0aW9uUG9saWN5LCBCYXRjaEhlYWRlckZpbHRlclBvbGljeUZhY3RvcnksIChPcHRpb25hbClDcmVkZW50aWFsLCBCYXRjaFJlcXVlc3RBc3NlbWJsZVBvbGljeUZhY3RvcnldXG4gICAgICAgIGNvbnN0IGZhY3RvcmllcyA9IG5ldyBBcnJheShwb2xpY3lGYWN0b3J5TGVuZ3RoKTtcbiAgICAgICAgZmFjdG9yaWVzWzBdID0gZGVzZXJpYWxpemF0aW9uUG9saWN5KCk7IC8vIERlZmF1bHQgZGVzZXJpYWxpemF0aW9uUG9saWN5IGlzIHByb3ZpZGVkIGJ5IHByb3RvY29sIGxheWVyXG4gICAgICAgIGZhY3Rvcmllc1sxXSA9IG5ldyBCYXRjaEhlYWRlckZpbHRlclBvbGljeUZhY3RvcnkoKTsgLy8gVXNlIGJhdGNoIGhlYWRlciBmaWx0ZXIgcG9saWN5IHRvIGV4Y2x1ZGUgdW5uZWNlc3NhcnkgaGVhZGVyc1xuICAgICAgICBpZiAoIWlzQW5vbnltb3VzQ3JlZHMpIHtcbiAgICAgICAgICAgIGZhY3Rvcmllc1syXSA9IGlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWwpXG4gICAgICAgICAgICAgICAgPyBhdHRhY2hDcmVkZW50aWFsKGJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3koY3JlZGVudGlhbCwgU3RvcmFnZU9BdXRoU2NvcGVzKSwgY3JlZGVudGlhbClcbiAgICAgICAgICAgICAgICA6IGNyZWRlbnRpYWw7XG4gICAgICAgIH1cbiAgICAgICAgZmFjdG9yaWVzW3BvbGljeUZhY3RvcnlMZW5ndGggLSAxXSA9IG5ldyBCYXRjaFJlcXVlc3RBc3NlbWJsZVBvbGljeUZhY3RvcnkodGhpcyk7IC8vIFVzZSBiYXRjaCBhc3NlbWJsZSBwb2xpY3kgdG8gYXNzZW1ibGUgcmVxdWVzdCBhbmQgaW50ZXJjZXB0IHJlcXVlc3QgZnJvbSBnb2luZyB0byB3aXJlXG4gICAgICAgIHJldHVybiBuZXcgUGlwZWxpbmUoZmFjdG9yaWVzLCB7fSk7XG4gICAgfVxuICAgIGFwcGVuZFN1YlJlcXVlc3RUb0JvZHkocmVxdWVzdCkge1xuICAgICAgICAvLyBTdGFydCB0byBhc3NlbWJsZSBzdWIgcmVxdWVzdFxuICAgICAgICB0aGlzLmJvZHkgKz0gW1xuICAgICAgICAgICAgdGhpcy5zdWJSZXF1ZXN0UHJlZml4LFxuICAgICAgICAgICAgYCR7SGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfSUR9OiAke3RoaXMub3BlcmF0aW9uQ291bnR9YCxcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBgJHtyZXF1ZXN0Lm1ldGhvZC50b1N0cmluZygpfSAke2dldFVSTFBhdGhBbmRRdWVyeShyZXF1ZXN0LnVybCl9ICR7SFRUUF9WRVJTSU9OXzFfMX0ke0hUVFBfTElORV9FTkRJTkd9YCwgLy8gc3ViIHJlcXVlc3Qgc3RhcnQgbGluZSB3aXRoIG1ldGhvZFxuICAgICAgICBdLmpvaW4oSFRUUF9MSU5FX0VORElORyk7XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHJlcXVlc3QuaGVhZGVycy5oZWFkZXJzQXJyYXkoKSkge1xuICAgICAgICAgICAgdGhpcy5ib2R5ICs9IGAke2hlYWRlci5uYW1lfTogJHtoZWFkZXIudmFsdWV9JHtIVFRQX0xJTkVfRU5ESU5HfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib2R5ICs9IEhUVFBfTElORV9FTkRJTkc7IC8vIHN1YiByZXF1ZXN0J3MgaGVhZGVycyBuZWVkIGJlIGVuZGluZyB3aXRoIGFuIGVtcHR5IGxpbmVcbiAgICAgICAgLy8gTm8gYm9keSB0byBhc3NlbWJsZSBmb3IgY3VycmVudCBiYXRjaCByZXF1ZXN0IHN1cHBvcnRcbiAgICAgICAgLy8gRW5kIHRvIGFzc2VtYmxlIHN1YiByZXF1ZXN0XG4gICAgfVxuICAgIHByZUFkZFN1YlJlcXVlc3Qoc3ViUmVxdWVzdCkge1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25Db3VudCA+PSBCQVRDSF9NQVhfUkVRVUVTVCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBleGNlZWQgJHtCQVRDSF9NQVhfUkVRVUVTVH0gc3ViIHJlcXVlc3RzIGluIGEgc2luZ2xlIGJhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCBmYWlsIGlmIHVybCBmb3Igc3ViIHJlcXVlc3QgaXMgaW52YWxpZFxuICAgICAgICBjb25zdCBwYXRoID0gZ2V0VVJMUGF0aChzdWJSZXF1ZXN0LnVybCk7XG4gICAgICAgIGlmICghcGF0aCB8fCBwYXRoID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCB1cmwgZm9yIHN1YiByZXF1ZXN0OiAnJHtzdWJSZXF1ZXN0LnVybH0nYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcG9zdEFkZFN1YlJlcXVlc3Qoc3ViUmVxdWVzdCkge1xuICAgICAgICB0aGlzLnN1YlJlcXVlc3RzLnNldCh0aGlzLm9wZXJhdGlvbkNvdW50LCBzdWJSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25Db3VudCsrO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGh0dHAgcmVxdWVzdCBib2R5IHdpdGggYXNzZW1ibGluZyB0aGUgZW5kaW5nIGxpbmUgdG8gdGhlIHN1YiByZXF1ZXN0IGJvZHkuXG4gICAgZ2V0SHR0cFJlcXVlc3RCb2R5KCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5ib2R5fSR7dGhpcy5iYXRjaFJlcXVlc3RFbmRpbmd9JHtIVFRQX0xJTkVfRU5ESU5HfWA7XG4gICAgfVxuICAgIGdldE11bHRpcGFydENvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBhcnRDb250ZW50VHlwZTtcbiAgICB9XG4gICAgZ2V0U3ViUmVxdWVzdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YlJlcXVlc3RzO1xuICAgIH1cbn1cbmNsYXNzIEJhdGNoUmVxdWVzdEFzc2VtYmxlUG9saWN5IGV4dGVuZHMgQmFzZVJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0cnVjdG9yKGJhdGNoUmVxdWVzdCwgbmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5kdW1teVJlc3BvbnNlID0ge1xuICAgICAgICAgICAgcmVxdWVzdDogbmV3IFdlYlJlc291cmNlKCksXG4gICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmJhdGNoUmVxdWVzdCA9IGJhdGNoUmVxdWVzdDtcbiAgICB9XG4gICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICBhd2FpdCB0aGlzLmJhdGNoUmVxdWVzdC5hcHBlbmRTdWJSZXF1ZXN0VG9Cb2R5KHJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gdGhpcy5kdW1teVJlc3BvbnNlOyAvLyBJbnRlcmNlcHQgcmVxdWVzdCBmcm9tIGdvaW5nIHRvIHdpcmVcbiAgICB9XG59XG5jbGFzcyBCYXRjaFJlcXVlc3RBc3NlbWJsZVBvbGljeUZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKGJhdGNoUmVxdWVzdCkge1xuICAgICAgICB0aGlzLmJhdGNoUmVxdWVzdCA9IGJhdGNoUmVxdWVzdDtcbiAgICB9XG4gICAgY3JlYXRlKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXRjaFJlcXVlc3RBc3NlbWJsZVBvbGljeSh0aGlzLmJhdGNoUmVxdWVzdCwgbmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgfVxufVxuY2xhc3MgQmF0Y2hIZWFkZXJGaWx0ZXJQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgLy8gVGhlIGJhc2UgY2xhc3MgaGFzIGEgcHJvdGVjdGVkIGNvbnN0cnVjdG9yLiBBZGRpbmcgYSBwdWJsaWMgb25lIHRvIGVuYWJsZSBjb25zdHJ1Y3Rpbmcgb2YgdGhpcyBjbGFzcy5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZWxlc3MtY29uc3RydWN0b3IqL1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgbGV0IHhNc0hlYWRlck5hbWUgPSBcIlwiO1xuICAgICAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiByZXF1ZXN0LmhlYWRlcnMuaGVhZGVyc0FycmF5KCkpIHtcbiAgICAgICAgICAgIGlmIChpRXF1YWwoaGVhZGVyLm5hbWUsIEhlYWRlckNvbnN0YW50cy5YX01TX1ZFUlNJT04pKSB7XG4gICAgICAgICAgICAgICAgeE1zSGVhZGVyTmFtZSA9IGhlYWRlci5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh4TXNIZWFkZXJOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMucmVtb3ZlKHhNc0hlYWRlck5hbWUpOyAvLyBUaGUgc3VicmVxdWVzdHMgc2hvdWxkIG5vdCBoYXZlIHRoZSB4LW1zLXZlcnNpb24gaGVhZGVyLlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgIH1cbn1cbmNsYXNzIEJhdGNoSGVhZGVyRmlsdGVyUG9saWN5RmFjdG9yeSB7XG4gICAgY3JlYXRlKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXRjaEhlYWRlckZpbHRlclBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CbG9iQmF0Y2guanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5pbXBvcnQgeyBCYXRjaFJlc3BvbnNlUGFyc2VyIH0gZnJvbSBcIi4vQmF0Y2hSZXNwb25zZVBhcnNlclwiO1xuaW1wb3J0IHsgdXRmOEJ5dGVMZW5ndGggfSBmcm9tIFwiLi9CYXRjaFV0aWxzXCI7XG5pbXBvcnQgeyBCbG9iQmF0Y2ggfSBmcm9tIFwiLi9CbG9iQmF0Y2hcIjtcbmltcG9ydCB7IFNwYW5TdGF0dXNDb2RlIH0gZnJvbSBcIkBhenVyZS9jb3JlLXRyYWNpbmdcIjtcbmltcG9ydCB7IGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UsIGNyZWF0ZVNwYW4gfSBmcm9tIFwiLi91dGlscy90cmFjaW5nXCI7XG5pbXBvcnQgeyBTZXJ2aWNlLCBDb250YWluZXIgfSBmcm9tIFwiLi9nZW5lcmF0ZWQvc3JjL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IEFub255bW91c0NyZWRlbnRpYWwgfSBmcm9tIFwiLi9jcmVkZW50aWFscy9Bbm9ueW1vdXNDcmVkZW50aWFsXCI7XG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50Q29udGV4dCB9IGZyb20gXCIuL2dlbmVyYXRlZC9zcmMvc3RvcmFnZUNsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IG5ld1BpcGVsaW5lLCBpc1BpcGVsaW5lTGlrZSB9IGZyb20gXCIuL1BpcGVsaW5lXCI7XG5pbXBvcnQgeyBnZXRVUkxQYXRoIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHMuY29tbW9uXCI7XG4vKipcbiAqIEEgQmxvYkJhdGNoQ2xpZW50IGFsbG93cyB5b3UgdG8gbWFrZSBiYXRjaGVkIHJlcXVlc3RzIHRvIHRoZSBBenVyZSBTdG9yYWdlIEJsb2Igc2VydmljZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9ibG9iLWJhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iQmF0Y2hDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVybCwgY3JlZGVudGlhbE9yUGlwZWxpbmUsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBpZiAoaXNQaXBlbGluZUxpa2UoY3JlZGVudGlhbE9yUGlwZWxpbmUpKSB7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjcmVkZW50aWFsT3JQaXBlbGluZSkge1xuICAgICAgICAgICAgLy8gbm8gY3JlZGVudGlhbCBwcm92aWRlZFxuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoY3JlZGVudGlhbE9yUGlwZWxpbmUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VDbGllbnRDb250ZXh0ID0gbmV3IFN0b3JhZ2VDbGllbnRDb250ZXh0KHVybCwgcGlwZWxpbmUudG9TZXJ2aWNlQ2xpZW50T3B0aW9ucygpKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldFVSTFBhdGgodXJsKTtcbiAgICAgICAgaWYgKHBhdGggJiYgcGF0aCAhPT0gXCIvXCIpIHtcbiAgICAgICAgICAgIC8vIENvbnRhaW5lciBzY29wZWQuXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VPckNvbnRhaW5lckNvbnRleHQgPSBuZXcgQ29udGFpbmVyKHN0b3JhZ2VDbGllbnRDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZU9yQ29udGFpbmVyQ29udGV4dCA9IG5ldyBTZXJ2aWNlKHN0b3JhZ2VDbGllbnRDb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEJsb2JCYXRjaH0uXG4gICAgICogQSBCbG9iQmF0Y2ggcmVwcmVzZW50cyBhbiBhZ2dyZWdhdGVkIHNldCBvZiBvcGVyYXRpb25zIG9uIGJsb2JzLlxuICAgICAqL1xuICAgIGNyZWF0ZUJhdGNoKCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JCYXRjaCgpO1xuICAgIH1cbiAgICBhc3luYyBkZWxldGVCbG9icyh1cmxzT3JCbG9iQ2xpZW50cywgY3JlZGVudGlhbE9yT3B0aW9ucywgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBiYXRjaCA9IG5ldyBCbG9iQmF0Y2goKTtcbiAgICAgICAgZm9yIChjb25zdCB1cmxPckJsb2JDbGllbnQgb2YgdXJsc09yQmxvYkNsaWVudHMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsT3JCbG9iQ2xpZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYmF0Y2guZGVsZXRlQmxvYih1cmxPckJsb2JDbGllbnQsIGNyZWRlbnRpYWxPck9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYmF0Y2guZGVsZXRlQmxvYih1cmxPckJsb2JDbGllbnQsIGNyZWRlbnRpYWxPck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN1Ym1pdEJhdGNoKGJhdGNoKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0QmxvYnNBY2Nlc3NUaWVyKHVybHNPckJsb2JDbGllbnRzLCBjcmVkZW50aWFsT3JUaWVyLCB0aWVyT3JPcHRpb25zLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJhdGNoID0gbmV3IEJsb2JCYXRjaCgpO1xuICAgICAgICBmb3IgKGNvbnN0IHVybE9yQmxvYkNsaWVudCBvZiB1cmxzT3JCbG9iQ2xpZW50cykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPckJsb2JDbGllbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBiYXRjaC5zZXRCbG9iQWNjZXNzVGllcih1cmxPckJsb2JDbGllbnQsIGNyZWRlbnRpYWxPclRpZXIsIHRpZXJPck9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYmF0Y2guc2V0QmxvYkFjY2Vzc1RpZXIodXJsT3JCbG9iQ2xpZW50LCBjcmVkZW50aWFsT3JUaWVyLCB0aWVyT3JPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdWJtaXRCYXRjaChiYXRjaCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN1Ym1pdCBiYXRjaCByZXF1ZXN0IHdoaWNoIGNvbnNpc3RzIG9mIG11bHRpcGxlIHN1YnJlcXVlc3RzLlxuICAgICAqXG4gICAgICogR2V0IGBibG9iQmF0Y2hDbGllbnRgIGFuZCBvdGhlciBkZXRhaWxzIGJlZm9yZSBydW5uaW5nIHRoZSBzbmlwcGV0cy5cbiAgICAgKiBgYmxvYlNlcnZpY2VDbGllbnQuZ2V0QmxvYkJhdGNoQ2xpZW50KClgIGdpdmVzIHRoZSBgYmxvYkJhdGNoQ2xpZW50YFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGJhdGNoUmVxdWVzdCA9IG5ldyBCbG9iQmF0Y2goKTtcbiAgICAgKiBhd2FpdCBiYXRjaFJlcXVlc3QuZGVsZXRlQmxvYih1cmxJblN0cmluZzAsIGNyZWRlbnRpYWwwKTtcbiAgICAgKiBhd2FpdCBiYXRjaFJlcXVlc3QuZGVsZXRlQmxvYih1cmxJblN0cmluZzEsIGNyZWRlbnRpYWwxLCB7XG4gICAgICogIGRlbGV0ZVNuYXBzaG90czogXCJpbmNsdWRlXCJcbiAgICAgKiB9KTtcbiAgICAgKiBjb25zdCBiYXRjaFJlc3AgPSBhd2FpdCBibG9iQmF0Y2hDbGllbnQuc3VibWl0QmF0Y2goYmF0Y2hSZXF1ZXN0KTtcbiAgICAgKiBjb25zb2xlLmxvZyhiYXRjaFJlc3Auc3ViUmVzcG9uc2VzU3VjY2VlZGVkQ291bnQpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBhIGxlYXNlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgYmF0Y2hSZXF1ZXN0ID0gbmV3IEJsb2JCYXRjaCgpO1xuICAgICAqIGF3YWl0IGJhdGNoUmVxdWVzdC5zZXRCbG9iQWNjZXNzVGllcihibG9ja0Jsb2JDbGllbnQwLCBcIkNvb2xcIik7XG4gICAgICogYXdhaXQgYmF0Y2hSZXF1ZXN0LnNldEJsb2JBY2Nlc3NUaWVyKGJsb2NrQmxvYkNsaWVudDEsIFwiQ29vbFwiLCB7XG4gICAgICogIGNvbmRpdGlvbnM6IHsgbGVhc2VJZDogbGVhc2VJZCB9XG4gICAgICogfSk7XG4gICAgICogY29uc3QgYmF0Y2hSZXNwID0gYXdhaXQgYmxvYkJhdGNoQ2xpZW50LnN1Ym1pdEJhdGNoKGJhdGNoUmVxdWVzdCk7XG4gICAgICogY29uc29sZS5sb2coYmF0Y2hSZXNwLnN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2Jsb2ItYmF0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSBiYXRjaFJlcXVlc3QgLSBBIHNldCBvZiBEZWxldGUgb3IgU2V0VGllciBvcGVyYXRpb25zLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBzdWJtaXRCYXRjaChiYXRjaFJlcXVlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIWJhdGNoUmVxdWVzdCB8fCBiYXRjaFJlcXVlc3QuZ2V0U3ViUmVxdWVzdHMoKS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJhdGNoIHJlcXVlc3Qgc2hvdWxkIGNvbnRhaW4gb25lIG9yIG1vcmUgc3ViIHJlcXVlc3RzLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYkJhdGNoQ2xpZW50LXN1Ym1pdEJhdGNoXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2hSZXF1ZXN0Qm9keSA9IGJhdGNoUmVxdWVzdC5nZXRIdHRwUmVxdWVzdEJvZHkoKTtcbiAgICAgICAgICAgIC8vIFNlcnZpY2VTdWJtaXRCYXRjaFJlc3BvbnNlTW9kZWwgYW5kIENvbnRhaW5lclN1Ym1pdEJhdGNoUmVzcG9uc2UgYXJlIGNvbXBhdGlibGUgZm9yIG5vdy5cbiAgICAgICAgICAgIGNvbnN0IHJhd0JhdGNoUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlcnZpY2VPckNvbnRhaW5lckNvbnRleHQuc3VibWl0QmF0Y2godXRmOEJ5dGVMZW5ndGgoYmF0Y2hSZXF1ZXN0Qm9keSksIGJhdGNoUmVxdWVzdC5nZXRNdWx0aVBhcnRDb250ZW50VHlwZSgpLCBiYXRjaFJlcXVlc3RCb2R5LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgLy8gUGFyc2UgdGhlIHN1YiByZXNwb25zZXMgcmVzdWx0LCBpZiBsb2dpYyByZWFjaGVzIGhlcmUoaS5lLiB0aGUgYmF0Y2ggcmVxdWVzdCBzdWNjZWVkZWQgd2l0aCBzdGF0dXMgY29kZSAyMDIpLlxuICAgICAgICAgICAgY29uc3QgYmF0Y2hSZXNwb25zZVBhcnNlciA9IG5ldyBCYXRjaFJlc3BvbnNlUGFyc2VyKHJhd0JhdGNoUmVzcG9uc2UsIGJhdGNoUmVxdWVzdC5nZXRTdWJSZXF1ZXN0cygpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlU3VtbWFyeSA9IGF3YWl0IGJhdGNoUmVzcG9uc2VQYXJzZXIucGFyc2VCYXRjaFJlc3BvbnNlKCk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICAgICAgX3Jlc3BvbnNlOiByYXdCYXRjaFJlc3BvbnNlLl9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcmF3QmF0Y2hSZXNwb25zZS5jb250ZW50VHlwZSxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IHJhd0JhdGNoUmVzcG9uc2UuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmF3QmF0Y2hSZXNwb25zZS5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiByYXdCYXRjaFJlc3BvbnNlLmNsaWVudFJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiByYXdCYXRjaFJlc3BvbnNlLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgc3ViUmVzcG9uc2VzOiByZXNwb25zZVN1bW1hcnkuc3ViUmVzcG9uc2VzLFxuICAgICAgICAgICAgICAgIHN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50OiByZXNwb25zZVN1bW1hcnkuc3ViUmVzcG9uc2VzU3VjY2VlZGVkQ291bnQsXG4gICAgICAgICAgICAgICAgc3ViUmVzcG9uc2VzRmFpbGVkQ291bnQ6IHJlc3BvbnNlU3VtbWFyeS5zdWJSZXNwb25zZXNGYWlsZWRDb3VudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJsb2JCYXRjaENsaWVudC5qcy5tYXAiLCJpbXBvcnQgeyBfX2FzeW5jRGVsZWdhdG9yLCBfX2FzeW5jR2VuZXJhdG9yLCBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0UHJveHlTZXR0aW5ncywgaXNOb2RlLCBpc1Rva2VuQ3JlZGVudGlhbCwgVVJMQnVpbGRlciwgfSBmcm9tIFwiQGF6dXJlL2NvcmUtaHR0cFwiO1xuaW1wb3J0IHsgU3BhblN0YXR1c0NvZGUgfSBmcm9tIFwiQGF6dXJlL2NvcmUtdHJhY2luZ1wiO1xuaW1wb3J0IHsgQW5vbnltb3VzQ3JlZGVudGlhbCB9IGZyb20gXCIuL2NyZWRlbnRpYWxzL0Fub255bW91c0NyZWRlbnRpYWxcIjtcbmltcG9ydCB7IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIH0gZnJvbSBcIi4vY3JlZGVudGlhbHMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2dlbmVyYXRlZC9zcmMvb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgbmV3UGlwZWxpbmUsIGlzUGlwZWxpbmVMaWtlIH0gZnJvbSBcIi4vUGlwZWxpbmVcIjtcbmltcG9ydCB7IFN0b3JhZ2VDbGllbnQgfSBmcm9tIFwiLi9TdG9yYWdlQ2xpZW50XCI7XG5pbXBvcnQgeyBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlLCBjcmVhdGVTcGFuIH0gZnJvbSBcIi4vdXRpbHMvdHJhY2luZ1wiO1xuaW1wb3J0IHsgYXBwZW5kVG9VUkxQYXRoLCBhcHBlbmRUb1VSTFF1ZXJ5LCBCbG9iTmFtZVRvU3RyaW5nLCBDb252ZXJ0SW50ZXJuYWxSZXNwb25zZU9mTGlzdEJsb2JGbGF0LCBDb252ZXJ0SW50ZXJuYWxSZXNwb25zZU9mTGlzdEJsb2JIaWVyYXJjaHksIEVzY2FwZVBhdGgsIGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHMsIGlzSXBFbmRwb2ludFN0eWxlLCBwYXJzZU9iamVjdFJlcGxpY2F0aW9uUmVjb3JkLCB0b1RhZ3MsIHRydW5jYXRlZElTTzgwNjFEYXRlLCB9IGZyb20gXCIuL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSBcIi4vc2FzL0Jsb2JTQVNTaWduYXR1cmVWYWx1ZXNcIjtcbmltcG9ydCB7IEJsb2JMZWFzZUNsaWVudCB9IGZyb20gXCIuL0Jsb2JMZWFzZUNsaWVudFwiO1xuaW1wb3J0IHsgQXBwZW5kQmxvYkNsaWVudCwgQmxvYkNsaWVudCwgQmxvY2tCbG9iQ2xpZW50LCBQYWdlQmxvYkNsaWVudCwgfSBmcm9tIFwiLi9DbGllbnRzXCI7XG5pbXBvcnQgeyBCbG9iQmF0Y2hDbGllbnQgfSBmcm9tIFwiLi9CbG9iQmF0Y2hDbGllbnRcIjtcbi8qKlxuICogQSBDb250YWluZXJDbGllbnQgcmVwcmVzZW50cyBhIFVSTCB0byB0aGUgQXp1cmUgU3RvcmFnZSBjb250YWluZXIgYWxsb3dpbmcgeW91IHRvIG1hbmlwdWxhdGUgaXRzIGJsb2JzLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyQ2xpZW50IGV4dGVuZHMgU3RvcmFnZUNsaWVudCB7XG4gICAgY29uc3RydWN0b3IodXJsT3JDb25uZWN0aW9uU3RyaW5nLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBsZXQgcGlwZWxpbmU7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoaXNQaXBlbGluZUxpa2UoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIHBpcGVsaW5lOiBQaXBlbGluZSlcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGlzTm9kZSAmJiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsIHx8XG4gICAgICAgICAgICBpc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSkpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBjcmVkZW50aWFsPzogU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfCBBbm9ueW1vdXNDcmVkZW50aWFsIHwgVG9rZW5DcmVkZW50aWFsLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIC8vIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4gVXNlIGFub255bW91cyBjcmVkZW50aWFsLlxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAoY29ubmVjdGlvblN0cmluZzogc3RyaW5nLCBjb250YWluZXJOYW1lOiBzdHJpbmcsIGJsb2JOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkQ3JlZHMgPSBleHRyYWN0Q29ubmVjdGlvblN0cmluZ1BhcnRzKHVybE9yQ29ubmVjdGlvblN0cmluZyk7XG4gICAgICAgICAgICBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJBY2NvdW50Q29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRLZXlDcmVkZW50aWFsID0gbmV3IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKGV4dHJhY3RlZENyZWRzLmFjY291bnROYW1lLCBleHRyYWN0ZWRDcmVkcy5hY2NvdW50S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnByb3h5T3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcm94eU9wdGlvbnMgPSBnZXREZWZhdWx0UHJveHlTZXR0aW5ncyhleHRyYWN0ZWRDcmVkcy5wcm94eVVyaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShzaGFyZWRLZXlDcmVkZW50aWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS5qcyBlbnZpcm9ubWVudFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIlNBU0Nvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHVybCA9XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI/XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudFNhcztcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgYW4gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGluZyBub24tZW1wdHkgc3RyaW5ncyBmb3IgY29udGFpbmVyTmFtZSBwYXJhbWV0ZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIodXJsLCBwaXBlbGluZSk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lck5hbWUgPSB0aGlzLmdldENvbnRhaW5lck5hbWVGcm9tVXJsKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyQ29udGV4dCA9IG5ldyBDb250YWluZXIodGhpcy5zdG9yYWdlQ2xpZW50Q29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIuXG4gICAgICovXG4gICAgZ2V0IGNvbnRhaW5lck5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXJOYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnQuIElmIHRoZSBjb250YWluZXIgd2l0aFxuICAgICAqIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZSBvcGVyYXRpb24gZmFpbHMuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY3JlYXRlLWNvbnRhaW5lclxuICAgICAqIE5hbWluZyBydWxlczogQHNlZSBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL25hbWluZy1hbmQtcmVmZXJlbmNpbmctY29udGFpbmVycy0tYmxvYnMtLWFuZC1tZXRhZGF0YVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBDcmVhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb250YWluZXJDbGllbnQgPSBibG9iU2VydmljZUNsaWVudC5nZXRDb250YWluZXJDbGllbnQoXCI8Y29udGFpbmVyIG5hbWU+XCIpO1xuICAgICAqIGNvbnN0IGNyZWF0ZUNvbnRhaW5lclJlc3BvbnNlID0gYXdhaXQgY29udGFpbmVyQ2xpZW50LmNyZWF0ZSgpO1xuICAgICAqIGNvbnNvbGUubG9nKFwiQ29udGFpbmVyIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseVwiLCBjcmVhdGVDb250YWluZXJSZXNwb25zZS5yZXF1ZXN0SWQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1jcmVhdGVcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTcHJlYWQgb3BlcmF0b3IgaW4gZGVzdHJ1Y3R1cmluZyBhc3NpZ25tZW50cyxcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBmaWx0ZXIgb3V0IHVud2FudGVkIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVzcG9uc2Ugb2JqZWN0IGludG8gcmVzdWx0IG9iamVjdFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29udGFpbmVyQ29udGV4dC5jcmVhdGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50LiBJZiB0aGUgY29udGFpbmVyIHdpdGhcbiAgICAgKiB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCBpcyBub3QgY2hhbmdlZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jcmVhdGUtY29udGFpbmVyXG4gICAgICogTmFtaW5nIHJ1bGVzOiBAc2VlIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbmFtaW5nLWFuZC1yZWZlcmVuY2luZy1jb250YWluZXJzLS1ibG9icy0tYW5kLW1ldGFkYXRhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlSWZOb3RFeGlzdHMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtY3JlYXRlSWZOb3RFeGlzdHNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNyZWF0ZSh1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiB0cnVlIH0sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoKChfYSA9IGUuZGV0YWlscykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yQ29kZSkgPT09IFwiQ29udGFpbmVyQWxyZWFkeUV4aXN0c1wiKSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJFeHBlY3RlZCBleGNlcHRpb24gd2hlbiBjcmVhdGluZyBhIGNvbnRhaW5lciBvbmx5IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IHN1Y2NlZWRlZDogZmFsc2UgfSwgKF9iID0gZS5yZXNwb25zZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBhcnNlZEhlYWRlcnMpLCB7IF9yZXNwb25zZTogZS5yZXNwb25zZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQXp1cmUgY29udGFpbmVyIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xpZW50IGV4aXN0czsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogTk9URTogdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBjYXJlIHNpbmNlIGFuIGV4aXN0aW5nIGNvbnRhaW5lciBtaWdodCBiZSBkZWxldGVkIGJ5IG90aGVyIGNsaWVudHMgb3JcbiAgICAgKiBhcHBsaWNhdGlvbnMuIFZpY2UgdmVyc2EgbmV3IGNvbnRhaW5lcnMgd2l0aCB0aGUgc2FtZSBuYW1lIG1pZ2h0IGJlIGFkZGVkIGJ5IG90aGVyIGNsaWVudHMgb3JcbiAgICAgKiBhcHBsaWNhdGlvbnMgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgZXhpc3RzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWV4aXN0c1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0UHJvcGVydGllcyh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJFeHBlY3RlZCBleGNlcHRpb24gd2hlbiBjaGVja2luZyBjb250YWluZXIgZXhpc3RlbmNlXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBCbG9iQ2xpZW50fVxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2JOYW1lIC0gQSBibG9iIG5hbWVcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBCbG9iQ2xpZW50IG9iamVjdCBmb3IgdGhlIGdpdmVuIGJsb2IgbmFtZS5cbiAgICAgKi9cbiAgICBnZXRCbG9iQ2xpZW50KGJsb2JOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvYkNsaWVudChhcHBlbmRUb1VSTFBhdGgodGhpcy51cmwsIEVzY2FwZVBhdGgoYmxvYk5hbWUpKSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFwcGVuZEJsb2JDbGllbnR9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvYk5hbWUgLSBBbiBhcHBlbmQgYmxvYiBuYW1lXG4gICAgICovXG4gICAgZ2V0QXBwZW5kQmxvYkNsaWVudChibG9iTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFwcGVuZEJsb2JDbGllbnQoYXBwZW5kVG9VUkxQYXRoKHRoaXMudXJsLCBFc2NhcGVQYXRoKGJsb2JOYW1lKSksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEJsb2NrQmxvYkNsaWVudH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9iTmFtZSAtIEEgYmxvY2sgYmxvYiBuYW1lXG4gICAgICpcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2U6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvbnRlbnQgPSBcIkhlbGxvIHdvcmxkIVwiO1xuICAgICAqXG4gICAgICogY29uc3QgYmxvY2tCbG9iQ2xpZW50ID0gY29udGFpbmVyQ2xpZW50LmdldEJsb2NrQmxvYkNsaWVudChcIjxibG9iIG5hbWU+XCIpO1xuICAgICAqIGNvbnN0IHVwbG9hZEJsb2JSZXNwb25zZSA9IGF3YWl0IGJsb2NrQmxvYkNsaWVudC51cGxvYWQoY29udGVudCwgY29udGVudC5sZW5ndGgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldEJsb2NrQmxvYkNsaWVudChibG9iTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrQmxvYkNsaWVudChhcHBlbmRUb1VSTFBhdGgodGhpcy51cmwsIEVzY2FwZVBhdGgoYmxvYk5hbWUpKSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgUGFnZUJsb2JDbGllbnR9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvYk5hbWUgLSBBIHBhZ2UgYmxvYiBuYW1lXG4gICAgICovXG4gICAgZ2V0UGFnZUJsb2JDbGllbnQoYmxvYk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQmxvYkNsaWVudChhcHBlbmRUb1VSTFBhdGgodGhpcy51cmwsIEVzY2FwZVBhdGgoYmxvYk5hbWUpKSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBhbmQgc3lzdGVtIHByb3BlcnRpZXMgZm9yIHRoZSBzcGVjaWZpZWRcbiAgICAgKiBjb250YWluZXIuIFRoZSBkYXRhIHJldHVybmVkIGRvZXMgbm90IGluY2x1ZGUgdGhlIGNvbnRhaW5lcidzIGxpc3Qgb2YgYmxvYnMuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWNvbnRhaW5lci1wcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBXQVJOSU5HOiBUaGUgYG1ldGFkYXRhYCBvYmplY3QgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBpdHMga2V5cyBpbiBsb3dlcmNhc2UsIGV2ZW4gaWZcbiAgICAgKiB0aGV5IG9yaWdpbmFsbHkgY29udGFpbmVkIHVwcGVyY2FzZSBjaGFyYWN0ZXJzLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgbWV0YWRhdGEga2V5cyByZXR1cm5lZCBieVxuICAgICAqIHRoZSBgbGlzdENvbnRhaW5lcnNgIG1ldGhvZCBvZiB7QGxpbmsgQmxvYlNlcnZpY2VDbGllbnR9IHVzaW5nIHRoZSBgaW5jbHVkZU1ldGFkYXRhYCBvcHRpb24sIHdoaWNoXG4gICAgICogd2lsbCByZXRhaW4gdGhlaXIgb3JpZ2luYWwgY2FzaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBHZXQgUHJvcGVydGllcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UHJvcGVydGllcyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtZ2V0UHJvcGVydGllc1wiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQuZ2V0UHJvcGVydGllcyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBmb3IgZGVsZXRpb24uIFRoZSBjb250YWluZXIgYW5kIGFueSBibG9ic1xuICAgICAqIGNvbnRhaW5lZCB3aXRoaW4gaXQgYXJlIGxhdGVyIGRlbGV0ZWQgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9kZWxldGUtY29udGFpbmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIERlbGV0ZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1kZWxldGVcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0LmRlbGV0ZShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBmb3IgZGVsZXRpb24gaWYgaXQgZXhpc3RzLiBUaGUgY29udGFpbmVyIGFuZCBhbnkgYmxvYnNcbiAgICAgKiBjb250YWluZWQgd2l0aGluIGl0IGFyZSBsYXRlciBkZWxldGVkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZGVsZXRlLWNvbnRhaW5lclxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBEZWxldGUgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUlmRXhpc3RzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWRlbGV0ZUlmRXhpc3RzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5kZWxldGUodXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IHN1Y2NlZWRlZDogdHJ1ZSB9LCByZXMpLCB7IF9yZXNwb25zZTogcmVzLl9yZXNwb25zZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKCgoX2EgPSBlLmRldGFpbHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lcnJvckNvZGUpID09PSBcIkNvbnRhaW5lck5vdEZvdW5kXCIpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIGRlbGV0aW5nIGEgY29udGFpbmVyIG9ubHkgaWYgaXQgZXhpc3RzLlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IGZhbHNlIH0sIChfYiA9IGUucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJzZWRIZWFkZXJzKSwgeyBfcmVzcG9uc2U6IGUucmVzcG9uc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIG9uZSBvciBtb3JlIHVzZXItZGVmaW5lZCBuYW1lLXZhbHVlIHBhaXJzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIElmIG5vIG9wdGlvbiBwcm92aWRlZCwgb3Igbm8gbWV0YWRhdGEgZGVmaW5lZCBpbiB0aGUgcGFyYW1ldGVyLCB0aGUgY29udGFpbmVyXG4gICAgICogbWV0YWRhdGEgd2lsbCBiZSByZW1vdmVkLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvc2V0LWNvbnRhaW5lci1tZXRhZGF0YVxuICAgICAqXG4gICAgICogQHBhcmFtIG1ldGFkYXRhIC0gUmVwbGFjZSBleGlzdGluZyBtZXRhZGF0YSB3aXRoIHRoaXMgdmFsdWUuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm8gdmFsdWUgcHJvdmlkZWQgdGhlIGV4aXN0aW5nIG1ldGFkYXRhIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIFNldCBNZXRhZGF0YSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgc2V0TWV0YWRhdGEobWV0YWRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuY29uZGl0aW9ucy5pZlVubW9kaWZpZWRTaW5jZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ0aGUgSWZVbm1vZGlmaWVkU2luY2UgbXVzdCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGJlY2F1c2UgdGhleSBhcmUgaWdub3JlZCBieSB0aGUgYmxvYiBzZXJ2aWNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtc2V0TWV0YWRhdGFcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0LnNldE1ldGFkYXRhKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1ldGFkYXRhLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIuIFRoZSBwZXJtaXNzaW9ucyBpbmRpY2F0ZVxuICAgICAqIHdoZXRoZXIgY29udGFpbmVyIGRhdGEgbWF5IGJlIGFjY2Vzc2VkIHB1YmxpY2x5LlxuICAgICAqXG4gICAgICogV0FSTklORzogSmF2YVNjcmlwdCBEYXRlIHdpbGwgcG90ZW50aWFsbHkgbG9zZSBwcmVjaXNpb24gd2hlbiBwYXJzaW5nIHN0YXJ0c09uIGFuZCBleHBpcmVzT24gc3RyaW5ncy5cbiAgICAgKiBGb3IgZXhhbXBsZSwgbmV3IERhdGUoXCIyMDE4LTEyLTMxVDAzOjQ0OjIzLjg4Mjc4OTFaXCIpLnRvSVNPU3RyaW5nKCkgd2lsbCBnZXQgXCIyMDE4LTEyLTMxVDAzOjQ0OjIzLjg4MlpcIi5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1jb250YWluZXItYWNsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIEdldCBBY2Nlc3MgUG9saWN5IG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRBY2Nlc3NQb2xpY3kob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWdldEFjY2Vzc1BvbGljeVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0LmdldEFjY2Vzc1BvbGljeShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICAgICAgX3Jlc3BvbnNlOiByZXNwb25zZS5fcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgYmxvYlB1YmxpY0FjY2VzczogcmVzcG9uc2UuYmxvYlB1YmxpY0FjY2VzcyxcbiAgICAgICAgICAgICAgICBkYXRlOiByZXNwb25zZS5kYXRlLFxuICAgICAgICAgICAgICAgIGV0YWc6IHJlc3BvbnNlLmV0YWcsXG4gICAgICAgICAgICAgICAgZXJyb3JDb2RlOiByZXNwb25zZS5lcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiByZXNwb25zZS5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiByZXNwb25zZS5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiByZXNwb25zZS5jbGllbnRSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgc2lnbmVkSWRlbnRpZmllcnM6IFtdLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IHJlc3BvbnNlLnZlcnNpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjY2Vzc1BvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzUG9saWN5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kuZXhwaXJlc09uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQb2xpY3kuZXhwaXJlc09uID0gbmV3IERhdGUoaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kuZXhwaXJlc09uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kuc3RhcnRzT24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1BvbGljeS5zdGFydHNPbiA9IG5ldyBEYXRlKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LnN0YXJ0c09uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXMuc2lnbmVkSWRlbnRpZmllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1BvbGljeSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkZW50aWZpZXIuaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIuIFRoZSBwZXJtaXNzaW9ucyBpbmRpY2F0ZVxuICAgICAqIHdoZXRoZXIgYmxvYnMgaW4gYSBjb250YWluZXIgbWF5IGJlIGFjY2Vzc2VkIHB1YmxpY2x5LlxuICAgICAqXG4gICAgICogV2hlbiB5b3Ugc2V0IHBlcm1pc3Npb25zIGZvciBhIGNvbnRhaW5lciwgdGhlIGV4aXN0aW5nIHBlcm1pc3Npb25zIGFyZSByZXBsYWNlZC5cbiAgICAgKiBJZiBubyBhY2Nlc3Mgb3IgY29udGFpbmVyQWNsIHByb3ZpZGVkLCB0aGUgZXhpc3RpbmcgY29udGFpbmVyIEFDTCB3aWxsIGJlXG4gICAgICogcmVtb3ZlZC5cbiAgICAgKlxuICAgICAqIFdoZW4geW91IGVzdGFibGlzaCBhIHN0b3JlZCBhY2Nlc3MgcG9saWN5IG9uIGEgY29udGFpbmVyLCBpdCBtYXkgdGFrZSB1cCB0byAzMCBzZWNvbmRzIHRvIHRha2UgZWZmZWN0LlxuICAgICAqIER1cmluZyB0aGlzIGludGVydmFsLCBhIHNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9yZWQgYWNjZXNzIHBvbGljeSB3aWxsXG4gICAgICogZmFpbCB3aXRoIHN0YXR1cyBjb2RlIDQwMyAoRm9yYmlkZGVuKSwgdW50aWwgdGhlIGFjY2VzcyBwb2xpY3kgYmVjb21lcyBhY3RpdmUuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvc2V0LWNvbnRhaW5lci1hY2xcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY2Nlc3MgLSBUaGUgbGV2ZWwgb2YgcHVibGljIGFjY2VzcyB0byBkYXRhIGluIHRoZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lckFjbCAtIEFycmF5IG9mIGVsZW1lbnRzIGVhY2ggaGF2aW5nIGEgdW5pcXVlIElkIGFuZCBkZXRhaWxzIG9mIHRoZSBhY2Nlc3MgcG9saWN5LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBDb250YWluZXIgU2V0IEFjY2VzcyBQb2xpY3kgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHNldEFjY2Vzc1BvbGljeShhY2Nlc3MsIGNvbnRhaW5lckFjbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1zZXRBY2Nlc3NQb2xpY3lcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhY2wgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiBjb250YWluZXJBY2wgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBhY2wucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1BvbGljeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlc09uOiBpZGVudGlmaWVyLmFjY2Vzc1BvbGljeS5leHBpcmVzT25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LmV4cGlyZXNPbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kucGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydHNPbjogaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kuc3RhcnRzT25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LnN0YXJ0c09uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkZW50aWZpZXIuaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0LnNldEFjY2Vzc1BvbGljeShPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIGFjY2VzcywgY29udGFpbmVyQWNsOiBhY2wsIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLCBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSB7QGxpbmsgQmxvYkxlYXNlQ2xpZW50fSB0aGF0IG1hbmFnZXMgbGVhc2VzIG9uIHRoZSBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcG9zZUxlYXNlSWQgLSBJbml0aWFsIHByb3Bvc2VkIGxlYXNlIElkLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2JMZWFzZUNsaWVudCBvYmplY3QgZm9yIG1hbmFnaW5nIGxlYXNlcyBvbiB0aGUgY29udGFpbmVyLlxuICAgICAqL1xuICAgIGdldEJsb2JMZWFzZUNsaWVudChwcm9wb3NlTGVhc2VJZCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JMZWFzZUNsaWVudCh0aGlzLCBwcm9wb3NlTGVhc2VJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYmxvY2sgYmxvYiwgb3IgdXBkYXRlcyB0aGUgY29udGVudCBvZiBhbiBleGlzdGluZyBibG9jayBibG9iLlxuICAgICAqXG4gICAgICogVXBkYXRpbmcgYW4gZXhpc3RpbmcgYmxvY2sgYmxvYiBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBtZXRhZGF0YSBvbiB0aGUgYmxvYi5cbiAgICAgKiBQYXJ0aWFsIHVwZGF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQ7IHRoZSBjb250ZW50IG9mIHRoZSBleGlzdGluZyBibG9iIGlzXG4gICAgICogb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV3IGNvbnRlbnQuIFRvIHBlcmZvcm0gYSBwYXJ0aWFsIHVwZGF0ZSBvZiBhIGJsb2NrIGJsb2IncyxcbiAgICAgKiB1c2Uge0BsaW5rIEJsb2NrQmxvYkNsaWVudC5zdGFnZUJsb2NrfSBhbmQge0BsaW5rIEJsb2NrQmxvYkNsaWVudC5jb21taXRCbG9ja0xpc3R9LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhIG5vbi1wYXJhbGxlbCB1cGxvYWRpbmcgbWV0aG9kLCBwbGVhc2UgdXNlIHtAbGluayBCbG9ja0Jsb2JDbGllbnQudXBsb2FkRmlsZX0sXG4gICAgICoge0BsaW5rIEJsb2NrQmxvYkNsaWVudC51cGxvYWRTdHJlYW19IG9yIHtAbGluayBCbG9ja0Jsb2JDbGllbnQudXBsb2FkQnJvd3NlckRhdGF9IGZvciBiZXR0ZXJcbiAgICAgKiBwZXJmb3JtYW5jZSB3aXRoIGNvbmN1cnJlbmN5IHVwbG9hZGluZy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvYk5hbWUgLSBOYW1lIG9mIHRoZSBibG9jayBibG9iIHRvIGNyZWF0ZSBvciB1cGRhdGUuXG4gICAgICogQHBhcmFtIGJvZHkgLSBCbG9iLCBzdHJpbmcsIEFycmF5QnVmZmVyLCBBcnJheUJ1ZmZlclZpZXcgb3IgYSBmdW5jdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHJldHVybnMgYSBuZXcgUmVhZGFibGUgc3RyZWFtIHdob3NlIG9mZnNldCBpcyBmcm9tIGRhdGEgc291cmNlIGJlZ2lubmluZy5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCAtIExlbmd0aCBvZiBib2R5IGluIGJ5dGVzLiBVc2UgQnVmZmVyLmJ5dGVMZW5ndGgoKSB0byBjYWxjdWxhdGUgYm9keSBsZW5ndGggZm9yIGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5jbHVkaW5nIG5vbiBub24tQmFzZTY0L0hleC1lbmNvZGVkIGNoYXJhY3RlcnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgQmxvY2sgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIEJsb2NrIEJsb2IgdXBsb2FkIHJlc3BvbnNlIGRhdGEgYW5kIHRoZSBjb3JyZXNwb25kaW5nIEJsb2NrQmxvYkNsaWVudCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRCbG9ja0Jsb2IoYmxvYk5hbWUsIGJvZHksIGNvbnRlbnRMZW5ndGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LXVwbG9hZEJsb2NrQmxvYlwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrQmxvYkNsaWVudCA9IHRoaXMuZ2V0QmxvY2tCbG9iQ2xpZW50KGJsb2JOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYmxvY2tCbG9iQ2xpZW50LnVwbG9hZChib2R5LCBjb250ZW50TGVuZ3RoLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJsb2NrQmxvYkNsaWVudCxcbiAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoZSBzcGVjaWZpZWQgYmxvYiBvciBzbmFwc2hvdCBmb3IgZGVsZXRpb24uIFRoZSBibG9iIGlzIGxhdGVyIGRlbGV0ZWRcbiAgICAgKiBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gZGVsZXRlIGEgYmxvYiwgeW91IG11c3QgZGVsZXRlXG4gICAgICogYWxsIG9mIGl0cyBzbmFwc2hvdHMuIFlvdSBjYW4gZGVsZXRlIGJvdGggYXQgdGhlIHNhbWUgdGltZSB3aXRoIHRoZSBEZWxldGVcbiAgICAgKiBCbG9iIG9wZXJhdGlvbi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9kZWxldGUtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2JOYW1lIC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQmxvYiBEZWxldGUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIEJsb2NrIGJsb2IgZGVsZXRpb24gcmVzcG9uc2UgZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVCbG9iKGJsb2JOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1kZWxldGVCbG9iXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJsb2JDbGllbnQgPSB0aGlzLmdldEJsb2JDbGllbnQoYmxvYk5hbWUpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyc2lvbklkKSB7XG4gICAgICAgICAgICAgICAgYmxvYkNsaWVudCA9IGJsb2JDbGllbnQud2l0aFZlcnNpb24ob3B0aW9ucy52ZXJzaW9uSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGJsb2JDbGllbnQuZGVsZXRlKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogbGlzdEJsb2JGbGF0U2VnbWVudCByZXR1cm5zIGEgc2luZ2xlIHNlZ21lbnQgb2YgYmxvYnMgc3RhcnRpbmcgZnJvbSB0aGVcbiAgICAgKiBzcGVjaWZpZWQgTWFya2VyLiBVc2UgYW4gZW1wdHkgTWFya2VyIHRvIHN0YXJ0IGVudW1lcmF0aW9uIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBBZnRlciBnZXR0aW5nIGEgc2VnbWVudCwgcHJvY2VzcyBpdCwgYW5kIHRoZW4gY2FsbCBsaXN0QmxvYnNGbGF0U2VnbWVudCBhZ2FpblxuICAgICAqIChwYXNzaW5nIHRoZSB0aGUgcHJldmlvdXNseS1yZXR1cm5lZCBNYXJrZXIpIHRvIGdldCB0aGUgbmV4dCBzZWdtZW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xpc3QtYmxvYnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2YgdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIExpc3QgQmxvYiBGbGF0IFNlZ21lbnQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RCbG9iRmxhdFNlZ21lbnQobWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkNvbnRhaW5lckNsaWVudC1saXN0QmxvYkZsYXRTZWdtZW50XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQubGlzdEJsb2JGbGF0U2VnbWVudChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBtYXJrZXIgfSwgb3B0aW9ucyksIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkUmVzcG9uc2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlKSwgeyBfcmVzcG9uc2U6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2UuX3Jlc3BvbnNlKSwgeyBwYXJzZWRCb2R5OiBDb252ZXJ0SW50ZXJuYWxSZXNwb25zZU9mTGlzdEJsb2JGbGF0KHJlc3BvbnNlLl9yZXNwb25zZS5wYXJzZWRCb2R5KSB9KSwgc2VnbWVudDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZS5zZWdtZW50KSwgeyBibG9iSXRlbXM6IHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zLm1hcCgoYmxvYkl0ZW1JbnRlcmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9iSXRlbSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmxvYkl0ZW1JbnRlcmFsKSwgeyBuYW1lOiBCbG9iTmFtZVRvU3RyaW5nKGJsb2JJdGVtSW50ZXJhbC5uYW1lKSwgdGFnczogdG9UYWdzKGJsb2JJdGVtSW50ZXJhbC5ibG9iVGFncyksIG9iamVjdFJlcGxpY2F0aW9uU291cmNlUHJvcGVydGllczogcGFyc2VPYmplY3RSZXBsaWNhdGlvblJlY29yZChibG9iSXRlbUludGVyYWwub2JqZWN0UmVwbGljYXRpb25NZXRhZGF0YSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvYkl0ZW07XG4gICAgICAgICAgICAgICAgICAgIH0pIH0pIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50IHJldHVybnMgYSBzaW5nbGUgc2VnbWVudCBvZiBibG9icyBzdGFydGluZyBmcm9tXG4gICAgICogdGhlIHNwZWNpZmllZCBNYXJrZXIuIFVzZSBhbiBlbXB0eSBNYXJrZXIgdG8gc3RhcnQgZW51bWVyYXRpb24gZnJvbSB0aGVcbiAgICAgKiBiZWdpbm5pbmcuIEFmdGVyIGdldHRpbmcgYSBzZWdtZW50LCBwcm9jZXNzIGl0LCBhbmQgdGhlbiBjYWxsIGxpc3RCbG9ic0hpZXJhcmNoaWNhbFNlZ21lbnRcbiAgICAgKiBhZ2FpbiAocGFzc2luZyB0aGUgdGhlIHByZXZpb3VzbHktcmV0dXJuZWQgTWFya2VyKSB0byBnZXQgdGhlIG5leHQgc2VnbWVudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9saXN0LWJsb2JzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVsaW1pdGVyIC0gVGhlIGNoYXJhY3RlciBvciBzdHJpbmcgdXNlZCB0byBkZWZpbmUgdGhlIHZpcnR1YWwgaGllcmFyY2h5XG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZiB0aGUgbGlzdCB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Qgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBDb250YWluZXIgTGlzdCBCbG9iIEhpZXJhcmNoeSBTZWdtZW50IG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnQoZGVsaW1pdGVyLCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJDb250YWluZXJDbGllbnQtbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50XCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQubGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50KGRlbGltaXRlciwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgbWFya2VyIH0sIG9wdGlvbnMpLCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSksIHsgX3Jlc3BvbnNlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlLl9yZXNwb25zZSksIHsgcGFyc2VkQm9keTogQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iSGllcmFyY2h5KHJlc3BvbnNlLl9yZXNwb25zZS5wYXJzZWRCb2R5KSB9KSwgc2VnbWVudDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZS5zZWdtZW50KSwgeyBibG9iSXRlbXM6IHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zLm1hcCgoYmxvYkl0ZW1JbnRlcmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9iSXRlbSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmxvYkl0ZW1JbnRlcmFsKSwgeyBuYW1lOiBCbG9iTmFtZVRvU3RyaW5nKGJsb2JJdGVtSW50ZXJhbC5uYW1lKSwgdGFnczogdG9UYWdzKGJsb2JJdGVtSW50ZXJhbC5ibG9iVGFncyksIG9iamVjdFJlcGxpY2F0aW9uU291cmNlUHJvcGVydGllczogcGFyc2VPYmplY3RSZXBsaWNhdGlvblJlY29yZChibG9iSXRlbUludGVyYWwub2JqZWN0UmVwbGljYXRpb25NZXRhZGF0YSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvYkl0ZW07XG4gICAgICAgICAgICAgICAgICAgIH0pLCBibG9iUHJlZml4ZXM6IChfYSA9IHJlc3BvbnNlLnNlZ21lbnQuYmxvYlByZWZpeGVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKChibG9iUHJlZml4SW50ZXJuYWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2JQcmVmaXggPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2JQcmVmaXhJbnRlcm5hbCksIHsgbmFtZTogQmxvYk5hbWVUb1N0cmluZyhibG9iUHJlZml4SW50ZXJuYWwubmFtZSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvYlByZWZpeDtcbiAgICAgICAgICAgICAgICAgICAgfSkgfSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlZFJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudFJlc3BvbnNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIGJsb2JzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgQ29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgYmxvYnMgcmVtYWluaW5nIHRvIGJlIGxpc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGJsb2JzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0U2VnbWVudHMobWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFNlZ21lbnRzXzEoKSB7XG4gICAgICAgICAgICBsZXQgbGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZSA9IHlpZWxkIF9fYXdhaXQodGhpcy5saXN0QmxvYkZsYXRTZWdtZW50KG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlLmNvbnRpbnVhdGlvblRva2VuO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KHlpZWxkIF9fYXdhaXQobGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG1hcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBvZiB7QGxpbmsgQmxvYkl0ZW19IG9iamVjdHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGJsb2JzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0SXRlbXMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RJdGVtc18xKCkge1xuICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICBsZXQgbWFya2VyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fYXN5bmNWYWx1ZXModGhpcy5saXN0U2VnbWVudHMobWFya2VyLCBvcHRpb25zKSksIF9jOyBfYyA9IHlpZWxkIF9fYXdhaXQoX2IubmV4dCgpKSwgIV9jLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RCbG9ic0ZsYXRTZWdtZW50UmVzcG9uc2UgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKGxpc3RCbG9ic0ZsYXRTZWdtZW50UmVzcG9uc2Uuc2VnbWVudC5ibG9iSXRlbXMpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSB5aWVsZCBfX2F3YWl0KF9hLmNhbGwoX2IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IGFsbCB0aGUgYmxvYnNcbiAgICAgKiB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnQuXG4gICAgICpcbiAgICAgKiAuYnlQYWdlKCkgcmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IHRoZSBibG9icyBpbiBwYWdlcy5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGZvciBhd2FpdGAgc3ludGF4OlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBHZXQgdGhlIGNvbnRhaW5lckNsaWVudCBiZWZvcmUgeW91IHJ1biB0aGVzZSBzbmlwcGV0cyxcbiAgICAgKiAvLyBDYW4gYmUgb2J0YWluZWQgZnJvbSBgYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPHlvdXItY29udGFpbmVyLW5hbWU+XCIpO2BcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCBibG9iIG9mIGNvbnRhaW5lckNsaWVudC5saXN0QmxvYnNGbGF0KCkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgaXRlci5uZXh0KClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXIgPSBjb250YWluZXJDbGllbnQubGlzdEJsb2JzRmxhdCgpO1xuICAgICAqIGxldCBibG9iSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghYmxvYkl0ZW0uZG9uZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2JJdGVtLnZhbHVlLm5hbWV9YCk7XG4gICAgICogICBibG9iSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFzc2luZyBvcHRpb25hbCBtYXhQYWdlU2l6ZSBpbiB0aGUgcGFnZSBzZXR0aW5nc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIGNvbnRhaW5lckNsaWVudC5saXN0QmxvYnNGbGF0KCkuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIwIH0pKSB7XG4gICAgICogICBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2Uuc2VnbWVudC5ibG9iSXRlbXMpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIHBhZ2luZyB3aXRoIGEgbWFya2VyOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXJhdG9yID0gY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0ZsYXQoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KTtcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAyIGJsb2IgbmFtZXNcbiAgICAgKiBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2Uuc2VnbWVudC5ibG9iSXRlbXMpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKlxuICAgICAqIC8vIFBhc3NpbmcgbmV4dCBtYXJrZXIgYXMgY29udGludWF0aW9uVG9rZW5cbiAgICAgKlxuICAgICAqIGl0ZXJhdG9yID0gY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0ZsYXQoKS5ieVBhZ2UoeyBjb250aW51YXRpb25Ub2tlbjogbWFya2VyLCBtYXhQYWdlU2l6ZTogMTAgfSk7XG4gICAgICogcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAxMCBibG9iIG5hbWVzXG4gICAgICogZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGJsb2JzLlxuICAgICAqIEByZXR1cm5zIEFuIGFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHN1cHBvcnRzIHBhZ2luZy5cbiAgICAgKi9cbiAgICBsaXN0QmxvYnNGbGF0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBpbmNsdWRlID0gW107XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVDb3B5KSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJjb3B5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVEZWxldGVkKSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJkZWxldGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibWV0YWRhdGFcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVNuYXBzaG90cykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwic25hcHNob3RzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVWZXJzaW9ucykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidmVyc2lvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVVuY29tbWl0ZWRCbG9icykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidW5jb21taXR0ZWRibG9ic1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVGFncykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidGFnc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVsZXRlZFdpdGhWZXJzaW9ucykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiZGVsZXRlZHdpdGh2ZXJzaW9uc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlSW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJpbW11dGFiaWxpdHlwb2xpY3lcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUxlZ2FsSG9sZCkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibGVnYWxob2xkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgb3B0aW9ucy5wcmVmaXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCAoaW5jbHVkZS5sZW5ndGggPiAwID8geyBpbmNsdWRlOiBpbmNsdWRlIH0gOiB7fSkpO1xuICAgICAgICAvLyBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIGJsb2JzXG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmxpc3RJdGVtcyh1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0U2VnbWVudHMoc2V0dGluZ3MuY29udGludWF0aW9uVG9rZW4sIE9iamVjdC5hc3NpZ24oeyBtYXhQYWdlU2l6ZTogc2V0dGluZ3MubWF4UGFnZVNpemUgfSwgdXBkYXRlZE9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBDb250YWluZXJMaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIGRlbGltaXRlciAtIFRoZSBjaGFyYWN0ZXIgb3Igc3RyaW5nIHVzZWQgdG8gZGVmaW5lIHRoZSB2aXJ0dWFsIGhpZXJhcmNoeVxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYmxvYnMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBibG9icyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIENvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGxpc3QgYmxvYnMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RIaWVyYXJjaHlTZWdtZW50cyhkZWxpbWl0ZXIsIG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RIaWVyYXJjaHlTZWdtZW50c18xKCkge1xuICAgICAgICAgICAgbGV0IGxpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlID0geWllbGQgX19hd2FpdCh0aGlzLmxpc3RCbG9iSGllcmFyY2h5U2VnbWVudChkZWxpbWl0ZXIsIG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdChsaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgZm9yIHtAbGluayBCbG9iUHJlZml4fSBhbmQge0BsaW5rIEJsb2JJdGVtfSBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlbGltaXRlciAtIFRoZSBjaGFyYWN0ZXIgb3Igc3RyaW5nIHVzZWQgdG8gZGVmaW5lIHRoZSB2aXJ0dWFsIGhpZXJhcmNoeVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGJsb2JzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0SXRlbXNCeUhpZXJhcmNoeShkZWxpbWl0ZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBsaXN0SXRlbXNCeUhpZXJhcmNoeV8xKCkge1xuICAgICAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgICAgICBsZXQgbWFya2VyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fYXN5bmNWYWx1ZXModGhpcy5saXN0SGllcmFyY2h5U2VnbWVudHMoZGVsaW1pdGVyLCBtYXJrZXIsIG9wdGlvbnMpKSwgX2M7IF9jID0geWllbGQgX19hd2FpdChfYi5uZXh0KCkpLCAhX2MuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBsaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2Uuc2VnbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuYmxvYlByZWZpeGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBzZWdtZW50LmJsb2JQcmVmaXhlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoT2JqZWN0LmFzc2lnbih7IGtpbmQ6IFwicHJlZml4XCIgfSwgcHJlZml4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBibG9iIG9mIHNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KE9iamVjdC5hc3NpZ24oeyBraW5kOiBcImJsb2JcIiB9LCBibG9iKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIHlpZWxkIF9fYXdhaXQoX2EuY2FsbChfYikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3QgYWxsIHRoZSBibG9icyBieSBoaWVyYXJjaHkuXG4gICAgICogdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50LlxuICAgICAqXG4gICAgICogLmJ5UGFnZSgpIHJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCB0aGUgYmxvYnMgYnkgaGllcmFyY2h5IGluIHBhZ2VzLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgZm9yIGF3YWl0YCBzeW50YXg6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBjb250YWluZXJDbGllbnQubGlzdEJsb2JzQnlIaWVyYXJjaHkoXCIvXCIpKSB7XG4gICAgICogICBpZiAoaXRlbS5raW5kID09PSBcInByZWZpeFwiKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iUHJlZml4OiAke2l0ZW0ubmFtZX1gKTtcbiAgICAgKiAgIH0gZWxzZSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iSXRlbTogbmFtZSAtICR7aXRlbS5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGl0ZXIgPSBjb250YWluZXJDbGllbnQubGlzdEJsb2JzQnlIaWVyYXJjaHkoXCIvXCIsIHsgcHJlZml4OiBcInByZWZpeDEvXCIgfSk7XG4gICAgICogbGV0IGVudGl0eSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghZW50aXR5LmRvbmUpIHtcbiAgICAgKiAgIGxldCBpdGVtID0gZW50aXR5LnZhbHVlO1xuICAgICAqICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJwcmVmaXhcIikge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYlByZWZpeDogJHtpdGVtLm5hbWV9YCk7XG4gICAgICogICB9IGVsc2Uge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYkl0ZW06IG5hbWUgLSAke2l0ZW0ubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiAgIGVudGl0eSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2coXCJMaXN0aW5nIGJsb2JzIGJ5IGhpZXJhcmNoeSBieSBwYWdlXCIpO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcmVzcG9uc2Ugb2YgY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0J5SGllcmFyY2h5KFwiL1wiKS5ieVBhZ2UoKSkge1xuICAgICAqICAgY29uc3Qgc2VnbWVudCA9IHJlc3BvbnNlLnNlZ21lbnQ7XG4gICAgICogICBpZiAoc2VnbWVudC5ibG9iUHJlZml4ZXMpIHtcbiAgICAgKiAgICAgZm9yIChjb25zdCBwcmVmaXggb2Ygc2VnbWVudC5ibG9iUHJlZml4ZXMpIHtcbiAgICAgKiAgICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYlByZWZpeDogJHtwcmVmaXgubmFtZX1gKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iSXRlbTogbmFtZSAtICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcGFnaW5nIHdpdGggYSBtYXggcGFnZSBzaXplOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zb2xlLmxvZyhcIkxpc3RpbmcgYmxvYnMgYnkgaGllcmFyY2h5IGJ5IHBhZ2UsIHNwZWNpZnlpbmcgYSBwcmVmaXggYW5kIGEgbWF4IHBhZ2Ugc2l6ZVwiKTtcbiAgICAgKlxuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIGNvbnRhaW5lckNsaWVudFxuICAgICAqICAgLmxpc3RCbG9ic0J5SGllcmFyY2h5KFwiL1wiLCB7IHByZWZpeDogXCJwcmVmaXgyL3N1YjEvXCIgfSlcbiAgICAgKiAgIC5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgJHtpKyt9YCk7XG4gICAgICogICBjb25zdCBzZWdtZW50ID0gcmVzcG9uc2Uuc2VnbWVudDtcbiAgICAgKlxuICAgICAqICAgaWYgKHNlZ21lbnQuYmxvYlByZWZpeGVzKSB7XG4gICAgICogICAgIGZvciAoY29uc3QgcHJlZml4IG9mIHNlZ21lbnQuYmxvYlByZWZpeGVzKSB7XG4gICAgICogICAgICAgY29uc29sZS5sb2coYFxcdEJsb2JQcmVmaXg6ICR7cHJlZml4Lm5hbWV9YCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iSXRlbTogbmFtZSAtICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWxpbWl0ZXIgLSBUaGUgY2hhcmFjdGVyIG9yIHN0cmluZyB1c2VkIHRvIGRlZmluZSB0aGUgdmlydHVhbCBoaWVyYXJjaHlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBibG9icyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgbGlzdEJsb2JzQnlIaWVyYXJjaHkoZGVsaW1pdGVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKGRlbGltaXRlciA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJkZWxpbWl0ZXIgc2hvdWxkIGNvbnRhaW4gb25lIG9yIG1vcmUgY2hhcmFjdGVyc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmNsdWRlID0gW107XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVDb3B5KSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJjb3B5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVEZWxldGVkKSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJkZWxldGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibWV0YWRhdGFcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVNuYXBzaG90cykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwic25hcHNob3RzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVWZXJzaW9ucykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidmVyc2lvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVVuY29tbWl0ZWRCbG9icykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidW5jb21taXR0ZWRibG9ic1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVGFncykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidGFnc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVsZXRlZFdpdGhWZXJzaW9ucykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiZGVsZXRlZHdpdGh2ZXJzaW9uc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlSW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJpbW11dGFiaWxpdHlwb2xpY3lcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUxlZ2FsSG9sZCkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibGVnYWxob2xkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgb3B0aW9ucy5wcmVmaXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCAoaW5jbHVkZS5sZW5ndGggPiAwID8geyBpbmNsdWRlOiBpbmNsdWRlIH0gOiB7fSkpO1xuICAgICAgICAvLyBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIGJsb2IgcHJlZml4ZXMgYW5kIGJsb2JzXG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmxpc3RJdGVtc0J5SGllcmFyY2h5KGRlbGltaXRlciwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBhc3luYyBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdEhpZXJhcmNoeVNlZ21lbnRzKGRlbGltaXRlciwgc2V0dGluZ3MuY29udGludWF0aW9uVG9rZW4sIE9iamVjdC5hc3NpZ24oeyBtYXhQYWdlU2l6ZTogc2V0dGluZ3MubWF4UGFnZVNpemUgfSwgdXBkYXRlZE9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBGaWx0ZXIgQmxvYnMgb3BlcmF0aW9uIGVuYWJsZXMgY2FsbGVycyB0byBsaXN0IGJsb2JzIGluIHRoZSBjb250YWluZXIgd2hvc2UgdGFnc1xuICAgICAqIG1hdGNoIGEgZ2l2ZW4gc2VhcmNoIGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtIFRoZSB3aGVyZSBwYXJhbWV0ZXIgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIHF1ZXJ5IGJsb2JzIHdob3NlIHRhZ3MgbWF0Y2ggYSBnaXZlbiBleHByZXNzaW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93ZXZlciwgb25seSBhIHN1YnNldCBvZiB0aGUgT0RhdGEgZmlsdGVyIHN5bnRheCBpcyBzdXBwb3J0ZWQgaW4gdGhlIEJsb2Igc2VydmljZS5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIGJsb2JzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgYmxvYnMgcmVtYWluaW5nIHRvIGJlIGxpc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBmaW5kIGJsb2JzIGJ5IHRhZ3MuXG4gICAgICovXG4gICAgYXN5bmMgZmluZEJsb2JzQnlUYWdzU2VnbWVudCh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWZpbmRCbG9ic0J5VGFnc1NlZ21lbnRcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udGFpbmVyQ29udGV4dC5maWx0ZXJCbG9icyhPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIHdoZXJlOiB0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG1heFBhZ2VTaXplOiBvcHRpb25zLm1heFBhZ2VTaXplIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkUmVzcG9uc2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlKSwgeyBfcmVzcG9uc2U6IHJlc3BvbnNlLl9yZXNwb25zZSwgYmxvYnM6IHJlc3BvbnNlLmJsb2JzLm1hcCgoYmxvYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdWYWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoKF9hID0gYmxvYi50YWdzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmxvYlRhZ1NldC5sZW5ndGgpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdWYWx1ZSA9IGJsb2IudGFncy5ibG9iVGFnU2V0WzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2IpLCB7IHRhZ3M6IHRvVGFncyhibG9iLnRhZ3MpLCB0YWdWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB9KSB9KTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBDb250YWluZXJGaW5kQmxvYnNCeVRhZ3NTZWdtZW50UmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtICBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byB0cnVlIGZvciBhIGJsb2IgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBibG9icyB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Rpbmcgb3BlcmF0aW9uLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIHJldHVybnMgdGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIHdpdGhpbiB0aGUgcmVzcG9uc2UgYm9keSBpZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGluZyBvcGVyYXRpb24gZGlkIG5vdCByZXR1cm4gYWxsIGJsb2JzIHJlbWFpbmluZyB0byBiZSBsaXN0ZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBwYWdlLiBUaGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy4gVGhlIG1hcmtlciB2YWx1ZSBpcyBvcGFxdWUgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gZmluZCBibG9icyBieSB0YWdzLlxuICAgICAqL1xuICAgIGZpbmRCbG9ic0J5VGFnc1NlZ21lbnRzKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGZpbmRCbG9ic0J5VGFnc1NlZ21lbnRzXzEoKSB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAoISFtYXJrZXIgfHwgbWFya2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgX19hd2FpdCh0aGlzLmZpbmRCbG9ic0J5VGFnc1NlZ21lbnQodGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJsb2JzID0gcmVzcG9uc2UuYmxvYnMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IHJlc3BvbnNlLmNvbnRpbnVhdGlvblRva2VuO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgZm9yIGJsb2JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSAgVGhlIHdoZXJlIHBhcmFtZXRlciBlbmFibGVzIHRoZSBjYWxsZXIgdG8gcXVlcnkgYmxvYnMgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBPRGF0YSBmaWx0ZXIgc3ludGF4IGlzIHN1cHBvcnRlZCBpbiB0aGUgQmxvYiBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBmaW5kQmxvYnNCeVRhZ3NJdGVtcy5cbiAgICAgKi9cbiAgICBmaW5kQmxvYnNCeVRhZ3NJdGVtcyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogZmluZEJsb2JzQnlUYWdzSXRlbXNfMSgpIHtcbiAgICAgICAgICAgIHZhciBlXzMsIF9hO1xuICAgICAgICAgICAgbGV0IG1hcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX2FzeW5jVmFsdWVzKHRoaXMuZmluZEJsb2JzQnlUYWdzU2VnbWVudHModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zKSksIF9jOyBfYyA9IHlpZWxkIF9fYXdhaXQoX2IubmV4dCgpKSwgIV9jLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHNlZ21lbnQuYmxvYnMpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSB5aWVsZCBfX2F3YWl0KF9hLmNhbGwoX2IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBmaW5kIGFsbCBibG9icyB3aXRoIHNwZWNpZmllZCB0YWdcbiAgICAgKiB1bmRlciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIC5ieVBhZ2UoKSByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3QgdGhlIGJsb2JzIGluIHBhZ2VzLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgZm9yIGF3YWl0YCBzeW50YXg6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IGJsb2Igb2YgY29udGFpbmVyQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGNvbnN0IGl0ZXIgPSBjb250YWluZXJDbGllbnQuZmluZEJsb2JzQnlUYWdzKFwidGFna2V5PSd0YWd2YWx1ZSdcIik7XG4gICAgICogbGV0IGJsb2JJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogd2hpbGUgKCFibG9iSXRlbS5kb25lKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYkl0ZW0udmFsdWUubmFtZX1gKTtcbiAgICAgKiAgIGJsb2JJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgYnlQYWdlKClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYXNzaW5nIG9wdGlvbmFsIG1heFBhZ2VTaXplIGluIHRoZSBwYWdlIHNldHRpbmdzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcmVzcG9uc2Ugb2YgY29udGFpbmVyQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyMCB9KSkge1xuICAgICAqICAgaWYgKHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIHBhZ2luZyB3aXRoIGEgbWFya2VyOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXJhdG9yID0gY29udGFpbmVyQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyIH0pO1xuICAgICAqIGxldCByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDIgYmxvYiBuYW1lc1xuICAgICAqIGlmIChyZXNwb25zZS5ibG9icykge1xuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKiAvLyBQYXNzaW5nIG5leHQgbWFya2VyIGFzIGNvbnRpbnVhdGlvblRva2VuXG4gICAgICogaXRlcmF0b3IgPSBjb250YWluZXJDbGllbnRcbiAgICAgKiAgIC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKVxuICAgICAqICAgLmJ5UGFnZSh7IGNvbnRpbnVhdGlvblRva2VuOiBtYXJrZXIsIG1heFBhZ2VTaXplOiAxMCB9KTtcbiAgICAgKiByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIGJsb2IgbmFtZXNcbiAgICAgKiBpZiAocmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtICBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byB0cnVlIGZvciBhIGJsb2IgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmQgYmxvYnMgYnkgdGFncy5cbiAgICAgKi9cbiAgICBmaW5kQmxvYnNCeVRhZ3ModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBpdGVyYXRlIG92ZXIgYmxvYnNcbiAgICAgICAgY29uc3QgbGlzdFNlZ21lbnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmZpbmRCbG9ic0J5VGFnc0l0ZW1zKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIGxpc3RTZWdtZW50T3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kQmxvYnNCeVRhZ3NTZWdtZW50cyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBzZXR0aW5ncy5jb250aW51YXRpb25Ub2tlbiwgT2JqZWN0LmFzc2lnbih7IG1heFBhZ2VTaXplOiBzZXR0aW5ncy5tYXhQYWdlU2l6ZSB9LCBsaXN0U2VnbWVudE9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldENvbnRhaW5lck5hbWVGcm9tVXJsKCkge1xuICAgICAgICBsZXQgY29udGFpbmVyTmFtZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vICBVUkwgbWF5IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nXG4gICAgICAgICAgICAvLyBcImh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lcj9zYXNTdHJpbmdcIjtcbiAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyXCI7XG4gICAgICAgICAgICAvLyBJUHY0L0lQdjYgYWRkcmVzcyBob3N0cywgRW5kcG9pbnRzIC0gYGh0dHA6Ly8xMjcuMC4wLjE6MTAwMDAvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lYFxuICAgICAgICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdDoxMDAwMS9kZXZzdG9yZWFjY291bnQxL2NvbnRhaW5lcm5hbWVcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IFVSTEJ1aWxkZXIucGFyc2UodGhpcy51cmwpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZFVybC5nZXRIb3N0KCkuc3BsaXQoXCIuXCIpWzFdID09PSBcImJsb2JcIikge1xuICAgICAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2NvbnRhaW5lcm5hbWVcIi5cbiAgICAgICAgICAgICAgICAvLyBcImh0dHBzOi8vY3VzdG9tZG9tYWluLmNvbS9jb250YWluZXJuYW1lXCIuXG4gICAgICAgICAgICAgICAgLy8gLmdldFBhdGgoKSAtPiAvY29udGFpbmVybmFtZVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lck5hbWUgPSBwYXJzZWRVcmwuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzSXBFbmRwb2ludFN0eWxlKHBhcnNlZFVybCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJUHY0L0lQdjYgYWRkcmVzcyBob3N0cy4uLiBFeGFtcGxlIC0gaHR0cDovLzE5Mi4wLjAuMTA6MTAwMDEvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lXG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlIHdvcmQgZG9tYWluIHdpdGhvdXQgYSBbZG90XSBpbiB0aGUgZW5kcG9pbnQuLi4gRXhhbXBsZSAtIGh0dHA6Ly9sb2NhbGhvc3Q6MTAwMDEvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lXG4gICAgICAgICAgICAgICAgLy8gLmdldFBhdGgoKSAtPiAvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTmFtZSA9IHBhcnNlZFVybC5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gXCJodHRwczovL2N1c3RvbWRvbWFpbi5jb20vY29udGFpbmVybmFtZVwiLlxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2NvbnRhaW5lcm5hbWVcbiAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lID0gcGFyc2VkVXJsLmdldFBhdGgoKS5zcGxpdChcIi9cIilbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkZWNvZGUgdGhlIGVuY29kZWQgY29udGFpbmVyTmFtZSAtIHRvIGdldCBhbGwgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIHByZXNlbnQgaW4gaXRcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSk7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBjb250YWluZXJOYW1lIGlzIGludmFsaWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZXh0cmFjdCBjb250YWluZXJOYW1lIHdpdGggcHJvdmlkZWQgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBDb250YWluZXJDbGllbnQgY29uc3RydWN0ZWQgd2l0aCBhIHNoYXJlZCBrZXkgY3JlZGVudGlhbC5cbiAgICAgKlxuICAgICAqIEdlbmVyYXRlcyBhIEJsb2IgQ29udGFpbmVyIFNlcnZpY2UgU2hhcmVkIEFjY2VzcyBTaWduYXR1cmUgKFNBUykgVVJJIGJhc2VkIG9uIHRoZSBjbGllbnQgcHJvcGVydGllc1xuICAgICAqIGFuZCBwYXJhbWV0ZXJzIHBhc3NlZCBpbi4gVGhlIFNBUyBpcyBzaWduZWQgYnkgdGhlIHNoYXJlZCBrZXkgY3JlZGVudGlhbCBvZiB0aGUgY2xpZW50LlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29uc3RydWN0aW5nLWEtc2VydmljZS1zYXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJucyBUaGUgU0FTIFVSSSBjb25zaXN0aW5nIG9mIHRoZSBVUkkgdG8gdGhlIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xpZW50LCBmb2xsb3dlZCBieSB0aGUgZ2VuZXJhdGVkIFNBUyB0b2tlbi5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVNhc1VybChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCEodGhpcy5jcmVkZW50aWFsIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4gb25seSBnZW5lcmF0ZSB0aGUgU0FTIHdoZW4gdGhlIGNsaWVudCBpcyBpbml0aWFsaXplZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2FzID0gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzKE9iamVjdC5hc3NpZ24oeyBjb250YWluZXJOYW1lOiB0aGlzLl9jb250YWluZXJOYW1lIH0sIG9wdGlvbnMpLCB0aGlzLmNyZWRlbnRpYWwpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICByZXNvbHZlKGFwcGVuZFRvVVJMUXVlcnkodGhpcy51cmwsIHNhcykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEJsb2JCYXRjaENsaWVudCBvYmplY3QgdG8gY29uZHVjdCBiYXRjaCBvcGVyYXRpb25zLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYmxvYi1iYXRjaFxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBuZXcgQmxvYkJhdGNoQ2xpZW50IG9iamVjdCBmb3IgdGhpcyBjb250YWluZXIuXG4gICAgICovXG4gICAgZ2V0QmxvYkJhdGNoQ2xpZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JCYXRjaENsaWVudCh0aGlzLnVybCwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udGFpbmVyQ2xpZW50LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IGFuIEFjY291bnRTQVMuIFNldHRpbmcgYSB2YWx1ZVxuICogdG8gdHJ1ZSBtZWFucyB0aGF0IGFueSBTQVMgd2hpY2ggdXNlcyB0aGVzZSBwZXJtaXNzaW9ucyB3aWxsIGdyYW50IHBlcm1pc3Npb25zIGZvciB0aGF0IG9wZXJhdGlvbi4gT25jZSBhbGwgdGhlXG4gKiB2YWx1ZXMgYXJlIHNldCwgdGhpcyBzaG91bGQgYmUgc2VyaWFsaXplZCB3aXRoIHRvU3RyaW5nIGFuZCBzZXQgYXMgdGhlIHBlcm1pc3Npb25zIGZpZWxkIG9uIGFuXG4gKiB7QGxpbmsgQWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlc30gb2JqZWN0LiBJdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhlIHBlcm1pc3Npb25zIHN0cmluZyB3aXRob3V0IHRoaXMgY2xhc3MsIGJ1dFxuICogdGhlIG9yZGVyIG9mIHRoZSBwZXJtaXNzaW9ucyBpcyBwYXJ0aWN1bGFyIGFuZCB0aGlzIGNsYXNzIGd1YXJhbnRlZXMgY29ycmVjdG5lc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY2NvdW50U0FTUGVybWlzc2lvbnMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byByZWFkIHJlc291cmNlcyBhbmQgbGlzdCBxdWV1ZXMgYW5kIHRhYmxlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWFkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIHdyaXRlIHJlc291cmNlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53cml0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBjcmVhdGUgYmxvYnMgYW5kIGZpbGVzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGV0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBkZWxldGUgdmVyc2lvbnMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVsZXRlVmVyc2lvbiA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBsaXN0IGJsb2IgY29udGFpbmVycywgYmxvYnMsIHNoYXJlcywgZGlyZWN0b3JpZXMsIGFuZCBmaWxlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saXN0ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGFkZCBtZXNzYWdlcywgdGFibGUgZW50aXRpZXMsIGFuZCBhcHBlbmQgdG8gYmxvYnMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGNyZWF0ZSBibG9icyBhbmQgZmlsZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9ucyB0byB1cGRhdGUgbWVzc2FnZXMgYW5kIHRhYmxlIGVudGl0aWVzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBnZXQgYW5kIGRlbGV0ZSBtZXNzYWdlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjZmllcyBUYWcgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhZyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBmaWx0ZXIgYmxvYnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlciA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBzZXQgaW1tdXRhYmlsaXR5IHBvbGljeS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCBQZXJtYW5lbnQgRGVsZXRlIGlzIHBlcm1pdHRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGVybWFuZW50RGVsZXRlID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlIGluaXRpYWxpemVzIHRoZSBBY2NvdW50U0FTUGVybWlzc2lvbnMgZmllbGRzIGZyb20gYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbnMgLVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShwZXJtaXNzaW9ucykge1xuICAgICAgICBjb25zdCBhY2NvdW50U0FTUGVybWlzc2lvbnMgPSBuZXcgQWNjb3VudFNBU1Blcm1pc3Npb25zKCk7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnJlYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwid1wiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMud3JpdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuZGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibFwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMubGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5hZGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY1wiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuY3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5wcm9jZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5maWx0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiaVwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnBlcm1hbmVudERlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHBlcm1pc3Npb24gY2hhcmFjdGVyOiAke2N9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY291bnRTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBBY2NvdW50U0FTUGVybWlzc2lvbnN9IGZyb20gYSByYXcgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHNhbWUga2V5cyBhcyBpdFxuICAgICAqIGFuZCBib29sZWFuIHZhbHVlcyBmb3IgdGhlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uTGlrZSAtXG4gICAgICovXG4gICAgc3RhdGljIGZyb20ocGVybWlzc2lvbkxpa2UpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudFNBU1Blcm1pc3Npb25zID0gbmV3IEFjY291bnRTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucmVhZCkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnJlYWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS53cml0ZSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLndyaXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZGVsZXRlKSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuZGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZGVsZXRlVmVyc2lvbikge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5maWx0ZXIpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5maWx0ZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS50YWcpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5saXN0KSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMubGlzdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmFkZCkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmFkZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmNyZWF0ZSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmNyZWF0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnVwZGF0ZSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnVwZGF0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnByb2Nlc3MpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5wcm9jZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2Uuc2V0SW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucGVybWFuZW50RGVsZXRlKSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMucGVybWFuZW50RGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjb3VudFNBU1Blcm1pc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0aGUgU0FTIHBlcm1pc3Npb25zIHN0cmluZyBmb3IgYW4gQXp1cmUgU3RvcmFnZSBhY2NvdW50LlxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgdG8gc2V0IEFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMgUGVybWlzc2lvbnMgZmllbGQuXG4gICAgICpcbiAgICAgKiBVc2luZyB0aGlzIG1ldGhvZCB3aWxsIGd1YXJhbnRlZSB0aGUgcmVzb3VyY2UgdHlwZXMgYXJlIGluXG4gICAgICogYW4gb3JkZXIgYWNjZXB0ZWQgYnkgdGhlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYW4tYWNjb3VudC1zYXNcbiAgICAgKlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAvLyBUaGUgb3JkZXIgb2YgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGFzIHNwZWNpZmllZCBoZXJlIHRvIGVuc3VyZSBjb3JyZWN0bmVzczpcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvbnN0cnVjdGluZy1hbi1hY2NvdW50LXNhc1xuICAgICAgICAvLyBVc2UgYSBzdHJpbmcgYXJyYXkgaW5zdGVhZCBvZiBzdHJpbmcgY29uY2F0ZW5hdGluZyArPSBvcGVyYXRvciBmb3IgcGVyZm9ybWFuY2VcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMucmVhZCkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud3JpdGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ3XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlVmVyc2lvbikge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInhcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50YWcpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3QpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFkZCkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImFcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3JlYXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiY1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51cGRhdGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ1XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3MpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJwXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNldEltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImlcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGVybWFuZW50RGVsZXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwieVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGVybWlzc2lvbnMuam9pbihcIlwiKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY2NvdW50U0FTUGVybWlzc2lvbnMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGNvbnN0cnVjdCBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlcyBhY2Nlc3NpYmxlIGJ5IGFuIEFjY291bnRTQVMuIFNldHRpbmcgYSB2YWx1ZVxuICogdG8gdHJ1ZSBtZWFucyB0aGF0IGFueSBTQVMgd2hpY2ggdXNlcyB0aGVzZSBwZXJtaXNzaW9ucyB3aWxsIGdyYW50IGFjY2VzcyB0byB0aGF0IHJlc291cmNlIHR5cGUuIE9uY2UgYWxsIHRoZVxuICogdmFsdWVzIGFyZSBzZXQsIHRoaXMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgd2l0aCB0b1N0cmluZyBhbmQgc2V0IGFzIHRoZSByZXNvdXJjZXMgZmllbGQgb24gYW5cbiAqIHtAbGluayBBY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzfSBvYmplY3QuIEl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGUgcmVzb3VyY2VzIHN0cmluZyB3aXRob3V0IHRoaXMgY2xhc3MsIGJ1dFxuICogdGhlIG9yZGVyIG9mIHRoZSByZXNvdXJjZXMgaXMgcGFydGljdWxhciBhbmQgdGhpcyBjbGFzcyBndWFyYW50ZWVzIGNvcnJlY3RuZXNzLlxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFNBU1Jlc291cmNlVHlwZXMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhY2Nlc3Mgc2VydmljZSBsZXZlbCBBUElzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gYWNjZXNzIGNvbnRhaW5lciBsZXZlbCBBUElzIChCbG9iIENvbnRhaW5lcnMsIFRhYmxlcywgUXVldWVzLCBGaWxlIFNoYXJlcykgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGFjY2VzcyBvYmplY3QgbGV2ZWwgQVBJcyAoQmxvYnMsIFRhYmxlIEVudGl0aWVzLCBRdWV1ZSBNZXNzYWdlcywgRmlsZXMpIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9iamVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBY2NvdW50U0FTUmVzb3VyY2VUeXBlc30gZnJvbSB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGVzIHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhblxuICAgICAqIEVycm9yIGlmIGl0IGVuY291bnRlcnMgYSBjaGFyYWN0ZXIgdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgdmFsaWQgcmVzb3VyY2UgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXNvdXJjZVR5cGVzIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2UocmVzb3VyY2VUeXBlcykge1xuICAgICAgICBjb25zdCBhY2NvdW50U0FTUmVzb3VyY2VUeXBlcyA9IG5ldyBBY2NvdW50U0FTUmVzb3VyY2VUeXBlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgcmVzb3VyY2VUeXBlcykge1xuICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Jlc291cmNlVHlwZXMuc2VydmljZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNSZXNvdXJjZVR5cGVzLmNvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNSZXNvdXJjZVR5cGVzLm9iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHJlc291cmNlIHR5cGU6ICR7Y31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjb3VudFNBU1Jlc291cmNlVHlwZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiByZXNvdXJjZSB0eXBlcyB0byBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvbnN0cnVjdGluZy1hbi1hY2NvdW50LXNhc1xuICAgICAqXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlVHlwZXMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuc2VydmljZSkge1xuICAgICAgICAgICAgcmVzb3VyY2VUeXBlcy5wdXNoKFwic1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIHJlc291cmNlVHlwZXMucHVzaChcImNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2JqZWN0KSB7XG4gICAgICAgICAgICByZXNvdXJjZVR5cGVzLnB1c2goXCJvXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvdXJjZVR5cGVzLmpvaW4oXCJcIik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWNjb3VudFNBU1Jlc291cmNlVHlwZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGNvbnN0cnVjdCBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgYW4gQWNjb3VudFNBUy4gU2V0dGluZyBhIHZhbHVlXG4gKiB0byB0cnVlIG1lYW5zIHRoYXQgYW55IFNBUyB3aGljaCB1c2VzIHRoZXNlIHBlcm1pc3Npb25zIHdpbGwgZ3JhbnQgYWNjZXNzIHRvIHRoYXQgc2VydmljZS4gT25jZSBhbGwgdGhlXG4gKiB2YWx1ZXMgYXJlIHNldCwgdGhpcyBzaG91bGQgYmUgc2VyaWFsaXplZCB3aXRoIHRvU3RyaW5nIGFuZCBzZXQgYXMgdGhlIHNlcnZpY2VzIGZpZWxkIG9uIGFuXG4gKiB7QGxpbmsgQWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlc30gb2JqZWN0LiBJdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhlIHNlcnZpY2VzIHN0cmluZyB3aXRob3V0IHRoaXMgY2xhc3MsIGJ1dFxuICogdGhlIG9yZGVyIG9mIHRoZSBzZXJ2aWNlcyBpcyBwYXJ0aWN1bGFyIGFuZCB0aGlzIGNsYXNzIGd1YXJhbnRlZXMgY29ycmVjdG5lc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY2NvdW50U0FTU2VydmljZXMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhY2Nlc3MgYmxvYiByZXNvdXJjZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvYiA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhY2Nlc3MgZmlsZSByZXNvdXJjZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlsZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhY2Nlc3MgcXVldWUgcmVzb3VyY2VzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnF1ZXVlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGFjY2VzcyB0YWJsZSByZXNvdXJjZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQWNjb3VudFNBU1NlcnZpY2VzfSBmcm9tIHRoZSBzcGVjaWZpZWQgc2VydmljZXMgc3RyaW5nLiBUaGlzIG1ldGhvZCB3aWxsIHRocm93IGFuXG4gICAgICogRXJyb3IgaWYgaXQgZW5jb3VudGVycyBhIGNoYXJhY3RlciB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSB2YWxpZCBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZpY2VzIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2Uoc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudFNBU1NlcnZpY2VzID0gbmV3IEFjY291bnRTQVNTZXJ2aWNlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNTZXJ2aWNlcy5ibG9iID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImZcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1NlcnZpY2VzLmZpbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTU2VydmljZXMucXVldWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidFwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTU2VydmljZXMudGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBzZXJ2aWNlIGNoYXJhY3RlcjogJHtjfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2NvdW50U0FTU2VydmljZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBzZXJ2aWNlcyB0byBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5ibG9iKSB7XG4gICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKFwiYlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50YWJsZSkge1xuICAgICAgICAgICAgc2VydmljZXMucHVzaChcInRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVldWUpIHtcbiAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goXCJxXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbGUpIHtcbiAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goXCJmXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJ2aWNlcy5qb2luKFwiXCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjY291bnRTQVNTZXJ2aWNlcy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbmltcG9ydCB7IEFjY291bnRTQVNQZXJtaXNzaW9ucyB9IGZyb20gXCIuL0FjY291bnRTQVNQZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgQWNjb3VudFNBU1Jlc291cmNlVHlwZXMgfSBmcm9tIFwiLi9BY2NvdW50U0FTUmVzb3VyY2VUeXBlc1wiO1xuaW1wb3J0IHsgQWNjb3VudFNBU1NlcnZpY2VzIH0gZnJvbSBcIi4vQWNjb3VudFNBU1NlcnZpY2VzXCI7XG5pbXBvcnQgeyBpcFJhbmdlVG9TdHJpbmcgfSBmcm9tIFwiLi9TYXNJUFJhbmdlXCI7XG5pbXBvcnQgeyBTQVNRdWVyeVBhcmFtZXRlcnMgfSBmcm9tIFwiLi9TQVNRdWVyeVBhcmFtZXRlcnNcIjtcbmltcG9ydCB7IFNFUlZJQ0VfVkVSU0lPTiB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHRydW5jYXRlZElTTzgwNjFEYXRlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogR2VuZXJhdGVzIGEge0BsaW5rIFNBU1F1ZXJ5UGFyYW1ldGVyc30gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFsbCBTQVMgcXVlcnkgcGFyYW1ldGVycyBuZWVkZWQgdG8gbWFrZSBhbiBhY3R1YWxcbiAqIFJFU1QgcmVxdWVzdC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYW4tYWNjb3VudC1zYXNcbiAqXG4gKiBAcGFyYW0gYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcyAtXG4gKiBAcGFyYW0gc2hhcmVkS2V5Q3JlZGVudGlhbCAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnMoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCkge1xuICAgIGNvbnN0IHZlcnNpb24gPSBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25cbiAgICAgICAgPyBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25cbiAgICAgICAgOiBTRVJWSUNFX1ZFUlNJT047XG4gICAgaWYgKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5zZXRJbW11dGFiaWxpdHlQb2xpY3kgJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAyMC0wOC0wNFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAyMC0wOC0wNCcgd2hlbiBwcm92aWRlZCAnaScgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMuZGVsZXRlVmVyc2lvbiAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDE5LTEwLTEwXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEwLTEwJyB3aGVuIHByb3ZpZGVkICd4JyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAxOS0xMC0xMFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOS0xMC0xMCcgd2hlbiBwcm92aWRlZCAneScgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudGFnICYmXG4gICAgICAgIHZlcnNpb24gPCBcIjIwMTktMTItMTJcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTktMTItMTInIHdoZW4gcHJvdmlkZWQgJ3QnIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLmZpbHRlciAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDE5LTEyLTEyXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEyLTEyJyB3aGVuIHByb3ZpZGVkICdmJyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlICYmIHZlcnNpb24gPCBcIjIwMjAtMTItMDZcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMjAtMTItMDYnIHdoZW4gcHJvdmlkZWQgJ2VuY3J5cHRpb25TY29wZScgaW4gU0FTLlwiKTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkUGVybWlzc2lvbnMgPSBBY2NvdW50U0FTUGVybWlzc2lvbnMucGFyc2UoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKTtcbiAgICBjb25zdCBwYXJzZWRTZXJ2aWNlcyA9IEFjY291bnRTQVNTZXJ2aWNlcy5wYXJzZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnNlcnZpY2VzKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHBhcnNlZFJlc291cmNlVHlwZXMgPSBBY2NvdW50U0FTUmVzb3VyY2VUeXBlcy5wYXJzZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnJlc291cmNlVHlwZXMpLnRvU3RyaW5nKCk7XG4gICAgbGV0IHN0cmluZ1RvU2lnbjtcbiAgICBpZiAodmVyc2lvbiA+PSBcIjIwMjAtMTItMDZcIikge1xuICAgICAgICBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgICAgICBzaGFyZWRLZXlDcmVkZW50aWFsLmFjY291bnROYW1lLFxuICAgICAgICAgICAgcGFyc2VkUGVybWlzc2lvbnMsXG4gICAgICAgICAgICBwYXJzZWRTZXJ2aWNlcyxcbiAgICAgICAgICAgIHBhcnNlZFJlc291cmNlVHlwZXMsXG4gICAgICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgICAgICB0cnVuY2F0ZWRJU084MDYxRGF0ZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSkgOiBcIlwiLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlID8gYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5lbmNyeXB0aW9uU2NvcGUgOiBcIlwiLFxuICAgICAgICAgICAgXCJcIiwgLy8gQWNjb3VudCBTQVMgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBuZXdsaW5lIGNoYXJhY3RlclxuICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgICAgICBzaGFyZWRLZXlDcmVkZW50aWFsLmFjY291bnROYW1lLFxuICAgICAgICAgICAgcGFyc2VkUGVybWlzc2lvbnMsXG4gICAgICAgICAgICBwYXJzZWRTZXJ2aWNlcyxcbiAgICAgICAgICAgIHBhcnNlZFJlc291cmNlVHlwZXMsXG4gICAgICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgICAgICB0cnVuY2F0ZWRJU084MDYxRGF0ZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSkgOiBcIlwiLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgIFwiXCIsIC8vIEFjY291bnQgU0FTIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgbmV3bGluZSBjaGFyYWN0ZXJcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmUgPSBzaGFyZWRLZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIG5ldyBTQVNRdWVyeVBhcmFtZXRlcnModmVyc2lvbiwgc2lnbmF0dXJlLCBwYXJzZWRQZXJtaXNzaW9ucy50b1N0cmluZygpLCBwYXJzZWRTZXJ2aWNlcywgcGFyc2VkUmVzb3VyY2VUeXBlcywgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCwgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmpzLm1hcCIsImltcG9ydCB7IF9fYXN5bmNEZWxlZ2F0b3IsIF9fYXN5bmNHZW5lcmF0b3IsIF9fYXN5bmNWYWx1ZXMsIF9fYXdhaXQgfSBmcm9tIFwidHNsaWJcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgaXNUb2tlbkNyZWRlbnRpYWwsIGlzTm9kZSwgZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MsIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmltcG9ydCB7IFNwYW5TdGF0dXNDb2RlIH0gZnJvbSBcIkBhenVyZS9jb3JlLXRyYWNpbmdcIjtcbmltcG9ydCB7IENvbnRhaW5lciwgU2VydmljZSB9IGZyb20gXCIuL2dlbmVyYXRlZC9zcmMvb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgbmV3UGlwZWxpbmUsIGlzUGlwZWxpbmVMaWtlIH0gZnJvbSBcIi4vUGlwZWxpbmVcIjtcbmltcG9ydCB7IENvbnRhaW5lckNsaWVudCwgfSBmcm9tIFwiLi9Db250YWluZXJDbGllbnRcIjtcbmltcG9ydCB7IGFwcGVuZFRvVVJMUGF0aCwgYXBwZW5kVG9VUkxRdWVyeSwgZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0cywgdG9UYWdzLCB9IGZyb20gXCIuL3V0aWxzL3V0aWxzLmNvbW1vblwiO1xuaW1wb3J0IHsgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfSBmcm9tIFwiLi9jcmVkZW50aWFscy9TdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFwiO1xuaW1wb3J0IHsgQW5vbnltb3VzQ3JlZGVudGlhbCB9IGZyb20gXCIuL2NyZWRlbnRpYWxzL0Fub255bW91c0NyZWRlbnRpYWxcIjtcbmltcG9ydCBcIkBhenVyZS9jb3JlLXBhZ2luZ1wiO1xuaW1wb3J0IHsgdHJ1bmNhdGVkSVNPODA2MURhdGUgfSBmcm9tIFwiLi91dGlscy91dGlscy5jb21tb25cIjtcbmltcG9ydCB7IGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UsIGNyZWF0ZVNwYW4gfSBmcm9tIFwiLi91dGlscy90cmFjaW5nXCI7XG5pbXBvcnQgeyBCbG9iQmF0Y2hDbGllbnQgfSBmcm9tIFwiLi9CbG9iQmF0Y2hDbGllbnRcIjtcbmltcG9ydCB7IFN0b3JhZ2VDbGllbnQgfSBmcm9tIFwiLi9TdG9yYWdlQ2xpZW50XCI7XG5pbXBvcnQgeyBBY2NvdW50U0FTUGVybWlzc2lvbnMgfSBmcm9tIFwiLi9zYXMvQWNjb3VudFNBU1Blcm1pc3Npb25zXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnMgfSBmcm9tIFwiLi9zYXMvQWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlc1wiO1xuaW1wb3J0IHsgQWNjb3VudFNBU1NlcnZpY2VzIH0gZnJvbSBcIi4vc2FzL0FjY291bnRTQVNTZXJ2aWNlc1wiO1xuLyoqXG4gKiBBIEJsb2JTZXJ2aWNlQ2xpZW50IHJlcHJlc2VudHMgYSBDbGllbnQgdG8gdGhlIEF6dXJlIFN0b3JhZ2UgQmxvYiBzZXJ2aWNlIGFsbG93aW5nIHlvdVxuICogdG8gbWFuaXB1bGF0ZSBibG9iIGNvbnRhaW5lcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9iU2VydmljZUNsaWVudCBleHRlbmRzIFN0b3JhZ2VDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVybCwgY3JlZGVudGlhbE9yUGlwZWxpbmUsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBpZiAoaXNQaXBlbGluZUxpa2UoY3JlZGVudGlhbE9yUGlwZWxpbmUpKSB7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChpc05vZGUgJiYgY3JlZGVudGlhbE9yUGlwZWxpbmUgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxPclBpcGVsaW5lIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yUGlwZWxpbmUpKSB7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKGNyZWRlbnRpYWxPclBpcGVsaW5lLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4gVXNlIGFub255bW91cyBjcmVkZW50aWFsXG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHVybCwgcGlwZWxpbmUpO1xuICAgICAgICB0aGlzLnNlcnZpY2VDb250ZXh0ID0gbmV3IFNlcnZpY2UodGhpcy5zdG9yYWdlQ2xpZW50Q29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCbG9iU2VydmljZUNsaWVudCBmcm9tIGNvbm5lY3Rpb24gc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb25TdHJpbmcgLSBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIG9yIGEgU0FTIGNvbm5lY3Rpb24gc3RyaW5nIG9mIGFuIEF6dXJlIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIE5vdGUgLSBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIGNhbiBvbmx5IGJlIHVzZWQgaW4gTk9ERS5KUyBydW50aW1lLiBdXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBleGFtcGxlIC1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRGVmYXVsdEVuZHBvaW50c1Byb3RvY29sPWh0dHBzO0FjY291bnROYW1lPW15YWNjb3VudDtBY2NvdW50S2V5PWFjY291bnRLZXk7RW5kcG9pbnRTdWZmaXg9Y29yZS53aW5kb3dzLm5ldGBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQVMgY29ubmVjdGlvbiBzdHJpbmcgZXhhbXBsZSAtXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJsb2JFbmRwb2ludD1odHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvO1F1ZXVlRW5kcG9pbnQ9aHR0cHM6Ly9teWFjY291bnQucXVldWUuY29yZS53aW5kb3dzLm5ldC87RmlsZUVuZHBvaW50PWh0dHBzOi8vbXlhY2NvdW50LmZpbGUuY29yZS53aW5kb3dzLm5ldC87VGFibGVFbmRwb2ludD1odHRwczovL215YWNjb3VudC50YWJsZS5jb3JlLndpbmRvd3MubmV0LztTaGFyZWRBY2Nlc3NTaWduYXR1cmU9c2FzU3RyaW5nYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwuIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBIVFRQIHBpcGVsaW5lLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQ29ubmVjdGlvblN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCBleHRyYWN0ZWRDcmVkcyA9IGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHMoY29ubmVjdGlvblN0cmluZyk7XG4gICAgICAgIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIkFjY291bnRDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRLZXlDcmVkZW50aWFsID0gbmV3IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKGV4dHJhY3RlZENyZWRzLmFjY291bnROYW1lLCBleHRyYWN0ZWRDcmVkcy5hY2NvdW50S2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucHJveHlPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveHlPcHRpb25zID0gZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MoZXh0cmFjdGVkQ3JlZHMucHJveHlVcmkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKHNoYXJlZEtleUNyZWRlbnRpYWwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYlNlcnZpY2VDbGllbnQoZXh0cmFjdGVkQ3JlZHMudXJsLCBwaXBlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuanMgZW52aXJvbm1lbnRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJTQVNDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2JTZXJ2aWNlQ2xpZW50KGV4dHJhY3RlZENyZWRzLnVybCArIFwiP1wiICsgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudFNhcywgcGlwZWxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgYW4gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIENvbnRhaW5lckNsaWVudH0gb2JqZWN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSAtIEEgY29udGFpbmVyIG5hbWVcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBDb250YWluZXJDbGllbnQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyIG5hbWUuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb250YWluZXJDbGllbnQgPSBibG9iU2VydmljZUNsaWVudC5nZXRDb250YWluZXJDbGllbnQoXCI8Y29udGFpbmVyIG5hbWU+XCIpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldENvbnRhaW5lckNsaWVudChjb250YWluZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udGFpbmVyQ2xpZW50KGFwcGVuZFRvVVJMUGF0aCh0aGlzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIEJsb2IgY29udGFpbmVyLiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jcmVhdGUtY29udGFpbmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSAtIE5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byBjcmVhdGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBDb250YWluZXIgQ3JlYXRlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBDb250YWluZXIgY3JlYXRpb24gcmVzcG9uc2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRhaW5lciBjbGllbnQuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lck5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtY3JlYXRlQ29udGFpbmVyXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2xpZW50ID0gdGhpcy5nZXRDb250YWluZXJDbGllbnQoY29udGFpbmVyTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJDcmVhdGVSZXNwb25zZSA9IGF3YWl0IGNvbnRhaW5lckNsaWVudC5jcmVhdGUodXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJDbGllbnQsXG4gICAgICAgICAgICAgICAgY29udGFpbmVyQ3JlYXRlUmVzcG9uc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGEgQmxvYiBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSAtIE5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byBkZWxldGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBDb250YWluZXIgRGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBDb250YWluZXIgZGVsZXRpb24gcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlQ29udGFpbmVyKGNvbnRhaW5lck5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtZGVsZXRlQ29udGFpbmVyXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2xpZW50ID0gdGhpcy5nZXRDb250YWluZXJDbGllbnQoY29udGFpbmVyTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY29udGFpbmVyQ2xpZW50LmRlbGV0ZSh1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc3RvcmUgYSBwcmV2aW91c2x5IGRlbGV0ZWQgQmxvYiBjb250YWluZXIuXG4gICAgICogVGhpcyBBUEkgaXMgb25seSBmdW5jdGlvbmFsIGlmIENvbnRhaW5lciBTb2Z0IERlbGV0ZSBpcyBlbmFibGVkIGZvciB0aGUgc3RvcmFnZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlbGV0ZWRDb250YWluZXJOYW1lIC0gTmFtZSBvZiB0aGUgcHJldmlvdXNseSBkZWxldGVkIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gZGVsZXRlZENvbnRhaW5lclZlcnNpb24gLSBWZXJzaW9uIG9mIHRoZSBwcmV2aW91c2x5IGRlbGV0ZWQgY29udGFpbmVyLCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkZWxldGVkIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gY29uZmlndXJlIENvbnRhaW5lciBSZXN0b3JlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBDb250YWluZXIgZGVsZXRpb24gcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgdW5kZWxldGVDb250YWluZXIoZGVsZXRlZENvbnRhaW5lck5hbWUsIGRlbGV0ZWRDb250YWluZXJWZXJzaW9uLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LXVuZGVsZXRlQ29udGFpbmVyXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2xpZW50ID0gdGhpcy5nZXRDb250YWluZXJDbGllbnQob3B0aW9ucy5kZXN0aW5hdGlvbkNvbnRhaW5lck5hbWUgfHwgZGVsZXRlZENvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgLy8gSGFjayB0byBhY2Nlc3MgYSBwcm90ZWN0ZWQgbWVtYmVyLlxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ29udGV4dCA9IG5ldyBDb250YWluZXIoY29udGFpbmVyQ2xpZW50W1wic3RvcmFnZUNsaWVudENvbnRleHRcIl0pO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyVW5kZWxldGVSZXNwb25zZSA9IGF3YWl0IGNvbnRhaW5lckNvbnRleHQucmVzdG9yZShPYmplY3QuYXNzaWduKHsgZGVsZXRlZENvbnRhaW5lck5hbWUsXG4gICAgICAgICAgICAgICAgZGVsZXRlZENvbnRhaW5lclZlcnNpb24gfSwgdXBkYXRlZE9wdGlvbnMpKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbnRhaW5lckNsaWVudCwgY29udGFpbmVyVW5kZWxldGVSZXNwb25zZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW5hbWUgYW4gZXhpc3RpbmcgQmxvYiBDb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc291cmNlQ29udGFpbmVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkNvbnRhaW5lck5hbWUgLSBUaGUgbmV3IG5hbWUgb2YgdGhlIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gY29uZmlndXJlIENvbnRhaW5lciBSZW5hbWUgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbiAgICAvLyBAdHMtaWdub3JlIE5lZWQgdG8gaGlkZSB0aGlzIGludGVyZmFjZSBmb3Igbm93LiBNYWtlIGl0IHB1YmxpYyBhbmQgdHVybiBvbiB0aGUgbGl2ZSB0ZXN0cyBmb3IgaXQgd2hlbiB0aGUgc2VydmljZSBpcyByZWFkeS5cbiAgICBhc3luYyByZW5hbWVDb250YWluZXIoc291cmNlQ29udGFpbmVyTmFtZSwgZGVzdGluYXRpb25Db250YWluZXJOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtcmVuYW1lQ29udGFpbmVyXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2xpZW50ID0gdGhpcy5nZXRDb250YWluZXJDbGllbnQoZGVzdGluYXRpb25Db250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIC8vIEhhY2sgdG8gYWNjZXNzIGEgcHJvdGVjdGVkIG1lbWJlci5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNvbnRleHQgPSBuZXcgQ29udGFpbmVyKGNvbnRhaW5lckNsaWVudFtcInN0b3JhZ2VDbGllbnRDb250ZXh0XCJdKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlbmFtZVJlc3BvbnNlID0gYXdhaXQgY29udGFpbmVyQ29udGV4dC5yZW5hbWUoc291cmNlQ29udGFpbmVyTmFtZSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB1cGRhdGVkT3B0aW9ucyksIHsgc291cmNlTGVhc2VJZDogKF9hID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZWFzZUlkIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbnRhaW5lckNsaWVudCwgY29udGFpbmVyUmVuYW1lUmVzcG9uc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydGllcyBvZiBhIHN0b3JhZ2UgYWNjb3VudOKAmXMgQmxvYiBzZXJ2aWNlLCBpbmNsdWRpbmcgcHJvcGVydGllc1xuICAgICAqIGZvciBTdG9yYWdlIEFuYWx5dGljcyBhbmQgQ09SUyAoQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcpIHJ1bGVzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1ibG9iLXNlcnZpY2UtcHJvcGVydGllc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBTZXJ2aWNlIEdldCBQcm9wZXJ0aWVzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgU2VydmljZSBHZXQgUHJvcGVydGllcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UHJvcGVydGllcyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWdldFByb3BlcnRpZXNcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0aWVzKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHByb3BlcnRpZXMgZm9yIGEgc3RvcmFnZSBhY2NvdW504oCZcyBCbG9iIHNlcnZpY2UgZW5kcG9pbnQsIGluY2x1ZGluZyBwcm9wZXJ0aWVzXG4gICAgICogZm9yIFN0b3JhZ2UgQW5hbHl0aWNzLCBDT1JTIChDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZykgcnVsZXMgYW5kIHNvZnQgZGVsZXRlIHNldHRpbmdzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NldC1ibG9iLXNlcnZpY2UtcHJvcGVydGllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgU2VydmljZSBTZXQgUHJvcGVydGllcyBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFNlcnZpY2UgU2V0IFByb3BlcnRpZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHNldFByb3BlcnRpZXMocHJvcGVydGllcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1zZXRQcm9wZXJ0aWVzXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZUNvbnRleHQuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzLCBPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHN0YXRpc3RpY3MgcmVsYXRlZCB0byByZXBsaWNhdGlvbiBmb3IgdGhlIEJsb2Igc2VydmljZS4gSXQgaXMgb25seVxuICAgICAqIGF2YWlsYWJsZSBvbiB0aGUgc2Vjb25kYXJ5IGxvY2F0aW9uIGVuZHBvaW50IHdoZW4gcmVhZC1hY2Nlc3MgZ2VvLXJlZHVuZGFudFxuICAgICAqIHJlcGxpY2F0aW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBzdG9yYWdlIGFjY291bnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWJsb2Itc2VydmljZS1zdGF0c1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBTZXJ2aWNlIEdldCBTdGF0aXN0aWNzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgU2VydmljZSBHZXQgU3RhdGlzdGljcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0U3RhdGlzdGljcyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWdldFN0YXRpc3RpY3NcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5nZXRTdGF0aXN0aWNzKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgR2V0IEFjY291bnQgSW5mb3JtYXRpb24gb3BlcmF0aW9uIHJldHVybnMgdGhlIHNrdSBuYW1lIGFuZCBhY2NvdW50IGtpbmRcbiAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBhY2NvdW50LlxuICAgICAqIFRoZSBHZXQgQWNjb3VudCBJbmZvcm1hdGlvbiBvcGVyYXRpb24gaXMgYXZhaWxhYmxlIG9uIHNlcnZpY2UgdmVyc2lvbnMgYmVnaW5uaW5nXG4gICAgICogd2l0aCB2ZXJzaW9uIDIwMTgtMDMtMjguXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWFjY291bnQtaW5mb3JtYXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgU2VydmljZSBHZXQgQWNjb3VudCBJbmZvIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgU2VydmljZSBHZXQgQWNjb3VudCBJbmZvIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRBY2NvdW50SW5mbyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gY3JlYXRlU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWdldEFjY291bnRJbmZvXCIsIG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZUNvbnRleHQuZ2V0QWNjb3VudEluZm8oT2JqZWN0LmFzc2lnbih7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBjb250YWluZXJzIHVuZGVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9saXN0LWNvbnRhaW5lcnMyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBjb250YWluZXJzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIHJldHVybnMgdGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIHdpdGhpbiB0aGUgcmVzcG9uc2UgYm9keSBpZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBjb250YWluZXJzIHJlbWFpbmluZyB0byBiZSBsaXN0ZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy4gVGhlIG1hcmtlciB2YWx1ZSBpcyBvcGFxdWUgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFNlcnZpY2UgTGlzdCBDb250YWluZXIgU2VnbWVudCBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFNlcnZpY2UgTGlzdCBDb250YWluZXIgU2VnbWVudCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgbGlzdENvbnRhaW5lcnNTZWdtZW50KG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1saXN0Q29udGFpbmVyc1NlZ21lbnRcIiwgb3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5saXN0Q29udGFpbmVyc1NlZ21lbnQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbWFya2VyIH0sIG9wdGlvbnMpLCB7IGluY2x1ZGU6IHR5cGVvZiBvcHRpb25zLmluY2x1ZGUgPT09IFwic3RyaW5nXCIgPyBbb3B0aW9ucy5pbmNsdWRlXSA6IG9wdGlvbnMuaW5jbHVkZSB9KSwgY29udmVydFRyYWNpbmdUb1JlcXVlc3RPcHRpb25zQmFzZSh1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEZpbHRlciBCbG9icyBvcGVyYXRpb24gZW5hYmxlcyBjYWxsZXJzIHRvIGxpc3QgYmxvYnMgYWNyb3NzIGFsbCBjb250YWluZXJzIHdob3NlIHRhZ3NcbiAgICAgKiBtYXRjaCBhIGdpdmVuIHNlYXJjaCBleHByZXNzaW9uLiBGaWx0ZXIgYmxvYnMgc2VhcmNoZXMgYWNyb3NzIGFsbCBjb250YWluZXJzIHdpdGhpbiBhXG4gICAgICogc3RvcmFnZSBhY2NvdW50IGJ1dCBjYW4gYmUgc2NvcGVkIHdpdGhpbiB0aGUgZXhwcmVzc2lvbiB0byBhIHNpbmdsZSBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtIFRoZSB3aGVyZSBwYXJhbWV0ZXIgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIHF1ZXJ5IGJsb2JzIHdob3NlIHRhZ3MgbWF0Y2ggYSBnaXZlbiBleHByZXNzaW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93ZXZlciwgb25seSBhIHN1YnNldCBvZiB0aGUgT0RhdGEgZmlsdGVyIHN5bnRheCBpcyBzdXBwb3J0ZWQgaW4gdGhlIEJsb2Igc2VydmljZS5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIGJsb2JzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgYmxvYnMgcmVtYWluaW5nIHRvIGJlIGxpc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBmaW5kIGJsb2JzIGJ5IHRhZ3MuXG4gICAgICovXG4gICAgYXN5bmMgZmluZEJsb2JzQnlUYWdzU2VnbWVudCh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNwYW4sIHVwZGF0ZWRPcHRpb25zIH0gPSBjcmVhdGVTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtZmluZEJsb2JzQnlUYWdzU2VnbWVudFwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5maWx0ZXJCbG9icyhPYmplY3QuYXNzaWduKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsIHdoZXJlOiB0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG1heFBhZ2VTaXplOiBvcHRpb25zLm1heFBhZ2VTaXplIH0sIGNvbnZlcnRUcmFjaW5nVG9SZXF1ZXN0T3B0aW9uc0Jhc2UodXBkYXRlZE9wdGlvbnMpKSk7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkUmVzcG9uc2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlKSwgeyBfcmVzcG9uc2U6IHJlc3BvbnNlLl9yZXNwb25zZSwgYmxvYnM6IHJlc3BvbnNlLmJsb2JzLm1hcCgoYmxvYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdWYWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoKF9hID0gYmxvYi50YWdzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmxvYlRhZ1NldC5sZW5ndGgpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdWYWx1ZSA9IGJsb2IudGFncy5ibG9iVGFnU2V0WzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2IpLCB7IHRhZ3M6IHRvVGFncyhibG9iLnRhZ3MpLCB0YWdWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB9KSB9KTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBTZXJ2aWNlRmluZEJsb2JzQnlUYWdzU2VnbWVudFJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSAgVGhlIHdoZXJlIHBhcmFtZXRlciBlbmFibGVzIHRoZSBjYWxsZXIgdG8gcXVlcnkgYmxvYnMgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBPRGF0YSBmaWx0ZXIgc3ludGF4IGlzIHN1cHBvcnRlZCBpbiB0aGUgQmxvYiBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYmxvYnMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBibG9icyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmQgYmxvYnMgYnkgdGFncy5cbiAgICAgKi9cbiAgICBmaW5kQmxvYnNCeVRhZ3NTZWdtZW50cyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBmaW5kQmxvYnNCeVRhZ3NTZWdtZW50c18xKCkge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKCEhbWFya2VyIHx8IG1hcmtlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIF9fYXdhaXQodGhpcy5maW5kQmxvYnNCeVRhZ3NTZWdtZW50KHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ibG9icyA9IHJlc3BvbnNlLmJsb2JzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBibG9icy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWdGaWx0ZXJTcWxFeHByZXNzaW9uIC0gIFRoZSB3aGVyZSBwYXJhbWV0ZXIgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIHF1ZXJ5IGJsb2JzIHdob3NlIHRhZ3MgbWF0Y2ggYSBnaXZlbiBleHByZXNzaW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gZXhwcmVzc2lvbiBtdXN0IGV2YWx1YXRlIHRvIHRydWUgZm9yIGEgYmxvYiB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0cy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlW09EYXRhIC0gQUJORl0gZmlsdGVyIHN5bnRheCBydWxlIGRlZmluZXMgdGhlIGZvcm1hbCBncmFtbWFyIGZvciB0aGUgdmFsdWUgb2YgdGhlIHdoZXJlIHF1ZXJ5IHBhcmFtZXRlcjtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93ZXZlciwgb25seSBhIHN1YnNldCBvZiB0aGUgT0RhdGEgZmlsdGVyIHN5bnRheCBpcyBzdXBwb3J0ZWQgaW4gdGhlIEJsb2Igc2VydmljZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gZmluZEJsb2JzQnlUYWdzSXRlbXMuXG4gICAgICovXG4gICAgZmluZEJsb2JzQnlUYWdzSXRlbXModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGZpbmRCbG9ic0J5VGFnc0l0ZW1zXzEoKSB7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX19hc3luY1ZhbHVlcyh0aGlzLmZpbmRCbG9ic0J5VGFnc1NlZ21lbnRzKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG1hcmtlciwgb3B0aW9ucykpLCBfYzsgX2MgPSB5aWVsZCBfX2F3YWl0KF9iLm5leHQoKSksICFfYy5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyhzZWdtZW50LmJsb2JzKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgeWllbGQgX19hd2FpdChfYS5jYWxsKF9iKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gZmluZCBhbGwgYmxvYnMgd2l0aCBzcGVjaWZpZWQgdGFnXG4gICAgICogdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50LlxuICAgICAqXG4gICAgICogLmJ5UGFnZSgpIHJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCB0aGUgYmxvYnMgaW4gcGFnZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtYmxvYi1zZXJ2aWNlLXByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGZvciBhd2FpdGAgc3ludGF4OlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCBibG9iIG9mIGJsb2JTZXJ2aWNlQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7Y29udGFpbmVyLm5hbWV9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgaXRlci5uZXh0KClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogY29uc3QgaXRlciA9IGJsb2JTZXJ2aWNlQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpO1xuICAgICAqIGxldCBibG9iSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghYmxvYkl0ZW0uZG9uZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2JJdGVtLnZhbHVlLm5hbWV9YCk7XG4gICAgICogICBibG9iSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFzc2luZyBvcHRpb25hbCBtYXhQYWdlU2l6ZSBpbiB0aGUgcGFnZSBzZXR0aW5nc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIGJsb2JTZXJ2aWNlQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyMCB9KSkge1xuICAgICAqICAgaWYgKHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIHBhZ2luZyB3aXRoIGEgbWFya2VyOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXJhdG9yID0gYmxvYlNlcnZpY2VDbGllbnQuZmluZEJsb2JzQnlUYWdzKFwidGFna2V5PSd0YWd2YWx1ZSdcIikuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIgfSk7XG4gICAgICogbGV0IHJlc3BvbnNlID0gKGF3YWl0IGl0ZXJhdG9yLm5leHQoKSkudmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHMgMiBibG9iIG5hbWVzXG4gICAgICogaWYgKHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBHZXRzIG5leHQgbWFya2VyXG4gICAgICogbGV0IG1hcmtlciA9IHJlc3BvbnNlLmNvbnRpbnVhdGlvblRva2VuO1xuICAgICAqIC8vIFBhc3NpbmcgbmV4dCBtYXJrZXIgYXMgY29udGludWF0aW9uVG9rZW5cbiAgICAgKiBpdGVyYXRvciA9IGJsb2JTZXJ2aWNlQ2xpZW50XG4gICAgICogICAuZmluZEJsb2JzQnlUYWdzKFwidGFna2V5PSd0YWd2YWx1ZSdcIilcbiAgICAgKiAgIC5ieVBhZ2UoeyBjb250aW51YXRpb25Ub2tlbjogbWFya2VyLCBtYXhQYWdlU2l6ZTogMTAgfSk7XG4gICAgICogcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyBibG9iIG5hbWVzXG4gICAgICogaWYgKHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSAgVGhlIHdoZXJlIHBhcmFtZXRlciBlbmFibGVzIHRoZSBjYWxsZXIgdG8gcXVlcnkgYmxvYnMgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBPRGF0YSBmaWx0ZXIgc3ludGF4IGlzIHN1cHBvcnRlZCBpbiB0aGUgQmxvYiBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBmaW5kIGJsb2JzIGJ5IHRhZ3MuXG4gICAgICovXG4gICAgZmluZEJsb2JzQnlUYWdzKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIGJsb2JzXG4gICAgICAgIGNvbnN0IGxpc3RTZWdtZW50T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5maW5kQmxvYnNCeVRhZ3NJdGVtcyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBsaXN0U2VnbWVudE9wdGlvbnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEJsb2JzQnlUYWdzU2VnbWVudHModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgc2V0dGluZ3MuY29udGludWF0aW9uVG9rZW4sIE9iamVjdC5hc3NpZ24oeyBtYXhQYWdlU2l6ZTogc2V0dGluZ3MubWF4UGFnZVNpemUgfSwgbGlzdFNlZ21lbnRPcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgU2VydmljZUxpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlc1xuICAgICAqXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY29udGFpbmVycyB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Rpbmcgb3BlcmF0aW9uLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgY29udGFpbmVycyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGxpc3QgY29udGFpbmVycyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgbGlzdFNlZ21lbnRzKG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RTZWdtZW50c18xKCkge1xuICAgICAgICAgICAgbGV0IGxpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKCEhbWFya2VyIHx8IG1hcmtlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZSA9IHlpZWxkIF9fYXdhaXQodGhpcy5saXN0Q29udGFpbmVyc1NlZ21lbnQobWFya2VyLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlLmNvbnRhaW5lckl0ZW1zID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlLmNvbnRhaW5lckl0ZW1zIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdCh5aWVsZCBfX2F3YWl0KGxpc3RDb250YWluZXJzU2VnbWVudFJlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBDb250YWluZXIgSXRlbXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGNvbnRhaW5lcnMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RJdGVtcyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdEl0ZW1zXzEoKSB7XG4gICAgICAgICAgICB2YXIgZV8yLCBfYTtcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX19hc3luY1ZhbHVlcyh0aGlzLmxpc3RTZWdtZW50cyhtYXJrZXIsIG9wdGlvbnMpKSwgX2M7IF9jID0geWllbGQgX19hd2FpdChfYi5uZXh0KCkpLCAhX2MuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBfX2F3YWl0KHlpZWxkKiBfX2FzeW5jRGVsZWdhdG9yKF9fYXN5bmNWYWx1ZXMoc2VnbWVudC5jb250YWluZXJJdGVtcykpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIHlpZWxkIF9fYXdhaXQoX2EuY2FsbChfYikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3QgYWxsIHRoZSBjb250YWluZXJzXG4gICAgICogdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50LlxuICAgICAqXG4gICAgICogLmJ5UGFnZSgpIHJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCB0aGUgY29udGFpbmVycyBpbiBwYWdlcy5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGZvciBhd2FpdGAgc3ludGF4OlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCBjb250YWluZXIgb2YgYmxvYlNlcnZpY2VDbGllbnQubGlzdENvbnRhaW5lcnMoKSkge1xuICAgICAqICAgY29uc29sZS5sb2coYENvbnRhaW5lciAke2krK306ICR7Y29udGFpbmVyLm5hbWV9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgaXRlci5uZXh0KClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogY29uc3QgaXRlciA9IGJsb2JTZXJ2aWNlQ2xpZW50Lmxpc3RDb250YWluZXJzKCk7XG4gICAgICogbGV0IGNvbnRhaW5lckl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB3aGlsZSAoIWNvbnRhaW5lckl0ZW0uZG9uZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYENvbnRhaW5lciAke2krK306ICR7Y29udGFpbmVySXRlbS52YWx1ZS5uYW1lfWApO1xuICAgICAqICAgY29udGFpbmVySXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFzc2luZyBvcHRpb25hbCBtYXhQYWdlU2l6ZSBpbiB0aGUgcGFnZSBzZXR0aW5nc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIGJsb2JTZXJ2aWNlQ2xpZW50Lmxpc3RDb250YWluZXJzKCkuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIwIH0pKSB7XG4gICAgICogICBpZiAocmVzcG9uc2UuY29udGFpbmVySXRlbXMpIHtcbiAgICAgKiAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgcmVzcG9uc2UuY29udGFpbmVySXRlbXMpIHtcbiAgICAgKiAgICAgICBjb25zb2xlLmxvZyhgQ29udGFpbmVyICR7aSsrfTogJHtjb250YWluZXIubmFtZX1gKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcGFnaW5nIHdpdGggYSBtYXJrZXI6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlcmF0b3IgPSBibG9iU2VydmljZUNsaWVudC5saXN0Q29udGFpbmVycygpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyIH0pO1xuICAgICAqIGxldCByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDIgY29udGFpbmVyIG5hbWVzXG4gICAgICogaWYgKHJlc3BvbnNlLmNvbnRhaW5lckl0ZW1zKSB7XG4gICAgICogICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiByZXNwb25zZS5jb250YWluZXJJdGVtcykge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgQ29udGFpbmVyICR7aSsrfTogJHtjb250YWluZXIubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBHZXRzIG5leHQgbWFya2VyXG4gICAgICogbGV0IG1hcmtlciA9IHJlc3BvbnNlLmNvbnRpbnVhdGlvblRva2VuO1xuICAgICAqIC8vIFBhc3NpbmcgbmV4dCBtYXJrZXIgYXMgY29udGludWF0aW9uVG9rZW5cbiAgICAgKiBpdGVyYXRvciA9IGJsb2JTZXJ2aWNlQ2xpZW50XG4gICAgICogICAubGlzdENvbnRhaW5lcnMoKVxuICAgICAqICAgLmJ5UGFnZSh7IGNvbnRpbnVhdGlvblRva2VuOiBtYXJrZXIsIG1heFBhZ2VTaXplOiAxMCB9KTtcbiAgICAgKiByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDEwIGNvbnRhaW5lciBuYW1lc1xuICAgICAqIGlmIChyZXNwb25zZS5jb250YWluZXJJdGVtcykge1xuICAgICAqICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgcmVzcG9uc2UuY29udGFpbmVySXRlbXMpIHtcbiAgICAgKiAgICAgIGNvbnNvbGUubG9nKGBDb250YWluZXIgJHtpKyt9OiAke2NvbnRhaW5lci5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGNvbnRhaW5lcnMuXG4gICAgICogQHJldHVybnMgQW4gYXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgc3VwcG9ydHMgcGFnaW5nLlxuICAgICAqL1xuICAgIGxpc3RDb250YWluZXJzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJlZml4ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSBbXTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZURlbGV0ZWQpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcImRlbGV0ZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJtZXRhZGF0YVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlU3lzdGVtKSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJzeXN0ZW1cIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IGxpc3RTZWdtZW50T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIChpbmNsdWRlLmxlbmd0aCA+IDAgPyB7IGluY2x1ZGUgfSA6IHt9KSk7XG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmxpc3RJdGVtcyhsaXN0U2VnbWVudE9wdGlvbnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFNlZ21lbnRzKHNldHRpbmdzLmNvbnRpbnVhdGlvblRva2VuLCBPYmplY3QuYXNzaWduKHsgbWF4UGFnZVNpemU6IHNldHRpbmdzLm1heFBhZ2VTaXplIH0sIGxpc3RTZWdtZW50T3B0aW9ucykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT05MWSBBVkFJTEFCTEUgV0hFTiBVU0lORyBCRUFSRVIgVE9LRU4gQVVUSEVOVElDQVRJT04gKFRva2VuQ3JlZGVudGlhbCkuXG4gICAgICpcbiAgICAgKiBSZXRyaWV2ZXMgYSB1c2VyIGRlbGVnYXRpb24ga2V5IGZvciB0aGUgQmxvYiBzZXJ2aWNlLiBUaGlzIGlzIG9ubHkgYSB2YWxpZCBvcGVyYXRpb24gd2hlbiB1c2luZ1xuICAgICAqIGJlYXJlciB0b2tlbiBhdXRoZW50aWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC11c2VyLWRlbGVnYXRpb24ta2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhcnRzT24gLSAgICAgIFRoZSBzdGFydCB0aW1lIGZvciB0aGUgdXNlciBkZWxlZ2F0aW9uIFNBUy4gTXVzdCBiZSB3aXRoaW4gNyBkYXlzIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgKiBAcGFyYW0gZXhwaXJlc09uIC0gICAgIFRoZSBlbmQgdGltZSBmb3IgdGhlIHVzZXIgZGVsZWdhdGlvbiBTQVMuIE11c3QgYmUgd2l0aGluIDcgZGF5cyBvZiB0aGUgY3VycmVudCB0aW1lXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VXNlckRlbGVnYXRpb25LZXkoc3RhcnRzT24sIGV4cGlyZXNPbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IGNyZWF0ZVNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1nZXRVc2VyRGVsZWdhdGlvbktleVwiLCBvcHRpb25zKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5nZXRVc2VyRGVsZWdhdGlvbktleSh7XG4gICAgICAgICAgICAgICAgc3RhcnRzT246IHRydW5jYXRlZElTTzgwNjFEYXRlKHN0YXJ0c09uLCBmYWxzZSksXG4gICAgICAgICAgICAgICAgZXhwaXJlc09uOiB0cnVuY2F0ZWRJU084MDYxRGF0ZShleHBpcmVzT24sIGZhbHNlKSxcbiAgICAgICAgICAgIH0sIE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCBjb252ZXJ0VHJhY2luZ1RvUmVxdWVzdE9wdGlvbnNCYXNlKHVwZGF0ZWRPcHRpb25zKSkpO1xuICAgICAgICAgICAgY29uc3QgdXNlckRlbGVnYXRpb25LZXkgPSB7XG4gICAgICAgICAgICAgICAgc2lnbmVkT2JqZWN0SWQ6IHJlc3BvbnNlLnNpZ25lZE9iamVjdElkLFxuICAgICAgICAgICAgICAgIHNpZ25lZFRlbmFudElkOiByZXNwb25zZS5zaWduZWRUZW5hbnRJZCxcbiAgICAgICAgICAgICAgICBzaWduZWRTdGFydHNPbjogbmV3IERhdGUocmVzcG9uc2Uuc2lnbmVkU3RhcnRzT24pLFxuICAgICAgICAgICAgICAgIHNpZ25lZEV4cGlyZXNPbjogbmV3IERhdGUocmVzcG9uc2Uuc2lnbmVkRXhwaXJlc09uKSxcbiAgICAgICAgICAgICAgICBzaWduZWRTZXJ2aWNlOiByZXNwb25zZS5zaWduZWRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHNpZ25lZFZlcnNpb246IHJlc3BvbnNlLnNpZ25lZFZlcnNpb24sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlLnZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IE9iamVjdC5hc3NpZ24oeyBfcmVzcG9uc2U6IHJlc3BvbnNlLl9yZXNwb25zZSwgcmVxdWVzdElkOiByZXNwb25zZS5yZXF1ZXN0SWQsIGNsaWVudFJlcXVlc3RJZDogcmVzcG9uc2UuY2xpZW50UmVxdWVzdElkLCB2ZXJzaW9uOiByZXNwb25zZS52ZXJzaW9uLCBkYXRlOiByZXNwb25zZS5kYXRlLCBlcnJvckNvZGU6IHJlc3BvbnNlLmVycm9yQ29kZSB9LCB1c2VyRGVsZWdhdGlvbktleSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQmxvYkJhdGNoQ2xpZW50IG9iamVjdCB0byBjb25kdWN0IGJhdGNoIG9wZXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9ibG9iLWJhdGNoXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBCbG9iQmF0Y2hDbGllbnQgb2JqZWN0IGZvciB0aGlzIHNlcnZpY2UuXG4gICAgICovXG4gICAgZ2V0QmxvYkJhdGNoQ2xpZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JCYXRjaENsaWVudCh0aGlzLnVybCwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBCbG9iU2VydmljZUNsaWVudCBjb25zdHJ1Y3RlZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVzIGEgQmxvYiBhY2NvdW50IFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlIChTQVMpIFVSSSBiYXNlZCBvbiB0aGUgY2xpZW50IHByb3BlcnRpZXNcbiAgICAgKiBhbmQgcGFyYW1ldGVycyBwYXNzZWQgaW4uIFRoZSBTQVMgaXMgc2lnbmVkIGJ5IHRoZSBzaGFyZWQga2V5IGNyZWRlbnRpYWwgb2YgdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NyZWF0ZS1hY2NvdW50LXNhc1xuICAgICAqXG4gICAgICogQHBhcmFtIGV4cGlyZXNPbiAtIE9wdGlvbmFsLiBUaGUgdGltZSBhdCB3aGljaCB0aGUgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUgYmVjb21lcyBpbnZhbGlkLiBEZWZhdWx0IHRvIGFuIGhvdXIgbGF0ZXIgaWYgbm90IHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9ucyAtIFNwZWNpZmllcyB0aGUgbGlzdCBvZiBwZXJtaXNzaW9ucyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIFNBUy5cbiAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlcyAtIFNwZWNpZmllcyB0aGUgcmVzb3VyY2UgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybnMgQW4gYWNjb3VudCBTQVMgVVJJIGNvbnNpc3Rpbmcgb2YgdGhlIFVSSSB0byB0aGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGllbnQsIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmF0ZWQgU0FTIHRva2VuLlxuICAgICAqL1xuICAgIGdlbmVyYXRlQWNjb3VudFNhc1VybChleHBpcmVzT24sIHBlcm1pc3Npb25zID0gQWNjb3VudFNBU1Blcm1pc3Npb25zLnBhcnNlKFwiclwiKSwgcmVzb3VyY2VUeXBlcyA9IFwic2NvXCIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoISh0aGlzLmNyZWRlbnRpYWwgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkpIHtcbiAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJDYW4gb25seSBnZW5lcmF0ZSB0aGUgYWNjb3VudCBTQVMgd2hlbiB0aGUgY2xpZW50IGlzIGluaXRpYWxpemVkIHdpdGggYSBzaGFyZWQga2V5IGNyZWRlbnRpYWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGlyZXNPbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgZXhwaXJlc09uID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArIDM2MDAgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYXMgPSBnZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnMoT2JqZWN0LmFzc2lnbih7IHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgZXhwaXJlc09uLFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlcywgc2VydmljZXM6IEFjY291bnRTQVNTZXJ2aWNlcy5wYXJzZShcImJcIikudG9TdHJpbmcoKSB9LCBvcHRpb25zKSwgdGhpcy5jcmVkZW50aWFsKS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gYXBwZW5kVG9VUkxRdWVyeSh0aGlzLnVybCwgc2FzKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CbG9iU2VydmljZUNsaWVudC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8qKiBLbm93biB2YWx1ZXMgb2Yge0BsaW5rIEVuY3J5cHRpb25BbGdvcml0aG1UeXBlfSB0aGF0IHRoZSBzZXJ2aWNlIGFjY2VwdHMuICovXG5leHBvcnQgdmFyIEtub3duRW5jcnlwdGlvbkFsZ29yaXRobVR5cGU7XG4oZnVuY3Rpb24gKEtub3duRW5jcnlwdGlvbkFsZ29yaXRobVR5cGUpIHtcbiAgICBLbm93bkVuY3J5cHRpb25BbGdvcml0aG1UeXBlW1wiQUVTMjU2XCJdID0gXCJBRVMyNTZcIjtcbn0pKEtub3duRW5jcnlwdGlvbkFsZ29yaXRobVR5cGUgfHwgKEtub3duRW5jcnlwdGlvbkFsZ29yaXRobVR5cGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2VuZXJhdGVkTW9kZWxzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuaW1wb3J0IHsgUmVzdEVycm9yIH0gZnJvbSBcIkBhenVyZS9jb3JlLWh0dHBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Jsb2JTZXJ2aWNlQ2xpZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9DbGllbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Db250YWluZXJDbGllbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Jsb2JMZWFzZUNsaWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2FzL0FjY291bnRTQVNQZXJtaXNzaW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2FzL0FjY291bnRTQVNSZXNvdXJjZVR5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zYXMvQWNjb3VudFNBU1NlcnZpY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zYXMvQWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vQmxvYkJhdGNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9CbG9iQmF0Y2hDbGllbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0JhdGNoUmVzcG9uc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Nhcy9CbG9iU0FTUGVybWlzc2lvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Nhcy9CbG9iU0FTU2lnbmF0dXJlVmFsdWVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Nhcy9Db250YWluZXJTQVNQZXJtaXNzaW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY3JlZGVudGlhbHMvQW5vbnltb3VzQ3JlZGVudGlhbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY3JlZGVudGlhbHMvQ3JlZGVudGlhbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY3JlZGVudGlhbHMvU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcIjtcbmV4cG9ydCB7IEJsb2NrQmxvYlRpZXIsIFByZW1pdW1QYWdlQmxvYlRpZXIsIFN0b3JhZ2VCbG9iQXVkaWVuY2UsIGdldEJsb2JTZXJ2aWNlQWNjb3VudEF1ZGllbmNlLCB9IGZyb20gXCIuL21vZGVsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUGlwZWxpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BvbGljaWVzL0Fub255bW91c0NyZWRlbnRpYWxQb2xpY3lcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BvbGljaWVzL0NyZWRlbnRpYWxQb2xpY3lcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1N0b3JhZ2VSZXRyeVBvbGljeUZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BvbGljaWVzL1N0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zYXMvU0FTUXVlcnlQYXJhbWV0ZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZWRNb2RlbHNcIjtcbmV4cG9ydCB7IFJlc3RFcnJvciB9O1xuZXhwb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///58551\n')},81539:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n Octokit: () => (/* binding */ Octokit)\n});\n\n// EXTERNAL MODULE: ./node_modules/universal-user-agent/dist-web/index.js\nvar dist_web = __webpack_require__(56916);\n// EXTERNAL MODULE: ./node_modules/before-after-hook/index.js\nvar before_after_hook = __webpack_require__(80811);\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/lowercase-keys.js\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/is-plain-object.js\nfunction isPlainObject(value) {\n if (typeof value !== "object" || value === null)\n return false;\n if (Object.prototype.toString.call(value) !== "[object Object]")\n return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null)\n return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;\n return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/merge-deep.js\n\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if (isPlainObject(options[key])) {\n if (!(key in defaults))\n Object.assign(result, { [key]: options[key] });\n else\n result[key] = mergeDeep(defaults[key], options[key]);\n } else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/remove-undefined-properties.js\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === void 0) {\n delete obj[key];\n }\n }\n return obj;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/merge.js\n\n\n\nfunction merge(defaults, route, options) {\n if (typeof route === "string") {\n let [method, url] = route.split(" ");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n } else {\n options = Object.assign({}, route);\n }\n options.headers = lowercaseKeys(options.headers);\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n if (options.url === "/graphql") {\n if (defaults && defaults.mediaType.previews?.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(\n (preview) => !mergedOptions.mediaType.previews.includes(preview)\n ).concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, ""));\n }\n return mergedOptions;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/add-query-parameters.js\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? "&" : "?";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return url + separator + names.map((name) => {\n if (name === "q") {\n return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+");\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n }).join("&");\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/extract-url-variable-names.js\nconst urlVariableRegex = /\\{[^}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/^\\W+|\\W+$/g, "").split(/,/);\n}\nfunction extractUrlVariableNames(url) {\n const matches = url.match(urlVariableRegex);\n if (!matches) {\n return [];\n }\n return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/omit.js\nfunction omit(object, keysToOmit) {\n const result = { __proto__: null };\n for (const key of Object.keys(object)) {\n if (keysToOmit.indexOf(key) === -1) {\n result[key] = object[key];\n }\n }\n return result;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/util/url-template.js\nfunction encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");\n }\n return part;\n }).join("");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!\'()*]/g, function(c) {\n return "%" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + "=" + value;\n } else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== void 0 && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === ";" || operator === "&" || operator === "?";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== "") {\n if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {\n value = value.toString();\n if (modifier && modifier !== "*") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(\n encodeValue(operator, value, isKeyOperator(operator) ? key : "")\n );\n } else {\n if (modifier === "*") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n result.push(\n encodeValue(operator, value2, isKeyOperator(operator) ? key : "")\n );\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n tmp.push(encodeValue(operator, value2));\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + "=" + tmp.join(","));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(","));\n }\n }\n }\n } else {\n if (operator === ";") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === "" && (operator === "&" || operator === "?")) {\n result.push(encodeUnreserved(key) + "=");\n } else if (value === "") {\n result.push("");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template)\n };\n}\nfunction expand(template, context) {\n var operators = ["+", "#", ".", "/", ";", "?", "&"];\n template = template.replace(\n /\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g,\n function(_, expression, literal) {\n if (expression) {\n let operator = "";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function(variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== "+") {\n var separator = ",";\n if (operator === "?") {\n separator = "&";\n } else if (operator !== "#") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : "") + values.join(separator);\n } else {\n return values.join(",");\n }\n } else {\n return encodeReserved(literal);\n }\n }\n );\n if (template === "/") {\n return template;\n } else {\n return template.replace(/\\/$/, "");\n }\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/parse.js\n\n\n\n\nfunction parse(options) {\n let method = options.method.toUpperCase();\n let url = (options.url || "/").replace(/:([a-z]\\w+)/g, "{$1}");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n "method",\n "baseUrl",\n "url",\n "headers",\n "request",\n "mediaType"\n ]);\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n headers.accept = headers.accept.split(/,/).map(\n (format) => format.replace(\n /application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/,\n `application/vnd$1$2.${options.mediaType.format}`\n )\n ).join(",");\n }\n if (url.endsWith("/graphql")) {\n if (options.mediaType.previews?.length) {\n const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => {\n const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json";\n return `application/vnd.github.${preview}-preview${format}`;\n }).join(",");\n }\n }\n }\n if (["GET", "HEAD"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n } else {\n if ("data" in remainingParameters) {\n body = remainingParameters.data;\n } else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n }\n }\n if (!headers["content-type"] && typeof body !== "undefined") {\n headers["content-type"] = "application/json; charset=utf-8";\n }\n if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {\n body = "";\n }\n return Object.assign(\n { method, url, headers },\n typeof body !== "undefined" ? { body } : null,\n options.request ? { request: options.request } : null\n );\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/endpoint-with-defaults.js\n\n\n\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/with-defaults.js\n\n\n\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS = merge(oldDefaults, newDefaults);\n const endpoint = endpointWithDefaults.bind(null, DEFAULTS);\n return Object.assign(endpoint, {\n DEFAULTS,\n defaults: withDefaults.bind(null, DEFAULTS),\n merge: merge.bind(null, DEFAULTS),\n parse: parse\n });\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/version.js\nconst VERSION = "9.0.4";\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/defaults.js\n\n\nconst userAgent = `octokit-endpoint.js/${VERSION} ${(0,dist_web/* getUserAgent */.$)()}`;\nconst DEFAULTS = {\n method: "GET",\n baseUrl: "https://api.github.com",\n headers: {\n accept: "application/vnd.github.v3+json",\n "user-agent": userAgent\n },\n mediaType: {\n format: ""\n }\n};\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-src/index.js\n\n\nconst endpoint = withDefaults(null, DEFAULTS);\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/version.js\nconst version_VERSION = "8.1.6";\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/is-plain-object.js\nfunction is_plain_object_isPlainObject(value) {\n if (typeof value !== "object" || value === null)\n return false;\n if (Object.prototype.toString.call(value) !== "[object Object]")\n return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null)\n return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;\n return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n\n// EXTERNAL MODULE: ./node_modules/deprecation/dist-web/index.js\nvar deprecation_dist_web = __webpack_require__(62185);\n// EXTERNAL MODULE: ./node_modules/once/once.js\nvar once = __webpack_require__(83519);\nvar once_default = /*#__PURE__*/__webpack_require__.n(once);\n;// CONCATENATED MODULE: ./node_modules/@octokit/request-error/dist-src/index.js\n\n\nconst logOnceCode = once_default()((deprecation) => console.warn(deprecation));\nconst logOnceHeaders = once_default()((deprecation) => console.warn(deprecation));\nclass RequestError extends Error {\n constructor(message, statusCode, options) {\n super(message);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n this.name = "HttpError";\n this.status = statusCode;\n let headers;\n if ("headers" in options && typeof options.headers !== "undefined") {\n headers = options.headers;\n }\n if ("response" in options) {\n this.response = options.response;\n headers = options.response.headers;\n }\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n / .*$/,\n " [REDACTED]"\n )\n });\n }\n requestCopy.url = requestCopy.url.replace(/\\bclient_secret=\\w+/g, "client_secret=[REDACTED]").replace(/\\baccess_token=\\w+/g, "access_token=[REDACTED]");\n this.request = requestCopy;\n Object.defineProperty(this, "code", {\n get() {\n logOnceCode(\n new deprecation_dist_web/* Deprecation */.J(\n "[@octokit/request-error] `error.code` is deprecated, use `error.status`."\n )\n );\n return statusCode;\n }\n });\n Object.defineProperty(this, "headers", {\n get() {\n logOnceHeaders(\n new deprecation_dist_web/* Deprecation */.J(\n "[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`."\n )\n );\n return headers || {};\n }\n });\n }\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/get-buffer-response.js\nfunction getBufferResponse(response) {\n return response.arrayBuffer();\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/fetch-wrapper.js\n\n\n\nfunction fetchWrapper(requestOptions) {\n const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console;\n const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false;\n if (is_plain_object_isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n let headers = {};\n let status;\n let url;\n let { fetch } = globalThis;\n if (requestOptions.request?.fetch) {\n fetch = requestOptions.request.fetch;\n }\n if (!fetch) {\n throw new Error(\n "fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing"\n );\n }\n return fetch(requestOptions.url, {\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers,\n signal: requestOptions.request?.signal,\n // duplex must be set if request.body is ReadableStream or Async Iterables.\n // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.\n ...requestOptions.body && { duplex: "half" }\n }).then(async (response) => {\n url = response.url;\n status = response.status;\n for (const keyAndValue of response.headers) {\n headers[keyAndValue[0]] = keyAndValue[1];\n }\n if ("deprecation" in headers) {\n const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/);\n const deprecationLink = matches && matches.pop();\n log.warn(\n `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`\n );\n }\n if (status === 204 || status === 205) {\n return;\n }\n if (requestOptions.method === "HEAD") {\n if (status < 400) {\n return;\n }\n throw new RequestError(response.statusText, status, {\n response: {\n url,\n status,\n headers,\n data: void 0\n },\n request: requestOptions\n });\n }\n if (status === 304) {\n throw new RequestError("Not modified", status, {\n response: {\n url,\n status,\n headers,\n data: await getResponseData(response)\n },\n request: requestOptions\n });\n }\n if (status >= 400) {\n const data = await getResponseData(response);\n const error = new RequestError(toErrorMessage(data), status, {\n response: {\n url,\n status,\n headers,\n data\n },\n request: requestOptions\n });\n throw error;\n }\n return parseSuccessResponseBody ? await getResponseData(response) : response.body;\n }).then((data) => {\n return {\n status,\n url,\n headers,\n data\n };\n }).catch((error) => {\n if (error instanceof RequestError)\n throw error;\n else if (error.name === "AbortError")\n throw error;\n let message = error.message;\n if (error.name === "TypeError" && "cause" in error) {\n if (error.cause instanceof Error) {\n message = error.cause.message;\n } else if (typeof error.cause === "string") {\n message = error.cause;\n }\n }\n throw new RequestError(message, 500, {\n request: requestOptions\n });\n });\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get("content-type");\n if (/application\\/json/.test(contentType)) {\n return response.json().catch(() => response.text()).catch(() => "");\n }\n if (!contentType || /^text\\/|charset=utf-8$/.test(contentType)) {\n return response.text();\n }\n return getBufferResponse(response);\n}\nfunction toErrorMessage(data) {\n if (typeof data === "string")\n return data;\n if ("message" in data) {\n if (Array.isArray(data.errors)) {\n return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`;\n }\n return data.message;\n }\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/with-defaults.js\n\nfunction with_defaults_withDefaults(oldEndpoint, newDefaults) {\n const endpoint = oldEndpoint.defaults(newDefaults);\n const newApi = function(route, parameters) {\n const endpointOptions = endpoint.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint.parse(endpointOptions));\n }\n const request = (route2, parameters2) => {\n return fetchWrapper(\n endpoint.parse(endpoint.merge(route2, parameters2))\n );\n };\n Object.assign(request, {\n endpoint,\n defaults: with_defaults_withDefaults.bind(null, endpoint)\n });\n return endpointOptions.request.hook(request, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint,\n defaults: with_defaults_withDefaults.bind(null, endpoint)\n });\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-src/index.js\n\n\n\n\nconst request = with_defaults_withDefaults(endpoint, {\n headers: {\n "user-agent": `octokit-request.js/${version_VERSION} ${(0,dist_web/* getUserAgent */.$)()}`\n }\n});\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/graphql/dist-web/index.js\n// pkg/dist-src/index.js\n\n\n\n// pkg/dist-src/version.js\nvar dist_web_VERSION = "7.0.2";\n\n// pkg/dist-src/with-defaults.js\n\n\n// pkg/dist-src/graphql.js\n\n\n// pkg/dist-src/error.js\nfunction _buildMessageForResponseErrors(data) {\n return `Request failed due to following response errors:\n` + data.errors.map((e) => ` - ${e.message}`).join("\\n");\n}\nvar GraphqlResponseError = class extends Error {\n constructor(request2, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request2;\n this.headers = headers;\n this.response = response;\n this.name = "GraphqlResponseError";\n this.errors = response.errors;\n this.data = response.data;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n};\n\n// pkg/dist-src/graphql.js\nvar NON_VARIABLE_OPTIONS = [\n "method",\n "baseUrl",\n "url",\n "headers",\n "request",\n "query",\n "mediaType"\n];\nvar FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"];\nvar GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request2, query, options) {\n if (options) {\n if (typeof query === "string" && "query" in options) {\n return Promise.reject(\n new Error(`[@octokit/graphql] "query" cannot be used as variable name`)\n );\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key))\n continue;\n return Promise.reject(\n new Error(\n `[@octokit/graphql] "${key}" cannot be used as variable name`\n )\n );\n }\n }\n const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(\n parsedOptions\n ).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");\n }\n return request2(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(\n requestOptions,\n headers,\n response.data\n );\n }\n return response.data.data;\n });\n}\n\n// pkg/dist-src/with-defaults.js\nfunction dist_web_withDefaults(request2, newDefaults) {\n const newRequest = request2.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: dist_web_withDefaults.bind(null, newRequest),\n endpoint: newRequest.endpoint\n });\n}\n\n// pkg/dist-src/index.js\nvar graphql2 = dist_web_withDefaults(request, {\n headers: {\n "user-agent": `octokit-graphql.js/${dist_web_VERSION} ${(0,dist_web/* getUserAgent */.$)()}`\n },\n method: "POST",\n url: "/graphql"\n});\nfunction withCustomRequest(customRequest) {\n return dist_web_withDefaults(customRequest, {\n method: "POST",\n url: "/graphql"\n });\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-src/auth.js\nconst REGEX_IS_INSTALLATION_LEGACY = /^v1\\./;\nconst REGEX_IS_INSTALLATION = /^ghs_/;\nconst REGEX_IS_USER_TO_SERVER = /^ghu_/;\nasync function auth(token) {\n const isApp = token.split(/\\./).length === 3;\n const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token);\n const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token);\n const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth";\n return {\n type: "token",\n token,\n tokenType\n };\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-src/with-authorization-prefix.js\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-src/hook.js\n\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(\n route,\n parameters\n );\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-src/index.js\n\n\nconst createTokenAuth = function createTokenAuth2(token) {\n if (!token) {\n throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");\n }\n if (typeof token !== "string") {\n throw new Error(\n "[@octokit/auth-token] Token passed to createTokenAuth is not a string"\n );\n }\n token = token.replace(/^(token|bearer) +/i, "");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-web/index.js\n// pkg/dist-src/index.js\n\n\n\n\n\n\n// pkg/dist-src/version.js\nvar core_dist_web_VERSION = "5.1.0";\n\n// pkg/dist-src/index.js\nvar noop = () => {\n};\nvar consoleWarn = console.warn.bind(console);\nvar consoleError = console.error.bind(console);\nvar userAgentTrail = `octokit-core.js/${core_dist_web_VERSION} ${(0,dist_web/* getUserAgent */.$)()}`;\nvar Octokit = class {\n static {\n this.VERSION = core_dist_web_VERSION;\n }\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n if (typeof defaults === "function") {\n super(defaults(options));\n return;\n }\n super(\n Object.assign(\n {},\n defaults,\n options,\n options.userAgent && defaults.userAgent ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`\n } : null\n )\n );\n }\n };\n return OctokitWithDefaults;\n }\n static {\n this.plugins = [];\n }\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin(...newPlugins) {\n const currentPlugins = this.plugins;\n const NewOctokit = class extends this {\n static {\n this.plugins = currentPlugins.concat(\n newPlugins.filter((plugin) => !currentPlugins.includes(plugin))\n );\n }\n };\n return NewOctokit;\n }\n constructor(options = {}) {\n const hook = new before_after_hook.Collection();\n const requestDefaults = {\n baseUrl: request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n // @ts-ignore internal usage only, no need to type\n hook: hook.bind(null, "request")\n }),\n mediaType: {\n previews: [],\n format: ""\n }\n };\n requestDefaults.headers["user-agent"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail;\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n if (options.timeZone) {\n requestDefaults.headers["time-zone"] = options.timeZone;\n }\n this.request = request.defaults(requestDefaults);\n this.graphql = withCustomRequest(this.request).defaults(requestDefaults);\n this.log = Object.assign(\n {\n debug: noop,\n info: noop,\n warn: consoleWarn,\n error: consoleError\n },\n options.log\n );\n this.hook = hook;\n if (!options.authStrategy) {\n if (!options.auth) {\n this.auth = async () => ({\n type: "unauthenticated"\n });\n } else {\n const auth = createTokenAuth(options.auth);\n hook.wrap("request", auth.hook);\n this.auth = auth;\n }\n } else {\n const { authStrategy, ...otherOptions } = options;\n const auth = authStrategy(\n Object.assign(\n {\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the "event-octokit" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions\n },\n options.auth\n )\n );\n hook.wrap("request", auth.hook);\n this.auth = auth;\n }\n const classConstructor = this.constructor;\n for (let i = 0; i < classConstructor.plugins.length; ++i) {\n Object.assign(this, classConstructor.plugins[i](this, options));\n }\n }\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHFDQUFxQztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUdFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL2xvd2VyY2FzZS1rZXlzLmpzP2ZlYzYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL2lzLXBsYWluLW9iamVjdC5qcz85MjQzIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC9tZXJnZS1kZWVwLmpzPzNkYWQiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy91dGlsL3JlbW92ZS11bmRlZmluZWQtcHJvcGVydGllcy5qcz8xNWU0Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvbWVyZ2UuanM/ZmE3NiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvYWRkLXF1ZXJ5LXBhcmFtZXRlcnMuanM/YWVkZiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvZXh0cmFjdC11cmwtdmFyaWFibGUtbmFtZXMuanM/Y2QxMiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3V0aWwvb21pdC5qcz9hZGU4Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvdXRpbC91cmwtdGVtcGxhdGUuanM/ZTJlOCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2VuZHBvaW50L2Rpc3Qtc3JjL3BhcnNlLmpzPzliZjUiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy9lbmRwb2ludC13aXRoLWRlZmF1bHRzLmpzPzAwMTIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy93aXRoLWRlZmF1bHRzLmpzP2QzMTYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy92ZXJzaW9uLmpzPzZhYTYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LXNyYy9kZWZhdWx0cy5qcz85MzY0Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1zcmMvaW5kZXguanM/YTY1MCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvdmVyc2lvbi5qcz84YWI5Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LXNyYy9pcy1wbGFpbi1vYmplY3QuanM/Y2U2MCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QtZXJyb3IvZGlzdC1zcmMvaW5kZXguanM/Nzg5YiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvZ2V0LWJ1ZmZlci1yZXNwb25zZS5qcz8zNzgyIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LXNyYy9mZXRjaC13cmFwcGVyLmpzPzE4OTEiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9yZXF1ZXN0L2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanM/M2Q4MyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QvZGlzdC1zcmMvaW5kZXguanM/YTNhNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2dyYXBocWwvZGlzdC13ZWIvaW5kZXguanM/ZTA5YSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2F1dGgtdG9rZW4vZGlzdC1zcmMvYXV0aC5qcz82M2NhIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvYXV0aC10b2tlbi9kaXN0LXNyYy93aXRoLWF1dGhvcml6YXRpb24tcHJlZml4LmpzP2M2MDgiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9hdXRoLXRva2VuL2Rpc3Qtc3JjL2hvb2suanM/YjQxYSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2F1dGgtdG9rZW4vZGlzdC1zcmMvaW5kZXguanM/ODIwYiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L2NvcmUvZGlzdC13ZWIvaW5kZXguanM/OWJlYyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBsb3dlcmNhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIW9iamVjdCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5yZWR1Y2UoKG5ld09iaiwga2V5KSA9PiB7XG4gICAgbmV3T2JqW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9iamVjdFtrZXldO1xuICAgIHJldHVybiBuZXdPYmo7XG4gIH0sIHt9KTtcbn1cbmV4cG9ydCB7XG4gIGxvd2VyY2FzZUtleXNcbn07XG4iLCJmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKVxuICAgIHJldHVybiB0cnVlO1xuICBjb25zdCBDdG9yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBcImNvbnN0cnVjdG9yXCIpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbChDdG9yKSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwodmFsdWUpO1xufVxuZXhwb3J0IHtcbiAgaXNQbGFpbk9iamVjdFxufTtcbiIsImltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi9pcy1wbGFpbi1vYmplY3RcIjtcbmZ1bmN0aW9uIG1lcmdlRGVlcChkZWZhdWx0cywgb3B0aW9ucykge1xuICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyk7XG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnNba2V5XSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBkZWZhdWx0cykpXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtrZXldOiBvcHRpb25zW2tleV0gfSk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2VEZWVwKGRlZmF1bHRzW2tleV0sIG9wdGlvbnNba2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtrZXldOiBvcHRpb25zW2tleV0gfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIG1lcmdlRGVlcFxufTtcbiIsImZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob2JqKSB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmpba2V5XSA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG5leHBvcnQge1xuICByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzXG59O1xuIiwiaW1wb3J0IHsgbG93ZXJjYXNlS2V5cyB9IGZyb20gXCIuL3V0aWwvbG93ZXJjYXNlLWtleXNcIjtcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gXCIuL3V0aWwvbWVyZ2UtZGVlcFwiO1xuaW1wb3J0IHsgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyB9IGZyb20gXCIuL3V0aWwvcmVtb3ZlLXVuZGVmaW5lZC1wcm9wZXJ0aWVzXCI7XG5mdW5jdGlvbiBtZXJnZShkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiByb3V0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxldCBbbWV0aG9kLCB1cmxdID0gcm91dGUuc3BsaXQoXCIgXCIpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHVybCA/IHsgbWV0aG9kLCB1cmwgfSA6IHsgdXJsOiBtZXRob2QgfSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHJvdXRlKTtcbiAgfVxuICBvcHRpb25zLmhlYWRlcnMgPSBsb3dlcmNhc2VLZXlzKG9wdGlvbnMuaGVhZGVycyk7XG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob3B0aW9ucyk7XG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMob3B0aW9ucy5oZWFkZXJzKTtcbiAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IG1lcmdlRGVlcChkZWZhdWx0cyB8fCB7fSwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLnVybCA9PT0gXCIvZ3JhcGhxbFwiKSB7XG4gICAgaWYgKGRlZmF1bHRzICYmIGRlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cz8ubGVuZ3RoKSB7XG4gICAgICBtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyA9IGRlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cy5maWx0ZXIoXG4gICAgICAgIChwcmV2aWV3KSA9PiAhbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MuaW5jbHVkZXMocHJldmlldylcbiAgICAgICkuY29uY2F0KG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzKTtcbiAgICB9XG4gICAgbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgPSAobWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MgfHwgW10pLm1hcCgocHJldmlldykgPT4gcHJldmlldy5yZXBsYWNlKC8tcHJldmlldy8sIFwiXCIpKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcbn1cbmV4cG9ydCB7XG4gIG1lcmdlXG59O1xuIiwiZnVuY3Rpb24gYWRkUXVlcnlQYXJhbWV0ZXJzKHVybCwgcGFyYW1ldGVycykge1xuICBjb25zdCBzZXBhcmF0b3IgPSAvXFw/Ly50ZXN0KHVybCkgPyBcIiZcIiA6IFwiP1wiO1xuICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpO1xuICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICByZXR1cm4gdXJsICsgc2VwYXJhdG9yICsgbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgaWYgKG5hbWUgPT09IFwicVwiKSB7XG4gICAgICByZXR1cm4gXCJxPVwiICsgcGFyYW1ldGVycy5xLnNwbGl0KFwiK1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiK1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnNbbmFtZV0pfWA7XG4gIH0pLmpvaW4oXCImXCIpO1xufVxuZXhwb3J0IHtcbiAgYWRkUXVlcnlQYXJhbWV0ZXJzXG59O1xuIiwiY29uc3QgdXJsVmFyaWFibGVSZWdleCA9IC9cXHtbXn1dK1xcfS9nO1xuZnVuY3Rpb24gcmVtb3ZlTm9uQ2hhcnModmFyaWFibGVOYW1lKSB7XG4gIHJldHVybiB2YXJpYWJsZU5hbWUucmVwbGFjZSgvXlxcVyt8XFxXKyQvZywgXCJcIikuc3BsaXQoLywvKTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RVcmxWYXJpYWJsZU5hbWVzKHVybCkge1xuICBjb25zdCBtYXRjaGVzID0gdXJsLm1hdGNoKHVybFZhcmlhYmxlUmVnZXgpO1xuICBpZiAoIW1hdGNoZXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXMubWFwKHJlbW92ZU5vbkNoYXJzKS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk7XG59XG5leHBvcnQge1xuICBleHRyYWN0VXJsVmFyaWFibGVOYW1lc1xufTtcbiIsImZ1bmN0aW9uIG9taXQob2JqZWN0LCBrZXlzVG9PbWl0KSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgX19wcm90b19fOiBudWxsIH07XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iamVjdCkpIHtcbiAgICBpZiAoa2V5c1RvT21pdC5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG9iamVjdFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IHtcbiAgb21pdFxufTtcbiIsImZ1bmN0aW9uIGVuY29kZVJlc2VydmVkKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KC8oJVswLTlBLUZhLWZdezJ9KS9nKS5tYXAoZnVuY3Rpb24ocGFydCkge1xuICAgIGlmICghLyVbMC05QS1GYS1mXS8udGVzdChwYXJ0KSkge1xuICAgICAgcGFydCA9IGVuY29kZVVSSShwYXJ0KS5yZXBsYWNlKC8lNUIvZywgXCJbXCIpLnJlcGxhY2UoLyU1RC9nLCBcIl1cIik7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0O1xuICB9KS5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gZW5jb2RlVW5yZXNlcnZlZChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24oYykge1xuICAgIHJldHVybiBcIiVcIiArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGtleSkge1xuICB2YWx1ZSA9IG9wZXJhdG9yID09PSBcIitcIiB8fCBvcGVyYXRvciA9PT0gXCIjXCIgPyBlbmNvZGVSZXNlcnZlZCh2YWx1ZSkgOiBlbmNvZGVVbnJlc2VydmVkKHZhbHVlKTtcbiAgaWYgKGtleSkge1xuICAgIHJldHVybiBlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIiArIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdm9pZCAwICYmIHZhbHVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gaXNLZXlPcGVyYXRvcihvcGVyYXRvcikge1xuICByZXR1cm4gb3BlcmF0b3IgPT09IFwiO1wiIHx8IG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCI7XG59XG5mdW5jdGlvbiBnZXRWYWx1ZXMoY29udGV4dCwgb3BlcmF0b3IsIGtleSwgbW9kaWZpZXIpIHtcbiAgdmFyIHZhbHVlID0gY29udGV4dFtrZXldLCByZXN1bHQgPSBbXTtcbiAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkgJiYgdmFsdWUgIT09IFwiXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICBpZiAobW9kaWZpZXIgJiYgbW9kaWZpZXIgIT09IFwiKlwiKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHBhcnNlSW50KG1vZGlmaWVyLCAxMCkpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSwgaXNLZXlPcGVyYXRvcihvcGVyYXRvcikgPyBrZXkgOiBcIlwiKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1vZGlmaWVyID09PSBcIipcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZS5maWx0ZXIoaXNEZWZpbmVkKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlMikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgIGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZTIsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZVtrXSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlW2tdLCBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRtcCA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZS5maWx0ZXIoaXNEZWZpbmVkKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlMikge1xuICAgICAgICAgICAgdG1wLnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlMikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodmFsdWVba10pKSB7XG4gICAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoaykpO1xuICAgICAgICAgICAgICB0bXAucHVzaChlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWVba10udG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoa2V5KSArIFwiPVwiICsgdG1wLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0bXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godG1wLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiO1wiKSB7XG4gICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwiXCIgJiYgKG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCIpKSB7XG4gICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIik7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmVzdWx0LnB1c2goXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZVVybCh0ZW1wbGF0ZSkge1xuICByZXR1cm4ge1xuICAgIGV4cGFuZDogZXhwYW5kLmJpbmQobnVsbCwgdGVtcGxhdGUpXG4gIH07XG59XG5mdW5jdGlvbiBleHBhbmQodGVtcGxhdGUsIGNvbnRleHQpIHtcbiAgdmFyIG9wZXJhdG9ycyA9IFtcIitcIiwgXCIjXCIsIFwiLlwiLCBcIi9cIiwgXCI7XCIsIFwiP1wiLCBcIiZcIl07XG4gIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcbiAgICAvXFx7KFteXFx7XFx9XSspXFx9fChbXlxce1xcfV0rKS9nLFxuICAgIGZ1bmN0aW9uKF8sIGV4cHJlc3Npb24sIGxpdGVyYWwpIHtcbiAgICAgIGlmIChleHByZXNzaW9uKSB7XG4gICAgICAgIGxldCBvcGVyYXRvciA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBpZiAob3BlcmF0b3JzLmluZGV4T2YoZXhwcmVzc2lvbi5jaGFyQXQoMCkpICE9PSAtMSkge1xuICAgICAgICAgIG9wZXJhdG9yID0gZXhwcmVzc2lvbi5jaGFyQXQoMCk7XG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICAgIGV4cHJlc3Npb24uc3BsaXQoLywvZykuZm9yRWFjaChmdW5jdGlvbih2YXJpYWJsZSkge1xuICAgICAgICAgIHZhciB0bXAgPSAvKFteOlxcKl0qKSg/OjooXFxkKyl8KFxcKikpPy8uZXhlYyh2YXJpYWJsZSk7XG4gICAgICAgICAgdmFsdWVzLnB1c2goZ2V0VmFsdWVzKGNvbnRleHQsIG9wZXJhdG9yLCB0bXBbMV0sIHRtcFsyXSB8fCB0bXBbM10pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcGVyYXRvciAmJiBvcGVyYXRvciAhPT0gXCIrXCIpIHtcbiAgICAgICAgICB2YXIgc2VwYXJhdG9yID0gXCIsXCI7XG4gICAgICAgICAgaWYgKG9wZXJhdG9yID09PSBcIj9cIikge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gXCImXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciAhPT0gXCIjXCIpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHZhbHVlcy5sZW5ndGggIT09IDAgPyBvcGVyYXRvciA6IFwiXCIpICsgdmFsdWVzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVzLmpvaW4oXCIsXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVzZXJ2ZWQobGl0ZXJhbCk7XG4gICAgICB9XG4gICAgfVxuICApO1xuICBpZiAodGVtcGxhdGUgPT09IFwiL1wiKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHBhcnNlVXJsXG59O1xuIiwiaW1wb3J0IHsgYWRkUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSBcIi4vdXRpbC9hZGQtcXVlcnktcGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVybFZhcmlhYmxlTmFtZXMgfSBmcm9tIFwiLi91dGlsL2V4dHJhY3QtdXJsLXZhcmlhYmxlLW5hbWVzXCI7XG5pbXBvcnQgeyBvbWl0IH0gZnJvbSBcIi4vdXRpbC9vbWl0XCI7XG5pbXBvcnQgeyBwYXJzZVVybCB9IGZyb20gXCIuL3V0aWwvdXJsLXRlbXBsYXRlXCI7XG5mdW5jdGlvbiBwYXJzZShvcHRpb25zKSB7XG4gIGxldCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBsZXQgdXJsID0gKG9wdGlvbnMudXJsIHx8IFwiL1wiKS5yZXBsYWNlKC86KFthLXpdXFx3KykvZywgXCJ7JDF9XCIpO1xuICBsZXQgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuaGVhZGVycyk7XG4gIGxldCBib2R5O1xuICBsZXQgcGFyYW1ldGVycyA9IG9taXQob3B0aW9ucywgW1xuICAgIFwibWV0aG9kXCIsXG4gICAgXCJiYXNlVXJsXCIsXG4gICAgXCJ1cmxcIixcbiAgICBcImhlYWRlcnNcIixcbiAgICBcInJlcXVlc3RcIixcbiAgICBcIm1lZGlhVHlwZVwiXG4gIF0pO1xuICBjb25zdCB1cmxWYXJpYWJsZU5hbWVzID0gZXh0cmFjdFVybFZhcmlhYmxlTmFtZXModXJsKTtcbiAgdXJsID0gcGFyc2VVcmwodXJsKS5leHBhbmQocGFyYW1ldGVycyk7XG4gIGlmICghL15odHRwLy50ZXN0KHVybCkpIHtcbiAgICB1cmwgPSBvcHRpb25zLmJhc2VVcmwgKyB1cmw7XG4gIH1cbiAgY29uc3Qgb21pdHRlZFBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvcHRpb25zKS5maWx0ZXIoKG9wdGlvbikgPT4gdXJsVmFyaWFibGVOYW1lcy5pbmNsdWRlcyhvcHRpb24pKS5jb25jYXQoXCJiYXNlVXJsXCIpO1xuICBjb25zdCByZW1haW5pbmdQYXJhbWV0ZXJzID0gb21pdChwYXJhbWV0ZXJzLCBvbWl0dGVkUGFyYW1ldGVycyk7XG4gIGNvbnN0IGlzQmluYXJ5UmVxdWVzdCA9IC9hcHBsaWNhdGlvblxcL29jdGV0LXN0cmVhbS9pLnRlc3QoaGVhZGVycy5hY2NlcHQpO1xuICBpZiAoIWlzQmluYXJ5UmVxdWVzdCkge1xuICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXQpIHtcbiAgICAgIGhlYWRlcnMuYWNjZXB0ID0gaGVhZGVycy5hY2NlcHQuc3BsaXQoLywvKS5tYXAoXG4gICAgICAgIChmb3JtYXQpID0+IGZvcm1hdC5yZXBsYWNlKFxuICAgICAgICAgIC9hcHBsaWNhdGlvblxcL3ZuZChcXC5cXHcrKShcXC52Myk/KFxcLlxcdyspPyhcXCtqc29uKT8kLyxcbiAgICAgICAgICBgYXBwbGljYXRpb24vdm5kJDEkMi4ke29wdGlvbnMubWVkaWFUeXBlLmZvcm1hdH1gXG4gICAgICAgIClcbiAgICAgICkuam9pbihcIixcIik7XG4gICAgfVxuICAgIGlmICh1cmwuZW5kc1dpdGgoXCIvZ3JhcGhxbFwiKSkge1xuICAgICAgaWYgKG9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcHJldmlld3NGcm9tQWNjZXB0SGVhZGVyID0gaGVhZGVycy5hY2NlcHQubWF0Y2goL1tcXHctXSsoPz0tcHJldmlldykvZykgfHwgW107XG4gICAgICAgIGhlYWRlcnMuYWNjZXB0ID0gcHJldmlld3NGcm9tQWNjZXB0SGVhZGVyLmNvbmNhdChvcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cykubWFwKChwcmV2aWV3KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5tZWRpYVR5cGUuZm9ybWF0ID8gYC4ke29wdGlvbnMubWVkaWFUeXBlLmZvcm1hdH1gIDogXCIranNvblwiO1xuICAgICAgICAgIHJldHVybiBgYXBwbGljYXRpb24vdm5kLmdpdGh1Yi4ke3ByZXZpZXd9LXByZXZpZXcke2Zvcm1hdH1gO1xuICAgICAgICB9KS5qb2luKFwiLFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFtcIkdFVFwiLCBcIkhFQURcIl0uaW5jbHVkZXMobWV0aG9kKSkge1xuICAgIHVybCA9IGFkZFF1ZXJ5UGFyYW1ldGVycyh1cmwsIHJlbWFpbmluZ1BhcmFtZXRlcnMpO1xuICB9IGVsc2Uge1xuICAgIGlmIChcImRhdGFcIiBpbiByZW1haW5pbmdQYXJhbWV0ZXJzKSB7XG4gICAgICBib2R5ID0gcmVtYWluaW5nUGFyYW1ldGVycy5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocmVtYWluaW5nUGFyYW1ldGVycykubGVuZ3RoKSB7XG4gICAgICAgIGJvZHkgPSByZW1haW5pbmdQYXJhbWV0ZXJzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gJiYgdHlwZW9mIGJvZHkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCI7XG4gIH1cbiAgaWYgKFtcIlBBVENIXCIsIFwiUFVUXCJdLmluY2x1ZGVzKG1ldGhvZCkgJiYgdHlwZW9mIGJvZHkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBib2R5ID0gXCJcIjtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICB7IG1ldGhvZCwgdXJsLCBoZWFkZXJzIH0sXG4gICAgdHlwZW9mIGJvZHkgIT09IFwidW5kZWZpbmVkXCIgPyB7IGJvZHkgfSA6IG51bGwsXG4gICAgb3B0aW9ucy5yZXF1ZXN0ID8geyByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QgfSA6IG51bGxcbiAgKTtcbn1cbmV4cG9ydCB7XG4gIHBhcnNlXG59O1xuIiwiaW1wb3J0IHsgREVGQVVMVFMgfSBmcm9tIFwiLi9kZWZhdWx0c1wiO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwiLi9tZXJnZVwiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiLi9wYXJzZVwiO1xuZnVuY3Rpb24gZW5kcG9pbnRXaXRoRGVmYXVsdHMoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBwYXJzZShtZXJnZShkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpKTtcbn1cbmV4cG9ydCB7XG4gIGVuZHBvaW50V2l0aERlZmF1bHRzXG59O1xuIiwiaW1wb3J0IHsgZW5kcG9pbnRXaXRoRGVmYXVsdHMgfSBmcm9tIFwiLi9lbmRwb2ludC13aXRoLWRlZmF1bHRzXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCIuL21lcmdlXCI7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCIuL3BhcnNlXCI7XG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMob2xkRGVmYXVsdHMsIG5ld0RlZmF1bHRzKSB7XG4gIGNvbnN0IERFRkFVTFRTID0gbWVyZ2Uob2xkRGVmYXVsdHMsIG5ld0RlZmF1bHRzKTtcbiAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludFdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZW5kcG9pbnQsIHtcbiAgICBERUZBVUxUUyxcbiAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgREVGQVVMVFMpLFxuICAgIG1lcmdlOiBtZXJnZS5iaW5kKG51bGwsIERFRkFVTFRTKSxcbiAgICBwYXJzZVxuICB9KTtcbn1cbmV4cG9ydCB7XG4gIHdpdGhEZWZhdWx0c1xufTtcbiIsImNvbnN0IFZFUlNJT04gPSBcIjkuMC40XCI7XG5leHBvcnQge1xuICBWRVJTSU9OXG59O1xuIiwiaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vdmVyc2lvblwiO1xuY29uc3QgdXNlckFnZW50ID0gYG9jdG9raXQtZW5kcG9pbnQuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWA7XG5jb25zdCBERUZBVUxUUyA9IHtcbiAgbWV0aG9kOiBcIkdFVFwiLFxuICBiYXNlVXJsOiBcImh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cIixcbiAgaGVhZGVyczoge1xuICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb25cIixcbiAgICBcInVzZXItYWdlbnRcIjogdXNlckFnZW50XG4gIH0sXG4gIG1lZGlhVHlwZToge1xuICAgIGZvcm1hdDogXCJcIlxuICB9XG59O1xuZXhwb3J0IHtcbiAgREVGQVVMVFNcbn07XG4iLCJpbXBvcnQgeyB3aXRoRGVmYXVsdHMgfSBmcm9tIFwiLi93aXRoLWRlZmF1bHRzXCI7XG5pbXBvcnQgeyBERUZBVUxUUyB9IGZyb20gXCIuL2RlZmF1bHRzXCI7XG5jb25zdCBlbmRwb2ludCA9IHdpdGhEZWZhdWx0cyhudWxsLCBERUZBVUxUUyk7XG5leHBvcnQge1xuICBlbmRwb2ludFxufTtcbiIsImNvbnN0IFZFUlNJT04gPSBcIjguMS42XCI7XG5leHBvcnQge1xuICBWRVJTSU9OXG59O1xuIiwiZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT09IFwiW29iamVjdCBPYmplY3RdXCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgQ3RvciA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgXCJjb25zdHJ1Y3RvclwiKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwoQ3RvcikgPT09IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKHZhbHVlKTtcbn1cbmV4cG9ydCB7XG4gIGlzUGxhaW5PYmplY3Rcbn07XG4iLCJpbXBvcnQgeyBEZXByZWNhdGlvbiB9IGZyb20gXCJkZXByZWNhdGlvblwiO1xuaW1wb3J0IG9uY2UgZnJvbSBcIm9uY2VcIjtcbmNvbnN0IGxvZ09uY2VDb2RlID0gb25jZSgoZGVwcmVjYXRpb24pID0+IGNvbnNvbGUud2FybihkZXByZWNhdGlvbikpO1xuY29uc3QgbG9nT25jZUhlYWRlcnMgPSBvbmNlKChkZXByZWNhdGlvbikgPT4gY29uc29sZS53YXJuKGRlcHJlY2F0aW9uKSk7XG5jbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgICB0aGlzLm5hbWUgPSBcIkh0dHBFcnJvclwiO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzQ29kZTtcbiAgICBsZXQgaGVhZGVycztcbiAgICBpZiAoXCJoZWFkZXJzXCIgaW4gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5oZWFkZXJzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuICAgIH1cbiAgICBpZiAoXCJyZXNwb25zZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgaGVhZGVycyA9IG9wdGlvbnMucmVzcG9uc2UuaGVhZGVycztcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnJlcXVlc3QpO1xuICAgIGlmIChvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICByZXF1ZXN0Q29weS5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMsIHtcbiAgICAgICAgYXV0aG9yaXphdGlvbjogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbi5yZXBsYWNlKFxuICAgICAgICAgIC8gLiokLyxcbiAgICAgICAgICBcIiBbUkVEQUNURURdXCJcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb3B5LnVybCA9IHJlcXVlc3RDb3B5LnVybC5yZXBsYWNlKC9cXGJjbGllbnRfc2VjcmV0PVxcdysvZywgXCJjbGllbnRfc2VjcmV0PVtSRURBQ1RFRF1cIikucmVwbGFjZSgvXFxiYWNjZXNzX3Rva2VuPVxcdysvZywgXCJhY2Nlc3NfdG9rZW49W1JFREFDVEVEXVwiKTtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0Q29weTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbG9nT25jZUNvZGUoXG4gICAgICAgICAgbmV3IERlcHJlY2F0aW9uKFxuICAgICAgICAgICAgXCJbQG9jdG9raXQvcmVxdWVzdC1lcnJvcl0gYGVycm9yLmNvZGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZXJyb3Iuc3RhdHVzYC5cIlxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiaGVhZGVyc1wiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGxvZ09uY2VIZWFkZXJzKFxuICAgICAgICAgIG5ldyBEZXByZWNhdGlvbihcbiAgICAgICAgICAgIFwiW0BvY3Rva2l0L3JlcXVlc3QtZXJyb3JdIGBlcnJvci5oZWFkZXJzYCBpcyBkZXByZWNhdGVkLCB1c2UgYGVycm9yLnJlc3BvbnNlLmhlYWRlcnNgLlwiXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gaGVhZGVycyB8fCB7fTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUmVxdWVzdEVycm9yXG59O1xuIiwiZnVuY3Rpb24gZ2V0QnVmZmVyUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG59XG5leHBvcnQge1xuICBnZXRCdWZmZXJSZXNwb25zZSBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gXCIuL2lzLXBsYWluLW9iamVjdFwiO1xuaW1wb3J0IHsgUmVxdWVzdEVycm9yIH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3QtZXJyb3JcIjtcbmltcG9ydCBnZXRCdWZmZXIgZnJvbSBcIi4vZ2V0LWJ1ZmZlci1yZXNwb25zZVwiO1xuZnVuY3Rpb24gZmV0Y2hXcmFwcGVyKHJlcXVlc3RPcHRpb25zKSB7XG4gIGNvbnN0IGxvZyA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5sb2cgPyByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmxvZyA6IGNvbnNvbGU7XG4gIGNvbnN0IHBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3Q/LnBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSAhPT0gZmFsc2U7XG4gIGlmIChpc1BsYWluT2JqZWN0KHJlcXVlc3RPcHRpb25zLmJvZHkpIHx8IEFycmF5LmlzQXJyYXkocmVxdWVzdE9wdGlvbnMuYm9keSkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdE9wdGlvbnMuYm9keSk7XG4gIH1cbiAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgbGV0IHN0YXR1cztcbiAgbGV0IHVybDtcbiAgbGV0IHsgZmV0Y2ggfSA9IGdsb2JhbFRoaXM7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0Py5mZXRjaCkge1xuICAgIGZldGNoID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5mZXRjaDtcbiAgfVxuICBpZiAoIWZldGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJmZXRjaCBpcyBub3Qgc2V0LiBQbGVhc2UgcGFzcyBhIGZldGNoIGltcGxlbWVudGF0aW9uIGFzIG5ldyBPY3Rva2l0KHsgcmVxdWVzdDogeyBmZXRjaCB9fSkuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9naXRodWIuY29tL29jdG9raXQvb2N0b2tpdC5qcy8jZmV0Y2gtbWlzc2luZ1wiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmV0Y2gocmVxdWVzdE9wdGlvbnMudXJsLCB7XG4gICAgbWV0aG9kOiByZXF1ZXN0T3B0aW9ucy5tZXRob2QsXG4gICAgYm9keTogcmVxdWVzdE9wdGlvbnMuYm9keSxcbiAgICBoZWFkZXJzOiByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLFxuICAgIHNpZ25hbDogcmVxdWVzdE9wdGlvbnMucmVxdWVzdD8uc2lnbmFsLFxuICAgIC8vIGR1cGxleCBtdXN0IGJlIHNldCBpZiByZXF1ZXN0LmJvZHkgaXMgUmVhZGFibGVTdHJlYW0gb3IgQXN5bmMgSXRlcmFibGVzLlxuICAgIC8vIFNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3Rpbml0LWR1cGxleC5cbiAgICAuLi5yZXF1ZXN0T3B0aW9ucy5ib2R5ICYmIHsgZHVwbGV4OiBcImhhbGZcIiB9XG4gIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICBmb3IgKGNvbnN0IGtleUFuZFZhbHVlIG9mIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnNba2V5QW5kVmFsdWVbMF1dID0ga2V5QW5kVmFsdWVbMV07XG4gICAgfVxuICAgIGlmIChcImRlcHJlY2F0aW9uXCIgaW4gaGVhZGVycykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGhlYWRlcnMubGluayAmJiBoZWFkZXJzLmxpbmsubWF0Y2goLzwoW14+XSspPjsgcmVsPVwiZGVwcmVjYXRpb25cIi8pO1xuICAgICAgY29uc3QgZGVwcmVjYXRpb25MaW5rID0gbWF0Y2hlcyAmJiBtYXRjaGVzLnBvcCgpO1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBbQG9jdG9raXQvcmVxdWVzdF0gXCIke3JlcXVlc3RPcHRpb25zLm1ldGhvZH0gJHtyZXF1ZXN0T3B0aW9ucy51cmx9XCIgaXMgZGVwcmVjYXRlZC4gSXQgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgb24gJHtoZWFkZXJzLnN1bnNldH0ke2RlcHJlY2F0aW9uTGluayA/IGAuIFNlZSAke2RlcHJlY2F0aW9uTGlua31gIDogXCJcIn1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSAyMDQgfHwgc3RhdHVzID09PSAyMDUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3RPcHRpb25zLm1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgIGlmIChzdGF0dXMgPCA0MDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0LCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YTogdm9pZCAwXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICB0aHJvdyBuZXcgUmVxdWVzdEVycm9yKFwiTm90IG1vZGlmaWVkXCIsIHN0YXR1cywge1xuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBkYXRhOiBhd2FpdCBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKHRvRXJyb3JNZXNzYWdlKGRhdGEpLCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9uc1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSA/IGF3YWl0IGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSkgOiByZXNwb25zZS5ib2R5O1xuICB9KS50aGVuKChkYXRhKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUmVxdWVzdEVycm9yKVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09IFwiVHlwZUVycm9yXCIgJiYgXCJjYXVzZVwiIGluIGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IuY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3IuY2F1c2UubWVzc2FnZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yLmNhdXNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvci5jYXVzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFJlcXVlc3RFcnJvcihtZXNzYWdlLCA1MDAsIHtcbiAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgfSk7XG4gIH0pO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik7XG4gIGlmICgvYXBwbGljYXRpb25cXC9qc29uLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UudGV4dCgpKS5jYXRjaCgoKSA9PiBcIlwiKTtcbiAgfVxuICBpZiAoIWNvbnRlbnRUeXBlIHx8IC9edGV4dFxcL3xjaGFyc2V0PXV0Zi04JC8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICB9XG4gIHJldHVybiBnZXRCdWZmZXIocmVzcG9uc2UpO1xufVxuZnVuY3Rpb24gdG9FcnJvck1lc3NhZ2UoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIGRhdGE7XG4gIGlmIChcIm1lc3NhZ2VcIiBpbiBkYXRhKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5lcnJvcnMpKSB7XG4gICAgICByZXR1cm4gYCR7ZGF0YS5tZXNzYWdlfTogJHtkYXRhLmVycm9ycy5tYXAoSlNPTi5zdHJpbmdpZnkpLmpvaW4oXCIsIFwiKX1gO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS5tZXNzYWdlO1xuICB9XG4gIHJldHVybiBgVW5rbm93biBlcnJvcjogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gO1xufVxuZXhwb3J0IHtcbiAgZmV0Y2hXcmFwcGVyIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgZmV0Y2hXcmFwcGVyIGZyb20gXCIuL2ZldGNoLXdyYXBwZXJcIjtcbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGRFbmRwb2ludCwgbmV3RGVmYXVsdHMpIHtcbiAgY29uc3QgZW5kcG9pbnQgPSBvbGRFbmRwb2ludC5kZWZhdWx0cyhuZXdEZWZhdWx0cyk7XG4gIGNvbnN0IG5ld0FwaSA9IGZ1bmN0aW9uKHJvdXRlLCBwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgZW5kcG9pbnRPcHRpb25zID0gZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpO1xuICAgIGlmICghZW5kcG9pbnRPcHRpb25zLnJlcXVlc3QgfHwgIWVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0Lmhvb2spIHtcbiAgICAgIHJldHVybiBmZXRjaFdyYXBwZXIoZW5kcG9pbnQucGFyc2UoZW5kcG9pbnRPcHRpb25zKSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSAocm91dGUyLCBwYXJhbWV0ZXJzMikgPT4ge1xuICAgICAgcmV0dXJuIGZldGNoV3JhcHBlcihcbiAgICAgICAgZW5kcG9pbnQucGFyc2UoZW5kcG9pbnQubWVyZ2Uocm91dGUyLCBwYXJhbWV0ZXJzMikpXG4gICAgICApO1xuICAgIH07XG4gICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0LCB7XG4gICAgICBlbmRwb2ludCxcbiAgICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBlbmRwb2ludClcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRPcHRpb25zLnJlcXVlc3QuaG9vayhyZXF1ZXN0LCBlbmRwb2ludE9wdGlvbnMpO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXdBcGksIHtcbiAgICBlbmRwb2ludCxcbiAgICBkZWZhdWx0czogd2l0aERlZmF1bHRzLmJpbmQobnVsbCwgZW5kcG9pbnQpXG4gIH0pO1xufVxuZXhwb3J0IHtcbiAgd2l0aERlZmF1bHRzIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgeyBlbmRwb2ludCB9IGZyb20gXCJAb2N0b2tpdC9lbmRwb2ludFwiO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vdmVyc2lvblwiO1xuaW1wb3J0IHdpdGhEZWZhdWx0cyBmcm9tIFwiLi93aXRoLWRlZmF1bHRzXCI7XG5jb25zdCByZXF1ZXN0ID0gd2l0aERlZmF1bHRzKGVuZHBvaW50LCB7XG4gIGhlYWRlcnM6IHtcbiAgICBcInVzZXItYWdlbnRcIjogYG9jdG9raXQtcmVxdWVzdC5qcy8ke1ZFUlNJT059ICR7Z2V0VXNlckFnZW50KCl9YFxuICB9XG59KTtcbmV4cG9ydCB7XG4gIHJlcXVlc3Rcbn07XG4iLCIvLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSBcInVuaXZlcnNhbC11c2VyLWFnZW50XCI7XG5cbi8vIHBrZy9kaXN0LXNyYy92ZXJzaW9uLmpzXG52YXIgVkVSU0lPTiA9IFwiNy4wLjJcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanNcbmltcG9ydCB7IHJlcXVlc3QgYXMgUmVxdWVzdDIgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuXG4vLyBwa2cvZGlzdC1zcmMvZ3JhcGhxbC5qc1xuaW1wb3J0IHsgcmVxdWVzdCBhcyBSZXF1ZXN0IH0gZnJvbSBcIkBvY3Rva2l0L3JlcXVlc3RcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL2Vycm9yLmpzXG5mdW5jdGlvbiBfYnVpbGRNZXNzYWdlRm9yUmVzcG9uc2VFcnJvcnMoZGF0YSkge1xuICByZXR1cm4gYFJlcXVlc3QgZmFpbGVkIGR1ZSB0byBmb2xsb3dpbmcgcmVzcG9uc2UgZXJyb3JzOlxuYCArIGRhdGEuZXJyb3JzLm1hcCgoZSkgPT4gYCAtICR7ZS5tZXNzYWdlfWApLmpvaW4oXCJcXG5cIik7XG59XG52YXIgR3JhcGhxbFJlc3BvbnNlRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVxdWVzdDIsIGhlYWRlcnMsIHJlc3BvbnNlKSB7XG4gICAgc3VwZXIoX2J1aWxkTWVzc2FnZUZvclJlc3BvbnNlRXJyb3JzKHJlc3BvbnNlKSk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDI7XG4gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5uYW1lID0gXCJHcmFwaHFsUmVzcG9uc2VFcnJvclwiO1xuICAgIHRoaXMuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzO1xuICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHBrZy9kaXN0LXNyYy9ncmFwaHFsLmpzXG52YXIgTk9OX1ZBUklBQkxFX09QVElPTlMgPSBbXG4gIFwibWV0aG9kXCIsXG4gIFwiYmFzZVVybFwiLFxuICBcInVybFwiLFxuICBcImhlYWRlcnNcIixcbiAgXCJyZXF1ZXN0XCIsXG4gIFwicXVlcnlcIixcbiAgXCJtZWRpYVR5cGVcIlxuXTtcbnZhciBGT1JCSURERU5fVkFSSUFCTEVfT1BUSU9OUyA9IFtcInF1ZXJ5XCIsIFwibWV0aG9kXCIsIFwidXJsXCJdO1xudmFyIEdIRVNfVjNfU1VGRklYX1JFR0VYID0gL1xcL2FwaVxcL3YzXFwvPyQvO1xuZnVuY3Rpb24gZ3JhcGhxbChyZXF1ZXN0MiwgcXVlcnksIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiICYmIFwicXVlcnlcIiBpbiBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihgW0BvY3Rva2l0L2dyYXBocWxdIFwicXVlcnlcIiBjYW5ub3QgYmUgdXNlZCBhcyB2YXJpYWJsZSBuYW1lYClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgIGlmICghRk9SQklEREVOX1ZBUklBQkxFX09QVElPTlMuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgY29udGludWU7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgW0BvY3Rva2l0L2dyYXBocWxdIFwiJHtrZXl9XCIgY2Fubm90IGJlIHVzZWQgYXMgdmFyaWFibGUgbmFtZWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IE9iamVjdC5hc3NpZ24oeyBxdWVyeSB9LCBvcHRpb25zKSA6IHF1ZXJ5O1xuICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IE9iamVjdC5rZXlzKFxuICAgIHBhcnNlZE9wdGlvbnNcbiAgKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgaWYgKE5PTl9WQVJJQUJMRV9PUFRJT05TLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gcGFyc2VkT3B0aW9uc1trZXldO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQudmFyaWFibGVzKSB7XG4gICAgICByZXN1bHQudmFyaWFibGVzID0ge307XG4gICAgfVxuICAgIHJlc3VsdC52YXJpYWJsZXNba2V5XSA9IHBhcnNlZE9wdGlvbnNba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG4gIGNvbnN0IGJhc2VVcmwgPSBwYXJzZWRPcHRpb25zLmJhc2VVcmwgfHwgcmVxdWVzdDIuZW5kcG9pbnQuREVGQVVMVFMuYmFzZVVybDtcbiAgaWYgKEdIRVNfVjNfU1VGRklYX1JFR0VYLnRlc3QoYmFzZVVybCkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy51cmwgPSBiYXNlVXJsLnJlcGxhY2UoR0hFU19WM19TVUZGSVhfUkVHRVgsIFwiL2FwaS9ncmFwaHFsXCIpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0MihyZXF1ZXN0T3B0aW9ucykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICBpZiAocmVzcG9uc2UuZGF0YS5lcnJvcnMpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlLmhlYWRlcnMpKSB7XG4gICAgICAgIGhlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnNba2V5XTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBHcmFwaHFsUmVzcG9uc2VFcnJvcihcbiAgICAgICAgcmVxdWVzdE9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHJlc3BvbnNlLmRhdGFcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvd2l0aC1kZWZhdWx0cy5qc1xuZnVuY3Rpb24gd2l0aERlZmF1bHRzKHJlcXVlc3QyLCBuZXdEZWZhdWx0cykge1xuICBjb25zdCBuZXdSZXF1ZXN0ID0gcmVxdWVzdDIuZGVmYXVsdHMobmV3RGVmYXVsdHMpO1xuICBjb25zdCBuZXdBcGkgPSAocXVlcnksIG9wdGlvbnMpID0+IHtcbiAgICByZXR1cm4gZ3JhcGhxbChuZXdSZXF1ZXN0LCBxdWVyeSwgb3B0aW9ucyk7XG4gIH07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ld0FwaSwge1xuICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBuZXdSZXF1ZXN0KSxcbiAgICBlbmRwb2ludDogbmV3UmVxdWVzdC5lbmRwb2ludFxuICB9KTtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG52YXIgZ3JhcGhxbDIgPSB3aXRoRGVmYXVsdHMocmVxdWVzdCwge1xuICBoZWFkZXJzOiB7XG4gICAgXCJ1c2VyLWFnZW50XCI6IGBvY3Rva2l0LWdyYXBocWwuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWBcbiAgfSxcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgdXJsOiBcIi9ncmFwaHFsXCJcbn0pO1xuZnVuY3Rpb24gd2l0aEN1c3RvbVJlcXVlc3QoY3VzdG9tUmVxdWVzdCkge1xuICByZXR1cm4gd2l0aERlZmF1bHRzKGN1c3RvbVJlcXVlc3QsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIHVybDogXCIvZ3JhcGhxbFwiXG4gIH0pO1xufVxuZXhwb3J0IHtcbiAgR3JhcGhxbFJlc3BvbnNlRXJyb3IsXG4gIGdyYXBocWwyIGFzIGdyYXBocWwsXG4gIHdpdGhDdXN0b21SZXF1ZXN0XG59O1xuIiwiY29uc3QgUkVHRVhfSVNfSU5TVEFMTEFUSU9OX0xFR0FDWSA9IC9edjFcXC4vO1xuY29uc3QgUkVHRVhfSVNfSU5TVEFMTEFUSU9OID0gL15naHNfLztcbmNvbnN0IFJFR0VYX0lTX1VTRVJfVE9fU0VSVkVSID0gL15naHVfLztcbmFzeW5jIGZ1bmN0aW9uIGF1dGgodG9rZW4pIHtcbiAgY29uc3QgaXNBcHAgPSB0b2tlbi5zcGxpdCgvXFwuLykubGVuZ3RoID09PSAzO1xuICBjb25zdCBpc0luc3RhbGxhdGlvbiA9IFJFR0VYX0lTX0lOU1RBTExBVElPTl9MRUdBQ1kudGVzdCh0b2tlbikgfHwgUkVHRVhfSVNfSU5TVEFMTEFUSU9OLnRlc3QodG9rZW4pO1xuICBjb25zdCBpc1VzZXJUb1NlcnZlciA9IFJFR0VYX0lTX1VTRVJfVE9fU0VSVkVSLnRlc3QodG9rZW4pO1xuICBjb25zdCB0b2tlblR5cGUgPSBpc0FwcCA/IFwiYXBwXCIgOiBpc0luc3RhbGxhdGlvbiA/IFwiaW5zdGFsbGF0aW9uXCIgOiBpc1VzZXJUb1NlcnZlciA/IFwidXNlci10by1zZXJ2ZXJcIiA6IFwib2F1dGhcIjtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcInRva2VuXCIsXG4gICAgdG9rZW4sXG4gICAgdG9rZW5UeXBlXG4gIH07XG59XG5leHBvcnQge1xuICBhdXRoXG59O1xuIiwiZnVuY3Rpb24gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pIHtcbiAgaWYgKHRva2VuLnNwbGl0KC9cXC4vKS5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYGJlYXJlciAke3Rva2VufWA7XG4gIH1cbiAgcmV0dXJuIGB0b2tlbiAke3Rva2VufWA7XG59XG5leHBvcnQge1xuICB3aXRoQXV0aG9yaXphdGlvblByZWZpeFxufTtcbiIsImltcG9ydCB7IHdpdGhBdXRob3JpemF0aW9uUHJlZml4IH0gZnJvbSBcIi4vd2l0aC1hdXRob3JpemF0aW9uLXByZWZpeFwiO1xuYXN5bmMgZnVuY3Rpb24gaG9vayh0b2tlbiwgcmVxdWVzdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3QgZW5kcG9pbnQgPSByZXF1ZXN0LmVuZHBvaW50Lm1lcmdlKFxuICAgIHJvdXRlLFxuICAgIHBhcmFtZXRlcnNcbiAgKTtcbiAgZW5kcG9pbnQuaGVhZGVycy5hdXRob3JpemF0aW9uID0gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pO1xuICByZXR1cm4gcmVxdWVzdChlbmRwb2ludCk7XG59XG5leHBvcnQge1xuICBob29rXG59O1xuIiwiaW1wb3J0IHsgYXV0aCB9IGZyb20gXCIuL2F1dGhcIjtcbmltcG9ydCB7IGhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG5jb25zdCBjcmVhdGVUb2tlbkF1dGggPSBmdW5jdGlvbiBjcmVhdGVUb2tlbkF1dGgyKHRva2VuKSB7XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbQG9jdG9raXQvYXV0aC10b2tlbl0gTm8gdG9rZW4gcGFzc2VkIHRvIGNyZWF0ZVRva2VuQXV0aFwiKTtcbiAgfVxuICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJbQG9jdG9raXQvYXV0aC10b2tlbl0gVG9rZW4gcGFzc2VkIHRvIGNyZWF0ZVRva2VuQXV0aCBpcyBub3QgYSBzdHJpbmdcIlxuICAgICk7XG4gIH1cbiAgdG9rZW4gPSB0b2tlbi5yZXBsYWNlKC9eKHRva2VufGJlYXJlcikgKy9pLCBcIlwiKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXV0aC5iaW5kKG51bGwsIHRva2VuKSwge1xuICAgIGhvb2s6IGhvb2suYmluZChudWxsLCB0b2tlbilcbiAgfSk7XG59O1xuZXhwb3J0IHtcbiAgY3JlYXRlVG9rZW5BdXRoXG59O1xuIiwiLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG5pbXBvcnQgeyBnZXRVc2VyQWdlbnQgfSBmcm9tIFwidW5pdmVyc2FsLXVzZXItYWdlbnRcIjtcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tIFwiYmVmb3JlLWFmdGVyLWhvb2tcIjtcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvcmVxdWVzdFwiO1xuaW1wb3J0IHsgZ3JhcGhxbCwgd2l0aEN1c3RvbVJlcXVlc3QgfSBmcm9tIFwiQG9jdG9raXQvZ3JhcGhxbFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9rZW5BdXRoIH0gZnJvbSBcIkBvY3Rva2l0L2F1dGgtdG9rZW5cIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL3ZlcnNpb24uanNcbnZhciBWRVJTSU9OID0gXCI1LjEuMFwiO1xuXG4vLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbnZhciBub29wID0gKCkgPT4ge1xufTtcbnZhciBjb25zb2xlV2FybiA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xudmFyIGNvbnNvbGVFcnJvciA9IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtcbnZhciB1c2VyQWdlbnRUcmFpbCA9IGBvY3Rva2l0LWNvcmUuanMvJHtWRVJTSU9OfSAke2dldFVzZXJBZ2VudCgpfWA7XG52YXIgT2N0b2tpdCA9IGNsYXNzIHtcbiAgc3RhdGljIHtcbiAgICB0aGlzLlZFUlNJT04gPSBWRVJTSU9OO1xuICB9XG4gIHN0YXRpYyBkZWZhdWx0cyhkZWZhdWx0cykge1xuICAgIGNvbnN0IE9jdG9raXRXaXRoRGVmYXVsdHMgPSBjbGFzcyBleHRlbmRzIHRoaXMge1xuICAgICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gYXJnc1swXSB8fCB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0cyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgc3VwZXIoZGVmYXVsdHMob3B0aW9ucykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihcbiAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBkZWZhdWx0cyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zLnVzZXJBZ2VudCAmJiBkZWZhdWx0cy51c2VyQWdlbnQgPyB7XG4gICAgICAgICAgICAgIHVzZXJBZ2VudDogYCR7b3B0aW9ucy51c2VyQWdlbnR9ICR7ZGVmYXVsdHMudXNlckFnZW50fWBcbiAgICAgICAgICAgIH0gOiBudWxsXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE9jdG9raXRXaXRoRGVmYXVsdHM7XG4gIH1cbiAgc3RhdGljIHtcbiAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgfVxuICAvKipcbiAgICogQXR0YWNoIGEgcGx1Z2luIChvciBtYW55KSB0byB5b3VyIE9jdG9raXQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IEFQSSA9IE9jdG9raXQucGx1Z2luKHBsdWdpbjEsIHBsdWdpbjIsIHBsdWdpbjMsIC4uLilcbiAgICovXG4gIHN0YXRpYyBwbHVnaW4oLi4ubmV3UGx1Z2lucykge1xuICAgIGNvbnN0IGN1cnJlbnRQbHVnaW5zID0gdGhpcy5wbHVnaW5zO1xuICAgIGNvbnN0IE5ld09jdG9raXQgPSBjbGFzcyBleHRlbmRzIHRoaXMge1xuICAgICAgc3RhdGljIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gY3VycmVudFBsdWdpbnMuY29uY2F0KFxuICAgICAgICAgIG5ld1BsdWdpbnMuZmlsdGVyKChwbHVnaW4pID0+ICFjdXJyZW50UGx1Z2lucy5pbmNsdWRlcyhwbHVnaW4pKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE5ld09jdG9raXQ7XG4gIH1cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaG9vayA9IG5ldyBDb2xsZWN0aW9uKCk7XG4gICAgY29uc3QgcmVxdWVzdERlZmF1bHRzID0ge1xuICAgICAgYmFzZVVybDogcmVxdWVzdC5lbmRwb2ludC5ERUZBVUxUUy5iYXNlVXJsLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICByZXF1ZXN0OiBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnJlcXVlc3QsIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBpbnRlcm5hbCB1c2FnZSBvbmx5LCBubyBuZWVkIHRvIHR5cGVcbiAgICAgICAgaG9vazogaG9vay5iaW5kKG51bGwsIFwicmVxdWVzdFwiKVxuICAgICAgfSksXG4gICAgICBtZWRpYVR5cGU6IHtcbiAgICAgICAgcHJldmlld3M6IFtdLFxuICAgICAgICBmb3JtYXQ6IFwiXCJcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3REZWZhdWx0cy5oZWFkZXJzW1widXNlci1hZ2VudFwiXSA9IG9wdGlvbnMudXNlckFnZW50ID8gYCR7b3B0aW9ucy51c2VyQWdlbnR9ICR7dXNlckFnZW50VHJhaWx9YCA6IHVzZXJBZ2VudFRyYWlsO1xuICAgIGlmIChvcHRpb25zLmJhc2VVcmwpIHtcbiAgICAgIHJlcXVlc3REZWZhdWx0cy5iYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5wcmV2aWV3cykge1xuICAgICAgcmVxdWVzdERlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cyA9IG9wdGlvbnMucHJldmlld3M7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRpbWVab25lKSB7XG4gICAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInRpbWUtem9uZVwiXSA9IG9wdGlvbnMudGltZVpvbmU7XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3QuZGVmYXVsdHMocmVxdWVzdERlZmF1bHRzKTtcbiAgICB0aGlzLmdyYXBocWwgPSB3aXRoQ3VzdG9tUmVxdWVzdCh0aGlzLnJlcXVlc3QpLmRlZmF1bHRzKHJlcXVlc3REZWZhdWx0cyk7XG4gICAgdGhpcy5sb2cgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBkZWJ1Zzogbm9vcCxcbiAgICAgICAgaW5mbzogbm9vcCxcbiAgICAgICAgd2FybjogY29uc29sZVdhcm4sXG4gICAgICAgIGVycm9yOiBjb25zb2xlRXJyb3JcbiAgICAgIH0sXG4gICAgICBvcHRpb25zLmxvZ1xuICAgICk7XG4gICAgdGhpcy5ob29rID0gaG9vaztcbiAgICBpZiAoIW9wdGlvbnMuYXV0aFN0cmF0ZWd5KSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aGlzLmF1dGggPSBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwidW5hdXRoZW50aWNhdGVkXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhdXRoID0gY3JlYXRlVG9rZW5BdXRoKG9wdGlvbnMuYXV0aCk7XG4gICAgICAgIGhvb2sud3JhcChcInJlcXVlc3RcIiwgYXV0aC5ob29rKTtcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBhdXRoU3RyYXRlZ3ksIC4uLm90aGVyT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICAgIGNvbnN0IGF1dGggPSBhdXRoU3RyYXRlZ3koXG4gICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgICAgICAgIC8vIHdlIHBhc3MgdGhlIGN1cnJlbnQgb2N0b2tpdCBpbnN0YW5jZSBhcyB3ZWxsIGFzIGl0cyBjb25zdHJ1Y3RvciBvcHRpb25zXG4gICAgICAgICAgICAvLyB0byBhbGxvdyBmb3IgYXV0aGVudGljYXRpb24gc3RyYXRlZ2llcyB0aGF0IHJldHVybiBhIG5ldyBvY3Rva2l0IGluc3RhbmNlXG4gICAgICAgICAgICAvLyB0aGF0IHNoYXJlcyB0aGUgc2FtZSBpbnRlcm5hbCBzdGF0ZSBhcyB0aGUgY3VycmVudCBvbmUuIFRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgLy8gcmVxdWlyZW1lbnQgZm9yIHRoaXMgd2FzIHRoZSBcImV2ZW50LW9jdG9raXRcIiBhdXRoZW50aWNhdGlvbiBzdHJhdGVneVxuICAgICAgICAgICAgLy8gb2YgaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9vY3Rva2l0LWF1dGgtcHJvYm90LlxuICAgICAgICAgICAgb2N0b2tpdDogdGhpcyxcbiAgICAgICAgICAgIG9jdG9raXRPcHRpb25zOiBvdGhlck9wdGlvbnNcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbnMuYXV0aFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NDb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0NvbnN0cnVjdG9yLnBsdWdpbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2xhc3NDb25zdHJ1Y3Rvci5wbHVnaW5zW2ldKHRoaXMsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQge1xuICBPY3Rva2l0XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///81539\n')},70909:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ composePaginateRest: () => (/* binding */ composePaginateRest),\n/* harmony export */ isPaginatingEndpoint: () => (/* binding */ isPaginatingEndpoint),\n/* harmony export */ paginateRest: () => (/* binding */ paginateRest),\n/* harmony export */ paginatingEndpoints: () => (/* binding */ paginatingEndpoints)\n/* harmony export */ });\n// pkg/dist-src/version.js\nvar VERSION = "9.1.5";\n\n// pkg/dist-src/normalize-paginated-list-response.js\nfunction normalizePaginatedListResponse(response) {\n if (!response.data) {\n return {\n ...response,\n data: []\n };\n }\n const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data);\n if (!responseNeedsNormalization)\n return response;\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n if (typeof incompleteResults !== "undefined") {\n response.data.incomplete_results = incompleteResults;\n }\n if (typeof repositorySelection !== "undefined") {\n response.data.repository_selection = repositorySelection;\n }\n response.data.total_count = totalCount;\n return response;\n}\n\n// pkg/dist-src/iterator.js\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === "function" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url)\n return { done: true };\n try {\n const response = await requestMethod({ method, url, headers });\n const normalizedResponse = normalizePaginatedListResponse(response);\n url = ((normalizedResponse.headers.link || "").match(\n /<([^>]+)>;\\s*rel="next"/\n ) || [])[1];\n return { value: normalizedResponse };\n } catch (error) {\n if (error.status !== 409)\n throw error;\n url = "";\n return {\n value: {\n status: 200,\n headers: {},\n data: []\n }\n };\n }\n }\n })\n };\n}\n\n// pkg/dist-src/paginate.js\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === "function") {\n mapFn = parameters;\n parameters = void 0;\n }\n return gather(\n octokit,\n [],\n iterator(octokit, route, parameters)[Symbol.asyncIterator](),\n mapFn\n );\n}\nfunction gather(octokit, results, iterator2, mapFn) {\n return iterator2.next().then((result) => {\n if (result.done) {\n return results;\n }\n let earlyExit = false;\n function done() {\n earlyExit = true;\n }\n results = results.concat(\n mapFn ? mapFn(result.value, done) : result.value.data\n );\n if (earlyExit) {\n return results;\n }\n return gather(octokit, results, iterator2, mapFn);\n });\n}\n\n// pkg/dist-src/compose-paginate.js\nvar composePaginateRest = Object.assign(paginate, {\n iterator\n});\n\n// pkg/dist-src/generated/paginating-endpoints.js\nvar paginatingEndpoints = [\n "GET /advisories",\n "GET /app/hook/deliveries",\n "GET /app/installation-requests",\n "GET /app/installations",\n "GET /assignments/{assignment_id}/accepted_assignments",\n "GET /classrooms",\n "GET /classrooms/{classroom_id}/assignments",\n "GET /enterprises/{enterprise}/dependabot/alerts",\n "GET /enterprises/{enterprise}/secret-scanning/alerts",\n "GET /events",\n "GET /gists",\n "GET /gists/public",\n "GET /gists/starred",\n "GET /gists/{gist_id}/comments",\n "GET /gists/{gist_id}/commits",\n "GET /gists/{gist_id}/forks",\n "GET /installation/repositories",\n "GET /issues",\n "GET /licenses",\n "GET /marketplace_listing/plans",\n "GET /marketplace_listing/plans/{plan_id}/accounts",\n "GET /marketplace_listing/stubbed/plans",\n "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts",\n "GET /networks/{owner}/{repo}/events",\n "GET /notifications",\n "GET /organizations",\n "GET /orgs/{org}/actions/cache/usage-by-repository",\n "GET /orgs/{org}/actions/permissions/repositories",\n "GET /orgs/{org}/actions/runners",\n "GET /orgs/{org}/actions/secrets",\n "GET /orgs/{org}/actions/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/actions/variables",\n "GET /orgs/{org}/actions/variables/{name}/repositories",\n "GET /orgs/{org}/blocks",\n "GET /orgs/{org}/code-scanning/alerts",\n "GET /orgs/{org}/codespaces",\n "GET /orgs/{org}/codespaces/secrets",\n "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/copilot/billing/seats",\n "GET /orgs/{org}/dependabot/alerts",\n "GET /orgs/{org}/dependabot/secrets",\n "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories",\n "GET /orgs/{org}/events",\n "GET /orgs/{org}/failed_invitations",\n "GET /orgs/{org}/hooks",\n "GET /orgs/{org}/hooks/{hook_id}/deliveries",\n "GET /orgs/{org}/installations",\n "GET /orgs/{org}/invitations",\n "GET /orgs/{org}/invitations/{invitation_id}/teams",\n "GET /orgs/{org}/issues",\n "GET /orgs/{org}/members",\n "GET /orgs/{org}/members/{username}/codespaces",\n "GET /orgs/{org}/migrations",\n "GET /orgs/{org}/migrations/{migration_id}/repositories",\n "GET /orgs/{org}/outside_collaborators",\n "GET /orgs/{org}/packages",\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n "GET /orgs/{org}/personal-access-token-requests",\n "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories",\n "GET /orgs/{org}/personal-access-tokens",\n "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories",\n "GET /orgs/{org}/projects",\n "GET /orgs/{org}/properties/values",\n "GET /orgs/{org}/public_members",\n "GET /orgs/{org}/repos",\n "GET /orgs/{org}/rulesets",\n "GET /orgs/{org}/rulesets/rule-suites",\n "GET /orgs/{org}/secret-scanning/alerts",\n "GET /orgs/{org}/security-advisories",\n "GET /orgs/{org}/teams",\n "GET /orgs/{org}/teams/{team_slug}/discussions",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",\n "GET /orgs/{org}/teams/{team_slug}/invitations",\n "GET /orgs/{org}/teams/{team_slug}/members",\n "GET /orgs/{org}/teams/{team_slug}/projects",\n "GET /orgs/{org}/teams/{team_slug}/repos",\n "GET /orgs/{org}/teams/{team_slug}/teams",\n "GET /projects/columns/{column_id}/cards",\n "GET /projects/{project_id}/collaborators",\n "GET /projects/{project_id}/columns",\n "GET /repos/{owner}/{repo}/actions/artifacts",\n "GET /repos/{owner}/{repo}/actions/caches",\n "GET /repos/{owner}/{repo}/actions/organization-secrets",\n "GET /repos/{owner}/{repo}/actions/organization-variables",\n "GET /repos/{owner}/{repo}/actions/runners",\n "GET /repos/{owner}/{repo}/actions/runs",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs",\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs",\n "GET /repos/{owner}/{repo}/actions/secrets",\n "GET /repos/{owner}/{repo}/actions/variables",\n "GET /repos/{owner}/{repo}/actions/workflows",\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",\n "GET /repos/{owner}/{repo}/activity",\n "GET /repos/{owner}/{repo}/assignees",\n "GET /repos/{owner}/{repo}/branches",\n "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations",\n "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs",\n "GET /repos/{owner}/{repo}/code-scanning/alerts",\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n "GET /repos/{owner}/{repo}/code-scanning/analyses",\n "GET /repos/{owner}/{repo}/codespaces",\n "GET /repos/{owner}/{repo}/codespaces/devcontainers",\n "GET /repos/{owner}/{repo}/codespaces/secrets",\n "GET /repos/{owner}/{repo}/collaborators",\n "GET /repos/{owner}/{repo}/comments",\n "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/commits",\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments",\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",\n "GET /repos/{owner}/{repo}/commits/{ref}/check-runs",\n "GET /repos/{owner}/{repo}/commits/{ref}/check-suites",\n "GET /repos/{owner}/{repo}/commits/{ref}/status",\n "GET /repos/{owner}/{repo}/commits/{ref}/statuses",\n "GET /repos/{owner}/{repo}/contributors",\n "GET /repos/{owner}/{repo}/dependabot/alerts",\n "GET /repos/{owner}/{repo}/dependabot/secrets",\n "GET /repos/{owner}/{repo}/deployments",\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",\n "GET /repos/{owner}/{repo}/environments",\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies",\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps",\n "GET /repos/{owner}/{repo}/events",\n "GET /repos/{owner}/{repo}/forks",\n "GET /repos/{owner}/{repo}/hooks",\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries",\n "GET /repos/{owner}/{repo}/invitations",\n "GET /repos/{owner}/{repo}/issues",\n "GET /repos/{owner}/{repo}/issues/comments",\n "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/issues/events",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/comments",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/events",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/labels",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions",\n "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline",\n "GET /repos/{owner}/{repo}/keys",\n "GET /repos/{owner}/{repo}/labels",\n "GET /repos/{owner}/{repo}/milestones",\n "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels",\n "GET /repos/{owner}/{repo}/notifications",\n "GET /repos/{owner}/{repo}/pages/builds",\n "GET /repos/{owner}/{repo}/projects",\n "GET /repos/{owner}/{repo}/pulls",\n "GET /repos/{owner}/{repo}/pulls/comments",\n "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/files",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews",\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments",\n "GET /repos/{owner}/{repo}/releases",\n "GET /repos/{owner}/{repo}/releases/{release_id}/assets",\n "GET /repos/{owner}/{repo}/releases/{release_id}/reactions",\n "GET /repos/{owner}/{repo}/rules/branches/{branch}",\n "GET /repos/{owner}/{repo}/rulesets",\n "GET /repos/{owner}/{repo}/rulesets/rule-suites",\n "GET /repos/{owner}/{repo}/secret-scanning/alerts",\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations",\n "GET /repos/{owner}/{repo}/security-advisories",\n "GET /repos/{owner}/{repo}/stargazers",\n "GET /repos/{owner}/{repo}/subscribers",\n "GET /repos/{owner}/{repo}/tags",\n "GET /repos/{owner}/{repo}/teams",\n "GET /repos/{owner}/{repo}/topics",\n "GET /repositories",\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets",\n "GET /repositories/{repository_id}/environments/{environment_name}/variables",\n "GET /search/code",\n "GET /search/commits",\n "GET /search/issues",\n "GET /search/labels",\n "GET /search/repositories",\n "GET /search/topics",\n "GET /search/users",\n "GET /teams/{team_id}/discussions",\n "GET /teams/{team_id}/discussions/{discussion_number}/comments",\n "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions",\n "GET /teams/{team_id}/discussions/{discussion_number}/reactions",\n "GET /teams/{team_id}/invitations",\n "GET /teams/{team_id}/members",\n "GET /teams/{team_id}/projects",\n "GET /teams/{team_id}/repos",\n "GET /teams/{team_id}/teams",\n "GET /user/blocks",\n "GET /user/codespaces",\n "GET /user/codespaces/secrets",\n "GET /user/emails",\n "GET /user/followers",\n "GET /user/following",\n "GET /user/gpg_keys",\n "GET /user/installations",\n "GET /user/installations/{installation_id}/repositories",\n "GET /user/issues",\n "GET /user/keys",\n "GET /user/marketplace_purchases",\n "GET /user/marketplace_purchases/stubbed",\n "GET /user/memberships/orgs",\n "GET /user/migrations",\n "GET /user/migrations/{migration_id}/repositories",\n "GET /user/orgs",\n "GET /user/packages",\n "GET /user/packages/{package_type}/{package_name}/versions",\n "GET /user/public_emails",\n "GET /user/repos",\n "GET /user/repository_invitations",\n "GET /user/social_accounts",\n "GET /user/ssh_signing_keys",\n "GET /user/starred",\n "GET /user/subscriptions",\n "GET /user/teams",\n "GET /users",\n "GET /users/{username}/events",\n "GET /users/{username}/events/orgs/{org}",\n "GET /users/{username}/events/public",\n "GET /users/{username}/followers",\n "GET /users/{username}/following",\n "GET /users/{username}/gists",\n "GET /users/{username}/gpg_keys",\n "GET /users/{username}/keys",\n "GET /users/{username}/orgs",\n "GET /users/{username}/packages",\n "GET /users/{username}/projects",\n "GET /users/{username}/received_events",\n "GET /users/{username}/received_events/public",\n "GET /users/{username}/repos",\n "GET /users/{username}/social_accounts",\n "GET /users/{username}/ssh_signing_keys",\n "GET /users/{username}/starred",\n "GET /users/{username}/subscriptions"\n];\n\n// pkg/dist-src/paginating-endpoints.js\nfunction isPaginatingEndpoint(arg) {\n if (typeof arg === "string") {\n return paginatingEndpoints.includes(arg);\n } else {\n return false;\n }\n}\n\n// pkg/dist-src/index.js\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit)\n })\n };\n}\npaginateRest.VERSION = VERSION;\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUN4QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsU0FBUztBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFNRSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXBhZ2luYXRlLXJlc3QvZGlzdC13ZWIvaW5kZXguanM/ZjcwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwa2cvZGlzdC1zcmMvdmVyc2lvbi5qc1xudmFyIFZFUlNJT04gPSBcIjkuMS41XCI7XG5cbi8vIHBrZy9kaXN0LXNyYy9ub3JtYWxpemUtcGFnaW5hdGVkLWxpc3QtcmVzcG9uc2UuanNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLmRhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICBkYXRhOiBbXVxuICAgIH07XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24gPSBcInRvdGFsX2NvdW50XCIgaW4gcmVzcG9uc2UuZGF0YSAmJiAhKFwidXJsXCIgaW4gcmVzcG9uc2UuZGF0YSk7XG4gIGlmICghcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24pXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICBjb25zdCBpbmNvbXBsZXRlUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEuaW5jb21wbGV0ZV9yZXN1bHRzO1xuICBjb25zdCByZXBvc2l0b3J5U2VsZWN0aW9uID0gcmVzcG9uc2UuZGF0YS5yZXBvc2l0b3J5X3NlbGVjdGlvbjtcbiAgY29uc3QgdG90YWxDb3VudCA9IHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQ7XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cztcbiAgZGVsZXRlIHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb247XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50O1xuICBjb25zdCBuYW1lc3BhY2VLZXkgPSBPYmplY3Qua2V5cyhyZXNwb25zZS5kYXRhKVswXTtcbiAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGFbbmFtZXNwYWNlS2V5XTtcbiAgcmVzcG9uc2UuZGF0YSA9IGRhdGE7XG4gIGlmICh0eXBlb2YgaW5jb21wbGV0ZVJlc3VsdHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cyA9IGluY29tcGxldGVSZXN1bHRzO1xuICB9XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVNlbGVjdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb24gPSByZXBvc2l0b3J5U2VsZWN0aW9uO1xuICB9XG4gIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPSB0b3RhbENvdW50O1xuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9pdGVyYXRvci5qc1xuZnVuY3Rpb24gaXRlcmF0b3Iob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiByb3V0ZSA9PT0gXCJmdW5jdGlvblwiID8gcm91dGUuZW5kcG9pbnQocGFyYW1ldGVycykgOiBvY3Rva2l0LnJlcXVlc3QuZW5kcG9pbnQocm91dGUsIHBhcmFtZXRlcnMpO1xuICBjb25zdCByZXF1ZXN0TWV0aG9kID0gdHlwZW9mIHJvdXRlID09PSBcImZ1bmN0aW9uXCIgPyByb3V0ZSA6IG9jdG9raXQucmVxdWVzdDtcbiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gIGxldCB1cmwgPSBvcHRpb25zLnVybDtcbiAgcmV0dXJuIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiAoe1xuICAgICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgaWYgKCF1cmwpXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdE1ldGhvZCh7IG1ldGhvZCwgdXJsLCBoZWFkZXJzIH0pO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNwb25zZSA9IG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgdXJsID0gKChub3JtYWxpemVkUmVzcG9uc2UuaGVhZGVycy5saW5rIHx8IFwiXCIpLm1hdGNoKFxuICAgICAgICAgICAgLzwoW14+XSspPjtcXHMqcmVsPVwibmV4dFwiL1xuICAgICAgICAgICkgfHwgW10pWzFdO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBub3JtYWxpemVkUmVzcG9uc2UgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzICE9PSA0MDkpXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB1cmwgPSBcIlwiO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgIGRhdGE6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH07XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9wYWdpbmF0ZS5qc1xuZnVuY3Rpb24gcGFnaW5hdGUob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMsIG1hcEZuKSB7XG4gIGlmICh0eXBlb2YgcGFyYW1ldGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbWFwRm4gPSBwYXJhbWV0ZXJzO1xuICAgIHBhcmFtZXRlcnMgPSB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIGdhdGhlcihcbiAgICBvY3Rva2l0LFxuICAgIFtdLFxuICAgIGl0ZXJhdG9yKG9jdG9raXQsIHJvdXRlLCBwYXJhbWV0ZXJzKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbiAgICBtYXBGblxuICApO1xufVxuZnVuY3Rpb24gZ2F0aGVyKG9jdG9raXQsIHJlc3VsdHMsIGl0ZXJhdG9yMiwgbWFwRm4pIHtcbiAgcmV0dXJuIGl0ZXJhdG9yMi5uZXh0KCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgbGV0IGVhcmx5RXhpdCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBlYXJseUV4aXQgPSB0cnVlO1xuICAgIH1cbiAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoXG4gICAgICBtYXBGbiA/IG1hcEZuKHJlc3VsdC52YWx1ZSwgZG9uZSkgOiByZXN1bHQudmFsdWUuZGF0YVxuICAgICk7XG4gICAgaWYgKGVhcmx5RXhpdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHJldHVybiBnYXRoZXIob2N0b2tpdCwgcmVzdWx0cywgaXRlcmF0b3IyLCBtYXBGbik7XG4gIH0pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvY29tcG9zZS1wYWdpbmF0ZS5qc1xudmFyIGNvbXBvc2VQYWdpbmF0ZVJlc3QgPSBPYmplY3QuYXNzaWduKHBhZ2luYXRlLCB7XG4gIGl0ZXJhdG9yXG59KTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2dlbmVyYXRlZC9wYWdpbmF0aW5nLWVuZHBvaW50cy5qc1xudmFyIHBhZ2luYXRpbmdFbmRwb2ludHMgPSBbXG4gIFwiR0VUIC9hZHZpc29yaWVzXCIsXG4gIFwiR0VUIC9hcHAvaG9vay9kZWxpdmVyaWVzXCIsXG4gIFwiR0VUIC9hcHAvaW5zdGFsbGF0aW9uLXJlcXVlc3RzXCIsXG4gIFwiR0VUIC9hcHAvaW5zdGFsbGF0aW9uc1wiLFxuICBcIkdFVCAvYXNzaWdubWVudHMve2Fzc2lnbm1lbnRfaWR9L2FjY2VwdGVkX2Fzc2lnbm1lbnRzXCIsXG4gIFwiR0VUIC9jbGFzc3Jvb21zXCIsXG4gIFwiR0VUIC9jbGFzc3Jvb21zL3tjbGFzc3Jvb21faWR9L2Fzc2lnbm1lbnRzXCIsXG4gIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vZGVwZW5kYWJvdC9hbGVydHNcIixcbiAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gIFwiR0VUIC9ldmVudHNcIixcbiAgXCJHRVQgL2dpc3RzXCIsXG4gIFwiR0VUIC9naXN0cy9wdWJsaWNcIixcbiAgXCJHRVQgL2dpc3RzL3N0YXJyZWRcIixcbiAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50c1wiLFxuICBcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIixcbiAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9mb3Jrc1wiLFxuICBcIkdFVCAvaW5zdGFsbGF0aW9uL3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvaXNzdWVzXCIsXG4gIFwiR0VUIC9saWNlbnNlc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIixcbiAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9wbGFuc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICBcIkdFVCAvbmV0d29ya3Mve293bmVyfS97cmVwb30vZXZlbnRzXCIsXG4gIFwiR0VUIC9ub3RpZmljYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdhbml6YXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2UtYnktcmVwb3NpdG9yeVwiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2Jsb2Nrc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlYXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3QvYWxlcnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vZXZlbnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ob29rc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfS90ZWFtc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9pc3N1ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzL3twYXRfcmVxdWVzdF9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vucy97cGF0X2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy92YWx1ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcnVsZXNldHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcnVsZXNldHMvcnVsZS1zdWl0ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9zZWN1cml0eS1hZHZpc29yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3Byb2plY3RzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3RlYW1zXCIsXG4gIFwiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L2NhcmRzXCIsXG4gIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbHVtbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vcmdhbml6YXRpb24tc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vcmdhbml6YXRpb24tdmFyaWFibGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vam9ic1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2pvYnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy92YXJpYWJsZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3J1bnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGl2aXR5XCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hc3NpZ25lZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9L2Fubm90YXRpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfS9jaGVjay1ydW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL2RldmNvbnRhaW5lcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9yc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9wdWxsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1ydW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXN1aXRlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9hbGVydHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlcy9hcHBzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9ldmVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2V2ZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9L2xhYmVsc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1pdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vZmlsZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L2Fzc2V0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXMvYnJhbmNoZXMve2JyYW5jaH1cIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy9ydWxlLXN1aXRlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9sb2NhdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmliZXJzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90ZWFtc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCIsXG4gIFwiR0VUIC9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCIsXG4gIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzXCIsXG4gIFwiR0VUIC9zZWFyY2gvY29kZVwiLFxuICBcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIixcbiAgXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIixcbiAgXCJHRVQgL3NlYXJjaC9sYWJlbHNcIixcbiAgXCJHRVQgL3NlYXJjaC9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL3NlYXJjaC90b3BpY3NcIixcbiAgXCJHRVQgL3NlYXJjaC91c2Vyc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vbWVtYmVyc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L3Byb2plY3RzXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vcmVwb3NcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS90ZWFtc1wiLFxuICBcIkdFVCAvdXNlci9ibG9ja3NcIixcbiAgXCJHRVQgL3VzZXIvY29kZXNwYWNlc1wiLFxuICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHNcIixcbiAgXCJHRVQgL3VzZXIvZW1haWxzXCIsXG4gIFwiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiLFxuICBcIkdFVCAvdXNlci9mb2xsb3dpbmdcIixcbiAgXCJHRVQgL3VzZXIvZ3BnX2tleXNcIixcbiAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9uc1wiLFxuICBcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvdXNlci9pc3N1ZXNcIixcbiAgXCJHRVQgL3VzZXIva2V5c1wiLFxuICBcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXNcIixcbiAgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzL3N0dWJiZWRcIixcbiAgXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiLFxuICBcIkdFVCAvdXNlci9taWdyYXRpb25zXCIsXG4gIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC91c2VyL29yZ3NcIixcbiAgXCJHRVQgL3VzZXIvcGFja2FnZXNcIixcbiAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLFxuICBcIkdFVCAvdXNlci9yZXBvc1wiLFxuICBcIkdFVCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC91c2VyL3NvY2lhbF9hY2NvdW50c1wiLFxuICBcIkdFVCAvdXNlci9zc2hfc2lnbmluZ19rZXlzXCIsXG4gIFwiR0VUIC91c2VyL3N0YXJyZWRcIixcbiAgXCJHRVQgL3VzZXIvc3Vic2NyaXB0aW9uc1wiLFxuICBcIkdFVCAvdXNlci90ZWFtc1wiLFxuICBcIkdFVCAvdXNlcnNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9vcmdzL3tvcmd9XCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93ZXJzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZ1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9rZXlzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L29yZ3NcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcHJvamVjdHNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50cy9wdWJsaWNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVwb3NcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc29jaWFsX2FjY291bnRzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NzaF9zaWduaW5nX2tleXNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3RhcnJlZFwiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdWJzY3JpcHRpb25zXCJcbl07XG5cbi8vIHBrZy9kaXN0LXNyYy9wYWdpbmF0aW5nLWVuZHBvaW50cy5qc1xuZnVuY3Rpb24gaXNQYWdpbmF0aW5nRW5kcG9pbnQoYXJnKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHBhZ2luYXRpbmdFbmRwb2ludHMuaW5jbHVkZXMoYXJnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG5mdW5jdGlvbiBwYWdpbmF0ZVJlc3Qob2N0b2tpdCkge1xuICByZXR1cm4ge1xuICAgIHBhZ2luYXRlOiBPYmplY3QuYXNzaWduKHBhZ2luYXRlLmJpbmQobnVsbCwgb2N0b2tpdCksIHtcbiAgICAgIGl0ZXJhdG9yOiBpdGVyYXRvci5iaW5kKG51bGwsIG9jdG9raXQpXG4gICAgfSlcbiAgfTtcbn1cbnBhZ2luYXRlUmVzdC5WRVJTSU9OID0gVkVSU0lPTjtcbmV4cG9ydCB7XG4gIGNvbXBvc2VQYWdpbmF0ZVJlc3QsXG4gIGlzUGFnaW5hdGluZ0VuZHBvaW50LFxuICBwYWdpbmF0ZVJlc3QsXG4gIHBhZ2luYXRpbmdFbmRwb2ludHNcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///70909\n')},42937:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ requestLog: () => (/* binding */ requestLog)\n/* harmony export */ });\nconst VERSION = "1.0.4";\n\n/**\n * @param octokit Octokit instance\n * @param options Options passed to Octokit constructor\n */\nfunction requestLog(octokit) {\n octokit.hook.wrap("request", (request, options) => {\n octokit.log.debug("request", options);\n const start = Date.now();\n const requestOptions = octokit.request.endpoint.parse(options);\n const path = requestOptions.url.replace(options.baseUrl, "");\n return request(options)\n .then((response) => {\n octokit.log.info(`${requestOptions.method} ${path} - ${response.status} in ${Date.now() - start}ms`);\n return response;\n })\n .catch((error) => {\n octokit.log.info(`${requestOptions.method} ${path} - ${error.status} in ${Date.now() - start}ms`);\n throw error;\n });\n });\n}\nrequestLog.VERSION = VERSION;\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI5MzcuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx1QkFBdUIsRUFBRSxNQUFNLElBQUksaUJBQWlCLEtBQUssbUJBQW1CO0FBQzVHO0FBQ0EsU0FBUztBQUNUO0FBQ0EsZ0NBQWdDLHVCQUF1QixFQUFFLE1BQU0sSUFBSSxjQUFjLEtBQUssbUJBQW1CO0FBQ3pHO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBOztBQUVzQjtBQUN0QiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlcXVlc3QtbG9nL2Rpc3Qtd2ViL2luZGV4LmpzPzEzZWUiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgVkVSU0lPTiA9IFwiMS4wLjRcIjtcblxuLyoqXG4gKiBAcGFyYW0gb2N0b2tpdCBPY3Rva2l0IGluc3RhbmNlXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHBhc3NlZCB0byBPY3Rva2l0IGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RMb2cob2N0b2tpdCkge1xuICAgIG9jdG9raXQuaG9vay53cmFwKFwicmVxdWVzdFwiLCAocmVxdWVzdCwgb3B0aW9ucykgPT4ge1xuICAgICAgICBvY3Rva2l0LmxvZy5kZWJ1ZyhcInJlcXVlc3RcIiwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSBvY3Rva2l0LnJlcXVlc3QuZW5kcG9pbnQucGFyc2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHBhdGggPSByZXF1ZXN0T3B0aW9ucy51cmwucmVwbGFjZShvcHRpb25zLmJhc2VVcmwsIFwiXCIpO1xuICAgICAgICByZXR1cm4gcmVxdWVzdChvcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBvY3Rva2l0LmxvZy5pbmZvKGAke3JlcXVlc3RPcHRpb25zLm1ldGhvZH0gJHtwYXRofSAtICR7cmVzcG9uc2Uuc3RhdHVzfSBpbiAke0RhdGUubm93KCkgLSBzdGFydH1tc2ApO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgb2N0b2tpdC5sb2cuaW5mbyhgJHtyZXF1ZXN0T3B0aW9ucy5tZXRob2R9ICR7cGF0aH0gLSAke2Vycm9yLnN0YXR1c30gaW4gJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbnJlcXVlc3RMb2cuVkVSU0lPTiA9IFZFUlNJT047XG5cbmV4cG9ydCB7IHJlcXVlc3RMb2cgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///42937\n')},30667:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n legacyRestEndpointMethods: () => (/* binding */ legacyRestEndpointMethods),\n restEndpointMethods: () => (/* binding */ restEndpointMethods)\n});\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/version.js\nconst VERSION = "10.2.0";\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/generated/endpoints.js\nconst Endpoints = {\n actions: {\n addCustomLabelsToSelfHostedRunnerForOrg: [\n "POST /orgs/{org}/actions/runners/{runner_id}/labels"\n ],\n addCustomLabelsToSelfHostedRunnerForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"\n ],\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"\n ],\n addSelectedRepoToOrgVariable: [\n "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"\n ],\n approveWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"\n ],\n cancelWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"\n ],\n createEnvironmentVariable: [\n "POST /repositories/{repository_id}/environments/{environment_name}/variables"\n ],\n createOrUpdateEnvironmentSecret: [\n "PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"\n ],\n createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"\n ],\n createOrgVariable: ["POST /orgs/{org}/actions/variables"],\n createRegistrationTokenForOrg: [\n "POST /orgs/{org}/actions/runners/registration-token"\n ],\n createRegistrationTokenForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/registration-token"\n ],\n createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"],\n createRemoveTokenForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/remove-token"\n ],\n createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"],\n createWorkflowDispatch: [\n "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"\n ],\n deleteActionsCacheById: [\n "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"\n ],\n deleteActionsCacheByKey: [\n "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"\n ],\n deleteArtifact: [\n "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"\n ],\n deleteEnvironmentSecret: [\n "DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"\n ],\n deleteEnvironmentVariable: [\n "DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name}"\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"],\n deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"\n ],\n deleteRepoVariable: [\n "DELETE /repos/{owner}/{repo}/actions/variables/{name}"\n ],\n deleteSelfHostedRunnerFromOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}"\n ],\n deleteSelfHostedRunnerFromRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"\n ],\n deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],\n deleteWorkflowRunLogs: [\n "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"\n ],\n disableSelectedRepositoryGithubActionsOrganization: [\n "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"\n ],\n disableWorkflow: [\n "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"\n ],\n downloadArtifact: [\n "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"\n ],\n downloadJobLogsForWorkflowRun: [\n "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"\n ],\n downloadWorkflowRunAttemptLogs: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"\n ],\n downloadWorkflowRunLogs: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"\n ],\n enableSelectedRepositoryGithubActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"\n ],\n enableWorkflow: [\n "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"\n ],\n forceCancelWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"\n ],\n generateRunnerJitconfigForOrg: [\n "POST /orgs/{org}/actions/runners/generate-jitconfig"\n ],\n generateRunnerJitconfigForRepo: [\n "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig"\n ],\n getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],\n getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],\n getActionsCacheUsageByRepoForOrg: [\n "GET /orgs/{org}/actions/cache/usage-by-repository"\n ],\n getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],\n getAllowedActionsOrganization: [\n "GET /orgs/{org}/actions/permissions/selected-actions"\n ],\n getAllowedActionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/selected-actions"\n ],\n getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],\n getEnvironmentPublicKey: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"\n ],\n getEnvironmentSecret: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"\n ],\n getEnvironmentVariable: [\n "GET /repositories/{repository_id}/environments/{environment_name}/variables/{name}"\n ],\n getGithubActionsDefaultWorkflowPermissionsOrganization: [\n "GET /orgs/{org}/actions/permissions/workflow"\n ],\n getGithubActionsDefaultWorkflowPermissionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/workflow"\n ],\n getGithubActionsPermissionsOrganization: [\n "GET /orgs/{org}/actions/permissions"\n ],\n getGithubActionsPermissionsRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions"\n ],\n getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],\n getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"],\n getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"],\n getPendingDeploymentsForRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"\n ],\n getRepoPermissions: [\n "GET /repos/{owner}/{repo}/actions/permissions",\n {},\n { renamed: ["actions", "getGithubActionsPermissionsRepository"] }\n ],\n getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"],\n getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],\n getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"],\n getReviewsForRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"\n ],\n getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"],\n getSelfHostedRunnerForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/{runner_id}"\n ],\n getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],\n getWorkflowAccessToRepository: [\n "GET /repos/{owner}/{repo}/actions/permissions/access"\n ],\n getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],\n getWorkflowRunAttempt: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"\n ],\n getWorkflowRunUsage: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"\n ],\n getWorkflowUsage: [\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"\n ],\n listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"],\n listEnvironmentSecrets: [\n "GET /repositories/{repository_id}/environments/{environment_name}/secrets"\n ],\n listEnvironmentVariables: [\n "GET /repositories/{repository_id}/environments/{environment_name}/variables"\n ],\n listJobsForWorkflowRun: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"\n ],\n listJobsForWorkflowRunAttempt: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"\n ],\n listLabelsForSelfHostedRunnerForOrg: [\n "GET /orgs/{org}/actions/runners/{runner_id}/labels"\n ],\n listLabelsForSelfHostedRunnerForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"\n ],\n listOrgSecrets: ["GET /orgs/{org}/actions/secrets"],\n listOrgVariables: ["GET /orgs/{org}/actions/variables"],\n listRepoOrganizationSecrets: [\n "GET /repos/{owner}/{repo}/actions/organization-secrets"\n ],\n listRepoOrganizationVariables: [\n "GET /repos/{owner}/{repo}/actions/organization-variables"\n ],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"],\n listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"],\n listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"],\n listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"],\n listRunnerApplicationsForRepo: [\n "GET /repos/{owner}/{repo}/actions/runners/downloads"\n ],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/actions/secrets/{secret_name}/repositories"\n ],\n listSelectedReposForOrgVariable: [\n "GET /orgs/{org}/actions/variables/{name}/repositories"\n ],\n listSelectedRepositoriesEnabledGithubActionsOrganization: [\n "GET /orgs/{org}/actions/permissions/repositories"\n ],\n listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"],\n listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"],\n listWorkflowRunArtifacts: [\n "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"\n ],\n listWorkflowRuns: [\n "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"\n ],\n listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"],\n reRunJobForWorkflowRun: [\n "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"\n ],\n reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],\n reRunWorkflowFailedJobs: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}/labels"\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"\n ],\n removeCustomLabelFromSelfHostedRunnerForOrg: [\n "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"\n ],\n removeCustomLabelFromSelfHostedRunnerForRepo: [\n "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"\n ],\n removeSelectedRepoFromOrgVariable: [\n "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"\n ],\n reviewCustomGatesForRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule"\n ],\n reviewPendingDeploymentsForRun: [\n "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"\n ],\n setAllowedActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/selected-actions"\n ],\n setAllowedActionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"\n ],\n setCustomLabelsForSelfHostedRunnerForOrg: [\n "PUT /orgs/{org}/actions/runners/{runner_id}/labels"\n ],\n setCustomLabelsForSelfHostedRunnerForRepo: [\n "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"\n ],\n setGithubActionsDefaultWorkflowPermissionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/workflow"\n ],\n setGithubActionsDefaultWorkflowPermissionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/workflow"\n ],\n setGithubActionsPermissionsOrganization: [\n "PUT /orgs/{org}/actions/permissions"\n ],\n setGithubActionsPermissionsRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions"\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"\n ],\n setSelectedReposForOrgVariable: [\n "PUT /orgs/{org}/actions/variables/{name}/repositories"\n ],\n setSelectedRepositoriesEnabledGithubActionsOrganization: [\n "PUT /orgs/{org}/actions/permissions/repositories"\n ],\n setWorkflowAccessToRepository: [\n "PUT /repos/{owner}/{repo}/actions/permissions/access"\n ],\n updateEnvironmentVariable: [\n "PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name}"\n ],\n updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"],\n updateRepoVariable: [\n "PATCH /repos/{owner}/{repo}/actions/variables/{name}"\n ]\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"],\n deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"],\n deleteThreadSubscription: [\n "DELETE /notifications/threads/{thread_id}/subscription"\n ],\n getFeeds: ["GET /feeds"],\n getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"],\n getThread: ["GET /notifications/threads/{thread_id}"],\n getThreadSubscriptionForAuthenticatedUser: [\n "GET /notifications/threads/{thread_id}/subscription"\n ],\n listEventsForAuthenticatedUser: ["GET /users/{username}/events"],\n listNotificationsForAuthenticatedUser: ["GET /notifications"],\n listOrgEventsForAuthenticatedUser: [\n "GET /users/{username}/events/orgs/{org}"\n ],\n listPublicEvents: ["GET /events"],\n listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"],\n listPublicEventsForUser: ["GET /users/{username}/events/public"],\n listPublicOrgEvents: ["GET /orgs/{org}/events"],\n listReceivedEventsForUser: ["GET /users/{username}/received_events"],\n listReceivedPublicEventsForUser: [\n "GET /users/{username}/received_events/public"\n ],\n listRepoEvents: ["GET /repos/{owner}/{repo}/events"],\n listRepoNotificationsForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/notifications"\n ],\n listReposStarredByAuthenticatedUser: ["GET /user/starred"],\n listReposStarredByUser: ["GET /users/{username}/starred"],\n listReposWatchedByUser: ["GET /users/{username}/subscriptions"],\n listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"],\n listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"],\n listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"],\n markNotificationsAsRead: ["PUT /notifications"],\n markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"],\n markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"],\n setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"],\n setThreadSubscription: [\n "PUT /notifications/threads/{thread_id}/subscription"\n ],\n starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"],\n unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"]\n },\n apps: {\n addRepoToInstallation: [\n "PUT /user/installations/{installation_id}/repositories/{repository_id}",\n {},\n { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] }\n ],\n addRepoToInstallationForAuthenticatedUser: [\n "PUT /user/installations/{installation_id}/repositories/{repository_id}"\n ],\n checkToken: ["POST /applications/{client_id}/token"],\n createFromManifest: ["POST /app-manifests/{code}/conversions"],\n createInstallationAccessToken: [\n "POST /app/installations/{installation_id}/access_tokens"\n ],\n deleteAuthorization: ["DELETE /applications/{client_id}/grant"],\n deleteInstallation: ["DELETE /app/installations/{installation_id}"],\n deleteToken: ["DELETE /applications/{client_id}/token"],\n getAuthenticated: ["GET /app"],\n getBySlug: ["GET /apps/{app_slug}"],\n getInstallation: ["GET /app/installations/{installation_id}"],\n getOrgInstallation: ["GET /orgs/{org}/installation"],\n getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"],\n getSubscriptionPlanForAccount: [\n "GET /marketplace_listing/accounts/{account_id}"\n ],\n getSubscriptionPlanForAccountStubbed: [\n "GET /marketplace_listing/stubbed/accounts/{account_id}"\n ],\n getUserInstallation: ["GET /users/{username}/installation"],\n getWebhookConfigForApp: ["GET /app/hook/config"],\n getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],\n listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"],\n listAccountsForPlanStubbed: [\n "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"\n ],\n listInstallationReposForAuthenticatedUser: [\n "GET /user/installations/{installation_id}/repositories"\n ],\n listInstallationRequestsForAuthenticatedApp: [\n "GET /app/installation-requests"\n ],\n listInstallations: ["GET /app/installations"],\n listInstallationsForAuthenticatedUser: ["GET /user/installations"],\n listPlans: ["GET /marketplace_listing/plans"],\n listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"],\n listReposAccessibleToInstallation: ["GET /installation/repositories"],\n listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"],\n listSubscriptionsForAuthenticatedUserStubbed: [\n "GET /user/marketplace_purchases/stubbed"\n ],\n listWebhookDeliveries: ["GET /app/hook/deliveries"],\n redeliverWebhookDelivery: [\n "POST /app/hook/deliveries/{delivery_id}/attempts"\n ],\n removeRepoFromInstallation: [\n "DELETE /user/installations/{installation_id}/repositories/{repository_id}",\n {},\n { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] }\n ],\n removeRepoFromInstallationForAuthenticatedUser: [\n "DELETE /user/installations/{installation_id}/repositories/{repository_id}"\n ],\n resetToken: ["PATCH /applications/{client_id}/token"],\n revokeInstallationAccessToken: ["DELETE /installation/token"],\n scopeToken: ["POST /applications/{client_id}/token/scoped"],\n suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"],\n unsuspendInstallation: [\n "DELETE /app/installations/{installation_id}/suspended"\n ],\n updateWebhookConfigForApp: ["PATCH /app/hook/config"]\n },\n billing: {\n getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"],\n getGithubActionsBillingUser: [\n "GET /users/{username}/settings/billing/actions"\n ],\n getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"],\n getGithubPackagesBillingUser: [\n "GET /users/{username}/settings/billing/packages"\n ],\n getSharedStorageBillingOrg: [\n "GET /orgs/{org}/settings/billing/shared-storage"\n ],\n getSharedStorageBillingUser: [\n "GET /users/{username}/settings/billing/shared-storage"\n ]\n },\n checks: {\n create: ["POST /repos/{owner}/{repo}/check-runs"],\n createSuite: ["POST /repos/{owner}/{repo}/check-suites"],\n get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],\n getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],\n listAnnotations: [\n "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"\n ],\n listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],\n listForSuite: [\n "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"\n ],\n listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],\n rerequestRun: [\n "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"\n ],\n rerequestSuite: [\n "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"\n ],\n setSuitesPreferences: [\n "PATCH /repos/{owner}/{repo}/check-suites/preferences"\n ],\n update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"]\n },\n codeScanning: {\n deleteAnalysis: [\n "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"\n ],\n getAlert: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",\n {},\n { renamedParameters: { alert_id: "alert_number" } }\n ],\n getAnalysis: [\n "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"\n ],\n getCodeqlDatabase: [\n "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"\n ],\n getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"],\n getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],\n listAlertInstances: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"\n ],\n listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"],\n listAlertsInstances: [\n "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",\n {},\n { renamed: ["codeScanning", "listAlertInstances"] }\n ],\n listCodeqlDatabases: [\n "GET /repos/{owner}/{repo}/code-scanning/codeql/databases"\n ],\n listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"\n ],\n updateDefaultSetup: [\n "PATCH /repos/{owner}/{repo}/code-scanning/default-setup"\n ],\n uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"]\n },\n codesOfConduct: {\n getAllCodesOfConduct: ["GET /codes_of_conduct"],\n getConductCode: ["GET /codes_of_conduct/{key}"]\n },\n codespaces: {\n addRepositoryForSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"\n ],\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"\n ],\n checkPermissionsForDevcontainer: [\n "GET /repos/{owner}/{repo}/codespaces/permissions_check"\n ],\n codespaceMachinesForAuthenticatedUser: [\n "GET /user/codespaces/{codespace_name}/machines"\n ],\n createForAuthenticatedUser: ["POST /user/codespaces"],\n createOrUpdateOrgSecret: [\n "PUT /orgs/{org}/codespaces/secrets/{secret_name}"\n ],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"\n ],\n createOrUpdateSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}"\n ],\n createWithPrForAuthenticatedUser: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"\n ],\n createWithRepoForAuthenticatedUser: [\n "POST /repos/{owner}/{repo}/codespaces"\n ],\n deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],\n deleteFromOrganization: [\n "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"\n ],\n deleteSecretForAuthenticatedUser: [\n "DELETE /user/codespaces/secrets/{secret_name}"\n ],\n exportForAuthenticatedUser: [\n "POST /user/codespaces/{codespace_name}/exports"\n ],\n getCodespacesForUserInOrg: [\n "GET /orgs/{org}/members/{username}/codespaces"\n ],\n getExportDetailsForAuthenticatedUser: [\n "GET /user/codespaces/{codespace_name}/exports/{export_id}"\n ],\n getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],\n getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"],\n getPublicKeyForAuthenticatedUser: [\n "GET /user/codespaces/secrets/public-key"\n ],\n getRepoPublicKey: [\n "GET /repos/{owner}/{repo}/codespaces/secrets/public-key"\n ],\n getRepoSecret: [\n "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"\n ],\n getSecretForAuthenticatedUser: [\n "GET /user/codespaces/secrets/{secret_name}"\n ],\n listDevcontainersInRepositoryForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/devcontainers"\n ],\n listForAuthenticatedUser: ["GET /user/codespaces"],\n listInOrganization: [\n "GET /orgs/{org}/codespaces",\n {},\n { renamedParameters: { org_id: "org" } }\n ],\n listInRepositoryForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces"\n ],\n listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],\n listRepositoriesForSecretForAuthenticatedUser: [\n "GET /user/codespaces/secrets/{secret_name}/repositories"\n ],\n listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories"\n ],\n preFlightWithRepoForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/new"\n ],\n publishForAuthenticatedUser: [\n "POST /user/codespaces/{codespace_name}/publish"\n ],\n removeRepositoryForSecretForAuthenticatedUser: [\n "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"\n ],\n repoMachinesForAuthenticatedUser: [\n "GET /repos/{owner}/{repo}/codespaces/machines"\n ],\n setRepositoriesForSecretForAuthenticatedUser: [\n "PUT /user/codespaces/secrets/{secret_name}/repositories"\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"\n ],\n startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],\n stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],\n stopInOrganization: [\n "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"\n ],\n updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]\n },\n copilot: {\n addCopilotForBusinessSeatsForTeams: [\n "POST /orgs/{org}/copilot/billing/selected_teams"\n ],\n addCopilotForBusinessSeatsForUsers: [\n "POST /orgs/{org}/copilot/billing/selected_users"\n ],\n cancelCopilotSeatAssignmentForTeams: [\n "DELETE /orgs/{org}/copilot/billing/selected_teams"\n ],\n cancelCopilotSeatAssignmentForUsers: [\n "DELETE /orgs/{org}/copilot/billing/selected_users"\n ],\n getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"],\n getCopilotSeatDetailsForUser: [\n "GET /orgs/{org}/members/{username}/copilot"\n ],\n listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"]\n },\n dependabot: {\n addSelectedRepoToOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"\n ],\n createOrUpdateOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}"\n ],\n createOrUpdateRepoSecret: [\n "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"\n ],\n deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],\n deleteRepoSecret: [\n "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"\n ],\n getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],\n getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],\n getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],\n getRepoPublicKey: [\n "GET /repos/{owner}/{repo}/dependabot/secrets/public-key"\n ],\n getRepoSecret: [\n "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"\n ],\n listAlertsForEnterprise: [\n "GET /enterprises/{enterprise}/dependabot/alerts"\n ],\n listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"],\n listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],\n listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],\n listSelectedReposForOrgSecret: [\n "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"\n ],\n removeSelectedRepoFromOrgSecret: [\n "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"\n ],\n setSelectedReposForOrgSecret: [\n "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"\n ],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"\n ]\n },\n dependencyGraph: {\n createRepositorySnapshot: [\n "POST /repos/{owner}/{repo}/dependency-graph/snapshots"\n ],\n diffRange: [\n "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"\n ],\n exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"]\n },\n emojis: { get: ["GET /emojis"] },\n gists: {\n checkIsStarred: ["GET /gists/{gist_id}/star"],\n create: ["POST /gists"],\n createComment: ["POST /gists/{gist_id}/comments"],\n delete: ["DELETE /gists/{gist_id}"],\n deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"],\n fork: ["POST /gists/{gist_id}/forks"],\n get: ["GET /gists/{gist_id}"],\n getComment: ["GET /gists/{gist_id}/comments/{comment_id}"],\n getRevision: ["GET /gists/{gist_id}/{sha}"],\n list: ["GET /gists"],\n listComments: ["GET /gists/{gist_id}/comments"],\n listCommits: ["GET /gists/{gist_id}/commits"],\n listForUser: ["GET /users/{username}/gists"],\n listForks: ["GET /gists/{gist_id}/forks"],\n listPublic: ["GET /gists/public"],\n listStarred: ["GET /gists/starred"],\n star: ["PUT /gists/{gist_id}/star"],\n unstar: ["DELETE /gists/{gist_id}/star"],\n update: ["PATCH /gists/{gist_id}"],\n updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"]\n },\n git: {\n createBlob: ["POST /repos/{owner}/{repo}/git/blobs"],\n createCommit: ["POST /repos/{owner}/{repo}/git/commits"],\n createRef: ["POST /repos/{owner}/{repo}/git/refs"],\n createTag: ["POST /repos/{owner}/{repo}/git/tags"],\n createTree: ["POST /repos/{owner}/{repo}/git/trees"],\n deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],\n getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],\n getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],\n getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"],\n getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],\n getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],\n listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],\n updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"]\n },\n gitignore: {\n getAllTemplates: ["GET /gitignore/templates"],\n getTemplate: ["GET /gitignore/templates/{name}"]\n },\n interactions: {\n getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"],\n getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"],\n getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"],\n getRestrictionsForYourPublicRepos: [\n "GET /user/interaction-limits",\n {},\n { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] }\n ],\n removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"],\n removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"],\n removeRestrictionsForRepo: [\n "DELETE /repos/{owner}/{repo}/interaction-limits"\n ],\n removeRestrictionsForYourPublicRepos: [\n "DELETE /user/interaction-limits",\n {},\n { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] }\n ],\n setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"],\n setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"],\n setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"],\n setRestrictionsForYourPublicRepos: [\n "PUT /user/interaction-limits",\n {},\n { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] }\n ]\n },\n issues: {\n addAssignees: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"\n ],\n addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],\n checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"],\n checkUserCanBeAssignedToIssue: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}"\n ],\n create: ["POST /repos/{owner}/{repo}/issues"],\n createComment: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/comments"\n ],\n createLabel: ["POST /repos/{owner}/{repo}/labels"],\n createMilestone: ["POST /repos/{owner}/{repo}/milestones"],\n deleteComment: [\n "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"\n ],\n deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"],\n deleteMilestone: [\n "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"\n ],\n get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"],\n getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],\n getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"],\n getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"],\n getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],\n list: ["GET /issues"],\n listAssignees: ["GET /repos/{owner}/{repo}/assignees"],\n listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],\n listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"],\n listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],\n listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"],\n listEventsForTimeline: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"\n ],\n listForAuthenticatedUser: ["GET /user/issues"],\n listForOrg: ["GET /orgs/{org}/issues"],\n listForRepo: ["GET /repos/{owner}/{repo}/issues"],\n listLabelsForMilestone: [\n "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"\n ],\n listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"],\n listLabelsOnIssue: [\n "GET /repos/{owner}/{repo}/issues/{issue_number}/labels"\n ],\n listMilestones: ["GET /repos/{owner}/{repo}/milestones"],\n lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],\n removeAllLabels: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"\n ],\n removeAssignees: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"\n ],\n removeLabel: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"\n ],\n setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],\n unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],\n update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],\n updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],\n updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"],\n updateMilestone: [\n "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"\n ]\n },\n licenses: {\n get: ["GET /licenses/{license}"],\n getAllCommonlyUsed: ["GET /licenses"],\n getForRepo: ["GET /repos/{owner}/{repo}/license"]\n },\n markdown: {\n render: ["POST /markdown"],\n renderRaw: [\n "POST /markdown/raw",\n { headers: { "content-type": "text/plain; charset=utf-8" } }\n ]\n },\n meta: {\n get: ["GET /meta"],\n getAllVersions: ["GET /versions"],\n getOctocat: ["GET /octocat"],\n getZen: ["GET /zen"],\n root: ["GET /"]\n },\n migrations: {\n cancelImport: [\n "DELETE /repos/{owner}/{repo}/import",\n {},\n {\n deprecated: "octokit.rest.migrations.cancelImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#cancel-an-import"\n }\n ],\n deleteArchiveForAuthenticatedUser: [\n "DELETE /user/migrations/{migration_id}/archive"\n ],\n deleteArchiveForOrg: [\n "DELETE /orgs/{org}/migrations/{migration_id}/archive"\n ],\n downloadArchiveForOrg: [\n "GET /orgs/{org}/migrations/{migration_id}/archive"\n ],\n getArchiveForAuthenticatedUser: [\n "GET /user/migrations/{migration_id}/archive"\n ],\n getCommitAuthors: [\n "GET /repos/{owner}/{repo}/import/authors",\n {},\n {\n deprecated: "octokit.rest.migrations.getCommitAuthors() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-commit-authors"\n }\n ],\n getImportStatus: [\n "GET /repos/{owner}/{repo}/import",\n {},\n {\n deprecated: "octokit.rest.migrations.getImportStatus() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-an-import-status"\n }\n ],\n getLargeFiles: [\n "GET /repos/{owner}/{repo}/import/large_files",\n {},\n {\n deprecated: "octokit.rest.migrations.getLargeFiles() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-large-files"\n }\n ],\n getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"],\n getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],\n listForAuthenticatedUser: ["GET /user/migrations"],\n listForOrg: ["GET /orgs/{org}/migrations"],\n listReposForAuthenticatedUser: [\n "GET /user/migrations/{migration_id}/repositories"\n ],\n listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],\n listReposForUser: [\n "GET /user/migrations/{migration_id}/repositories",\n {},\n { renamed: ["migrations", "listReposForAuthenticatedUser"] }\n ],\n mapCommitAuthor: [\n "PATCH /repos/{owner}/{repo}/import/authors/{author_id}",\n {},\n {\n deprecated: "octokit.rest.migrations.mapCommitAuthor() is deprecated, see https://docs.github.com/rest/migrations/source-imports#map-a-commit-author"\n }\n ],\n setLfsPreference: [\n "PATCH /repos/{owner}/{repo}/import/lfs",\n {},\n {\n deprecated: "octokit.rest.migrations.setLfsPreference() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference"\n }\n ],\n startForAuthenticatedUser: ["POST /user/migrations"],\n startForOrg: ["POST /orgs/{org}/migrations"],\n startImport: [\n "PUT /repos/{owner}/{repo}/import",\n {},\n {\n deprecated: "octokit.rest.migrations.startImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#start-an-import"\n }\n ],\n unlockRepoForAuthenticatedUser: [\n "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"\n ],\n unlockRepoForOrg: [\n "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"\n ],\n updateImport: [\n "PATCH /repos/{owner}/{repo}/import",\n {},\n {\n deprecated: "octokit.rest.migrations.updateImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-an-import"\n }\n ]\n },\n orgs: {\n addSecurityManagerTeam: [\n "PUT /orgs/{org}/security-managers/teams/{team_slug}"\n ],\n blockUser: ["PUT /orgs/{org}/blocks/{username}"],\n cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"],\n checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"],\n checkMembershipForUser: ["GET /orgs/{org}/members/{username}"],\n checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"],\n convertMemberToOutsideCollaborator: [\n "PUT /orgs/{org}/outside_collaborators/{username}"\n ],\n createInvitation: ["POST /orgs/{org}/invitations"],\n createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"],\n createOrUpdateCustomPropertiesValuesForRepos: [\n "PATCH /orgs/{org}/properties/values"\n ],\n createOrUpdateCustomProperty: [\n "PUT /orgs/{org}/properties/schema/{custom_property_name}"\n ],\n createWebhook: ["POST /orgs/{org}/hooks"],\n delete: ["DELETE /orgs/{org}"],\n deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],\n enableOrDisableSecurityProductOnAllOrgRepos: [\n "POST /orgs/{org}/{security_product}/{enablement}"\n ],\n get: ["GET /orgs/{org}"],\n getAllCustomProperties: ["GET /orgs/{org}/properties/schema"],\n getCustomProperty: [\n "GET /orgs/{org}/properties/schema/{custom_property_name}"\n ],\n getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"],\n getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"],\n getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"],\n getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"],\n getWebhookDelivery: [\n "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"\n ],\n list: ["GET /organizations"],\n listAppInstallations: ["GET /orgs/{org}/installations"],\n listBlockedUsers: ["GET /orgs/{org}/blocks"],\n listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"],\n listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],\n listForAuthenticatedUser: ["GET /user/orgs"],\n listForUser: ["GET /users/{username}/orgs"],\n listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"],\n listMembers: ["GET /orgs/{org}/members"],\n listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"],\n listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"],\n listPatGrantRepositories: [\n "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"\n ],\n listPatGrantRequestRepositories: [\n "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories"\n ],\n listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"],\n listPatGrants: ["GET /orgs/{org}/personal-access-tokens"],\n listPendingInvitations: ["GET /orgs/{org}/invitations"],\n listPublicMembers: ["GET /orgs/{org}/public_members"],\n listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"],\n listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],\n listWebhooks: ["GET /orgs/{org}/hooks"],\n pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],\n redeliverWebhookDelivery: [\n "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"\n ],\n removeCustomProperty: [\n "DELETE /orgs/{org}/properties/schema/{custom_property_name}"\n ],\n removeMember: ["DELETE /orgs/{org}/members/{username}"],\n removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"],\n removeOutsideCollaborator: [\n "DELETE /orgs/{org}/outside_collaborators/{username}"\n ],\n removePublicMembershipForAuthenticatedUser: [\n "DELETE /orgs/{org}/public_members/{username}"\n ],\n removeSecurityManagerTeam: [\n "DELETE /orgs/{org}/security-managers/teams/{team_slug}"\n ],\n reviewPatGrantRequest: [\n "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"\n ],\n reviewPatGrantRequestsInBulk: [\n "POST /orgs/{org}/personal-access-token-requests"\n ],\n setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],\n setPublicMembershipForAuthenticatedUser: [\n "PUT /orgs/{org}/public_members/{username}"\n ],\n unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],\n update: ["PATCH /orgs/{org}"],\n updateMembershipForAuthenticatedUser: [\n "PATCH /user/memberships/orgs/{org}"\n ],\n updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"],\n updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"],\n updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"],\n updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"]\n },\n packages: {\n deletePackageForAuthenticatedUser: [\n "DELETE /user/packages/{package_type}/{package_name}"\n ],\n deletePackageForOrg: [\n "DELETE /orgs/{org}/packages/{package_type}/{package_name}"\n ],\n deletePackageForUser: [\n "DELETE /users/{username}/packages/{package_type}/{package_name}"\n ],\n deletePackageVersionForAuthenticatedUser: [\n "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n deletePackageVersionForOrg: [\n "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n deletePackageVersionForUser: [\n "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n getAllPackageVersionsForAPackageOwnedByAnOrg: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",\n {},\n { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] }\n ],\n getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions",\n {},\n {\n renamed: [\n "packages",\n "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"\n ]\n }\n ],\n getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions"\n ],\n getAllPackageVersionsForPackageOwnedByOrg: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions"\n ],\n getAllPackageVersionsForPackageOwnedByUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}/versions"\n ],\n getPackageForAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}"\n ],\n getPackageForOrganization: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}"\n ],\n getPackageForUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}"\n ],\n getPackageVersionForAuthenticatedUser: [\n "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n getPackageVersionForOrganization: [\n "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n getPackageVersionForUser: [\n "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"\n ],\n listDockerMigrationConflictingPackagesForAuthenticatedUser: [\n "GET /user/docker/conflicts"\n ],\n listDockerMigrationConflictingPackagesForOrganization: [\n "GET /orgs/{org}/docker/conflicts"\n ],\n listDockerMigrationConflictingPackagesForUser: [\n "GET /users/{username}/docker/conflicts"\n ],\n listPackagesForAuthenticatedUser: ["GET /user/packages"],\n listPackagesForOrganization: ["GET /orgs/{org}/packages"],\n listPackagesForUser: ["GET /users/{username}/packages"],\n restorePackageForAuthenticatedUser: [\n "POST /user/packages/{package_type}/{package_name}/restore{?token}"\n ],\n restorePackageForOrg: [\n "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"\n ],\n restorePackageForUser: [\n "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"\n ],\n restorePackageVersionForAuthenticatedUser: [\n "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"\n ],\n restorePackageVersionForOrg: [\n "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"\n ],\n restorePackageVersionForUser: [\n "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"\n ]\n },\n projects: {\n addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],\n createCard: ["POST /projects/columns/{column_id}/cards"],\n createColumn: ["POST /projects/{project_id}/columns"],\n createForAuthenticatedUser: ["POST /user/projects"],\n createForOrg: ["POST /orgs/{org}/projects"],\n createForRepo: ["POST /repos/{owner}/{repo}/projects"],\n delete: ["DELETE /projects/{project_id}"],\n deleteCard: ["DELETE /projects/columns/cards/{card_id}"],\n deleteColumn: ["DELETE /projects/columns/{column_id}"],\n get: ["GET /projects/{project_id}"],\n getCard: ["GET /projects/columns/cards/{card_id}"],\n getColumn: ["GET /projects/columns/{column_id}"],\n getPermissionForUser: [\n "GET /projects/{project_id}/collaborators/{username}/permission"\n ],\n listCards: ["GET /projects/columns/{column_id}/cards"],\n listCollaborators: ["GET /projects/{project_id}/collaborators"],\n listColumns: ["GET /projects/{project_id}/columns"],\n listForOrg: ["GET /orgs/{org}/projects"],\n listForRepo: ["GET /repos/{owner}/{repo}/projects"],\n listForUser: ["GET /users/{username}/projects"],\n moveCard: ["POST /projects/columns/cards/{card_id}/moves"],\n moveColumn: ["POST /projects/columns/{column_id}/moves"],\n removeCollaborator: [\n "DELETE /projects/{project_id}/collaborators/{username}"\n ],\n update: ["PATCH /projects/{project_id}"],\n updateCard: ["PATCH /projects/columns/cards/{card_id}"],\n updateColumn: ["PATCH /projects/columns/{column_id}"]\n },\n pulls: {\n checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],\n create: ["POST /repos/{owner}/{repo}/pulls"],\n createReplyForReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"\n ],\n createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],\n createReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"\n ],\n deletePendingReview: [\n "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"\n ],\n deleteReviewComment: [\n "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"\n ],\n dismissReview: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"\n ],\n get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"],\n getReview: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"\n ],\n getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],\n list: ["GET /repos/{owner}/{repo}/pulls"],\n listCommentsForReview: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"\n ],\n listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],\n listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],\n listRequestedReviewers: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"\n ],\n listReviewComments: [\n "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"\n ],\n listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"],\n listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],\n merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],\n removeRequestedReviewers: [\n "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"\n ],\n requestReviewers: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"\n ],\n submitReview: [\n "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"\n ],\n update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],\n updateBranch: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"\n ],\n updateReview: [\n "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"\n ],\n updateReviewComment: [\n "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"\n ]\n },\n rateLimit: { get: ["GET /rate_limit"] },\n reactions: {\n createForCommitComment: [\n "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"\n ],\n createForIssue: [\n "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"\n ],\n createForIssueComment: [\n "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"\n ],\n createForPullRequestReviewComment: [\n "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"\n ],\n createForRelease: [\n "POST /repos/{owner}/{repo}/releases/{release_id}/reactions"\n ],\n createForTeamDiscussionCommentInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"\n ],\n createForTeamDiscussionInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"\n ],\n deleteForCommitComment: [\n "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"\n ],\n deleteForIssue: [\n "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"\n ],\n deleteForIssueComment: [\n "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"\n ],\n deleteForPullRequestComment: [\n "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"\n ],\n deleteForRelease: [\n "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"\n ],\n deleteForTeamDiscussion: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"\n ],\n deleteForTeamDiscussionComment: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"\n ],\n listForCommitComment: [\n "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"\n ],\n listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],\n listForIssueComment: [\n "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"\n ],\n listForPullRequestReviewComment: [\n "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"\n ],\n listForRelease: [\n "GET /repos/{owner}/{repo}/releases/{release_id}/reactions"\n ],\n listForTeamDiscussionCommentInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"\n ],\n listForTeamDiscussionInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"\n ]\n },\n repos: {\n acceptInvitation: [\n "PATCH /user/repository_invitations/{invitation_id}",\n {},\n { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] }\n ],\n acceptInvitationForAuthenticatedUser: [\n "PATCH /user/repository_invitations/{invitation_id}"\n ],\n addAppAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" }\n ],\n addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"],\n addStatusCheckContexts: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" }\n ],\n addTeamAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" }\n ],\n addUserAccessRestrictions: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" }\n ],\n checkAutomatedSecurityFixes: [\n "GET /repos/{owner}/{repo}/automated-security-fixes"\n ],\n checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"],\n checkVulnerabilityAlerts: [\n "GET /repos/{owner}/{repo}/vulnerability-alerts"\n ],\n codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],\n compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],\n compareCommitsWithBasehead: [\n "GET /repos/{owner}/{repo}/compare/{basehead}"\n ],\n createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],\n createCommitComment: [\n "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"\n ],\n createCommitSignatureProtection: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"\n ],\n createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"],\n createDeployKey: ["POST /repos/{owner}/{repo}/keys"],\n createDeployment: ["POST /repos/{owner}/{repo}/deployments"],\n createDeploymentBranchPolicy: [\n "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"\n ],\n createDeploymentProtectionRule: [\n "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"\n ],\n createDeploymentStatus: [\n "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"\n ],\n createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"],\n createForAuthenticatedUser: ["POST /user/repos"],\n createFork: ["POST /repos/{owner}/{repo}/forks"],\n createInOrg: ["POST /orgs/{org}/repos"],\n createOrUpdateEnvironment: [\n "PUT /repos/{owner}/{repo}/environments/{environment_name}"\n ],\n createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"],\n createOrgRuleset: ["POST /orgs/{org}/rulesets"],\n createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"],\n createPagesSite: ["POST /repos/{owner}/{repo}/pages"],\n createRelease: ["POST /repos/{owner}/{repo}/releases"],\n createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"],\n createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],\n createUsingTemplate: [\n "POST /repos/{template_owner}/{template_repo}/generate"\n ],\n createWebhook: ["POST /repos/{owner}/{repo}/hooks"],\n declineInvitation: [\n "DELETE /user/repository_invitations/{invitation_id}",\n {},\n { renamed: ["repos", "declineInvitationForAuthenticatedUser"] }\n ],\n declineInvitationForAuthenticatedUser: [\n "DELETE /user/repository_invitations/{invitation_id}"\n ],\n delete: ["DELETE /repos/{owner}/{repo}"],\n deleteAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"\n ],\n deleteAdminBranchProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"\n ],\n deleteAnEnvironment: [\n "DELETE /repos/{owner}/{repo}/environments/{environment_name}"\n ],\n deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],\n deleteBranchProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection"\n ],\n deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],\n deleteCommitSignatureProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"\n ],\n deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"],\n deleteDeployment: [\n "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"\n ],\n deleteDeploymentBranchPolicy: [\n "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"\n ],\n deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"],\n deleteInvitation: [\n "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"\n ],\n deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"],\n deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"],\n deletePullRequestReviewProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"\n ],\n deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"],\n deleteReleaseAsset: [\n "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"\n ],\n deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"],\n deleteTagProtection: [\n "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"\n ],\n deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],\n disableAutomatedSecurityFixes: [\n "DELETE /repos/{owner}/{repo}/automated-security-fixes"\n ],\n disableDeploymentProtectionRule: [\n "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"\n ],\n disablePrivateVulnerabilityReporting: [\n "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting"\n ],\n disableVulnerabilityAlerts: [\n "DELETE /repos/{owner}/{repo}/vulnerability-alerts"\n ],\n downloadArchive: [\n "GET /repos/{owner}/{repo}/zipball/{ref}",\n {},\n { renamed: ["repos", "downloadZipballArchive"] }\n ],\n downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"],\n downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"],\n enableAutomatedSecurityFixes: [\n "PUT /repos/{owner}/{repo}/automated-security-fixes"\n ],\n enablePrivateVulnerabilityReporting: [\n "PUT /repos/{owner}/{repo}/private-vulnerability-reporting"\n ],\n enableVulnerabilityAlerts: [\n "PUT /repos/{owner}/{repo}/vulnerability-alerts"\n ],\n generateReleaseNotes: [\n "POST /repos/{owner}/{repo}/releases/generate-notes"\n ],\n get: ["GET /repos/{owner}/{repo}"],\n getAccessRestrictions: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"\n ],\n getAdminBranchProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"\n ],\n getAllDeploymentProtectionRules: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"\n ],\n getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"],\n getAllStatusCheckContexts: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"\n ],\n getAllTopics: ["GET /repos/{owner}/{repo}/topics"],\n getAppsWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"\n ],\n getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],\n getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"],\n getBranchProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection"\n ],\n getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"],\n getClones: ["GET /repos/{owner}/{repo}/traffic/clones"],\n getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"],\n getCollaboratorPermissionLevel: [\n "GET /repos/{owner}/{repo}/collaborators/{username}/permission"\n ],\n getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"],\n getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"],\n getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"],\n getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"],\n getCommitSignatureProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"\n ],\n getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"],\n getContent: ["GET /repos/{owner}/{repo}/contents/{path}"],\n getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"],\n getCustomDeploymentProtectionRule: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"\n ],\n getCustomPropertiesValues: ["GET /repos/{owner}/{repo}/properties/values"],\n getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"],\n getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],\n getDeploymentBranchPolicy: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"\n ],\n getDeploymentStatus: [\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"\n ],\n getEnvironment: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}"\n ],\n getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"],\n getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"],\n getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"],\n getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"],\n getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"],\n getOrgRulesets: ["GET /orgs/{org}/rulesets"],\n getPages: ["GET /repos/{owner}/{repo}/pages"],\n getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],\n getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"],\n getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"],\n getPullRequestReviewProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"\n ],\n getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"],\n getReadme: ["GET /repos/{owner}/{repo}/readme"],\n getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"],\n getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"],\n getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],\n getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"],\n getRepoRuleSuite: [\n "GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"\n ],\n getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"],\n getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"],\n getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"],\n getStatusChecksProtection: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"\n ],\n getTeamsWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"\n ],\n getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"],\n getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"],\n getUsersWithAccessToProtectedBranch: [\n "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"\n ],\n getViews: ["GET /repos/{owner}/{repo}/traffic/views"],\n getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"],\n getWebhookConfigForRepo: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/config"\n ],\n getWebhookDelivery: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"\n ],\n listActivities: ["GET /repos/{owner}/{repo}/activity"],\n listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],\n listBranches: ["GET /repos/{owner}/{repo}/branches"],\n listBranchesForHeadCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"\n ],\n listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"],\n listCommentsForCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"\n ],\n listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"],\n listCommitStatusesForRef: [\n "GET /repos/{owner}/{repo}/commits/{ref}/statuses"\n ],\n listCommits: ["GET /repos/{owner}/{repo}/commits"],\n listContributors: ["GET /repos/{owner}/{repo}/contributors"],\n listCustomDeploymentRuleIntegrations: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps"\n ],\n listDeployKeys: ["GET /repos/{owner}/{repo}/keys"],\n listDeploymentBranchPolicies: [\n "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"\n ],\n listDeploymentStatuses: [\n "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"\n ],\n listDeployments: ["GET /repos/{owner}/{repo}/deployments"],\n listForAuthenticatedUser: ["GET /user/repos"],\n listForOrg: ["GET /orgs/{org}/repos"],\n listForUser: ["GET /users/{username}/repos"],\n listForks: ["GET /repos/{owner}/{repo}/forks"],\n listInvitations: ["GET /repos/{owner}/{repo}/invitations"],\n listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"],\n listLanguages: ["GET /repos/{owner}/{repo}/languages"],\n listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"],\n listPublic: ["GET /repositories"],\n listPullRequestsAssociatedWithCommit: [\n "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"\n ],\n listReleaseAssets: [\n "GET /repos/{owner}/{repo}/releases/{release_id}/assets"\n ],\n listReleases: ["GET /repos/{owner}/{repo}/releases"],\n listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],\n listTags: ["GET /repos/{owner}/{repo}/tags"],\n listTeams: ["GET /repos/{owner}/{repo}/teams"],\n listWebhookDeliveries: [\n "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"\n ],\n listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],\n merge: ["POST /repos/{owner}/{repo}/merges"],\n mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],\n pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],\n redeliverWebhookDelivery: [\n "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"\n ],\n removeAppAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" }\n ],\n removeCollaborator: [\n "DELETE /repos/{owner}/{repo}/collaborators/{username}"\n ],\n removeStatusCheckContexts: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" }\n ],\n removeStatusCheckProtection: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"\n ],\n removeTeamAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" }\n ],\n removeUserAccessRestrictions: [\n "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" }\n ],\n renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"],\n replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"],\n requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"],\n setAdminBranchProtection: [\n "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"\n ],\n setAppAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",\n {},\n { mapToData: "apps" }\n ],\n setStatusCheckContexts: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",\n {},\n { mapToData: "contexts" }\n ],\n setTeamAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",\n {},\n { mapToData: "teams" }\n ],\n setUserAccessRestrictions: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",\n {},\n { mapToData: "users" }\n ],\n testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],\n transfer: ["POST /repos/{owner}/{repo}/transfer"],\n update: ["PATCH /repos/{owner}/{repo}"],\n updateBranchProtection: [\n "PUT /repos/{owner}/{repo}/branches/{branch}/protection"\n ],\n updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],\n updateDeploymentBranchPolicy: [\n "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"\n ],\n updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"],\n updateInvitation: [\n "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"\n ],\n updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"],\n updatePullRequestReviewProtection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"\n ],\n updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"],\n updateReleaseAsset: [\n "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"\n ],\n updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"],\n updateStatusCheckPotection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",\n {},\n { renamed: ["repos", "updateStatusCheckProtection"] }\n ],\n updateStatusCheckProtection: [\n "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"\n ],\n updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],\n updateWebhookConfigForRepo: [\n "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"\n ],\n uploadReleaseAsset: [\n "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",\n { baseUrl: "https://uploads.github.com" }\n ]\n },\n search: {\n code: ["GET /search/code"],\n commits: ["GET /search/commits"],\n issuesAndPullRequests: ["GET /search/issues"],\n labels: ["GET /search/labels"],\n repos: ["GET /search/repositories"],\n topics: ["GET /search/topics"],\n users: ["GET /search/users"]\n },\n secretScanning: {\n getAlert: [\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"\n ],\n listAlertsForEnterprise: [\n "GET /enterprises/{enterprise}/secret-scanning/alerts"\n ],\n listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],\n listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],\n listLocationsForAlert: [\n "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"\n ],\n updateAlert: [\n "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"\n ]\n },\n securityAdvisories: {\n createPrivateVulnerabilityReport: [\n "POST /repos/{owner}/{repo}/security-advisories/reports"\n ],\n createRepositoryAdvisory: [\n "POST /repos/{owner}/{repo}/security-advisories"\n ],\n createRepositoryAdvisoryCveRequest: [\n "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve"\n ],\n getGlobalAdvisory: ["GET /advisories/{ghsa_id}"],\n getRepositoryAdvisory: [\n "GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"\n ],\n listGlobalAdvisories: ["GET /advisories"],\n listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"],\n listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"],\n updateRepositoryAdvisory: [\n "PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"\n ]\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"\n ],\n addOrUpdateProjectPermissionsInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"\n ],\n addOrUpdateRepoPermissionsInOrg: [\n "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"\n ],\n checkPermissionsForProjectInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"\n ],\n checkPermissionsForRepoInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"\n ],\n create: ["POST /orgs/{org}/teams"],\n createDiscussionCommentInOrg: [\n "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"\n ],\n createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"],\n deleteDiscussionCommentInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"\n ],\n deleteDiscussionInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"\n ],\n deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"],\n getByName: ["GET /orgs/{org}/teams/{team_slug}"],\n getDiscussionCommentInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"\n ],\n getDiscussionInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"\n ],\n getMembershipForUserInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/memberships/{username}"\n ],\n list: ["GET /orgs/{org}/teams"],\n listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"],\n listDiscussionCommentsInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"\n ],\n listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"],\n listForAuthenticatedUser: ["GET /user/teams"],\n listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"],\n listPendingInvitationsInOrg: [\n "GET /orgs/{org}/teams/{team_slug}/invitations"\n ],\n listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"],\n listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"],\n removeMembershipForUserInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"\n ],\n removeProjectInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"\n ],\n removeRepoInOrg: [\n "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"\n ],\n updateDiscussionCommentInOrg: [\n "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"\n ],\n updateDiscussionInOrg: [\n "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"\n ],\n updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"]\n },\n users: {\n addEmailForAuthenticated: [\n "POST /user/emails",\n {},\n { renamed: ["users", "addEmailForAuthenticatedUser"] }\n ],\n addEmailForAuthenticatedUser: ["POST /user/emails"],\n addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"],\n block: ["PUT /user/blocks/{username}"],\n checkBlocked: ["GET /user/blocks/{username}"],\n checkFollowingForUser: ["GET /users/{username}/following/{target_user}"],\n checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"],\n createGpgKeyForAuthenticated: [\n "POST /user/gpg_keys",\n {},\n { renamed: ["users", "createGpgKeyForAuthenticatedUser"] }\n ],\n createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],\n createPublicSshKeyForAuthenticated: [\n "POST /user/keys",\n {},\n { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] }\n ],\n createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],\n createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"],\n deleteEmailForAuthenticated: [\n "DELETE /user/emails",\n {},\n { renamed: ["users", "deleteEmailForAuthenticatedUser"] }\n ],\n deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],\n deleteGpgKeyForAuthenticated: [\n "DELETE /user/gpg_keys/{gpg_key_id}",\n {},\n { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] }\n ],\n deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],\n deletePublicSshKeyForAuthenticated: [\n "DELETE /user/keys/{key_id}",\n {},\n { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] }\n ],\n deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"],\n deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"],\n deleteSshSigningKeyForAuthenticatedUser: [\n "DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"\n ],\n follow: ["PUT /user/following/{username}"],\n getAuthenticated: ["GET /user"],\n getByUsername: ["GET /users/{username}"],\n getContextForUser: ["GET /users/{username}/hovercard"],\n getGpgKeyForAuthenticated: [\n "GET /user/gpg_keys/{gpg_key_id}",\n {},\n { renamed: ["users", "getGpgKeyForAuthenticatedUser"] }\n ],\n getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],\n getPublicSshKeyForAuthenticated: [\n "GET /user/keys/{key_id}",\n {},\n { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] }\n ],\n getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],\n getSshSigningKeyForAuthenticatedUser: [\n "GET /user/ssh_signing_keys/{ssh_signing_key_id}"\n ],\n list: ["GET /users"],\n listBlockedByAuthenticated: [\n "GET /user/blocks",\n {},\n { renamed: ["users", "listBlockedByAuthenticatedUser"] }\n ],\n listBlockedByAuthenticatedUser: ["GET /user/blocks"],\n listEmailsForAuthenticated: [\n "GET /user/emails",\n {},\n { renamed: ["users", "listEmailsForAuthenticatedUser"] }\n ],\n listEmailsForAuthenticatedUser: ["GET /user/emails"],\n listFollowedByAuthenticated: [\n "GET /user/following",\n {},\n { renamed: ["users", "listFollowedByAuthenticatedUser"] }\n ],\n listFollowedByAuthenticatedUser: ["GET /user/following"],\n listFollowersForAuthenticatedUser: ["GET /user/followers"],\n listFollowersForUser: ["GET /users/{username}/followers"],\n listFollowingForUser: ["GET /users/{username}/following"],\n listGpgKeysForAuthenticated: [\n "GET /user/gpg_keys",\n {},\n { renamed: ["users", "listGpgKeysForAuthenticatedUser"] }\n ],\n listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],\n listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],\n listPublicEmailsForAuthenticated: [\n "GET /user/public_emails",\n {},\n { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] }\n ],\n listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],\n listPublicKeysForUser: ["GET /users/{username}/keys"],\n listPublicSshKeysForAuthenticated: [\n "GET /user/keys",\n {},\n { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] }\n ],\n listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],\n listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"],\n listSocialAccountsForUser: ["GET /users/{username}/social_accounts"],\n listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"],\n listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"],\n setPrimaryEmailVisibilityForAuthenticated: [\n "PATCH /user/email/visibility",\n {},\n { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] }\n ],\n setPrimaryEmailVisibilityForAuthenticatedUser: [\n "PATCH /user/email/visibility"\n ],\n unblock: ["DELETE /user/blocks/{username}"],\n unfollow: ["DELETE /user/following/{username}"],\n updateAuthenticated: ["PATCH /user"]\n }\n};\nvar endpoints_default = Endpoints;\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/endpoints-to-methods.js\n\nconst endpointMethodsMap = /* @__PURE__ */ new Map();\nfor (const [scope, endpoints] of Object.entries(endpoints_default)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign(\n {\n method,\n url\n },\n defaults\n );\n if (!endpointMethodsMap.has(scope)) {\n endpointMethodsMap.set(scope, /* @__PURE__ */ new Map());\n }\n endpointMethodsMap.get(scope).set(methodName, {\n scope,\n methodName,\n endpointDefaults,\n decorations\n });\n }\n}\nconst handler = {\n has({ scope }, methodName) {\n return endpointMethodsMap.get(scope).has(methodName);\n },\n getOwnPropertyDescriptor(target, methodName) {\n return {\n value: this.get(target, methodName),\n // ensures method is in the cache\n configurable: true,\n writable: true,\n enumerable: true\n };\n },\n defineProperty(target, methodName, descriptor) {\n Object.defineProperty(target.cache, methodName, descriptor);\n return true;\n },\n deleteProperty(target, methodName) {\n delete target.cache[methodName];\n return true;\n },\n ownKeys({ scope }) {\n return [...endpointMethodsMap.get(scope).keys()];\n },\n set(target, methodName, value) {\n return target.cache[methodName] = value;\n },\n get({ octokit, scope, cache }, methodName) {\n if (cache[methodName]) {\n return cache[methodName];\n }\n const method = endpointMethodsMap.get(scope).get(methodName);\n if (!method) {\n return void 0;\n }\n const { endpointDefaults, decorations } = method;\n if (decorations) {\n cache[methodName] = decorate(\n octokit,\n scope,\n methodName,\n endpointDefaults,\n decorations\n );\n } else {\n cache[methodName] = octokit.request.defaults(endpointDefaults);\n }\n return cache[methodName];\n }\n};\nfunction endpointsToMethods(octokit) {\n const newMethods = {};\n for (const scope of endpointMethodsMap.keys()) {\n newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler);\n }\n return newMethods;\n}\nfunction decorate(octokit, scope, methodName, defaults, decorations) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n function withDecorations(...args) {\n let options = requestWithDefaults.endpoint.merge(...args);\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: void 0\n });\n return requestWithDefaults(options);\n }\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(\n `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`\n );\n }\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n if (decorations.renamedParameters) {\n const options2 = requestWithDefaults.endpoint.merge(...args);\n for (const [name, alias] of Object.entries(\n decorations.renamedParameters\n )) {\n if (name in options2) {\n octokit.log.warn(\n `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`\n );\n if (!(alias in options2)) {\n options2[alias] = options2[name];\n }\n delete options2[name];\n }\n }\n return requestWithDefaults(options2);\n }\n return requestWithDefaults(...args);\n }\n return Object.assign(withDecorations, requestWithDefaults);\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/index.js\n\n\nfunction restEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit);\n return {\n rest: api\n };\n}\nrestEndpointMethods.VERSION = VERSION;\nfunction legacyRestEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit);\n return {\n ...api,\n rest: api\n };\n}\nlegacyRestEndpointMethods.VERSION = VERSION;\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFNLEdBQUcsV0FBVyxpQ0FBaUMsU0FBUyxHQUFHLGNBQWM7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLEtBQUsseUNBQXlDLE1BQU0sR0FBRyxXQUFXLFlBQVksTUFBTTtBQUNwRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdFOzs7QUM1SHFDO0FBQ3dCO0FBQy9EO0FBQ0EsY0FBYyxrQkFBa0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsT0FBTztBQUNyQztBQUNBLGNBQWMsa0JBQWtCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsT0FBTztBQUl6QyIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LXNyYy92ZXJzaW9uLmpzPzljYTYiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9Ab2N0b2tpdC9wbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzL2Rpc3Qtc3JjL2dlbmVyYXRlZC9lbmRwb2ludHMuanM/OTQ0MiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHMvZGlzdC1zcmMvZW5kcG9pbnRzLXRvLW1ldGhvZHMuanM/NDU2OCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHMvZGlzdC1zcmMvaW5kZXguanM/YWEzNiJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBWRVJTSU9OID0gXCIxMC4yLjBcIjtcbmV4cG9ydCB7XG4gIFZFUlNJT05cbn07XG4iLCJjb25zdCBFbmRwb2ludHMgPSB7XG4gIGFjdGlvbnM6IHtcbiAgICBhZGRDdXN0b21MYWJlbHNUb1NlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGFkZEN1c3RvbUxhYmVsc1RvU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhcHByb3ZlV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FwcHJvdmVcIlxuICAgIF0sXG4gICAgY2FuY2VsV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2NhbmNlbFwiXG4gICAgXSxcbiAgICBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJQVVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPcmdWYXJpYWJsZTogW1wiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlc1wiXSxcbiAgICBjcmVhdGVSZWdpc3RyYXRpb25Ub2tlbkZvck9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVnaXN0cmF0aW9uVG9rZW5Gb3JSZXBvOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVtb3ZlVG9rZW5Gb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXSxcbiAgICBjcmVhdGVSZW1vdmVUb2tlbkZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvVmFyaWFibGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGNyZWF0ZVdvcmtmbG93RGlzcGF0Y2g6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNwYXRjaGVzXCJcbiAgICBdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5SWQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlcy97Y2FjaGVfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5S2V5OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXN7P2tleSxyZWZ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUFydGlmYWN0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlRW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZU9yZ1ZhcmlhYmxlOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVSZXBvVmFyaWFibGU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21Pcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVTZWxmSG9zdGVkUnVubmVyRnJvbVJlcG86IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlV29ya2Zsb3dSdW46IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgIGRlbGV0ZVdvcmtmbG93UnVuTG9nczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9sb2dzXCJcbiAgICBdLFxuICAgIGRpc2FibGVTZWxlY3RlZFJlcG9zaXRvcnlHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgZGlzYWJsZVdvcmtmbG93OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNhYmxlXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJ0aWZhY3Q6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0cy97YXJ0aWZhY3RfaWR9L3thcmNoaXZlX2Zvcm1hdH1cIlxuICAgIF0sXG4gICAgZG93bmxvYWRKb2JMb2dzRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2pvYnMve2pvYl9pZH0vbG9nc1wiXG4gICAgXSxcbiAgICBkb3dubG9hZFdvcmtmbG93UnVuQXR0ZW1wdExvZ3M6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfS9sb2dzXCJcbiAgICBdLFxuICAgIGRvd25sb2FkV29ya2Zsb3dSdW5Mb2dzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2xvZ3NcIlxuICAgIF0sXG4gICAgZW5hYmxlU2VsZWN0ZWRSZXBvc2l0b3J5R2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGVuYWJsZVdvcmtmbG93OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9lbmFibGVcIlxuICAgIF0sXG4gICAgZm9yY2VDYW5jZWxXb3JrZmxvd1J1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vZm9yY2UtY2FuY2VsXCJcbiAgICBdLFxuICAgIGdlbmVyYXRlUnVubmVySml0Y29uZmlnRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL2dlbmVyYXRlLWppdGNvbmZpZ1wiXG4gICAgXSxcbiAgICBnZW5lcmF0ZVJ1bm5lckppdGNvbmZpZ0ZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL2dlbmVyYXRlLWppdGNvbmZpZ1wiXG4gICAgXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVMaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzXCJdLFxuICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VCeVJlcG9Gb3JPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2UtYnktcmVwb3NpdG9yeVwiXG4gICAgXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVVc2FnZUZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWxsb3dlZEFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxvd2VkQWN0aW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0QXJ0aWZhY3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXSxcbiAgICBnZXRFbnZpcm9ubWVudFB1YmxpY0tleTogW1xuICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3B1YmxpYy1rZXlcIlxuICAgIF0sXG4gICAgZ2V0RW52aXJvbm1lbnRTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldEVudmlyb25tZW50VmFyaWFibGU6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzL3tuYW1lfVwiXG4gICAgXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIGdldEpvYkZvcldvcmtmbG93UnVuOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvam9icy97am9iX2lkfVwiXSxcbiAgICBnZXRPcmdQdWJsaWNLZXk6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRPcmdTZWNyZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBnZXRPcmdWYXJpYWJsZTogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXSxcbiAgICBnZXRQZW5kaW5nRGVwbG95bWVudHNGb3JSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiXG4gICAgXSxcbiAgICBnZXRSZXBvUGVybWlzc2lvbnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiYWN0aW9uc1wiLCBcImdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnlcIl0gfVxuICAgIF0sXG4gICAgZ2V0UmVwb1B1YmxpY0tleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFJlcG9WYXJpYWJsZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIl0sXG4gICAgZ2V0UmV2aWV3c0ZvclJ1bjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcHByb3ZhbHNcIlxuICAgIF0sXG4gICAgZ2V0U2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXSxcbiAgICBnZXRTZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXG4gICAgXSxcbiAgICBnZXRXb3JrZmxvdzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9XCJdLFxuICAgIGdldFdvcmtmbG93QWNjZXNzVG9SZXBvc2l0b3J5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9hY2Nlc3NcIlxuICAgIF0sXG4gICAgZ2V0V29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgIGdldFdvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGdldFdvcmtmbG93UnVuVXNhZ2U6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vdGltaW5nXCJcbiAgICBdLFxuICAgIGdldFdvcmtmbG93VXNhZ2U6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3RpbWluZ1wiXG4gICAgXSxcbiAgICBsaXN0QXJ0aWZhY3RzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiXSxcbiAgICBsaXN0RW52aXJvbm1lbnRTZWNyZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3NlY3JldHNcIlxuICAgIF0sXG4gICAgbGlzdEVudmlyb25tZW50VmFyaWFibGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3ZhcmlhYmxlc1wiXG4gICAgXSxcbiAgICBsaXN0Sm9ic0ZvcldvcmtmbG93UnVuOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2pvYnNcIlxuICAgIF0sXG4gICAgbGlzdEpvYnNGb3JXb3JrZmxvd1J1bkF0dGVtcHQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfS9qb2JzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdE9yZ1NlY3JldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHNcIl0sXG4gICAgbGlzdE9yZ1ZhcmlhYmxlczogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGxpc3RSZXBvT3JnYW5pemF0aW9uU2VjcmV0czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvb3JnYW5pemF0aW9uLXNlY3JldHNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9Pcmdhbml6YXRpb25WYXJpYWJsZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL29yZ2FuaXphdGlvbi12YXJpYWJsZXNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb1ZhcmlhYmxlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlc1wiXSxcbiAgICBsaXN0UmVwb1dvcmtmbG93czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93c1wiXSxcbiAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL2Rvd25sb2Fkc1wiXSxcbiAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yUmVwbzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9kb3dubG9hZHNcIlxuICAgIF0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0U2VsZWN0ZWRSZXBvc0Zvck9yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zaXRvcmllc0VuYWJsZWRHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0U2VsZkhvc3RlZFJ1bm5lcnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnNcIl0sXG4gICAgbGlzdFNlbGZIb3N0ZWRSdW5uZXJzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIl0sXG4gICAgbGlzdFdvcmtmbG93UnVuQXJ0aWZhY3RzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiXG4gICAgXSxcbiAgICBsaXN0V29ya2Zsb3dSdW5zOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCJcbiAgICBdLFxuICAgIGxpc3RXb3JrZmxvd1J1bnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiXSxcbiAgICByZVJ1bkpvYkZvcldvcmtmbG93UnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvam9icy97am9iX2lkfS9yZXJ1blwiXG4gICAgXSxcbiAgICByZVJ1bldvcmtmbG93OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcmVydW5cIl0sXG4gICAgcmVSdW5Xb3JrZmxvd0ZhaWxlZEpvYnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L3JlcnVuLWZhaWxlZC1qb2JzXCJcbiAgICBdLFxuICAgIHJlbW92ZUFsbEN1c3RvbUxhYmVsc0Zyb21TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHJlbW92ZUFsbEN1c3RvbUxhYmVsc0Zyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQ3VzdG9tTGFiZWxGcm9tU2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVscy97bmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlQ3VzdG9tTGFiZWxGcm9tU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdWYXJpYWJsZTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmV2aWV3Q3VzdG9tR2F0ZXNGb3JSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlXCJcbiAgICBdLFxuICAgIHJldmlld1BlbmRpbmdEZXBsb3ltZW50c0ZvclJ1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiXG4gICAgXSxcbiAgICBzZXRBbGxvd2VkQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJcbiAgICBdLFxuICAgIHNldEFsbG93ZWRBY3Rpb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXG4gICAgXSxcbiAgICBzZXRDdXN0b21MYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBzZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgc2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIlxuICAgIF0sXG4gICAgc2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBzZXRTZWxlY3RlZFJlcG9zRm9yT3JnVmFyaWFibGU6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc2l0b3JpZXNFbmFibGVkR2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc2V0V29ya2Zsb3dBY2Nlc3NUb1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL2FjY2Vzc1wiXG4gICAgXSxcbiAgICB1cGRhdGVFbnZpcm9ubWVudFZhcmlhYmxlOiBbXG4gICAgICBcIlBBVENIIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzL3tuYW1lfVwiXG4gICAgXSxcbiAgICB1cGRhdGVPcmdWYXJpYWJsZTogW1wiUEFUQ0ggL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJdLFxuICAgIHVwZGF0ZVJlcG9WYXJpYWJsZTogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdXG4gIH0sXG4gIGFjdGl2aXR5OiB7XG4gICAgY2hlY2tSZXBvSXNTdGFycmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N0YXJyZWQve293bmVyfS97cmVwb31cIl0sXG4gICAgZGVsZXRlUmVwb1N1YnNjcmlwdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgZGVsZXRlVGhyZWFkU3Vic2NyaXB0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9L3N1YnNjcmlwdGlvblwiXG4gICAgXSxcbiAgICBnZXRGZWVkczogW1wiR0VUIC9mZWVkc1wiXSxcbiAgICBnZXRSZXBvU3Vic2NyaXB0aW9uOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmlwdGlvblwiXSxcbiAgICBnZXRUaHJlYWQ6IFtcIkdFVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgIGdldFRocmVhZFN1YnNjcmlwdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9L3N1YnNjcmlwdGlvblwiXG4gICAgXSxcbiAgICBsaXN0RXZlbnRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHNcIl0sXG4gICAgbGlzdE5vdGlmaWNhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC9ub3RpZmljYXRpb25zXCJdLFxuICAgIGxpc3RPcmdFdmVudHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL29yZ3Mve29yZ31cIlxuICAgIF0sXG4gICAgbGlzdFB1YmxpY0V2ZW50czogW1wiR0VUIC9ldmVudHNcIl0sXG4gICAgbGlzdFB1YmxpY0V2ZW50c0ZvclJlcG9OZXR3b3JrOiBbXCJHRVQgL25ldHdvcmtzL3tvd25lcn0ve3JlcG99L2V2ZW50c1wiXSxcbiAgICBsaXN0UHVibGljRXZlbnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIl0sXG4gICAgbGlzdFB1YmxpY09yZ0V2ZW50czogW1wiR0VUIC9vcmdzL3tvcmd9L2V2ZW50c1wiXSxcbiAgICBsaXN0UmVjZWl2ZWRFdmVudHNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCJdLFxuICAgIGxpc3RSZWNlaXZlZFB1YmxpY0V2ZW50c0ZvclVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50cy9wdWJsaWNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9FdmVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZXZlbnRzXCJdLFxuICAgIGxpc3RSZXBvTm90aWZpY2F0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0UmVwb3NTdGFycmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N0YXJyZWRcIl0sXG4gICAgbGlzdFJlcG9zU3RhcnJlZEJ5VXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3N0YXJyZWRcIl0sXG4gICAgbGlzdFJlcG9zV2F0Y2hlZEJ5VXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3N1YnNjcmlwdGlvbnNcIl0sXG4gICAgbGlzdFN0YXJnYXplcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIl0sXG4gICAgbGlzdFdhdGNoZWRSZXBvc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3Vic2NyaXB0aW9uc1wiXSxcbiAgICBsaXN0V2F0Y2hlcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmliZXJzXCJdLFxuICAgIG1hcmtOb3RpZmljYXRpb25zQXNSZWFkOiBbXCJQVVQgL25vdGlmaWNhdGlvbnNcIl0sXG4gICAgbWFya1JlcG9Ob3RpZmljYXRpb25zQXNSZWFkOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L25vdGlmaWNhdGlvbnNcIl0sXG4gICAgbWFya1RocmVhZEFzUmVhZDogW1wiUEFUQ0ggL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfVwiXSxcbiAgICBzZXRSZXBvU3Vic2NyaXB0aW9uOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmlwdGlvblwiXSxcbiAgICBzZXRUaHJlYWRTdWJzY3JpcHRpb246IFtcbiAgICAgIFwiUFVUIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH0vc3Vic2NyaXB0aW9uXCJcbiAgICBdLFxuICAgIHN0YXJSZXBvRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBVVCAvdXNlci9zdGFycmVkL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIHVuc3RhclJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL3N0YXJyZWQve293bmVyfS97cmVwb31cIl1cbiAgfSxcbiAgYXBwczoge1xuICAgIGFkZFJlcG9Ub0luc3RhbGxhdGlvbjogW1xuICAgICAgXCJQVVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiYXBwc1wiLCBcImFkZFJlcG9Ub0luc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGFkZFJlcG9Ub0luc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBVVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgY2hlY2tUb2tlbjogW1wiUE9TVCAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgIGNyZWF0ZUZyb21NYW5pZmVzdDogW1wiUE9TVCAvYXBwLW1hbmlmZXN0cy97Y29kZX0vY29udmVyc2lvbnNcIl0sXG4gICAgY3JlYXRlSW5zdGFsbGF0aW9uQWNjZXNzVG9rZW46IFtcbiAgICAgIFwiUE9TVCAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vYWNjZXNzX3Rva2Vuc1wiXG4gICAgXSxcbiAgICBkZWxldGVBdXRob3JpemF0aW9uOiBbXCJERUxFVEUgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS9ncmFudFwiXSxcbiAgICBkZWxldGVJbnN0YWxsYXRpb246IFtcIkRFTEVURSAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH1cIl0sXG4gICAgZGVsZXRlVG9rZW46IFtcIkRFTEVURSAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgIGdldEF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvYXBwXCJdLFxuICAgIGdldEJ5U2x1ZzogW1wiR0VUIC9hcHBzL3thcHBfc2x1Z31cIl0sXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBbXCJHRVQgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9XCJdLFxuICAgIGdldE9yZ0luc3RhbGxhdGlvbjogW1wiR0VUIC9vcmdzL3tvcmd9L2luc3RhbGxhdGlvblwiXSxcbiAgICBnZXRSZXBvSW5zdGFsbGF0aW9uOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2luc3RhbGxhdGlvblwiXSxcbiAgICBnZXRTdWJzY3JpcHRpb25QbGFuRm9yQWNjb3VudDogW1xuICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvYWNjb3VudHMve2FjY291bnRfaWR9XCJcbiAgICBdLFxuICAgIGdldFN1YnNjcmlwdGlvblBsYW5Gb3JBY2NvdW50U3R1YmJlZDogW1xuICAgICAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9hY2NvdW50cy97YWNjb3VudF9pZH1cIlxuICAgIF0sXG4gICAgZ2V0VXNlckluc3RhbGxhdGlvbjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2luc3RhbGxhdGlvblwiXSxcbiAgICBnZXRXZWJob29rQ29uZmlnRm9yQXBwOiBbXCJHRVQgL2FwcC9ob29rL2NvbmZpZ1wiXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcIkdFVCAvYXBwL2hvb2svZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCJdLFxuICAgIGxpc3RBY2NvdW50c0ZvclBsYW46IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIl0sXG4gICAgbGlzdEFjY291bnRzRm9yUGxhblN0dWJiZWQ6IFtcbiAgICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnMve3BsYW5faWR9L2FjY291bnRzXCJcbiAgICBdLFxuICAgIGxpc3RJbnN0YWxsYXRpb25SZXBvc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uUmVxdWVzdHNGb3JBdXRoZW50aWNhdGVkQXBwOiBbXG4gICAgICBcIkdFVCAvYXBwL2luc3RhbGxhdGlvbi1yZXF1ZXN0c1wiXG4gICAgXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uczogW1wiR0VUIC9hcHAvaW5zdGFsbGF0aW9uc1wiXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9uc1wiXSxcbiAgICBsaXN0UGxhbnM6IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiXSxcbiAgICBsaXN0UGxhbnNTdHViYmVkOiBbXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9wbGFuc1wiXSxcbiAgICBsaXN0UmVwb3NBY2Nlc3NpYmxlVG9JbnN0YWxsYXRpb246IFtcIkdFVCAvaW5zdGFsbGF0aW9uL3JlcG9zaXRvcmllc1wiXSxcbiAgICBsaXN0U3Vic2NyaXB0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzXCJdLFxuICAgIGxpc3RTdWJzY3JpcHRpb25zRm9yQXV0aGVudGljYXRlZFVzZXJTdHViYmVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXMvc3R1YmJlZFwiXG4gICAgXSxcbiAgICBsaXN0V2ViaG9va0RlbGl2ZXJpZXM6IFtcIkdFVCAvYXBwL2hvb2svZGVsaXZlcmllc1wiXSxcbiAgICByZWRlbGl2ZXJXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiUE9TVCAvYXBwL2hvb2svZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCJcbiAgICBdLFxuICAgIHJlbW92ZVJlcG9Gcm9tSW5zdGFsbGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJhcHBzXCIsIFwicmVtb3ZlUmVwb0Zyb21JbnN0YWxsYXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICByZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmVzZXRUb2tlbjogW1wiUEFUQ0ggL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlblwiXSxcbiAgICByZXZva2VJbnN0YWxsYXRpb25BY2Nlc3NUb2tlbjogW1wiREVMRVRFIC9pbnN0YWxsYXRpb24vdG9rZW5cIl0sXG4gICAgc2NvcGVUb2tlbjogW1wiUE9TVCAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuL3Njb3BlZFwiXSxcbiAgICBzdXNwZW5kSW5zdGFsbGF0aW9uOiBbXCJQVVQgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3N1c3BlbmRlZFwiXSxcbiAgICB1bnN1c3BlbmRJbnN0YWxsYXRpb246IFtcbiAgICAgIFwiREVMRVRFIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9zdXNwZW5kZWRcIlxuICAgIF0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0ZvckFwcDogW1wiUEFUQ0ggL2FwcC9ob29rL2NvbmZpZ1wiXVxuICB9LFxuICBiaWxsaW5nOiB7XG4gICAgZ2V0R2l0aHViQWN0aW9uc0JpbGxpbmdPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL2FjdGlvbnNcIl0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc0JpbGxpbmdVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zZXR0aW5ncy9iaWxsaW5nL2FjdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9wYWNrYWdlc1wiXSxcbiAgICBnZXRHaXRodWJQYWNrYWdlc0JpbGxpbmdVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zZXR0aW5ncy9iaWxsaW5nL3BhY2thZ2VzXCJcbiAgICBdLFxuICAgIGdldFNoYXJlZFN0b3JhZ2VCaWxsaW5nT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL3NoYXJlZC1zdG9yYWdlXCJcbiAgICBdLFxuICAgIGdldFNoYXJlZFN0b3JhZ2VCaWxsaW5nVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9zaGFyZWQtc3RvcmFnZVwiXG4gICAgXVxuICB9LFxuICBjaGVja3M6IHtcbiAgICBjcmVhdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnNcIl0sXG4gICAgY3JlYXRlU3VpdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlc1wiXSxcbiAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfVwiXSxcbiAgICBnZXRTdWl0ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfVwiXSxcbiAgICBsaXN0QW5ub3RhdGlvbnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zL3tjaGVja19ydW5faWR9L2Fubm90YXRpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1ydW5zXCJdLFxuICAgIGxpc3RGb3JTdWl0ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9L2NoZWNrLXJ1bnNcIlxuICAgIF0sXG4gICAgbGlzdFN1aXRlc0ZvclJlZjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXN1aXRlc1wiXSxcbiAgICByZXJlcXVlc3RSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9yZXJlcXVlc3RcIlxuICAgIF0sXG4gICAgcmVyZXF1ZXN0U3VpdGU6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vcmVyZXF1ZXN0XCJcbiAgICBdLFxuICAgIHNldFN1aXRlc1ByZWZlcmVuY2VzOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMvcHJlZmVyZW5jZXNcIlxuICAgIF0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfVwiXVxuICB9LFxuICBjb2RlU2Nhbm5pbmc6IHtcbiAgICBkZWxldGVBbmFseXNpczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXMve2FuYWx5c2lzX2lkfXs/Y29uZmlybV9kZWxldGV9XCJcbiAgICBdLFxuICAgIGdldEFsZXJ0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkUGFyYW1ldGVyczogeyBhbGVydF9pZDogXCJhbGVydF9udW1iZXJcIiB9IH1cbiAgICBdLFxuICAgIGdldEFuYWx5c2lzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlcy97YW5hbHlzaXNfaWR9XCJcbiAgICBdLFxuICAgIGdldENvZGVxbERhdGFiYXNlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9jb2RlcWwvZGF0YWJhc2VzL3tsYW5ndWFnZX1cIlxuICAgIF0sXG4gICAgZ2V0RGVmYXVsdFNldHVwOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvZGVmYXVsdC1zZXR1cFwiXSxcbiAgICBnZXRTYXJpZjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL3Nhcmlmcy97c2FyaWZfaWR9XCJdLFxuICAgIGxpc3RBbGVydEluc3RhbmNlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiXG4gICAgXSxcbiAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vY29kZS1zY2FubmluZy9hbGVydHNcIl0sXG4gICAgbGlzdEFsZXJ0c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHNcIl0sXG4gICAgbGlzdEFsZXJ0c0luc3RhbmNlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImNvZGVTY2FubmluZ1wiLCBcImxpc3RBbGVydEluc3RhbmNlc1wiXSB9XG4gICAgXSxcbiAgICBsaXN0Q29kZXFsRGF0YWJhc2VzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9jb2RlcWwvZGF0YWJhc2VzXCJcbiAgICBdLFxuICAgIGxpc3RSZWNlbnRBbmFseXNlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzXCJdLFxuICAgIHVwZGF0ZUFsZXJ0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfVwiXG4gICAgXSxcbiAgICB1cGRhdGVEZWZhdWx0U2V0dXA6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvZGVmYXVsdC1zZXR1cFwiXG4gICAgXSxcbiAgICB1cGxvYWRTYXJpZjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9zYXJpZnNcIl1cbiAgfSxcbiAgY29kZXNPZkNvbmR1Y3Q6IHtcbiAgICBnZXRBbGxDb2Rlc09mQ29uZHVjdDogW1wiR0VUIC9jb2Rlc19vZl9jb25kdWN0XCJdLFxuICAgIGdldENvbmR1Y3RDb2RlOiBbXCJHRVQgL2NvZGVzX29mX2NvbmR1Y3Qve2tleX1cIl1cbiAgfSxcbiAgY29kZXNwYWNlczoge1xuICAgIGFkZFJlcG9zaXRvcnlGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBjaGVja1Blcm1pc3Npb25zRm9yRGV2Y29udGFpbmVyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9wZXJtaXNzaW9uc19jaGVja1wiXG4gICAgXSxcbiAgICBjb2Rlc3BhY2VNYWNoaW5lc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vbWFjaGluZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvY29kZXNwYWNlc1wiXSxcbiAgICBjcmVhdGVPclVwZGF0ZU9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlV2l0aFByRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb2Rlc3BhY2VzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVdpdGhSZXBvRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlc1wiXG4gICAgXSxcbiAgICBkZWxldGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXSxcbiAgICBkZWxldGVGcm9tT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZXhwb3J0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vZXhwb3J0c1wiXG4gICAgXSxcbiAgICBnZXRDb2Rlc3BhY2VzRm9yVXNlckluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlc1wiXG4gICAgXSxcbiAgICBnZXRFeHBvcnREZXRhaWxzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9leHBvcnRzL3tleHBvcnRfaWR9XCJcbiAgICBdLFxuICAgIGdldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFB1YmxpY0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRSZXBvUHVibGljS2V5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3B1YmxpYy1rZXlcIlxuICAgIF0sXG4gICAgZ2V0UmVwb1NlY3JldDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldFNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBsaXN0RGV2Y29udGFpbmVyc0luUmVwb3NpdG9yeUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9kZXZjb250YWluZXJzXCJcbiAgICBdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXNcIl0sXG4gICAgbGlzdEluT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZFBhcmFtZXRlcnM6IHsgb3JnX2lkOiBcIm9yZ1wiIH0gfVxuICAgIF0sXG4gICAgbGlzdEluUmVwb3NpdG9yeUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlc1wiXG4gICAgXSxcbiAgICBsaXN0T3JnU2VjcmV0czogW1wiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb1NlY3JldHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvc2l0b3JpZXNGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWNyZXRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBwcmVGbGlnaHRXaXRoUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9uZXdcIlxuICAgIF0sXG4gICAgcHVibGlzaEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3B1Ymxpc2hcIlxuICAgIF0sXG4gICAgcmVtb3ZlUmVwb3NpdG9yeUZvclNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdTZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmVwb01hY2hpbmVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL21hY2hpbmVzXCJcbiAgICBdLFxuICAgIHNldFJlcG9zaXRvcmllc0ZvclNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHN0YXJ0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0YXJ0XCJdLFxuICAgIHN0b3BGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vc3RvcFwiXSxcbiAgICBzdG9wSW5Pcmdhbml6YXRpb246IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0b3BcIlxuICAgIF0sXG4gICAgdXBkYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBBVENIIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXVxuICB9LFxuICBjb3BpbG90OiB7XG4gICAgYWRkQ29waWxvdEZvckJ1c2luZXNzU2VhdHNGb3JUZWFtczogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWxlY3RlZF90ZWFtc1wiXG4gICAgXSxcbiAgICBhZGRDb3BpbG90Rm9yQnVzaW5lc3NTZWF0c0ZvclVzZXJzOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlbGVjdGVkX3VzZXJzXCJcbiAgICBdLFxuICAgIGNhbmNlbENvcGlsb3RTZWF0QXNzaWdubWVudEZvclRlYW1zOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9jb3BpbG90L2JpbGxpbmcvc2VsZWN0ZWRfdGVhbXNcIlxuICAgIF0sXG4gICAgY2FuY2VsQ29waWxvdFNlYXRBc3NpZ25tZW50Rm9yVXNlcnM6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWxlY3RlZF91c2Vyc1wiXG4gICAgXSxcbiAgICBnZXRDb3BpbG90T3JnYW5pemF0aW9uRGV0YWlsczogW1wiR0VUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZ1wiXSxcbiAgICBnZXRDb3BpbG90U2VhdERldGFpbHNGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29waWxvdFwiXG4gICAgXSxcbiAgICBsaXN0Q29waWxvdFNlYXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlYXRzXCJdXG4gIH0sXG4gIGRlcGVuZGFib3Q6IHtcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZU9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlT3JnU2VjcmV0OiBbXCJERUxFVEUgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZGVsZXRlUmVwb1NlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldEFsZXJ0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFJlcG9QdWJsaWNLZXk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vZGVwZW5kYWJvdC9hbGVydHNcIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3QvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzXCJdLFxuICAgIGxpc3RPcmdTZWNyZXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvU2VjcmV0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHNcIl0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICB1cGRhdGVBbGVydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF1cbiAgfSxcbiAgZGVwZW5kZW5jeUdyYXBoOiB7XG4gICAgY3JlYXRlUmVwb3NpdG9yeVNuYXBzaG90OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvc25hcHNob3RzXCJcbiAgICBdLFxuICAgIGRpZmZSYW5nZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvY29tcGFyZS97YmFzZWhlYWR9XCJcbiAgICBdLFxuICAgIGV4cG9ydFNib206IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kZW5jeS1ncmFwaC9zYm9tXCJdXG4gIH0sXG4gIGVtb2ppczogeyBnZXQ6IFtcIkdFVCAvZW1vamlzXCJdIH0sXG4gIGdpc3RzOiB7XG4gICAgY2hlY2tJc1N0YXJyZWQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9naXN0c1wiXSxcbiAgICBjcmVhdGVDb21tZW50OiBbXCJQT1NUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfVwiXSxcbiAgICBkZWxldGVDb21tZW50OiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZm9yazogW1wiUE9TVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGdldDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH1cIl0sXG4gICAgZ2V0Q29tbWVudDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldFJldmlzaW9uOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS97c2hhfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL2dpc3RzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvZ2lzdHMvcHVibGljXCJdLFxuICAgIGxpc3RTdGFycmVkOiBbXCJHRVQgL2dpc3RzL3N0YXJyZWRcIl0sXG4gICAgc3RhcjogW1wiUFVUIC9naXN0cy97Z2lzdF9pZH0vc3RhclwiXSxcbiAgICB1bnN0YXI6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvZ2lzdHMve2dpc3RfaWR9XCJdLFxuICAgIHVwZGF0ZUNvbW1lbnQ6IFtcIlBBVENIIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdXG4gIH0sXG4gIGdpdDoge1xuICAgIGNyZWF0ZUJsb2I6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9ibG9ic1wiXSxcbiAgICBjcmVhdGVDb21taXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzXCJdLFxuICAgIGNyZWF0ZVJlZjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZnNcIl0sXG4gICAgY3JlYXRlVGFnOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdGFnc1wiXSxcbiAgICBjcmVhdGVUcmVlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdHJlZXNcIl0sXG4gICAgZGVsZXRlUmVmOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzL3tyZWZ9XCJdLFxuICAgIGdldEJsb2I6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L2Jsb2JzL3tmaWxlX3NoYX1cIl0sXG4gICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzL3tjb21taXRfc2hhfVwiXSxcbiAgICBnZXRSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZi97cmVmfVwiXSxcbiAgICBnZXRUYWc6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RhZ3Mve3RhZ19zaGF9XCJdLFxuICAgIGdldFRyZWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RyZWVzL3t0cmVlX3NoYX1cIl0sXG4gICAgbGlzdE1hdGNoaW5nUmVmczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvbWF0Y2hpbmctcmVmcy97cmVmfVwiXSxcbiAgICB1cGRhdGVSZWY6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvcmVmcy97cmVmfVwiXVxuICB9LFxuICBnaXRpZ25vcmU6IHtcbiAgICBnZXRBbGxUZW1wbGF0ZXM6IFtcIkdFVCAvZ2l0aWdub3JlL3RlbXBsYXRlc1wiXSxcbiAgICBnZXRUZW1wbGF0ZTogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzL3tuYW1lfVwiXVxuICB9LFxuICBpbnRlcmFjdGlvbnM6IHtcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXG4gICAgICBcIkdFVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXG4gICAgXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInJlbW92ZVJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIHNldFJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIHNldFJlc3RyaWN0aW9uc0Zvck9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JSZXBvOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcbiAgICAgIFwiUFVUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInNldFJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdXG4gIH0sXG4gIGlzc3Vlczoge1xuICAgIGFkZEFzc2lnbmVlczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vYXNzaWduZWVzXCJcbiAgICBdLFxuICAgIGFkZExhYmVsczogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiXSxcbiAgICBjaGVja1VzZXJDYW5CZUFzc2lnbmVkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlcy97YXNzaWduZWV9XCJdLFxuICAgIGNoZWNrVXNlckNhbkJlQXNzaWduZWRUb0lzc3VlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlcy97YXNzaWduZWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCJdLFxuICAgIGNyZWF0ZUNvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGNyZWF0ZUxhYmVsOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIl0sXG4gICAgY3JlYXRlTWlsZXN0b25lOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzXCJdLFxuICAgIGRlbGV0ZUNvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUxhYmVsOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgZGVsZXRlTWlsZXN0b25lOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfVwiXSxcbiAgICBnZXRDb21tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZ2V0RXZlbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50cy97ZXZlbnRfaWR9XCJdLFxuICAgIGdldExhYmVsOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgZ2V0TWlsZXN0b25lOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvaXNzdWVzXCJdLFxuICAgIGxpc3RBc3NpZ25lZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHNcIl0sXG4gICAgbGlzdEV2ZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vZXZlbnRzXCJdLFxuICAgIGxpc3RFdmVudHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9ldmVudHNcIl0sXG4gICAgbGlzdEV2ZW50c0ZvclRpbWVsaW5lOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCJcbiAgICBdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2lzc3Vlc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaXNzdWVzXCJdLFxuICAgIGxpc3RGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlc1wiXSxcbiAgICBsaXN0TGFiZWxzRm9yTWlsZXN0b25lOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVsc1wiXSxcbiAgICBsaXN0TGFiZWxzT25Jc3N1ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdE1pbGVzdG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lc1wiXSxcbiAgICBsb2NrOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sb2NrXCJdLFxuICAgIHJlbW92ZUFsbExhYmVsczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQXNzaWduZWVzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiXG4gICAgXSxcbiAgICByZW1vdmVMYWJlbDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHMve25hbWV9XCJcbiAgICBdLFxuICAgIHNldExhYmVsczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJdLFxuICAgIHVubG9jazogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbG9ja1wiXSxcbiAgICB1cGRhdGU6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn1cIl0sXG4gICAgdXBkYXRlQ29tbWVudDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlTGFiZWw6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgIHVwZGF0ZU1pbGVzdG9uZTogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIlxuICAgIF1cbiAgfSxcbiAgbGljZW5zZXM6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbGljZW5zZXMve2xpY2Vuc2V9XCJdLFxuICAgIGdldEFsbENvbW1vbmx5VXNlZDogW1wiR0VUIC9saWNlbnNlc1wiXSxcbiAgICBnZXRGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xpY2Vuc2VcIl1cbiAgfSxcbiAgbWFya2Rvd246IHtcbiAgICByZW5kZXI6IFtcIlBPU1QgL21hcmtkb3duXCJdLFxuICAgIHJlbmRlclJhdzogW1xuICAgICAgXCJQT1NUIC9tYXJrZG93bi9yYXdcIixcbiAgICAgIHsgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIiB9IH1cbiAgICBdXG4gIH0sXG4gIG1ldGE6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbWV0YVwiXSxcbiAgICBnZXRBbGxWZXJzaW9uczogW1wiR0VUIC92ZXJzaW9uc1wiXSxcbiAgICBnZXRPY3RvY2F0OiBbXCJHRVQgL29jdG9jYXRcIl0sXG4gICAgZ2V0WmVuOiBbXCJHRVQgL3plblwiXSxcbiAgICByb290OiBbXCJHRVQgL1wiXVxuICB9LFxuICBtaWdyYXRpb25zOiB7XG4gICAgY2FuY2VsSW1wb3J0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5jYW5jZWxJbXBvcnQoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI2NhbmNlbC1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L2FyY2hpdmVcIlxuICAgIF0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJjaGl2ZUZvck9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGdldEFyY2hpdmVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGdldENvbW1pdEF1dGhvcnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvYXV0aG9yc1wiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0Q29tbWl0QXV0aG9ycygpIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9yZXN0L21pZ3JhdGlvbnMvc291cmNlLWltcG9ydHMjZ2V0LWNvbW1pdC1hdXRob3JzXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIGdldEltcG9ydFN0YXR1czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0SW1wb3J0U3RhdHVzKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNnZXQtYW4taW1wb3J0LXN0YXR1c1wiXG4gICAgICB9XG4gICAgXSxcbiAgICBnZXRMYXJnZUZpbGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2xhcmdlX2ZpbGVzXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5nZXRMYXJnZUZpbGVzKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNnZXQtbGFyZ2UtZmlsZXNcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZ2V0U3RhdHVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9XCJdLFxuICAgIGdldFN0YXR1c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0UmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgbGlzdFJlcG9zRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJtaWdyYXRpb25zXCIsIFwibGlzdFJlcG9zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbWFwQ29tbWl0QXV0aG9yOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvYXV0aG9ycy97YXV0aG9yX2lkfVwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMubWFwQ29tbWl0QXV0aG9yKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNtYXAtYS1jb21taXQtYXV0aG9yXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIHNldExmc1ByZWZlcmVuY2U6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9sZnNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLnNldExmc1ByZWZlcmVuY2UoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI3VwZGF0ZS1naXQtbGZzLXByZWZlcmVuY2VcIlxuICAgICAgfVxuICAgIF0sXG4gICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9taWdyYXRpb25zXCJdLFxuICAgIHN0YXJ0Rm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnNcIl0sXG4gICAgc3RhcnRJbXBvcnQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLnN0YXJ0SW1wb3J0KCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNzdGFydC1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgdW5sb2NrUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zL3tyZXBvX25hbWV9L2xvY2tcIlxuICAgIF0sXG4gICAgdW5sb2NrUmVwb0Zvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvcy97cmVwb19uYW1lfS9sb2NrXCJcbiAgICBdLFxuICAgIHVwZGF0ZUltcG9ydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy51cGRhdGVJbXBvcnQoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI3VwZGF0ZS1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAgb3Jnczoge1xuICAgIGFkZFNlY3VyaXR5TWFuYWdlclRlYW06IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L3NlY3VyaXR5LW1hbmFnZXJzL3RlYW1zL3t0ZWFtX3NsdWd9XCJcbiAgICBdLFxuICAgIGJsb2NrVXNlcjogW1wiUFVUIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIGNhbmNlbEludml0YXRpb246IFtcIkRFTEVURSAvb3Jncy97b3JnfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIl0sXG4gICAgY2hlY2tCbG9ja2VkVXNlcjogW1wiR0VUIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrTWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgY2hlY2tQdWJsaWNNZW1iZXJzaGlwRm9yVXNlcjogW1wiR0VUIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgY29udmVydE1lbWJlclRvT3V0c2lkZUNvbGxhYm9yYXRvcjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlSW52aXRhdGlvbjogW1wiUE9TVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiXSxcbiAgICBjcmVhdGVPclVwZGF0ZUN1c3RvbVByb3BlcnRpZXM6IFtcIlBBVENIIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvc2NoZW1hXCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlQ3VzdG9tUHJvcGVydGllc1ZhbHVlc0ZvclJlcG9zOiBbXG4gICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvdmFsdWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlQ3VzdG9tUHJvcGVydHk6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvc2NoZW1hL3tjdXN0b21fcHJvcGVydHlfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlV2ViaG9vazogW1wiUE9TVCAvb3Jncy97b3JnfS9ob29rc1wiXSxcbiAgICBkZWxldGU6IFtcIkRFTEVURSAvb3Jncy97b3JnfVwiXSxcbiAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGVuYWJsZU9yRGlzYWJsZVNlY3VyaXR5UHJvZHVjdE9uQWxsT3JnUmVwb3M6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS97c2VjdXJpdHlfcHJvZHVjdH0ve2VuYWJsZW1lbnR9XCJcbiAgICBdLFxuICAgIGdldDogW1wiR0VUIC9vcmdzL3tvcmd9XCJdLFxuICAgIGdldEFsbEN1c3RvbVByb3BlcnRpZXM6IFtcIkdFVCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYVwiXSxcbiAgICBnZXRDdXN0b21Qcm9wZXJ0eTogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWEve2N1c3RvbV9wcm9wZXJ0eV9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9tZW1iZXJzaGlwcy9vcmdzL3tvcmd9XCJdLFxuICAgIGdldE1lbWJlcnNoaXBGb3JVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXSxcbiAgICBnZXRXZWJob29rOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJdLFxuICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL29yZ2FuaXphdGlvbnNcIl0sXG4gICAgbGlzdEFwcEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCJdLFxuICAgIGxpc3RCbG9ja2VkVXNlcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3NcIl0sXG4gICAgbGlzdEN1c3RvbVByb3BlcnRpZXNWYWx1ZXNGb3JSZXBvczogW1wiR0VUIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvdmFsdWVzXCJdLFxuICAgIGxpc3RGYWlsZWRJbnZpdGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9vcmdzXCJdLFxuICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vb3Jnc1wiXSxcbiAgICBsaXN0SW52aXRhdGlvblRlYW1zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9L3RlYW1zXCJdLFxuICAgIGxpc3RNZW1iZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc1wiXSxcbiAgICBsaXN0TWVtYmVyc2hpcHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21lbWJlcnNoaXBzL29yZ3NcIl0sXG4gICAgbGlzdE91dHNpZGVDb2xsYWJvcmF0b3JzOiBbXCJHRVQgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzXCJdLFxuICAgIGxpc3RQYXRHcmFudFJlcG9zaXRvcmllczogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vucy97cGF0X2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFBhdEdyYW50UmVxdWVzdFJlcG9zaXRvcmllczogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzL3twYXRfcmVxdWVzdF9pZH0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RQYXRHcmFudFJlcXVlc3RzOiBbXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzXCJdLFxuICAgIGxpc3RQYXRHcmFudHM6IFtcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zXCJdLFxuICAgIGxpc3RQZW5kaW5nSW52aXRhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0UHVibGljTWVtYmVyczogW1wiR0VUIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzXCJdLFxuICAgIGxpc3RTZWN1cml0eU1hbmFnZXJUZWFtczogW1wiR0VUIC9vcmdzL3tvcmd9L3NlY3VyaXR5LW1hbmFnZXJzXCJdLFxuICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1wiR0VUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJdLFxuICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9vcmdzL3tvcmd9L2hvb2tzXCJdLFxuICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfS9waW5nc1wiXSxcbiAgICByZWRlbGl2ZXJXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCJcbiAgICBdLFxuICAgIHJlbW92ZUN1c3RvbVByb3BlcnR5OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYS97Y3VzdG9tX3Byb3BlcnR5X25hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZU1lbWJlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICByZW1vdmVNZW1iZXJzaGlwRm9yVXNlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgcmVtb3ZlT3V0c2lkZUNvbGxhYm9yYXRvcjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlUHVibGljTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlY3VyaXR5TWFuYWdlclRlYW06IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3NlY3VyaXR5LW1hbmFnZXJzL3RlYW1zL3t0ZWFtX3NsdWd9XCJcbiAgICBdLFxuICAgIHJldmlld1BhdEdyYW50UmVxdWVzdDogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0cy97cGF0X3JlcXVlc3RfaWR9XCJcbiAgICBdLFxuICAgIHJldmlld1BhdEdyYW50UmVxdWVzdHNJbkJ1bGs6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHNcIlxuICAgIF0sXG4gICAgc2V0TWVtYmVyc2hpcEZvclVzZXI6IFtcIlBVVCAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgIHNldFB1YmxpY01lbWJlcnNoaXBGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICB1bmJsb2NrVXNlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL29yZ3Mve29yZ31cIl0sXG4gICAgdXBkYXRlTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBBVENIIC91c2VyL21lbWJlcnNoaXBzL29yZ3Mve29yZ31cIlxuICAgIF0sXG4gICAgdXBkYXRlUGF0QWNjZXNzOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnMve3BhdF9pZH1cIl0sXG4gICAgdXBkYXRlUGF0QWNjZXNzZXM6IFtcIlBPU1QgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vuc1wiXSxcbiAgICB1cGRhdGVXZWJob29rOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0Zvck9yZzogW1wiUEFUQ0ggL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXVxuICB9LFxuICBwYWNrYWdlczoge1xuICAgIGRlbGV0ZVBhY2thZ2VGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZUZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZUZvclVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvckFQYWNrYWdlT3duZWRCeUFuT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInBhY2thZ2VzXCIsIFwiZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlPcmdcIl0gfVxuICAgIF0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yQVBhY2thZ2VPd25lZEJ5VGhlQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmVuYW1lZDogW1xuICAgICAgICAgIFwicGFja2FnZXNcIixcbiAgICAgICAgICBcImdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5QXV0aGVudGljYXRlZFVzZXJcIlxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeU9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIlxuICAgIF0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VGb3JPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvck9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIlxuICAgIF0sXG4gICAgZ2V0UGFja2FnZVZlcnNpb25Gb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBsaXN0RG9ja2VyTWlncmF0aW9uQ29uZmxpY3RpbmdQYWNrYWdlc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9kb2NrZXIvY29uZmxpY3RzXCJcbiAgICBdLFxuICAgIGxpc3REb2NrZXJNaWdyYXRpb25Db25mbGljdGluZ1BhY2thZ2VzRm9yT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9kb2NrZXIvY29uZmxpY3RzXCJcbiAgICBdLFxuICAgIGxpc3REb2NrZXJNaWdyYXRpb25Db25mbGljdGluZ1BhY2thZ2VzRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZG9ja2VyL2NvbmZsaWN0c1wiXG4gICAgXSxcbiAgICBsaXN0UGFja2FnZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3BhY2thZ2VzXCJdLFxuICAgIGxpc3RQYWNrYWdlc0Zvck9yZ2FuaXphdGlvbjogW1wiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzXCJdLFxuICAgIGxpc3RQYWNrYWdlc0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiXSxcbiAgICByZXN0b3JlUGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vcmVzdG9yZXs/dG9rZW59XCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vcmVzdG9yZXs/dG9rZW59XCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiXG4gICAgXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9L3Jlc3RvcmVcIlxuICAgIF0sXG4gICAgcmVzdG9yZVBhY2thZ2VWZXJzaW9uRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXG4gICAgXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXG4gICAgXVxuICB9LFxuICBwcm9qZWN0czoge1xuICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJdLFxuICAgIGNyZWF0ZUNhcmQ6IFtcIlBPU1QgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vY2FyZHNcIl0sXG4gICAgY3JlYXRlQ29sdW1uOiBbXCJQT1NUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiXSxcbiAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9wcm9qZWN0c1wiXSxcbiAgICBjcmVhdGVGb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgY3JlYXRlRm9yUmVwbzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICBkZWxldGVDYXJkOiBbXCJERUxFVEUgL3Byb2plY3RzL2NvbHVtbnMvY2FyZHMve2NhcmRfaWR9XCJdLFxuICAgIGRlbGV0ZUNvbHVtbjogW1wiREVMRVRFIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdLFxuICAgIGdldDogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH1cIl0sXG4gICAgZ2V0Q2FyZDogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICBnZXRDb2x1bW46IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfVwiXSxcbiAgICBnZXRQZXJtaXNzaW9uRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX0vcGVybWlzc2lvblwiXG4gICAgXSxcbiAgICBsaXN0Q2FyZHM6IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiXSxcbiAgICBsaXN0Q29sbGFib3JhdG9yczogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9yc1wiXSxcbiAgICBsaXN0Q29sdW1uczogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgbGlzdEZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wcm9qZWN0c1wiXSxcbiAgICBtb3ZlQ2FyZDogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH0vbW92ZXNcIl0sXG4gICAgbW92ZUNvbHVtbjogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9tb3Zlc1wiXSxcbiAgICByZW1vdmVDb2xsYWJvcmF0b3I6IFtcbiAgICAgIFwiREVMRVRFIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICB1cGRhdGVDYXJkOiBbXCJQQVRDSCAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgdXBkYXRlQ29sdW1uOiBbXCJQQVRDSCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfVwiXVxuICB9LFxuICBwdWxsczoge1xuICAgIGNoZWNrSWZNZXJnZWQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9tZXJnZVwiXSxcbiAgICBjcmVhdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCJdLFxuICAgIGNyZWF0ZVJlcGx5Rm9yUmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZXBsaWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJldmlldzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgIGNyZWF0ZVJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBkZWxldGVQZW5kaW5nUmV2aWV3OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH1cIlxuICAgIF0sXG4gICAgZGlzbWlzc1JldmlldzogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9kaXNtaXNzYWxzXCJcbiAgICBdLFxuICAgIGdldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9XCJdLFxuICAgIGdldFJldmlldzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfVwiXG4gICAgXSxcbiAgICBnZXRSZXZpZXdDb21tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCJdLFxuICAgIGxpc3RDb21tZW50c0ZvclJldmlldzogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZpbGVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vZmlsZXNcIl0sXG4gICAgbGlzdFJlcXVlc3RlZFJldmlld2VyczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmVxdWVzdGVkX3Jldmlld2Vyc1wiXG4gICAgXSxcbiAgICBsaXN0UmV2aWV3Q29tbWVudHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RSZXZpZXdDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHNcIl0sXG4gICAgbGlzdFJldmlld3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgIG1lcmdlOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vbWVyZ2VcIl0sXG4gICAgcmVtb3ZlUmVxdWVzdGVkUmV2aWV3ZXJzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJcbiAgICBdLFxuICAgIHJlcXVlc3RSZXZpZXdlcnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJcbiAgICBdLFxuICAgIHN1Ym1pdFJldmlldzogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vZXZlbnRzXCJcbiAgICBdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn1cIl0sXG4gICAgdXBkYXRlQnJhbmNoOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS91cGRhdGUtYnJhbmNoXCJcbiAgICBdLFxuICAgIHVwZGF0ZVJldmlldzogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVSZXZpZXdDb21tZW50OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH1cIlxuICAgIF1cbiAgfSxcbiAgcmF0ZUxpbWl0OiB7IGdldDogW1wiR0VUIC9yYXRlX2xpbWl0XCJdIH0sXG4gIHJlYWN0aW9uczoge1xuICAgIGNyZWF0ZUZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JJc3N1ZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvcklzc3VlQ29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JQdWxsUmVxdWVzdFJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JSZWxlYXNlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9yVGVhbURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvclRlYW1EaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBkZWxldGVGb3JDb21taXRDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvcklzc3VlOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvcklzc3VlQ29tbWVudDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yUHVsbFJlcXVlc3RDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvclJlbGVhc2U6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yVGVhbURpc2N1c3Npb246IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yVGVhbURpc2N1c3Npb25Db21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgbGlzdEZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JJc3N1ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zXCJdLFxuICAgIGxpc3RGb3JJc3N1ZUNvbW1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yUHVsbFJlcXVlc3RSZXZpZXdDb21tZW50OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yUmVsZWFzZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdEZvclRlYW1EaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JUZWFtRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiXG4gICAgXVxuICB9LFxuICByZXBvczoge1xuICAgIGFjY2VwdEludml0YXRpb246IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBhY2NlcHRJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgYWRkQXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL2FwcHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiYXBwc1wiIH1cbiAgICBdLFxuICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgYWRkU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9XG4gICAgXSxcbiAgICBhZGRUZWFtQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgYWRkVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJ1c2Vyc1wiIH1cbiAgICBdLFxuICAgIGNoZWNrQXV0b21hdGVkU2VjdXJpdHlGaXhlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9tYXRlZC1zZWN1cml0eS1maXhlc1wiXG4gICAgXSxcbiAgICBjaGVja0NvbGxhYm9yYXRvcjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgY2hlY2tWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIlxuICAgIF0sXG4gICAgY29kZW93bmVyc0Vycm9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlb3duZXJzL2Vycm9yc1wiXSxcbiAgICBjb21wYXJlQ29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21wYXJlL3tiYXNlfS4uLntoZWFkfVwiXSxcbiAgICBjb21wYXJlQ29tbWl0c1dpdGhCYXNlaGVhZDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbXBhcmUve2Jhc2VoZWFkfVwiXG4gICAgXSxcbiAgICBjcmVhdGVBdXRvbGluazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzXCJdLFxuICAgIGNyZWF0ZUNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vY29tbWVudHNcIlxuICAgIF0sXG4gICAgY3JlYXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlQ29tbWl0U3RhdHVzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0dXNlcy97c2hhfVwiXSxcbiAgICBjcmVhdGVEZXBsb3lLZXk6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXNcIl0sXG4gICAgY3JlYXRlRGVwbG95bWVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIl0sXG4gICAgY3JlYXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURlcGxveW1lbnRQcm90ZWN0aW9uUnVsZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50U3RhdHVzOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVEaXNwYXRjaEV2ZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kaXNwYXRjaGVzXCJdLFxuICAgIGNyZWF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3JlcG9zXCJdLFxuICAgIGNyZWF0ZUZvcms6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCJdLFxuICAgIGNyZWF0ZUluT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3JlcG9zXCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlRmlsZUNvbnRlbnRzOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICBjcmVhdGVPcmdSdWxlc2V0OiBbXCJQT1NUIC9vcmdzL3tvcmd9L3J1bGVzZXRzXCJdLFxuICAgIGNyZWF0ZVBhZ2VzRGVwbG95bWVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvZGVwbG95bWVudFwiXSxcbiAgICBjcmVhdGVQYWdlc1NpdGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGNyZWF0ZVJlbGVhc2U6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzXCJdLFxuICAgIGNyZWF0ZVJlcG9SdWxlc2V0OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0c1wiXSxcbiAgICBjcmVhdGVUYWdQcm90ZWN0aW9uOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb25cIl0sXG4gICAgY3JlYXRlVXNpbmdUZW1wbGF0ZTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97dGVtcGxhdGVfb3duZXJ9L3t0ZW1wbGF0ZV9yZXBvfS9nZW5lcmF0ZVwiXG4gICAgXSxcbiAgICBjcmVhdGVXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICBkZWNsaW5lSW52aXRhdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRlY2xpbmVJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZGVjbGluZUludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGRlbGV0ZUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCJcbiAgICBdLFxuICAgIGRlbGV0ZUFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIlxuICAgIF0sXG4gICAgZGVsZXRlQW5FbnZpcm9ubWVudDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlQXV0b2xpbms6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzL3thdXRvbGlua19pZH1cIl0sXG4gICAgZGVsZXRlQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb25cIlxuICAgIF0sXG4gICAgZGVsZXRlQ29tbWl0Q29tbWVudDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZGVsZXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiXG4gICAgXSxcbiAgICBkZWxldGVEZXBsb3lLZXk6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30va2V5cy97a2V5X2lkfVwiXSxcbiAgICBkZWxldGVEZXBsb3ltZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZURlcGxveW1lbnRCcmFuY2hQb2xpY3k6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnQtYnJhbmNoLXBvbGljaWVzL3ticmFuY2hfcG9saWN5X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGaWxlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICBkZWxldGVJbnZpdGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1J1bGVzZXQ6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZGVsZXRlUGFnZXNTaXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGRlbGV0ZVB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIlxuICAgIF0sXG4gICAgZGVsZXRlUmVsZWFzZTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgZGVsZXRlUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlUmVwb1J1bGVzZXQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9XCJdLFxuICAgIGRlbGV0ZVRhZ1Byb3RlY3Rpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb24ve3RhZ19wcm90ZWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICBkaXNhYmxlQXV0b21hdGVkU2VjdXJpdHlGaXhlczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9tYXRlZC1zZWN1cml0eS1maXhlc1wiXG4gICAgXSxcbiAgICBkaXNhYmxlRGVwbG95bWVudFByb3RlY3Rpb25SdWxlOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50X3Byb3RlY3Rpb25fcnVsZXMve3Byb3RlY3Rpb25fcnVsZV9pZH1cIlxuICAgIF0sXG4gICAgZGlzYWJsZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0aW5nOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHJpdmF0ZS12dWxuZXJhYmlsaXR5LXJlcG9ydGluZ1wiXG4gICAgXSxcbiAgICBkaXNhYmxlVnVsbmVyYWJpbGl0eUFsZXJ0czogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Z1bG5lcmFiaWxpdHktYWxlcnRzXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJjaGl2ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImRvd25sb2FkWmlwYmFsbEFyY2hpdmVcIl0gfVxuICAgIF0sXG4gICAgZG93bmxvYWRUYXJiYWxsQXJjaGl2ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YXJiYWxsL3tyZWZ9XCJdLFxuICAgIGRvd25sb2FkWmlwYmFsbEFyY2hpdmU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vemlwYmFsbC97cmVmfVwiXSxcbiAgICBlbmFibGVBdXRvbWF0ZWRTZWN1cml0eUZpeGVzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b21hdGVkLXNlY3VyaXR5LWZpeGVzXCJcbiAgICBdLFxuICAgIGVuYWJsZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0aW5nOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJpdmF0ZS12dWxuZXJhYmlsaXR5LXJlcG9ydGluZ1wiXG4gICAgXSxcbiAgICBlbmFibGVWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIlxuICAgIF0sXG4gICAgZ2VuZXJhdGVSZWxlYXNlTm90ZXM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvZ2VuZXJhdGUtbm90ZXNcIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGdldEFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCJcbiAgICBdLFxuICAgIGdldEFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vZW5mb3JjZV9hZG1pbnNcIlxuICAgIF0sXG4gICAgZ2V0QWxsRGVwbG95bWVudFByb3RlY3Rpb25SdWxlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzXCJcbiAgICBdLFxuICAgIGdldEFsbEVudmlyb25tZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHNcIl0sXG4gICAgZ2V0QWxsU3RhdHVzQ2hlY2tDb250ZXh0czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiXG4gICAgXSxcbiAgICBnZXRBbGxUb3BpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCJdLFxuICAgIGdldEFwcHNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCJcbiAgICBdLFxuICAgIGdldEF1dG9saW5rOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9saW5rcy97YXV0b2xpbmtfaWR9XCJdLFxuICAgIGdldEJyYW5jaDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofVwiXSxcbiAgICBnZXRCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiXG4gICAgXSxcbiAgICBnZXRCcmFuY2hSdWxlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlcy9icmFuY2hlcy97YnJhbmNofVwiXSxcbiAgICBnZXRDbG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9jbG9uZXNcIl0sXG4gICAgZ2V0Q29kZUZyZXF1ZW5jeVN0YXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXRzL2NvZGVfZnJlcXVlbmN5XCJdLFxuICAgIGdldENvbGxhYm9yYXRvclBlcm1pc3Npb25MZXZlbDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfS9wZXJtaXNzaW9uXCJcbiAgICBdLFxuICAgIGdldENvbWJpbmVkU3RhdHVzRm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzXCJdLFxuICAgIGdldENvbW1pdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9XCJdLFxuICAgIGdldENvbW1pdEFjdGl2aXR5U3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29tbWl0X2FjdGl2aXR5XCJdLFxuICAgIGdldENvbW1pdENvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldENvbW1pdFNpZ25hdHVyZVByb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIlxuICAgIF0sXG4gICAgZ2V0Q29tbXVuaXR5UHJvZmlsZU1ldHJpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbXVuaXR5L3Byb2ZpbGVcIl0sXG4gICAgZ2V0Q29udGVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250ZW50cy97cGF0aH1cIl0sXG4gICAgZ2V0Q29udHJpYnV0b3JzU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29udHJpYnV0b3JzXCJdLFxuICAgIGdldEN1c3RvbURlcGxveW1lbnRQcm90ZWN0aW9uUnVsZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzL3twcm90ZWN0aW9uX3J1bGVfaWR9XCJcbiAgICBdLFxuICAgIGdldEN1c3RvbVByb3BlcnRpZXNWYWx1ZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvcGVydGllcy92YWx1ZXNcIl0sXG4gICAgZ2V0RGVwbG95S2V5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXMve2tleV9pZH1cIl0sXG4gICAgZ2V0RGVwbG95bWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH1cIl0sXG4gICAgZ2V0RGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIGdldERlcGxveW1lbnRTdGF0dXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH0vc3RhdHVzZXMve3N0YXR1c19pZH1cIlxuICAgIF0sXG4gICAgZ2V0RW52aXJvbm1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9XCJcbiAgICBdLFxuICAgIGdldExhdGVzdFBhZ2VzQnVpbGQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzL2xhdGVzdFwiXSxcbiAgICBnZXRMYXRlc3RSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdFwiXSxcbiAgICBnZXRPcmdSdWxlU3VpdGU6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0cy9ydWxlLXN1aXRlcy97cnVsZV9zdWl0ZV9pZH1cIl0sXG4gICAgZ2V0T3JnUnVsZVN1aXRlczogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3J1bGUtc3VpdGVzXCJdLFxuICAgIGdldE9yZ1J1bGVzZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZ2V0T3JnUnVsZXNldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9ydWxlc2V0c1wiXSxcbiAgICBnZXRQYWdlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlc1wiXSxcbiAgICBnZXRQYWdlc0J1aWxkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkcy97YnVpbGRfaWR9XCJdLFxuICAgIGdldFBhZ2VzSGVhbHRoQ2hlY2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvaGVhbHRoXCJdLFxuICAgIGdldFBhcnRpY2lwYXRpb25TdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9wYXJ0aWNpcGF0aW9uXCJdLFxuICAgIGdldFB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIlxuICAgIF0sXG4gICAgZ2V0UHVuY2hDYXJkU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvcHVuY2hfY2FyZFwiXSxcbiAgICBnZXRSZWFkbWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVhZG1lXCJdLFxuICAgIGdldFJlYWRtZUluRGlyZWN0b3J5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlYWRtZS97ZGlyfVwiXSxcbiAgICBnZXRSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfVwiXSxcbiAgICBnZXRSZWxlYXNlQXNzZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIl0sXG4gICAgZ2V0UmVsZWFzZUJ5VGFnOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3RhZ3Mve3RhZ31cIl0sXG4gICAgZ2V0UmVwb1J1bGVTdWl0ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3J1bGUtc3VpdGVzL3tydWxlX3N1aXRlX2lkfVwiXG4gICAgXSxcbiAgICBnZXRSZXBvUnVsZVN1aXRlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy9ydWxlLXN1aXRlc1wiXSxcbiAgICBnZXRSZXBvUnVsZXNldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZ2V0UmVwb1J1bGVzZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCJdLFxuICAgIGdldFN0YXR1c0NoZWNrc1Byb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIlxuICAgIF0sXG4gICAgZ2V0VGVhbXNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiXG4gICAgXSxcbiAgICBnZXRUb3BQYXRoczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3BvcHVsYXIvcGF0aHNcIl0sXG4gICAgZ2V0VG9wUmVmZXJyZXJzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYWZmaWMvcG9wdWxhci9yZWZlcnJlcnNcIl0sXG4gICAgZ2V0VXNlcnNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiXG4gICAgXSxcbiAgICBnZXRWaWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3ZpZXdzXCJdLFxuICAgIGdldFdlYmhvb2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXG4gICAgXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCJcbiAgICBdLFxuICAgIGxpc3RBY3Rpdml0aWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGl2aXR5XCJdLFxuICAgIGxpc3RBdXRvbGlua3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzXCJdLFxuICAgIGxpc3RCcmFuY2hlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiXSxcbiAgICBsaXN0QnJhbmNoZXNGb3JIZWFkQ29tbWl0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vYnJhbmNoZXMtd2hlcmUtaGVhZFwiXG4gICAgXSxcbiAgICBsaXN0Q29sbGFib3JhdG9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzXCJdLFxuICAgIGxpc3RDb21tZW50c0ZvckNvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RDb21taXRDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdFN0YXR1c2VzRm9yUmVmOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNlc1wiXG4gICAgXSxcbiAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCJdLFxuICAgIGxpc3RDb250cmlidXRvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udHJpYnV0b3JzXCJdLFxuICAgIGxpc3RDdXN0b21EZXBsb3ltZW50UnVsZUludGVncmF0aW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzL2FwcHNcIlxuICAgIF0sXG4gICAgbGlzdERlcGxveUtleXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICBsaXN0RGVwbG95bWVudEJyYW5jaFBvbGljaWVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50LWJyYW5jaC1wb2xpY2llc1wiXG4gICAgXSxcbiAgICBsaXN0RGVwbG95bWVudFN0YXR1c2VzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCJcbiAgICBdLFxuICAgIGxpc3REZXBsb3ltZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9yZXBvc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZXBvc1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIl0sXG4gICAgbGlzdEludml0YXRpb25zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCJdLFxuICAgIGxpc3RJbnZpdGF0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0TGFuZ3VhZ2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhbmd1YWdlc1wiXSxcbiAgICBsaXN0UGFnZXNCdWlsZHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RQdWxsUmVxdWVzdHNBc3NvY2lhdGVkV2l0aENvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L3B1bGxzXCJcbiAgICBdLFxuICAgIGxpc3RSZWxlYXNlQXNzZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L2Fzc2V0c1wiXG4gICAgXSxcbiAgICBsaXN0UmVsZWFzZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXNcIl0sXG4gICAgbGlzdFRhZ1Byb3RlY3Rpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgIGxpc3RUYWdzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3NcIl0sXG4gICAgbGlzdFRlYW1zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RlYW1zXCJdLFxuICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJcbiAgICBdLFxuICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICBtZXJnZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWVyZ2VzXCJdLFxuICAgIG1lcmdlVXBzdHJlYW06IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21lcmdlLXVwc3RyZWFtXCJdLFxuICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH0vYXR0ZW1wdHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlQ29sbGFib3JhdG9yOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVN0YXR1c0NoZWNrQ29udGV4dHM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9XG4gICAgXSxcbiAgICByZW1vdmVTdGF0dXNDaGVja1Byb3RlY3Rpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIlxuICAgIF0sXG4gICAgcmVtb3ZlVGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgcmVuYW1lQnJhbmNoOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9yZW5hbWVcIl0sXG4gICAgcmVwbGFjZUFsbFRvcGljczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIl0sXG4gICAgcmVxdWVzdFBhZ2VzQnVpbGQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiXSxcbiAgICBzZXRBZG1pbkJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXG4gICAgXSxcbiAgICBzZXRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImFwcHNcIiB9XG4gICAgXSxcbiAgICBzZXRTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImNvbnRleHRzXCIgfVxuICAgIF0sXG4gICAgc2V0VGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgc2V0VXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgdGVzdFB1c2hXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vdGVzdHNcIl0sXG4gICAgdHJhbnNmZXI6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYW5zZmVyXCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIHVwZGF0ZUJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uXCJcbiAgICBdLFxuICAgIHVwZGF0ZUNvbW1pdENvbW1lbnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZUluZm9ybWF0aW9uQWJvdXRQYWdlc1NpdGU6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgdXBkYXRlSW52aXRhdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZU9yZ1J1bGVzZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgdXBkYXRlUHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3B1bGxfcmVxdWVzdF9yZXZpZXdzXCJcbiAgICBdLFxuICAgIHVwZGF0ZVJlbGVhc2U6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgdXBkYXRlUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9hc3NldHMve2Fzc2V0X2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVSZXBvUnVsZXNldDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgdXBkYXRlU3RhdHVzQ2hlY2tQb3RlY3Rpb246IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwidXBkYXRlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uXCJdIH1cbiAgICBdLFxuICAgIHVwZGF0ZVN0YXR1c0NoZWNrUHJvdGVjdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCJcbiAgICBdLFxuICAgIHVwZGF0ZVdlYmhvb2s6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0ZvclJlcG86IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9jb25maWdcIlxuICAgIF0sXG4gICAgdXBsb2FkUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9hc3NldHN7P25hbWUsbGFiZWx9XCIsXG4gICAgICB7IGJhc2VVcmw6IFwiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb21cIiB9XG4gICAgXVxuICB9LFxuICBzZWFyY2g6IHtcbiAgICBjb2RlOiBbXCJHRVQgL3NlYXJjaC9jb2RlXCJdLFxuICAgIGNvbW1pdHM6IFtcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIl0sXG4gICAgaXNzdWVzQW5kUHVsbFJlcXVlc3RzOiBbXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIl0sXG4gICAgbGFiZWxzOiBbXCJHRVQgL3NlYXJjaC9sYWJlbHNcIl0sXG4gICAgcmVwb3M6IFtcIkdFVCAvc2VhcmNoL3JlcG9zaXRvcmllc1wiXSxcbiAgICB0b3BpY3M6IFtcIkdFVCAvc2VhcmNoL3RvcGljc1wiXSxcbiAgICB1c2VyczogW1wiR0VUIC9zZWFyY2gvdXNlcnNcIl1cbiAgfSxcbiAgc2VjcmV0U2Nhbm5pbmc6IHtcbiAgICBnZXRBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXG4gICAgXSxcbiAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RMb2NhdGlvbnNGb3JBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vbG9jYXRpb25zXCJcbiAgICBdLFxuICAgIHVwZGF0ZUFsZXJ0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJcbiAgICBdXG4gIH0sXG4gIHNlY3VyaXR5QWR2aXNvcmllczoge1xuICAgIGNyZWF0ZVByaXZhdGVWdWxuZXJhYmlsaXR5UmVwb3J0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMvcmVwb3J0c1wiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvc2l0b3J5QWR2aXNvcnk6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllc1wiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvc2l0b3J5QWR2aXNvcnlDdmVSZXF1ZXN0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMve2doc2FfaWR9L2N2ZVwiXG4gICAgXSxcbiAgICBnZXRHbG9iYWxBZHZpc29yeTogW1wiR0VUIC9hZHZpc29yaWVzL3tnaHNhX2lkfVwiXSxcbiAgICBnZXRSZXBvc2l0b3J5QWR2aXNvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzL3tnaHNhX2lkfVwiXG4gICAgXSxcbiAgICBsaXN0R2xvYmFsQWR2aXNvcmllczogW1wiR0VUIC9hZHZpc29yaWVzXCJdLFxuICAgIGxpc3RPcmdSZXBvc2l0b3J5QWR2aXNvcmllczogW1wiR0VUIC9vcmdzL3tvcmd9L3NlY3VyaXR5LWFkdmlzb3JpZXNcIl0sXG4gICAgbGlzdFJlcG9zaXRvcnlBZHZpc29yaWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXNcIl0sXG4gICAgdXBkYXRlUmVwb3NpdG9yeUFkdmlzb3J5OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzL3tnaHNhX2lkfVwiXG4gICAgXVxuICB9LFxuICB0ZWFtczoge1xuICAgIGFkZE9yVXBkYXRlTWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICBhZGRPclVwZGF0ZVByb2plY3RQZXJtaXNzaW9uc0luT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIlxuICAgIF0sXG4gICAgYWRkT3JVcGRhdGVSZXBvUGVybWlzc2lvbnNJbk9yZzogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIlxuICAgIF0sXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvclByb2plY3RJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCJcbiAgICBdLFxuICAgIGNoZWNrUGVybWlzc2lvbnNGb3JSZXBvSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zL3tvd25lcn0ve3JlcG99XCJcbiAgICBdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvb3Jncy97b3JnfS90ZWFtc1wiXSxcbiAgICBjcmVhdGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBjcmVhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnNcIl0sXG4gICAgZGVsZXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZURpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiXG4gICAgXSxcbiAgICBkZWxldGVJbk9yZzogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdLFxuICAgIGdldEJ5TmFtZTogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdLFxuICAgIGdldERpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiXG4gICAgXSxcbiAgICBnZXREaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0TWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXNcIl0sXG4gICAgbGlzdENoaWxkSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS90ZWFtc1wiXSxcbiAgICBsaXN0RGlzY3Vzc2lvbkNvbW1lbnRzSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIlxuICAgIF0sXG4gICAgbGlzdERpc2N1c3Npb25zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci90ZWFtc1wiXSxcbiAgICBsaXN0TWVtYmVyc0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc1wiXSxcbiAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2ludml0YXRpb25zXCJcbiAgICBdLFxuICAgIGxpc3RQcm9qZWN0c0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHNcIl0sXG4gICAgbGlzdFJlcG9zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvc1wiXSxcbiAgICByZW1vdmVNZW1iZXJzaGlwRm9yVXNlckluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVByb2plY3RJbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCJcbiAgICBdLFxuICAgIHJlbW92ZVJlcG9Jbk9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIlxuICAgIF0sXG4gICAgdXBkYXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJQQVRDSCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIlxuICAgIF0sXG4gICAgdXBkYXRlRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn1cIlxuICAgIF0sXG4gICAgdXBkYXRlSW5Pcmc6IFtcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdXG4gIH0sXG4gIHVzZXJzOiB7XG4gICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJhZGRFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGFkZEVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvZW1haWxzXCJdLFxuICAgIGFkZFNvY2lhbEFjY291bnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9zb2NpYWxfYWNjb3VudHNcIl0sXG4gICAgYmxvY2s6IFtcIlBVVCAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja0Jsb2NrZWQ6IFtcIkdFVCAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja0ZvbGxvd2luZ0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmcve3RhcmdldF91c2VyfVwiXSxcbiAgICBjaGVja1BlcnNvbklzRm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9mb2xsb3dpbmcve3VzZXJuYW1lfVwiXSxcbiAgICBjcmVhdGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvZ3BnX2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2dwZ19rZXlzXCJdLFxuICAgIGNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9rZXlzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBjcmVhdGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9rZXlzXCJdLFxuICAgIGNyZWF0ZVNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9zc2hfc2lnbmluZ19rZXlzXCJdLFxuICAgIGRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9lbWFpbHNcIl0sXG4gICAgZGVsZXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiXSxcbiAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9rZXlzL3trZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBkZWxldGVQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2tleXMve2tleV9pZH1cIl0sXG4gICAgZGVsZXRlU29jaWFsQWNjb3VudEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvc29jaWFsX2FjY291bnRzXCJdLFxuICAgIGRlbGV0ZVNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvc3NoX3NpZ25pbmdfa2V5cy97c3NoX3NpZ25pbmdfa2V5X2lkfVwiXG4gICAgXSxcbiAgICBmb2xsb3c6IFtcIlBVVCAvdXNlci9mb2xsb3dpbmcve3VzZXJuYW1lfVwiXSxcbiAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL3VzZXJcIl0sXG4gICAgZ2V0QnlVc2VybmFtZTogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9XCJdLFxuICAgIGdldENvbnRleHRGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vaG92ZXJjYXJkXCJdLFxuICAgIGdldEdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIl0sXG4gICAgZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIva2V5cy97a2V5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9rZXlzL3trZXlfaWR9XCJdLFxuICAgIGdldFNzaFNpZ25pbmdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvc3NoX3NpZ25pbmdfa2V5cy97c3NoX3NpZ25pbmdfa2V5X2lkfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL3VzZXJzXCJdLFxuICAgIGxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9ibG9ja3NcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBsaXN0QmxvY2tlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ibG9ja3NcIl0sXG4gICAgbGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2VtYWlsc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2VtYWlsc1wiXSxcbiAgICBsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2ZvbGxvd2luZ1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEZvbGxvd2VkQnlBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZm9sbG93aW5nXCJdLFxuICAgIGxpc3RGb2xsb3dlcnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiXSxcbiAgICBsaXN0Rm9sbG93ZXJzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2Vyc1wiXSxcbiAgICBsaXN0Rm9sbG93aW5nRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZ1wiXSxcbiAgICBsaXN0R3BnS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2dwZ19rZXlzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0R3BnS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9ncGdfa2V5c1wiXSxcbiAgICBsaXN0R3BnS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiXSxcbiAgICBsaXN0UHVibGljRW1haWxzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdFB1YmxpY0VtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3B1YmxpY19lbWFpbHNcIl0sXG4gICAgbGlzdFB1YmxpY0tleXNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0va2V5c1wiXSxcbiAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNTc2hLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdFB1YmxpY1NzaEtleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2tleXNcIl0sXG4gICAgbGlzdFNvY2lhbEFjY291bnRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zb2NpYWxfYWNjb3VudHNcIl0sXG4gICAgbGlzdFNvY2lhbEFjY291bnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NvY2lhbF9hY2NvdW50c1wiXSxcbiAgICBsaXN0U3NoU2lnbmluZ0tleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3NzaF9zaWduaW5nX2tleXNcIl0sXG4gICAgbGlzdFNzaFNpZ25pbmdLZXlzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NzaF9zaWduaW5nX2tleXNcIl0sXG4gICAgc2V0UHJpbWFyeUVtYWlsVmlzaWJpbGl0eUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvZW1haWwvdmlzaWJpbGl0eVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwic2V0UHJpbWFyeUVtYWlsVmlzaWJpbGl0eUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIHNldFByaW1hcnlFbWFpbFZpc2liaWxpdHlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQQVRDSCAvdXNlci9lbWFpbC92aXNpYmlsaXR5XCJcbiAgICBdLFxuICAgIHVuYmxvY2s6IFtcIkRFTEVURSAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICB1bmZvbGxvdzogW1wiREVMRVRFIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgIHVwZGF0ZUF1dGhlbnRpY2F0ZWQ6IFtcIlBBVENIIC91c2VyXCJdXG4gIH1cbn07XG52YXIgZW5kcG9pbnRzX2RlZmF1bHQgPSBFbmRwb2ludHM7XG5leHBvcnQge1xuICBlbmRwb2ludHNfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IEVORFBPSU5UUyBmcm9tIFwiLi9nZW5lcmF0ZWQvZW5kcG9pbnRzLmpzXCI7XG5jb25zdCBlbmRwb2ludE1ldGhvZHNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuZm9yIChjb25zdCBbc2NvcGUsIGVuZHBvaW50c10gb2YgT2JqZWN0LmVudHJpZXMoRU5EUE9JTlRTKSkge1xuICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBlbmRwb2ludF0gb2YgT2JqZWN0LmVudHJpZXMoZW5kcG9pbnRzKSkge1xuICAgIGNvbnN0IFtyb3V0ZSwgZGVmYXVsdHMsIGRlY29yYXRpb25zXSA9IGVuZHBvaW50O1xuICAgIGNvbnN0IFttZXRob2QsIHVybF0gPSByb3V0ZS5zcGxpdCgvIC8pO1xuICAgIGNvbnN0IGVuZHBvaW50RGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRzXG4gICAgKTtcbiAgICBpZiAoIWVuZHBvaW50TWV0aG9kc01hcC5oYXMoc2NvcGUpKSB7XG4gICAgICBlbmRwb2ludE1ldGhvZHNNYXAuc2V0KHNjb3BlLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkuc2V0KG1ldGhvZE5hbWUsIHtcbiAgICAgIHNjb3BlLFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIGVuZHBvaW50RGVmYXVsdHMsXG4gICAgICBkZWNvcmF0aW9uc1xuICAgIH0pO1xuICB9XG59XG5jb25zdCBoYW5kbGVyID0ge1xuICBoYXMoeyBzY29wZSB9LCBtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGVuZHBvaW50TWV0aG9kc01hcC5nZXQoc2NvcGUpLmhhcyhtZXRob2ROYW1lKTtcbiAgfSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdGhpcy5nZXQodGFyZ2V0LCBtZXRob2ROYW1lKSxcbiAgICAgIC8vIGVuc3VyZXMgbWV0aG9kIGlzIGluIHRoZSBjYWNoZVxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldC5jYWNoZSwgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIGRlbGV0ZSB0YXJnZXQuY2FjaGVbbWV0aG9kTmFtZV07XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG93bktleXMoeyBzY29wZSB9KSB7XG4gICAgcmV0dXJuIFsuLi5lbmRwb2ludE1ldGhvZHNNYXAuZ2V0KHNjb3BlKS5rZXlzKCldO1xuICB9LFxuICBzZXQodGFyZ2V0LCBtZXRob2ROYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiB0YXJnZXQuY2FjaGVbbWV0aG9kTmFtZV0gPSB2YWx1ZTtcbiAgfSxcbiAgZ2V0KHsgb2N0b2tpdCwgc2NvcGUsIGNhY2hlIH0sIG1ldGhvZE5hbWUpIHtcbiAgICBpZiAoY2FjaGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgIHJldHVybiBjYWNoZVttZXRob2ROYW1lXTtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkuZ2V0KG1ldGhvZE5hbWUpO1xuICAgIGlmICghbWV0aG9kKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCB7IGVuZHBvaW50RGVmYXVsdHMsIGRlY29yYXRpb25zIH0gPSBtZXRob2Q7XG4gICAgaWYgKGRlY29yYXRpb25zKSB7XG4gICAgICBjYWNoZVttZXRob2ROYW1lXSA9IGRlY29yYXRlKFxuICAgICAgICBvY3Rva2l0LFxuICAgICAgICBzY29wZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgZW5kcG9pbnREZWZhdWx0cyxcbiAgICAgICAgZGVjb3JhdGlvbnNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlW21ldGhvZE5hbWVdID0gb2N0b2tpdC5yZXF1ZXN0LmRlZmF1bHRzKGVuZHBvaW50RGVmYXVsdHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVbbWV0aG9kTmFtZV07XG4gIH1cbn07XG5mdW5jdGlvbiBlbmRwb2ludHNUb01ldGhvZHMob2N0b2tpdCkge1xuICBjb25zdCBuZXdNZXRob2RzID0ge307XG4gIGZvciAoY29uc3Qgc2NvcGUgb2YgZW5kcG9pbnRNZXRob2RzTWFwLmtleXMoKSkge1xuICAgIG5ld01ldGhvZHNbc2NvcGVdID0gbmV3IFByb3h5KHsgb2N0b2tpdCwgc2NvcGUsIGNhY2hlOiB7fSB9LCBoYW5kbGVyKTtcbiAgfVxuICByZXR1cm4gbmV3TWV0aG9kcztcbn1cbmZ1bmN0aW9uIGRlY29yYXRlKG9jdG9raXQsIHNjb3BlLCBtZXRob2ROYW1lLCBkZWZhdWx0cywgZGVjb3JhdGlvbnMpIHtcbiAgY29uc3QgcmVxdWVzdFdpdGhEZWZhdWx0cyA9IG9jdG9raXQucmVxdWVzdC5kZWZhdWx0cyhkZWZhdWx0cyk7XG4gIGZ1bmN0aW9uIHdpdGhEZWNvcmF0aW9ucyguLi5hcmdzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSByZXF1ZXN0V2l0aERlZmF1bHRzLmVuZHBvaW50Lm1lcmdlKC4uLmFyZ3MpO1xuICAgIGlmIChkZWNvcmF0aW9ucy5tYXBUb0RhdGEpIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgIGRhdGE6IG9wdGlvbnNbZGVjb3JhdGlvbnMubWFwVG9EYXRhXSxcbiAgICAgICAgW2RlY29yYXRpb25zLm1hcFRvRGF0YV06IHZvaWQgMFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFdpdGhEZWZhdWx0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWQpIHtcbiAgICAgIGNvbnN0IFtuZXdTY29wZSwgbmV3TWV0aG9kTmFtZV0gPSBkZWNvcmF0aW9ucy5yZW5hbWVkO1xuICAgICAgb2N0b2tpdC5sb2cud2FybihcbiAgICAgICAgYG9jdG9raXQuJHtzY29wZX0uJHttZXRob2ROYW1lfSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gb2N0b2tpdC4ke25ld1Njb3BlfS4ke25ld01ldGhvZE5hbWV9KClgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVjb3JhdGlvbnMuZGVwcmVjYXRlZCkge1xuICAgICAgb2N0b2tpdC5sb2cud2FybihkZWNvcmF0aW9ucy5kZXByZWNhdGVkKTtcbiAgICB9XG4gICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWRQYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBvcHRpb25zMiA9IHJlcXVlc3RXaXRoRGVmYXVsdHMuZW5kcG9pbnQubWVyZ2UoLi4uYXJncyk7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBhbGlhc10gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIGRlY29yYXRpb25zLnJlbmFtZWRQYXJhbWV0ZXJzXG4gICAgICApKSB7XG4gICAgICAgIGlmIChuYW1lIGluIG9wdGlvbnMyKSB7XG4gICAgICAgICAgb2N0b2tpdC5sb2cud2FybihcbiAgICAgICAgICAgIGBcIiR7bmFtZX1cIiBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBmb3IgXCJvY3Rva2l0LiR7c2NvcGV9LiR7bWV0aG9kTmFtZX0oKVwiLiBVc2UgXCIke2FsaWFzfVwiIGluc3RlYWRgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIShhbGlhcyBpbiBvcHRpb25zMikpIHtcbiAgICAgICAgICAgIG9wdGlvbnMyW2FsaWFzXSA9IG9wdGlvbnMyW25hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgb3B0aW9uczJbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0V2l0aERlZmF1bHRzKG9wdGlvbnMyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMoLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24od2l0aERlY29yYXRpb25zLCByZXF1ZXN0V2l0aERlZmF1bHRzKTtcbn1cbmV4cG9ydCB7XG4gIGVuZHBvaW50c1RvTWV0aG9kc1xufTtcbiIsImltcG9ydCB7IFZFUlNJT04gfSBmcm9tIFwiLi92ZXJzaW9uLmpzXCI7XG5pbXBvcnQgeyBlbmRwb2ludHNUb01ldGhvZHMgfSBmcm9tIFwiLi9lbmRwb2ludHMtdG8tbWV0aG9kcy5qc1wiO1xuZnVuY3Rpb24gcmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gIGNvbnN0IGFwaSA9IGVuZHBvaW50c1RvTWV0aG9kcyhvY3Rva2l0KTtcbiAgcmV0dXJuIHtcbiAgICByZXN0OiBhcGlcbiAgfTtcbn1cbnJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5mdW5jdGlvbiBsZWdhY3lSZXN0RW5kcG9pbnRNZXRob2RzKG9jdG9raXQpIHtcbiAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQpO1xuICByZXR1cm4ge1xuICAgIC4uLmFwaSxcbiAgICByZXN0OiBhcGlcbiAgfTtcbn1cbmxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5leHBvcnQge1xuICBsZWdhY3lSZXN0RW5kcG9pbnRNZXRob2RzLFxuICByZXN0RW5kcG9pbnRNZXRob2RzXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///30667\n')},89673:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VERSION: () => (/* binding */ VERSION),\n/* harmony export */ retry: () => (/* binding */ retry)\n/* harmony export */ });\n/* harmony import */ var bottleneck_light__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68454);\n/* harmony import */ var bottleneck_light__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(bottleneck_light__WEBPACK_IMPORTED_MODULE_0__);\n\n\n// @ts-ignore\nasync function errorRequest(octokit, state, error, options) {\n if (!error.request || !error.request.request) {\n // address https://github.com/octokit/plugin-retry.js/issues/8\n throw error;\n }\n // retry all >= 400 && not doNotRetry\n if (error.status >= 400 && !state.doNotRetry.includes(error.status)) {\n const retries = options.request.retries != null ? options.request.retries : state.retries;\n const retryAfter = Math.pow((options.request.retryCount || 0) + 1, 2);\n throw octokit.retry.retryRequest(error, retries, retryAfter);\n }\n // Maybe eventually there will be more cases here\n throw error;\n}\n\n// @ts-ignore\n// @ts-ignore\nasync function wrapRequest(state, request, options) {\n const limiter = new (bottleneck_light__WEBPACK_IMPORTED_MODULE_0___default())();\n // @ts-ignore\n limiter.on("failed", function (error, info) {\n const maxRetries = ~~error.request.request.retries;\n const after = ~~error.request.request.retryAfter;\n options.request.retryCount = info.retryCount + 1;\n if (maxRetries > info.retryCount) {\n // Returning a number instructs the limiter to retry\n // the request after that number of milliseconds have passed\n return after * state.retryAfterBaseValue;\n }\n });\n return limiter.schedule(request, options);\n}\n\nconst VERSION = "3.0.9";\nfunction retry(octokit, octokitOptions) {\n const state = Object.assign({\n enabled: true,\n retryAfterBaseValue: 1000,\n doNotRetry: [400, 401, 403, 404, 422],\n retries: 3,\n }, octokitOptions.retry);\n if (state.enabled) {\n octokit.hook.error("request", errorRequest.bind(null, octokit, state));\n octokit.hook.wrap("request", wrapRequest.bind(null, state));\n }\n return {\n retry: {\n retryRequest: (error, retries, retryAfter) => {\n error.request.request = Object.assign({}, error.request.request, {\n retries: retries,\n retryAfter: retryAfter,\n });\n return error;\n },\n },\n };\n}\nretry.VERSION = VERSION;\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODk2NzMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUEwQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5REFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFMEI7QUFDMUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXRyeS9kaXN0LXdlYi9pbmRleC5qcz9kNWEwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCb3R0bGVuZWNrIGZyb20gJ2JvdHRsZW5lY2svbGlnaHQnO1xuXG4vLyBAdHMtaWdub3JlXG5hc3luYyBmdW5jdGlvbiBlcnJvclJlcXVlc3Qob2N0b2tpdCwgc3RhdGUsIGVycm9yLCBvcHRpb25zKSB7XG4gICAgaWYgKCFlcnJvci5yZXF1ZXN0IHx8ICFlcnJvci5yZXF1ZXN0LnJlcXVlc3QpIHtcbiAgICAgICAgLy8gYWRkcmVzcyBodHRwczovL2dpdGh1Yi5jb20vb2N0b2tpdC9wbHVnaW4tcmV0cnkuanMvaXNzdWVzLzhcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIC8vIHJldHJ5IGFsbCA+PSA0MDAgJiYgbm90IGRvTm90UmV0cnlcbiAgICBpZiAoZXJyb3Iuc3RhdHVzID49IDQwMCAmJiAhc3RhdGUuZG9Ob3RSZXRyeS5pbmNsdWRlcyhlcnJvci5zdGF0dXMpKSB7XG4gICAgICAgIGNvbnN0IHJldHJpZXMgPSBvcHRpb25zLnJlcXVlc3QucmV0cmllcyAhPSBudWxsID8gb3B0aW9ucy5yZXF1ZXN0LnJldHJpZXMgOiBzdGF0ZS5yZXRyaWVzO1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTWF0aC5wb3coKG9wdGlvbnMucmVxdWVzdC5yZXRyeUNvdW50IHx8IDApICsgMSwgMik7XG4gICAgICAgIHRocm93IG9jdG9raXQucmV0cnkucmV0cnlSZXF1ZXN0KGVycm9yLCByZXRyaWVzLCByZXRyeUFmdGVyKTtcbiAgICB9XG4gICAgLy8gTWF5YmUgZXZlbnR1YWxseSB0aGVyZSB3aWxsIGJlIG1vcmUgY2FzZXMgaGVyZVxuICAgIHRocm93IGVycm9yO1xufVxuXG4vLyBAdHMtaWdub3JlXG4vLyBAdHMtaWdub3JlXG5hc3luYyBmdW5jdGlvbiB3cmFwUmVxdWVzdChzdGF0ZSwgcmVxdWVzdCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGxpbWl0ZXIgPSBuZXcgQm90dGxlbmVjaygpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsaW1pdGVyLm9uKFwiZmFpbGVkXCIsIGZ1bmN0aW9uIChlcnJvciwgaW5mbykge1xuICAgICAgICBjb25zdCBtYXhSZXRyaWVzID0gfn5lcnJvci5yZXF1ZXN0LnJlcXVlc3QucmV0cmllcztcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB+fmVycm9yLnJlcXVlc3QucmVxdWVzdC5yZXRyeUFmdGVyO1xuICAgICAgICBvcHRpb25zLnJlcXVlc3QucmV0cnlDb3VudCA9IGluZm8ucmV0cnlDb3VudCArIDE7XG4gICAgICAgIGlmIChtYXhSZXRyaWVzID4gaW5mby5yZXRyeUNvdW50KSB7XG4gICAgICAgICAgICAvLyBSZXR1cm5pbmcgYSBudW1iZXIgaW5zdHJ1Y3RzIHRoZSBsaW1pdGVyIHRvIHJldHJ5XG4gICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBhZnRlciB0aGF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWRcbiAgICAgICAgICAgIHJldHVybiBhZnRlciAqIHN0YXRlLnJldHJ5QWZ0ZXJCYXNlVmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbGltaXRlci5zY2hlZHVsZShyZXF1ZXN0LCBvcHRpb25zKTtcbn1cblxuY29uc3QgVkVSU0lPTiA9IFwiMy4wLjlcIjtcbmZ1bmN0aW9uIHJldHJ5KG9jdG9raXQsIG9jdG9raXRPcHRpb25zKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgcmV0cnlBZnRlckJhc2VWYWx1ZTogMTAwMCxcbiAgICAgICAgZG9Ob3RSZXRyeTogWzQwMCwgNDAxLCA0MDMsIDQwNCwgNDIyXSxcbiAgICAgICAgcmV0cmllczogMyxcbiAgICB9LCBvY3Rva2l0T3B0aW9ucy5yZXRyeSk7XG4gICAgaWYgKHN0YXRlLmVuYWJsZWQpIHtcbiAgICAgICAgb2N0b2tpdC5ob29rLmVycm9yKFwicmVxdWVzdFwiLCBlcnJvclJlcXVlc3QuYmluZChudWxsLCBvY3Rva2l0LCBzdGF0ZSkpO1xuICAgICAgICBvY3Rva2l0Lmhvb2sud3JhcChcInJlcXVlc3RcIiwgd3JhcFJlcXVlc3QuYmluZChudWxsLCBzdGF0ZSkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZXRyeToge1xuICAgICAgICAgICAgcmV0cnlSZXF1ZXN0OiAoZXJyb3IsIHJldHJpZXMsIHJldHJ5QWZ0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBlcnJvci5yZXF1ZXN0LnJlcXVlc3QgPSBPYmplY3QuYXNzaWduKHt9LCBlcnJvci5yZXF1ZXN0LnJlcXVlc3QsIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogcmV0cmllcyxcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlcjogcmV0cnlBZnRlcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG5yZXRyeS5WRVJTSU9OID0gVkVSU0lPTjtcblxuZXhwb3J0IHsgVkVSU0lPTiwgcmV0cnkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///89673\n')},28003:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n ClientStreamingCall: () => (/* reexport */ ClientStreamingCall),\n Deferred: () => (/* reexport */ Deferred),\n DeferredState: () => (/* reexport */ DeferredState),\n DuplexStreamingCall: () => (/* reexport */ DuplexStreamingCall),\n RpcError: () => (/* reexport */ RpcError),\n RpcOutputStreamController: () => (/* reexport */ RpcOutputStreamController),\n ServerCallContextController: () => (/* reexport */ ServerCallContextController),\n ServerStreamingCall: () => (/* reexport */ ServerStreamingCall),\n ServiceType: () => (/* reexport */ ServiceType),\n TestTransport: () => (/* reexport */ TestTransport),\n UnaryCall: () => (/* reexport */ UnaryCall),\n mergeRpcOptions: () => (/* reexport */ mergeRpcOptions),\n readMethodOption: () => (/* reexport */ readMethodOption),\n readMethodOptions: () => (/* reexport */ readMethodOptions),\n readServiceOption: () => (/* reexport */ readServiceOption),\n stackClientStreamingInterceptors: () => (/* reexport */ stackClientStreamingInterceptors),\n stackDuplexStreamingInterceptors: () => (/* reexport */ stackDuplexStreamingInterceptors),\n stackIntercept: () => (/* reexport */ stackIntercept),\n stackServerStreamingInterceptors: () => (/* reexport */ stackServerStreamingInterceptors),\n stackUnaryInterceptors: () => (/* reexport */ stackUnaryInterceptors)\n});\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/lower-camel-case.js\nvar lower_camel_case = __webpack_require__(99378);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/reflection-info.js\n\n/**\n * Turns PartialMethodInfo into MethodInfo.\n */\nfunction normalizeMethodInfo(method, service) {\n var _a, _b, _c;\n let m = method;\n m.service = service;\n m.localName = (_a = m.localName) !== null && _a !== void 0 ? _a : (0,lower_camel_case/* lowerCamelCase */.W)(m.name);\n // noinspection PointlessBooleanExpressionJS\n m.serverStreaming = !!m.serverStreaming;\n // noinspection PointlessBooleanExpressionJS\n m.clientStreaming = !!m.clientStreaming;\n m.options = (_b = m.options) !== null && _b !== void 0 ? _b : {};\n m.idempotency = (_c = m.idempotency) !== null && _c !== void 0 ? _c : undefined;\n return m;\n}\n/**\n * Read custom method options from a generated service client.\n *\n * @deprecated use readMethodOption()\n */\nfunction readMethodOptions(service, methodName, extensionName, extensionType) {\n var _a;\n const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;\n return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;\n}\nfunction readMethodOption(service, methodName, extensionName, extensionType) {\n var _a;\n const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;\n if (!options) {\n return undefined;\n }\n const optionVal = options[extensionName];\n if (optionVal === undefined) {\n return optionVal;\n }\n return extensionType ? extensionType.fromJson(optionVal) : optionVal;\n}\nfunction readServiceOption(service, extensionName, extensionType) {\n const options = service.options;\n if (!options) {\n return undefined;\n }\n const optionVal = options[extensionName];\n if (optionVal === undefined) {\n return optionVal;\n }\n return extensionType ? extensionType.fromJson(optionVal) : optionVal;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/service-type.js\n\nclass ServiceType {\n constructor(typeName, methods, options) {\n this.typeName = typeName;\n this.methods = methods.map(i => normalizeMethodInfo(i, this));\n this.options = options !== null && options !== void 0 ? options : {};\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/rpc-error.js\n/**\n * An error that occurred while calling a RPC method.\n */\nclass RpcError extends Error {\n constructor(message, code = \'UNKNOWN\', meta) {\n super(message);\n this.name = \'RpcError\';\n // see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#example\n Object.setPrototypeOf(this, new.target.prototype);\n this.code = code;\n this.meta = meta !== null && meta !== void 0 ? meta : {};\n }\n toString() {\n const l = [this.name + \': \' + this.message];\n if (this.code) {\n l.push(\'\');\n l.push(\'Code: \' + this.code);\n }\n if (this.serviceName && this.methodName) {\n l.push(\'Method: \' + this.serviceName + \'/\' + this.methodName);\n }\n let m = Object.entries(this.meta);\n if (m.length) {\n l.push(\'\');\n l.push(\'Meta:\');\n for (let [k, v] of m) {\n l.push(` ${k}: ${v}`);\n }\n }\n return l.join(\'\\n\');\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/json-format-contract.js\nvar json_format_contract = __webpack_require__(69196);\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/binary-format-contract.js\nvar binary_format_contract = __webpack_require__(8899);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/rpc-options.js\n\n/**\n * Merges custom RPC options with defaults. Returns a new instance and keeps\n * the "defaults" and the "options" unmodified.\n *\n * Merges `RpcMetadata` "meta", overwriting values from "defaults" with\n * values from "options". Does not append values to existing entries.\n *\n * Merges "jsonOptions", including "jsonOptions.typeRegistry", by creating\n * a new array that contains types from "options.jsonOptions.typeRegistry"\n * first, then types from "defaults.jsonOptions.typeRegistry".\n *\n * Merges "binaryOptions".\n *\n * Merges "interceptors" by creating a new array that contains interceptors\n * from "defaults" first, then interceptors from "options".\n *\n * Works with objects that extend `RpcOptions`, but only if the added\n * properties are of type Date, primitive like string, boolean, or Array\n * of primitives. If you have other property types, you have to merge them\n * yourself.\n */\nfunction mergeRpcOptions(defaults, options) {\n if (!options)\n return defaults;\n let o = {};\n copy(defaults, o);\n copy(options, o);\n for (let key of Object.keys(options)) {\n let val = options[key];\n switch (key) {\n case "jsonOptions":\n o.jsonOptions = (0,json_format_contract/* mergeJsonOptions */.Zc)(defaults.jsonOptions, o.jsonOptions);\n break;\n case "binaryOptions":\n o.binaryOptions = (0,binary_format_contract/* mergeBinaryOptions */.Ix)(defaults.binaryOptions, o.binaryOptions);\n break;\n case "meta":\n o.meta = {};\n copy(defaults.meta, o.meta);\n copy(options.meta, o.meta);\n break;\n case "interceptors":\n o.interceptors = defaults.interceptors ? defaults.interceptors.concat(val) : val.concat();\n break;\n }\n }\n return o;\n}\nfunction copy(a, into) {\n if (!a)\n return;\n let c = into;\n for (let [k, v] of Object.entries(a)) {\n if (v instanceof Date)\n c[k] = new Date(v.getTime());\n else if (Array.isArray(v))\n c[k] = v.concat();\n else\n c[k] = v;\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/deferred.js\nvar DeferredState;\n(function (DeferredState) {\n DeferredState[DeferredState["PENDING"] = 0] = "PENDING";\n DeferredState[DeferredState["REJECTED"] = 1] = "REJECTED";\n DeferredState[DeferredState["RESOLVED"] = 2] = "RESOLVED";\n})(DeferredState || (DeferredState = {}));\n/**\n * A deferred promise. This is a "controller" for a promise, which lets you\n * pass a promise around and reject or resolve it from the outside.\n *\n * Warning: This class is to be used with care. Using it can make code very\n * difficult to read. It is intended for use in library code that exposes\n * promises, not for regular business logic.\n */\nclass Deferred {\n /**\n * @param preventUnhandledRejectionWarning - prevents the warning\n * "Unhandled Promise rejection" by adding a noop rejection handler.\n * Working with calls returned from the runtime-rpc package in an\n * async function usually means awaiting one call property after\n * the other. This means that the "status" is not being awaited when\n * an earlier await for the "headers" is rejected. This causes the\n * "unhandled promise reject" warning. A more correct behaviour for\n * calls might be to become aware whether at least one of the\n * promises is handled and swallow the rejection warning for the\n * others.\n */\n constructor(preventUnhandledRejectionWarning = true) {\n this._state = DeferredState.PENDING;\n this._promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n if (preventUnhandledRejectionWarning) {\n this._promise.catch(_ => { });\n }\n }\n /**\n * Get the current state of the promise.\n */\n get state() {\n return this._state;\n }\n /**\n * Get the deferred promise.\n */\n get promise() {\n return this._promise;\n }\n /**\n * Resolve the promise. Throws if the promise is already resolved or rejected.\n */\n resolve(value) {\n if (this.state !== DeferredState.PENDING)\n throw new Error(`cannot resolve ${DeferredState[this.state].toLowerCase()}`);\n this._resolve(value);\n this._state = DeferredState.RESOLVED;\n }\n /**\n * Reject the promise. Throws if the promise is already resolved or rejected.\n */\n reject(reason) {\n if (this.state !== DeferredState.PENDING)\n throw new Error(`cannot reject ${DeferredState[this.state].toLowerCase()}`);\n this._reject(reason);\n this._state = DeferredState.REJECTED;\n }\n /**\n * Resolve the promise. Ignore if not pending.\n */\n resolvePending(val) {\n if (this._state === DeferredState.PENDING)\n this.resolve(val);\n }\n /**\n * Reject the promise. Ignore if not pending.\n */\n rejectPending(reason) {\n if (this._state === DeferredState.PENDING)\n this.reject(reason);\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/assert.js\nvar assert = __webpack_require__(64441);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/rpc-output-stream.js\n\n\n/**\n * A `RpcOutputStream` that you control.\n */\nclass RpcOutputStreamController {\n constructor() {\n this._lis = {\n nxt: [],\n msg: [],\n err: [],\n cmp: [],\n };\n this._closed = false;\n }\n // --- RpcOutputStream callback API\n onNext(callback) {\n return this.addLis(callback, this._lis.nxt);\n }\n onMessage(callback) {\n return this.addLis(callback, this._lis.msg);\n }\n onError(callback) {\n return this.addLis(callback, this._lis.err);\n }\n onComplete(callback) {\n return this.addLis(callback, this._lis.cmp);\n }\n addLis(callback, list) {\n list.push(callback);\n return () => {\n let i = list.indexOf(callback);\n if (i >= 0)\n list.splice(i, 1);\n };\n }\n // remove all listeners\n clearLis() {\n for (let l of Object.values(this._lis))\n l.splice(0, l.length);\n }\n // --- Controller API\n /**\n * Is this stream already closed by a completion or error?\n */\n get closed() {\n return this._closed !== false;\n }\n /**\n * Emit message, close with error, or close successfully, but only one\n * at a time.\n * Can be used to wrap a stream by using the other stream\'s `onNext`.\n */\n notifyNext(message, error, complete) {\n (0,assert/* assert */.vA)((message ? 1 : 0) + (error ? 1 : 0) + (complete ? 1 : 0) <= 1, \'only one emission at a time\');\n if (message)\n this.notifyMessage(message);\n if (error)\n this.notifyError(error);\n if (complete)\n this.notifyComplete();\n }\n /**\n * Emits a new message. Throws if stream is closed.\n *\n * Triggers onNext and onMessage callbacks.\n */\n notifyMessage(message) {\n (0,assert/* assert */.vA)(!this.closed, \'stream is closed\');\n this.pushIt({ value: message, done: false });\n this._lis.msg.forEach(l => l(message));\n this._lis.nxt.forEach(l => l(message, undefined, false));\n }\n /**\n * Closes the stream with an error. Throws if stream is closed.\n *\n * Triggers onNext and onError callbacks.\n */\n notifyError(error) {\n (0,assert/* assert */.vA)(!this.closed, \'stream is closed\');\n this._closed = error;\n this.pushIt(error);\n this._lis.err.forEach(l => l(error));\n this._lis.nxt.forEach(l => l(undefined, error, false));\n this.clearLis();\n }\n /**\n * Closes the stream successfully. Throws if stream is closed.\n *\n * Triggers onNext and onComplete callbacks.\n */\n notifyComplete() {\n (0,assert/* assert */.vA)(!this.closed, \'stream is closed\');\n this._closed = true;\n this.pushIt({ value: null, done: true });\n this._lis.cmp.forEach(l => l());\n this._lis.nxt.forEach(l => l(undefined, undefined, true));\n this.clearLis();\n }\n /**\n * Creates an async iterator (that can be used with `for await {...}`)\n * to consume the stream.\n *\n * Some things to note:\n * - If an error occurs, the `for await` will throw it.\n * - If an error occurred before the `for await` was started, `for await`\n * will re-throw it.\n * - If the stream is already complete, the `for await` will be empty.\n * - If your `for await` consumes slower than the stream produces,\n * for example because you are relaying messages in a slow operation,\n * messages are queued.\n */\n [Symbol.asyncIterator]() {\n // init the iterator state, enabling pushIt()\n if (!this._itState) {\n this._itState = { q: [] };\n }\n // if we are closed, we are definitely not receiving any more messages.\n // but we can\'t let the iterator get stuck. we want to either:\n // a) finish the new iterator immediately, because we are completed\n // b) reject the new iterator, because we errored\n if (this._closed === true)\n this.pushIt({ value: null, done: true });\n else if (this._closed !== false)\n this.pushIt(this._closed);\n // the async iterator\n return {\n next: () => {\n let state = this._itState;\n (0,assert/* assert */.vA)(state, "bad state"); // if we don\'t have a state here, code is broken\n // there should be no pending result.\n // did the consumer call next() before we resolved our previous result promise?\n (0,assert/* assert */.vA)(!state.p, "iterator contract broken");\n // did we produce faster than the iterator consumed?\n // return the oldest result from the queue.\n let first = state.q.shift();\n if (first)\n return ("value" in first) ? Promise.resolve(first) : Promise.reject(first);\n // we have no result ATM, but we promise one.\n // as soon as we have a result, we must resolve promise.\n state.p = new Deferred();\n return state.p.promise;\n },\n };\n }\n // "push" a new iterator result.\n // this either resolves a pending promise, or enqueues the result.\n pushIt(result) {\n let state = this._itState;\n if (!state)\n return;\n // is the consumer waiting for us?\n if (state.p) {\n // yes, consumer is waiting for this promise.\n const p = state.p;\n (0,assert/* assert */.vA)(p.state == DeferredState.PENDING, "iterator contract broken");\n // resolve the promise\n ("value" in result) ? p.resolve(result) : p.reject(result);\n // must cleanup, otherwise iterator.next() would pick it up again.\n delete state.p;\n }\n else {\n // we are producing faster than the iterator consumes.\n // push result onto queue.\n state.q.push(result);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/unary-call.js\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * A unary RPC call. Unary means there is exactly one input message and\n * exactly one output message unless an error occurred.\n */\nclass UnaryCall {\n constructor(method, requestHeaders, request, headers, response, status, trailers) {\n this.method = method;\n this.requestHeaders = requestHeaders;\n this.request = request;\n this.headers = headers;\n this.response = response;\n this.status = status;\n this.trailers = trailers;\n }\n /**\n * If you are only interested in the final outcome of this call,\n * you can await it to receive a `FinishedUnaryCall`.\n */\n then(onfulfilled, onrejected) {\n return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));\n }\n promiseFinished() {\n return __awaiter(this, void 0, void 0, function* () {\n let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);\n return {\n method: this.method,\n requestHeaders: this.requestHeaders,\n request: this.request,\n headers,\n response,\n status,\n trailers\n };\n });\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/server-streaming-call.js\nvar server_streaming_call_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * A server streaming RPC call. The client provides exactly one input message\n * but the server may respond with 0, 1, or more messages.\n */\nclass ServerStreamingCall {\n constructor(method, requestHeaders, request, headers, response, status, trailers) {\n this.method = method;\n this.requestHeaders = requestHeaders;\n this.request = request;\n this.headers = headers;\n this.responses = response;\n this.status = status;\n this.trailers = trailers;\n }\n /**\n * Instead of awaiting the response status and trailers, you can\n * just as well await this call itself to receive the server outcome.\n * You should first setup some listeners to the `request` to\n * see the actual messages the server replied with.\n */\n then(onfulfilled, onrejected) {\n return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));\n }\n promiseFinished() {\n return server_streaming_call_awaiter(this, void 0, void 0, function* () {\n let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);\n return {\n method: this.method,\n requestHeaders: this.requestHeaders,\n request: this.request,\n headers,\n status,\n trailers,\n };\n });\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/client-streaming-call.js\nvar client_streaming_call_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * A client streaming RPC call. This means that the clients sends 0, 1, or\n * more messages to the server, and the server replies with exactly one\n * message.\n */\nclass ClientStreamingCall {\n constructor(method, requestHeaders, request, headers, response, status, trailers) {\n this.method = method;\n this.requestHeaders = requestHeaders;\n this.requests = request;\n this.headers = headers;\n this.response = response;\n this.status = status;\n this.trailers = trailers;\n }\n /**\n * Instead of awaiting the response status and trailers, you can\n * just as well await this call itself to receive the server outcome.\n * Note that it may still be valid to send more request messages.\n */\n then(onfulfilled, onrejected) {\n return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));\n }\n promiseFinished() {\n return client_streaming_call_awaiter(this, void 0, void 0, function* () {\n let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);\n return {\n method: this.method,\n requestHeaders: this.requestHeaders,\n headers,\n response,\n status,\n trailers\n };\n });\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/duplex-streaming-call.js\nvar duplex_streaming_call_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * A duplex streaming RPC call. This means that the clients sends an\n * arbitrary amount of messages to the server, while at the same time,\n * the server sends an arbitrary amount of messages to the client.\n */\nclass DuplexStreamingCall {\n constructor(method, requestHeaders, request, headers, response, status, trailers) {\n this.method = method;\n this.requestHeaders = requestHeaders;\n this.requests = request;\n this.headers = headers;\n this.responses = response;\n this.status = status;\n this.trailers = trailers;\n }\n /**\n * Instead of awaiting the response status and trailers, you can\n * just as well await this call itself to receive the server outcome.\n * Note that it may still be valid to send more request messages.\n */\n then(onfulfilled, onrejected) {\n return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));\n }\n promiseFinished() {\n return duplex_streaming_call_awaiter(this, void 0, void 0, function* () {\n let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);\n return {\n method: this.method,\n requestHeaders: this.requestHeaders,\n headers,\n status,\n trailers,\n };\n });\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/test-transport.js\nvar test_transport_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n/**\n * Transport for testing.\n */\nclass TestTransport {\n /**\n * Initialize with mock data. Omitted fields have default value.\n */\n constructor(data) {\n /**\n * Suppress warning / error about uncaught rejections of\n * "status" and "trailers".\n */\n this.suppressUncaughtRejections = true;\n this.headerDelay = 10;\n this.responseDelay = 50;\n this.betweenResponseDelay = 10;\n this.afterResponseDelay = 10;\n this.data = data !== null && data !== void 0 ? data : {};\n }\n /**\n * Sent message(s) during the last operation.\n */\n get sentMessages() {\n if (this.lastInput instanceof TestInputStream) {\n return this.lastInput.sent;\n }\n else if (typeof this.lastInput == "object") {\n return [this.lastInput.single];\n }\n return [];\n }\n /**\n * Sending message(s) completed?\n */\n get sendComplete() {\n if (this.lastInput instanceof TestInputStream) {\n return this.lastInput.completed;\n }\n else if (typeof this.lastInput == "object") {\n return true;\n }\n return false;\n }\n // Creates a promise for response headers from the mock data.\n promiseHeaders() {\n var _a;\n const headers = (_a = this.data.headers) !== null && _a !== void 0 ? _a : TestTransport.defaultHeaders;\n return headers instanceof RpcError\n ? Promise.reject(headers)\n : Promise.resolve(headers);\n }\n // Creates a promise for a single, valid, message from the mock data.\n promiseSingleResponse(method) {\n if (this.data.response instanceof RpcError) {\n return Promise.reject(this.data.response);\n }\n let r;\n if (Array.isArray(this.data.response)) {\n (0,assert/* assert */.vA)(this.data.response.length > 0);\n r = this.data.response[0];\n }\n else if (this.data.response !== undefined) {\n r = this.data.response;\n }\n else {\n r = method.O.create();\n }\n (0,assert/* assert */.vA)(method.O.is(r));\n return Promise.resolve(r);\n }\n /**\n * Pushes response messages from the mock data to the output stream.\n * If an error response, status or trailers are mocked, the stream is\n * closed with the respective error.\n * Otherwise, stream is completed successfully.\n *\n * The returned promise resolves when the stream is closed. It should\n * not reject. If it does, code is broken.\n */\n streamResponses(method, stream, abort) {\n return test_transport_awaiter(this, void 0, void 0, function* () {\n // normalize "data.response" into an array of valid output messages\n const messages = [];\n if (this.data.response === undefined) {\n messages.push(method.O.create());\n }\n else if (Array.isArray(this.data.response)) {\n for (let msg of this.data.response) {\n (0,assert/* assert */.vA)(method.O.is(msg));\n messages.push(msg);\n }\n }\n else if (!(this.data.response instanceof RpcError)) {\n (0,assert/* assert */.vA)(method.O.is(this.data.response));\n messages.push(this.data.response);\n }\n // start the stream with an initial delay.\n // if the request is cancelled, notify() error and exit.\n try {\n yield delay(this.responseDelay, abort)(undefined);\n }\n catch (error) {\n stream.notifyError(error);\n return;\n }\n // if error response was mocked, notify() error (stream is now closed with error) and exit.\n if (this.data.response instanceof RpcError) {\n stream.notifyError(this.data.response);\n return;\n }\n // regular response messages were mocked. notify() them.\n for (let msg of messages) {\n stream.notifyMessage(msg);\n // add a short delay between responses\n // if the request is cancelled, notify() error and exit.\n try {\n yield delay(this.betweenResponseDelay, abort)(undefined);\n }\n catch (error) {\n stream.notifyError(error);\n return;\n }\n }\n // error status was mocked, notify() error (stream is now closed with error) and exit.\n if (this.data.status instanceof RpcError) {\n stream.notifyError(this.data.status);\n return;\n }\n // error trailers were mocked, notify() error (stream is now closed with error) and exit.\n if (this.data.trailers instanceof RpcError) {\n stream.notifyError(this.data.trailers);\n return;\n }\n // stream completed successfully\n stream.notifyComplete();\n });\n }\n // Creates a promise for response status from the mock data.\n promiseStatus() {\n var _a;\n const status = (_a = this.data.status) !== null && _a !== void 0 ? _a : TestTransport.defaultStatus;\n return status instanceof RpcError\n ? Promise.reject(status)\n : Promise.resolve(status);\n }\n // Creates a promise for response trailers from the mock data.\n promiseTrailers() {\n var _a;\n const trailers = (_a = this.data.trailers) !== null && _a !== void 0 ? _a : TestTransport.defaultTrailers;\n return trailers instanceof RpcError\n ? Promise.reject(trailers)\n : Promise.resolve(trailers);\n }\n maybeSuppressUncaught(...promise) {\n if (this.suppressUncaughtRejections) {\n for (let p of promise) {\n p.catch(() => {\n });\n }\n }\n }\n mergeOptions(options) {\n return mergeRpcOptions({}, options);\n }\n unary(method, input, options) {\n var _a;\n const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()\n .then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise\n .catch(_ => {\n })\n .then(delay(this.responseDelay, options.abort))\n .then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise\n .catch(_ => {\n })\n .then(delay(this.afterResponseDelay, options.abort))\n .then(_ => this.promiseStatus()), trailersPromise = responsePromise\n .catch(_ => {\n })\n .then(delay(this.afterResponseDelay, options.abort))\n .then(_ => this.promiseTrailers());\n this.maybeSuppressUncaught(statusPromise, trailersPromise);\n this.lastInput = { single: input };\n return new UnaryCall(method, requestHeaders, input, headersPromise, responsePromise, statusPromise, trailersPromise);\n }\n serverStreaming(method, input, options) {\n var _a;\n const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()\n .then(delay(this.headerDelay, options.abort)), outputStream = new RpcOutputStreamController(), responseStreamClosedPromise = headersPromise\n .then(delay(this.responseDelay, options.abort))\n .catch(() => {\n })\n .then(() => this.streamResponses(method, outputStream, options.abort))\n .then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise\n .then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise\n .then(() => this.promiseTrailers());\n this.maybeSuppressUncaught(statusPromise, trailersPromise);\n this.lastInput = { single: input };\n return new ServerStreamingCall(method, requestHeaders, input, headersPromise, outputStream, statusPromise, trailersPromise);\n }\n clientStreaming(method, options) {\n var _a;\n const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()\n .then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise\n .catch(_ => {\n })\n .then(delay(this.responseDelay, options.abort))\n .then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise\n .catch(_ => {\n })\n .then(delay(this.afterResponseDelay, options.abort))\n .then(_ => this.promiseStatus()), trailersPromise = responsePromise\n .catch(_ => {\n })\n .then(delay(this.afterResponseDelay, options.abort))\n .then(_ => this.promiseTrailers());\n this.maybeSuppressUncaught(statusPromise, trailersPromise);\n this.lastInput = new TestInputStream(this.data, options.abort);\n return new ClientStreamingCall(method, requestHeaders, this.lastInput, headersPromise, responsePromise, statusPromise, trailersPromise);\n }\n duplex(method, options) {\n var _a;\n const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()\n .then(delay(this.headerDelay, options.abort)), outputStream = new RpcOutputStreamController(), responseStreamClosedPromise = headersPromise\n .then(delay(this.responseDelay, options.abort))\n .catch(() => {\n })\n .then(() => this.streamResponses(method, outputStream, options.abort))\n .then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise\n .then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise\n .then(() => this.promiseTrailers());\n this.maybeSuppressUncaught(statusPromise, trailersPromise);\n this.lastInput = new TestInputStream(this.data, options.abort);\n return new DuplexStreamingCall(method, requestHeaders, this.lastInput, headersPromise, outputStream, statusPromise, trailersPromise);\n }\n}\nTestTransport.defaultHeaders = {\n responseHeader: "test"\n};\nTestTransport.defaultStatus = {\n code: "OK", detail: "all good"\n};\nTestTransport.defaultTrailers = {\n responseTrailer: "test"\n};\nfunction delay(ms, abort) {\n return (v) => new Promise((resolve, reject) => {\n if (abort === null || abort === void 0 ? void 0 : abort.aborted) {\n reject(new RpcError("user cancel", "CANCELLED"));\n }\n else {\n const id = setTimeout(() => resolve(v), ms);\n if (abort) {\n abort.addEventListener("abort", ev => {\n clearTimeout(id);\n reject(new RpcError("user cancel", "CANCELLED"));\n });\n }\n }\n });\n}\nclass TestInputStream {\n constructor(data, abort) {\n this._completed = false;\n this._sent = [];\n this.data = data;\n this.abort = abort;\n }\n get sent() {\n return this._sent;\n }\n get completed() {\n return this._completed;\n }\n send(message) {\n if (this.data.inputMessage instanceof RpcError) {\n return Promise.reject(this.data.inputMessage);\n }\n const delayMs = this.data.inputMessage === undefined\n ? 10\n : this.data.inputMessage;\n return Promise.resolve(undefined)\n .then(() => {\n this._sent.push(message);\n })\n .then(delay(delayMs, this.abort));\n }\n complete() {\n if (this.data.inputComplete instanceof RpcError) {\n return Promise.reject(this.data.inputComplete);\n }\n const delayMs = this.data.inputComplete === undefined\n ? 10\n : this.data.inputComplete;\n return Promise.resolve(undefined)\n .then(() => {\n this._completed = true;\n })\n .then(delay(delayMs, this.abort));\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/rpc-interceptor.js\n\n/**\n * Creates a "stack" of of all interceptors specified in the given `RpcOptions`.\n * Used by generated client implementations.\n * @internal\n */\nfunction stackIntercept(kind, transport, method, options, input) {\n var _a, _b, _c, _d;\n if (kind == "unary") {\n let tail = (mtd, inp, opt) => transport.unary(mtd, inp, opt);\n for (const curr of ((_a = options.interceptors) !== null && _a !== void 0 ? _a : []).filter(i => i.interceptUnary).reverse()) {\n const next = tail;\n tail = (mtd, inp, opt) => curr.interceptUnary(next, mtd, inp, opt);\n }\n return tail(method, input, options);\n }\n if (kind == "serverStreaming") {\n let tail = (mtd, inp, opt) => transport.serverStreaming(mtd, inp, opt);\n for (const curr of ((_b = options.interceptors) !== null && _b !== void 0 ? _b : []).filter(i => i.interceptServerStreaming).reverse()) {\n const next = tail;\n tail = (mtd, inp, opt) => curr.interceptServerStreaming(next, mtd, inp, opt);\n }\n return tail(method, input, options);\n }\n if (kind == "clientStreaming") {\n let tail = (mtd, opt) => transport.clientStreaming(mtd, opt);\n for (const curr of ((_c = options.interceptors) !== null && _c !== void 0 ? _c : []).filter(i => i.interceptClientStreaming).reverse()) {\n const next = tail;\n tail = (mtd, opt) => curr.interceptClientStreaming(next, mtd, opt);\n }\n return tail(method, options);\n }\n if (kind == "duplex") {\n let tail = (mtd, opt) => transport.duplex(mtd, opt);\n for (const curr of ((_d = options.interceptors) !== null && _d !== void 0 ? _d : []).filter(i => i.interceptDuplex).reverse()) {\n const next = tail;\n tail = (mtd, opt) => curr.interceptDuplex(next, mtd, opt);\n }\n return tail(method, options);\n }\n (0,assert/* assertNever */.xb)(kind);\n}\n/**\n * @deprecated replaced by `stackIntercept()`, still here to support older generated code\n */\nfunction stackUnaryInterceptors(transport, method, input, options) {\n return stackIntercept("unary", transport, method, options, input);\n}\n/**\n * @deprecated replaced by `stackIntercept()`, still here to support older generated code\n */\nfunction stackServerStreamingInterceptors(transport, method, input, options) {\n return stackIntercept("serverStreaming", transport, method, options, input);\n}\n/**\n * @deprecated replaced by `stackIntercept()`, still here to support older generated code\n */\nfunction stackClientStreamingInterceptors(transport, method, options) {\n return stackIntercept("clientStreaming", transport, method, options);\n}\n/**\n * @deprecated replaced by `stackIntercept()`, still here to support older generated code\n */\nfunction stackDuplexStreamingInterceptors(transport, method, options) {\n return stackIntercept("duplex", transport, method, options);\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/server-call-context.js\nclass ServerCallContextController {\n constructor(method, headers, deadline, sendResponseHeadersFn, defaultStatus = { code: \'OK\', detail: \'\' }) {\n this._cancelled = false;\n this._listeners = [];\n this.method = method;\n this.headers = headers;\n this.deadline = deadline;\n this.trailers = {};\n this._sendRH = sendResponseHeadersFn;\n this.status = defaultStatus;\n }\n /**\n * Set the call cancelled.\n *\n * Invokes all callbacks registered with onCancel() and\n * sets `cancelled = true`.\n */\n notifyCancelled() {\n if (!this._cancelled) {\n this._cancelled = true;\n for (let l of this._listeners) {\n l();\n }\n }\n }\n /**\n * Send response headers.\n */\n sendResponseHeaders(data) {\n this._sendRH(data);\n }\n /**\n * Is the call cancelled?\n *\n * When the client closes the connection before the server\n * is done, the call is cancelled.\n *\n * If you want to cancel a request on the server, throw a\n * RpcError with the CANCELLED status code.\n */\n get cancelled() {\n return this._cancelled;\n }\n /**\n * Add a callback for cancellation.\n */\n onCancel(callback) {\n const l = this._listeners;\n l.push(callback);\n return () => {\n let i = l.indexOf(callback);\n if (i >= 0)\n l.splice(i, 1);\n };\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/es2015/index.js\n// Public API of the rpc runtime.\n// Note: we do not use `export * from ...` to help tree shakers,\n// webpack verbose output hints that this should be useful\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgwMDMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLDBDQUFjO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2pEd0Q7QUFDakQ7QUFDUDtBQUNBO0FBQ0Esd0NBQXdDLG1CQUFtQjtBQUMzRDtBQUNBO0FBQ0E7OztBQ1BBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsRUFBRSxJQUFJLEVBQUU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQy9CNEU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsaURBQWdCO0FBQ2hEO0FBQ0E7QUFDQSxrQ0FBa0MscURBQWtCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdETztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzQ0FBc0M7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qyx3Q0FBd0M7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qyx3Q0FBd0M7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2pGcUQ7QUFDUDtBQUM5QztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEseUJBQU07QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEseUJBQU07QUFDZCxzQkFBc0IsNkJBQTZCO0FBQ25E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QUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7O0FDakVPO0FBQ1Asb0ZBQW9GLHdCQUF3QjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZEQTtBQUNBO0FBQ0E7QUFDNkM7QUFDOEM7QUFDcEQ7QUFDUztBQUNnQjtBQUNmO0FBQ0k7QUFDUztBQUNBO0FBQ0E7QUFDckI7QUFDd0k7QUFDN0ciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1pbmZvLmpzPzJjODkiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvZXMyMDE1L3NlcnZpY2UtdHlwZS5qcz9mYzYyIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9ycGMtZXJyb3IuanM/OThlNCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvcnBjLW9wdGlvbnMuanM/MWZhMiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvZGVmZXJyZWQuanM/MjQ4MyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvcnBjLW91dHB1dC1zdHJlYW0uanM/MGZkOCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvdW5hcnktY2FsbC5qcz8yNDgzIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9zZXJ2ZXItc3RyZWFtaW5nLWNhbGwuanM/MzQzNiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvY2xpZW50LXN0cmVhbWluZy1jYWxsLmpzPzAzZDIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvZXMyMDE1L2R1cGxleC1zdHJlYW1pbmctY2FsbC5qcz84Y2VmIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS90ZXN0LXRyYW5zcG9ydC5qcz84NjdlIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9ycGMtaW50ZXJjZXB0b3IuanM/ZDg4MyIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9lczIwMTUvc2VydmVyLWNhbGwtY29udGV4dC5qcz9mNWM3Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2VzMjAxNS9pbmRleC5qcz9iZDkzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvd2VyQ2FtZWxDYXNlIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG4vKipcbiAqIFR1cm5zIFBhcnRpYWxNZXRob2RJbmZvIGludG8gTWV0aG9kSW5mby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZEluZm8obWV0aG9kLCBzZXJ2aWNlKSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgbGV0IG0gPSBtZXRob2Q7XG4gICAgbS5zZXJ2aWNlID0gc2VydmljZTtcbiAgICBtLmxvY2FsTmFtZSA9IChfYSA9IG0ubG9jYWxOYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBsb3dlckNhbWVsQ2FzZShtLm5hbWUpO1xuICAgIC8vIG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbkpTXG4gICAgbS5zZXJ2ZXJTdHJlYW1pbmcgPSAhIW0uc2VydmVyU3RyZWFtaW5nO1xuICAgIC8vIG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbkpTXG4gICAgbS5jbGllbnRTdHJlYW1pbmcgPSAhIW0uY2xpZW50U3RyZWFtaW5nO1xuICAgIG0ub3B0aW9ucyA9IChfYiA9IG0ub3B0aW9ucykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge307XG4gICAgbS5pZGVtcG90ZW5jeSA9IChfYyA9IG0uaWRlbXBvdGVuY3kpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbTtcbn1cbi8qKlxuICogUmVhZCBjdXN0b20gbWV0aG9kIG9wdGlvbnMgZnJvbSBhIGdlbmVyYXRlZCBzZXJ2aWNlIGNsaWVudC5cbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgcmVhZE1ldGhvZE9wdGlvbigpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkTWV0aG9kT3B0aW9ucyhzZXJ2aWNlLCBtZXRob2ROYW1lLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoX2EgPSBzZXJ2aWNlLm1ldGhvZHMuZmluZCgobSwgaSkgPT4gbS5sb2NhbE5hbWUgPT09IG1ldGhvZE5hbWUgfHwgaSA9PT0gbWV0aG9kTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0gPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNZXRob2RPcHRpb24oc2VydmljZSwgbWV0aG9kTmFtZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvcHRpb25zID0gKF9hID0gc2VydmljZS5tZXRob2RzLmZpbmQoKG0sIGkpID0+IG0ubG9jYWxOYW1lID09PSBtZXRob2ROYW1lIHx8IGkgPT09IG1ldGhvZE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW9ucztcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uVmFsID0gb3B0aW9uc1tleHRlbnNpb25OYW1lXTtcbiAgICBpZiAob3B0aW9uVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvblZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvblR5cGUgPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvblZhbCkgOiBvcHRpb25WYWw7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVhZFNlcnZpY2VPcHRpb24oc2VydmljZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBzZXJ2aWNlLm9wdGlvbnM7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvblZhbCA9IG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV07XG4gICAgaWYgKG9wdGlvblZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWw7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25UeXBlID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25WYWwpIDogb3B0aW9uVmFsO1xufVxuIiwiaW1wb3J0IHsgbm9ybWFsaXplTWV0aG9kSW5mbyB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlTmFtZSwgbWV0aG9kcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7XG4gICAgICAgIHRoaXMubWV0aG9kcyA9IG1ldGhvZHMubWFwKGkgPT4gbm9ybWFsaXplTWV0aG9kSW5mbyhpLCB0aGlzKSk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuICAgIH1cbn1cbiIsIi8qKlxuICogQW4gZXJyb3IgdGhhdCBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIGEgUlBDIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJwY0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGNvZGUgPSAnVU5LTk9XTicsIG1ldGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdScGNFcnJvcic7XG4gICAgICAgIC8vIHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtMi0yLmh0bWwjZXhhbXBsZVxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhICE9PSBudWxsICYmIG1ldGEgIT09IHZvaWQgMCA/IG1ldGEgOiB7fTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGwgPSBbdGhpcy5uYW1lICsgJzogJyArIHRoaXMubWVzc2FnZV07XG4gICAgICAgIGlmICh0aGlzLmNvZGUpIHtcbiAgICAgICAgICAgIGwucHVzaCgnJyk7XG4gICAgICAgICAgICBsLnB1c2goJ0NvZGU6ICcgKyB0aGlzLmNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VOYW1lICYmIHRoaXMubWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgbC5wdXNoKCdNZXRob2Q6ICcgKyB0aGlzLnNlcnZpY2VOYW1lICsgJy8nICsgdGhpcy5tZXRob2ROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbSA9IE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YSk7XG4gICAgICAgIGlmIChtLmxlbmd0aCkge1xuICAgICAgICAgICAgbC5wdXNoKCcnKTtcbiAgICAgICAgICAgIGwucHVzaCgnTWV0YTonKTtcbiAgICAgICAgICAgIGZvciAobGV0IFtrLCB2XSBvZiBtKSB7XG4gICAgICAgICAgICAgICAgbC5wdXNoKGAgICR7a306ICR7dn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbC5qb2luKCdcXG4nKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBtZXJnZUJpbmFyeU9wdGlvbnMsIG1lcmdlSnNvbk9wdGlvbnMgfSBmcm9tIFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIjtcbi8qKlxuICogTWVyZ2VzIGN1c3RvbSBSUEMgb3B0aW9ucyB3aXRoIGRlZmF1bHRzLiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIGFuZCBrZWVwc1xuICogdGhlIFwiZGVmYXVsdHNcIiBhbmQgdGhlIFwib3B0aW9uc1wiIHVubW9kaWZpZWQuXG4gKlxuICogTWVyZ2VzIGBScGNNZXRhZGF0YWAgXCJtZXRhXCIsIG92ZXJ3cml0aW5nIHZhbHVlcyBmcm9tIFwiZGVmYXVsdHNcIiB3aXRoXG4gKiB2YWx1ZXMgZnJvbSBcIm9wdGlvbnNcIi4gRG9lcyBub3QgYXBwZW5kIHZhbHVlcyB0byBleGlzdGluZyBlbnRyaWVzLlxuICpcbiAqIE1lcmdlcyBcImpzb25PcHRpb25zXCIsIGluY2x1ZGluZyBcImpzb25PcHRpb25zLnR5cGVSZWdpc3RyeVwiLCBieSBjcmVhdGluZ1xuICogYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0eXBlcyBmcm9tIFwib3B0aW9ucy5qc29uT3B0aW9ucy50eXBlUmVnaXN0cnlcIlxuICogZmlyc3QsIHRoZW4gdHlwZXMgZnJvbSBcImRlZmF1bHRzLmpzb25PcHRpb25zLnR5cGVSZWdpc3RyeVwiLlxuICpcbiAqIE1lcmdlcyBcImJpbmFyeU9wdGlvbnNcIi5cbiAqXG4gKiBNZXJnZXMgXCJpbnRlcmNlcHRvcnNcIiBieSBjcmVhdGluZyBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIGludGVyY2VwdG9yc1xuICogZnJvbSBcImRlZmF1bHRzXCIgZmlyc3QsIHRoZW4gaW50ZXJjZXB0b3JzIGZyb20gXCJvcHRpb25zXCIuXG4gKlxuICogV29ya3Mgd2l0aCBvYmplY3RzIHRoYXQgZXh0ZW5kIGBScGNPcHRpb25zYCwgYnV0IG9ubHkgaWYgdGhlIGFkZGVkXG4gKiBwcm9wZXJ0aWVzIGFyZSBvZiB0eXBlIERhdGUsIHByaW1pdGl2ZSBsaWtlIHN0cmluZywgYm9vbGVhbiwgb3IgQXJyYXlcbiAqIG9mIHByaW1pdGl2ZXMuIElmIHlvdSBoYXZlIG90aGVyIHByb3BlcnR5IHR5cGVzLCB5b3UgaGF2ZSB0byBtZXJnZSB0aGVtXG4gKiB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUnBjT3B0aW9ucyhkZWZhdWx0cywgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIGxldCBvID0ge307XG4gICAgY29weShkZWZhdWx0cywgbyk7XG4gICAgY29weShvcHRpb25zLCBvKTtcbiAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMob3B0aW9ucykpIHtcbiAgICAgICAgbGV0IHZhbCA9IG9wdGlvbnNba2V5XTtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqc29uT3B0aW9uc1wiOlxuICAgICAgICAgICAgICAgIG8uanNvbk9wdGlvbnMgPSBtZXJnZUpzb25PcHRpb25zKGRlZmF1bHRzLmpzb25PcHRpb25zLCBvLmpzb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiaW5hcnlPcHRpb25zXCI6XG4gICAgICAgICAgICAgICAgby5iaW5hcnlPcHRpb25zID0gbWVyZ2VCaW5hcnlPcHRpb25zKGRlZmF1bHRzLmJpbmFyeU9wdGlvbnMsIG8uYmluYXJ5T3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWV0YVwiOlxuICAgICAgICAgICAgICAgIG8ubWV0YSA9IHt9O1xuICAgICAgICAgICAgICAgIGNvcHkoZGVmYXVsdHMubWV0YSwgby5tZXRhKTtcbiAgICAgICAgICAgICAgICBjb3B5KG9wdGlvbnMubWV0YSwgby5tZXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlcmNlcHRvcnNcIjpcbiAgICAgICAgICAgICAgICBvLmludGVyY2VwdG9ycyA9IGRlZmF1bHRzLmludGVyY2VwdG9ycyA/IGRlZmF1bHRzLmludGVyY2VwdG9ycy5jb25jYXQodmFsKSA6IHZhbC5jb25jYXQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbztcbn1cbmZ1bmN0aW9uIGNvcHkoYSwgaW50bykge1xuICAgIGlmICghYSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBjID0gaW50bztcbiAgICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYSkpIHtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICAgICAgY1trXSA9IG5ldyBEYXRlKHYuZ2V0VGltZSgpKTtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2KSlcbiAgICAgICAgICAgIGNba10gPSB2LmNvbmNhdCgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjW2tdID0gdjtcbiAgICB9XG59XG4iLCJleHBvcnQgdmFyIERlZmVycmVkU3RhdGU7XG4oZnVuY3Rpb24gKERlZmVycmVkU3RhdGUpIHtcbiAgICBEZWZlcnJlZFN0YXRlW0RlZmVycmVkU3RhdGVbXCJQRU5ESU5HXCJdID0gMF0gPSBcIlBFTkRJTkdcIjtcbiAgICBEZWZlcnJlZFN0YXRlW0RlZmVycmVkU3RhdGVbXCJSRUpFQ1RFRFwiXSA9IDFdID0gXCJSRUpFQ1RFRFwiO1xuICAgIERlZmVycmVkU3RhdGVbRGVmZXJyZWRTdGF0ZVtcIlJFU09MVkVEXCJdID0gMl0gPSBcIlJFU09MVkVEXCI7XG59KShEZWZlcnJlZFN0YXRlIHx8IChEZWZlcnJlZFN0YXRlID0ge30pKTtcbi8qKlxuICogQSBkZWZlcnJlZCBwcm9taXNlLiBUaGlzIGlzIGEgXCJjb250cm9sbGVyXCIgZm9yIGEgcHJvbWlzZSwgd2hpY2ggbGV0cyB5b3VcbiAqIHBhc3MgYSBwcm9taXNlIGFyb3VuZCBhbmQgcmVqZWN0IG9yIHJlc29sdmUgaXQgZnJvbSB0aGUgb3V0c2lkZS5cbiAqXG4gKiBXYXJuaW5nOiBUaGlzIGNsYXNzIGlzIHRvIGJlIHVzZWQgd2l0aCBjYXJlLiBVc2luZyBpdCBjYW4gbWFrZSBjb2RlIHZlcnlcbiAqIGRpZmZpY3VsdCB0byByZWFkLiBJdCBpcyBpbnRlbmRlZCBmb3IgdXNlIGluIGxpYnJhcnkgY29kZSB0aGF0IGV4cG9zZXNcbiAqIHByb21pc2VzLCBub3QgZm9yIHJlZ3VsYXIgYnVzaW5lc3MgbG9naWMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHByZXZlbnRVbmhhbmRsZWRSZWplY3Rpb25XYXJuaW5nIC0gcHJldmVudHMgdGhlIHdhcm5pbmdcbiAgICAgKiBcIlVuaGFuZGxlZCBQcm9taXNlIHJlamVjdGlvblwiIGJ5IGFkZGluZyBhIG5vb3AgcmVqZWN0aW9uIGhhbmRsZXIuXG4gICAgICogV29ya2luZyB3aXRoIGNhbGxzIHJldHVybmVkIGZyb20gdGhlIHJ1bnRpbWUtcnBjIHBhY2thZ2UgaW4gYW5cbiAgICAgKiBhc3luYyBmdW5jdGlvbiB1c3VhbGx5IG1lYW5zIGF3YWl0aW5nIG9uZSBjYWxsIHByb3BlcnR5IGFmdGVyXG4gICAgICogdGhlIG90aGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlIFwic3RhdHVzXCIgaXMgbm90IGJlaW5nIGF3YWl0ZWQgd2hlblxuICAgICAqIGFuIGVhcmxpZXIgYXdhaXQgZm9yIHRoZSBcImhlYWRlcnNcIiBpcyByZWplY3RlZC4gVGhpcyBjYXVzZXMgdGhlXG4gICAgICogXCJ1bmhhbmRsZWQgcHJvbWlzZSByZWplY3RcIiB3YXJuaW5nLiBBIG1vcmUgY29ycmVjdCBiZWhhdmlvdXIgZm9yXG4gICAgICogY2FsbHMgbWlnaHQgYmUgdG8gYmVjb21lIGF3YXJlIHdoZXRoZXIgYXQgbGVhc3Qgb25lIG9mIHRoZVxuICAgICAqIHByb21pc2VzIGlzIGhhbmRsZWQgYW5kIHN3YWxsb3cgdGhlIHJlamVjdGlvbiB3YXJuaW5nIGZvciB0aGVcbiAgICAgKiBvdGhlcnMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJldmVudFVuaGFuZGxlZFJlamVjdGlvbldhcm5pbmcgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gRGVmZXJyZWRTdGF0ZS5QRU5ESU5HO1xuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocHJldmVudFVuaGFuZGxlZFJlamVjdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb21pc2UuY2F0Y2goXyA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWZlcnJlZCBwcm9taXNlLlxuICAgICAqL1xuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB0aGUgcHJvbWlzZS4gVGhyb3dzIGlmIHRoZSBwcm9taXNlIGlzIGFscmVhZHkgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuXG4gICAgICovXG4gICAgcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gRGVmZXJyZWRTdGF0ZS5QRU5ESU5HKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVzb2x2ZSAke0RlZmVycmVkU3RhdGVbdGhpcy5zdGF0ZV0udG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gRGVmZXJyZWRTdGF0ZS5SRVNPTFZFRDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0IHRoZSBwcm9taXNlLiBUaHJvd3MgaWYgdGhlIHByb21pc2UgaXMgYWxyZWFkeSByZXNvbHZlZCBvciByZWplY3RlZC5cbiAgICAgKi9cbiAgICByZWplY3QocmVhc29uKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWplY3QgJHtEZWZlcnJlZFN0YXRlW3RoaXMuc3RhdGVdLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICAgIHRoaXMuX3JlamVjdChyZWFzb24pO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IERlZmVycmVkU3RhdGUuUkVKRUNURUQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdGhlIHByb21pc2UuIElnbm9yZSBpZiBub3QgcGVuZGluZy5cbiAgICAgKi9cbiAgICByZXNvbHZlUGVuZGluZyh2YWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aGlzLnJlc29sdmUodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0IHRoZSBwcm9taXNlLiBJZ25vcmUgaWYgbm90IHBlbmRpbmcuXG4gICAgICovXG4gICAgcmVqZWN0UGVuZGluZyhyZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aGlzLnJlamVjdChyZWFzb24pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERlZmVycmVkLCBEZWZlcnJlZFN0YXRlIH0gZnJvbSBcIi4vZGVmZXJyZWRcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCJAcHJvdG9idWYtdHMvcnVudGltZVwiO1xuLyoqXG4gKiBBIGBScGNPdXRwdXRTdHJlYW1gIHRoYXQgeW91IGNvbnRyb2wuXG4gKi9cbmV4cG9ydCBjbGFzcyBScGNPdXRwdXRTdHJlYW1Db250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fbGlzID0ge1xuICAgICAgICAgICAgbnh0OiBbXSxcbiAgICAgICAgICAgIG1zZzogW10sXG4gICAgICAgICAgICBlcnI6IFtdLFxuICAgICAgICAgICAgY21wOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fY2xvc2VkID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIC0tLSBScGNPdXRwdXRTdHJlYW0gY2FsbGJhY2sgQVBJXG4gICAgb25OZXh0KGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZExpcyhjYWxsYmFjaywgdGhpcy5fbGlzLm54dCk7XG4gICAgfVxuICAgIG9uTWVzc2FnZShjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRMaXMoY2FsbGJhY2ssIHRoaXMuX2xpcy5tc2cpO1xuICAgIH1cbiAgICBvbkVycm9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZExpcyhjYWxsYmFjaywgdGhpcy5fbGlzLmVycik7XG4gICAgfVxuICAgIG9uQ29tcGxldGUoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGlzKGNhbGxiYWNrLCB0aGlzLl9saXMuY21wKTtcbiAgICB9XG4gICAgYWRkTGlzKGNhbGxiYWNrLCBsaXN0KSB7XG4gICAgICAgIGxpc3QucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IGxpc3QuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaSA+PSAwKVxuICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgIGNsZWFyTGlzKCkge1xuICAgICAgICBmb3IgKGxldCBsIG9mIE9iamVjdC52YWx1ZXModGhpcy5fbGlzKSlcbiAgICAgICAgICAgIGwuc3BsaWNlKDAsIGwubGVuZ3RoKTtcbiAgICB9XG4gICAgLy8gLS0tIENvbnRyb2xsZXIgQVBJXG4gICAgLyoqXG4gICAgICogSXMgdGhpcyBzdHJlYW0gYWxyZWFkeSBjbG9zZWQgYnkgYSBjb21wbGV0aW9uIG9yIGVycm9yP1xuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9zZWQgIT09IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IG1lc3NhZ2UsIGNsb3NlIHdpdGggZXJyb3IsIG9yIGNsb3NlIHN1Y2Nlc3NmdWxseSwgYnV0IG9ubHkgb25lXG4gICAgICogYXQgYSB0aW1lLlxuICAgICAqIENhbiBiZSB1c2VkIHRvIHdyYXAgYSBzdHJlYW0gYnkgdXNpbmcgdGhlIG90aGVyIHN0cmVhbSdzIGBvbk5leHRgLlxuICAgICAqL1xuICAgIG5vdGlmeU5leHQobWVzc2FnZSwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIGFzc2VydCgobWVzc2FnZSA/IDEgOiAwKSArIChlcnJvciA/IDEgOiAwKSArIChjb21wbGV0ZSA/IDEgOiAwKSA8PSAxLCAnb25seSBvbmUgZW1pc3Npb24gYXQgYSB0aW1lJyk7XG4gICAgICAgIGlmIChtZXNzYWdlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnlNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUVycm9yKGVycm9yKTtcbiAgICAgICAgaWYgKGNvbXBsZXRlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhIG5ldyBtZXNzYWdlLiBUaHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC5cbiAgICAgKlxuICAgICAqIFRyaWdnZXJzIG9uTmV4dCBhbmQgb25NZXNzYWdlIGNhbGxiYWNrcy5cbiAgICAgKi9cbiAgICBub3RpZnlNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmNsb3NlZCwgJ3N0cmVhbSBpcyBjbG9zZWQnKTtcbiAgICAgICAgdGhpcy5wdXNoSXQoeyB2YWx1ZTogbWVzc2FnZSwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX2xpcy5tc2cuZm9yRWFjaChsID0+IGwobWVzc2FnZSkpO1xuICAgICAgICB0aGlzLl9saXMubnh0LmZvckVhY2gobCA9PiBsKG1lc3NhZ2UsIHVuZGVmaW5lZCwgZmFsc2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gd2l0aCBhbiBlcnJvci4gVGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VycyBvbk5leHQgYW5kIG9uRXJyb3IgY2FsbGJhY2tzLlxuICAgICAqL1xuICAgIG5vdGlmeUVycm9yKGVycm9yKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5jbG9zZWQsICdzdHJlYW0gaXMgY2xvc2VkJyk7XG4gICAgICAgIHRoaXMuX2Nsb3NlZCA9IGVycm9yO1xuICAgICAgICB0aGlzLnB1c2hJdChlcnJvcik7XG4gICAgICAgIHRoaXMuX2xpcy5lcnIuZm9yRWFjaChsID0+IGwoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5fbGlzLm54dC5mb3JFYWNoKGwgPT4gbCh1bmRlZmluZWQsIGVycm9yLCBmYWxzZSkpO1xuICAgICAgICB0aGlzLmNsZWFyTGlzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgc3RyZWFtIHN1Y2Nlc3NmdWxseS4gVGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VycyBvbk5leHQgYW5kIG9uQ29tcGxldGUgY2FsbGJhY2tzLlxuICAgICAqL1xuICAgIG5vdGlmeUNvbXBsZXRlKCkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuY2xvc2VkLCAnc3RyZWFtIGlzIGNsb3NlZCcpO1xuICAgICAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnB1c2hJdCh7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLl9saXMuY21wLmZvckVhY2gobCA9PiBsKCkpO1xuICAgICAgICB0aGlzLl9saXMubnh0LmZvckVhY2gobCA9PiBsKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgIHRoaXMuY2xlYXJMaXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhc3luYyBpdGVyYXRvciAodGhhdCBjYW4gYmUgdXNlZCB3aXRoIGBmb3IgYXdhaXQgey4uLn1gKVxuICAgICAqIHRvIGNvbnN1bWUgdGhlIHN0cmVhbS5cbiAgICAgKlxuICAgICAqIFNvbWUgdGhpbmdzIHRvIG5vdGU6XG4gICAgICogLSBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBgZm9yIGF3YWl0YCB3aWxsIHRocm93IGl0LlxuICAgICAqIC0gSWYgYW4gZXJyb3Igb2NjdXJyZWQgYmVmb3JlIHRoZSBgZm9yIGF3YWl0YCB3YXMgc3RhcnRlZCwgYGZvciBhd2FpdGBcbiAgICAgKiAgIHdpbGwgcmUtdGhyb3cgaXQuXG4gICAgICogLSBJZiB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY29tcGxldGUsIHRoZSBgZm9yIGF3YWl0YCB3aWxsIGJlIGVtcHR5LlxuICAgICAqIC0gSWYgeW91ciBgZm9yIGF3YWl0YCBjb25zdW1lcyBzbG93ZXIgdGhhbiB0aGUgc3RyZWFtIHByb2R1Y2VzLFxuICAgICAqICAgZm9yIGV4YW1wbGUgYmVjYXVzZSB5b3UgYXJlIHJlbGF5aW5nIG1lc3NhZ2VzIGluIGEgc2xvdyBvcGVyYXRpb24sXG4gICAgICogICBtZXNzYWdlcyBhcmUgcXVldWVkLlxuICAgICAqL1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIC8vIGluaXQgdGhlIGl0ZXJhdG9yIHN0YXRlLCBlbmFibGluZyBwdXNoSXQoKVxuICAgICAgICBpZiAoIXRoaXMuX2l0U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2l0U3RhdGUgPSB7IHE6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgYXJlIGNsb3NlZCwgd2UgYXJlIGRlZmluaXRlbHkgbm90IHJlY2VpdmluZyBhbnkgbW9yZSBtZXNzYWdlcy5cbiAgICAgICAgLy8gYnV0IHdlIGNhbid0IGxldCB0aGUgaXRlcmF0b3IgZ2V0IHN0dWNrLiB3ZSB3YW50IHRvIGVpdGhlcjpcbiAgICAgICAgLy8gYSkgZmluaXNoIHRoZSBuZXcgaXRlcmF0b3IgaW1tZWRpYXRlbHksIGJlY2F1c2Ugd2UgYXJlIGNvbXBsZXRlZFxuICAgICAgICAvLyBiKSByZWplY3QgdGhlIG5ldyBpdGVyYXRvciwgYmVjYXVzZSB3ZSBlcnJvcmVkXG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWQgPT09IHRydWUpXG4gICAgICAgICAgICB0aGlzLnB1c2hJdCh7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICBlbHNlIGlmICh0aGlzLl9jbG9zZWQgIT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5wdXNoSXQodGhpcy5fY2xvc2VkKTtcbiAgICAgICAgLy8gdGhlIGFzeW5jIGl0ZXJhdG9yXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5faXRTdGF0ZTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoc3RhdGUsIFwiYmFkIHN0YXRlXCIpOyAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3RhdGUgaGVyZSwgY29kZSBpcyBicm9rZW5cbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgbm8gcGVuZGluZyByZXN1bHQuXG4gICAgICAgICAgICAgICAgLy8gZGlkIHRoZSBjb25zdW1lciBjYWxsIG5leHQoKSBiZWZvcmUgd2UgcmVzb2x2ZWQgb3VyIHByZXZpb3VzIHJlc3VsdCBwcm9taXNlP1xuICAgICAgICAgICAgICAgIGFzc2VydCghc3RhdGUucCwgXCJpdGVyYXRvciBjb250cmFjdCBicm9rZW5cIik7XG4gICAgICAgICAgICAgICAgLy8gZGlkIHdlIHByb2R1Y2UgZmFzdGVyIHRoYW4gdGhlIGl0ZXJhdG9yIGNvbnN1bWVkP1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgb2xkZXN0IHJlc3VsdCBmcm9tIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBzdGF0ZS5xLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFwidmFsdWVcIiBpbiBmaXJzdCkgPyBQcm9taXNlLnJlc29sdmUoZmlyc3QpIDogUHJvbWlzZS5yZWplY3QoZmlyc3QpO1xuICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgbm8gcmVzdWx0IEFUTSwgYnV0IHdlIHByb21pc2Ugb25lLlxuICAgICAgICAgICAgICAgIC8vIGFzIHNvb24gYXMgd2UgaGF2ZSBhIHJlc3VsdCwgd2UgbXVzdCByZXNvbHZlIHByb21pc2UuXG4gICAgICAgICAgICAgICAgc3RhdGUucCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5wLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBcInB1c2hcIiBhIG5ldyBpdGVyYXRvciByZXN1bHQuXG4gICAgLy8gdGhpcyBlaXRoZXIgcmVzb2x2ZXMgYSBwZW5kaW5nIHByb21pc2UsIG9yIGVucXVldWVzIHRoZSByZXN1bHQuXG4gICAgcHVzaEl0KHJlc3VsdCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLl9pdFN0YXRlO1xuICAgICAgICBpZiAoIXN0YXRlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBpcyB0aGUgY29uc3VtZXIgd2FpdGluZyBmb3IgdXM/XG4gICAgICAgIGlmIChzdGF0ZS5wKSB7XG4gICAgICAgICAgICAvLyB5ZXMsIGNvbnN1bWVyIGlzIHdhaXRpbmcgZm9yIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgIGNvbnN0IHAgPSBzdGF0ZS5wO1xuICAgICAgICAgICAgYXNzZXJ0KHAuc3RhdGUgPT0gRGVmZXJyZWRTdGF0ZS5QRU5ESU5HLCBcIml0ZXJhdG9yIGNvbnRyYWN0IGJyb2tlblwiKTtcbiAgICAgICAgICAgIC8vIHJlc29sdmUgdGhlIHByb21pc2VcbiAgICAgICAgICAgIChcInZhbHVlXCIgaW4gcmVzdWx0KSA/IHAucmVzb2x2ZShyZXN1bHQpIDogcC5yZWplY3QocmVzdWx0KTtcbiAgICAgICAgICAgIC8vIG11c3QgY2xlYW51cCwgb3RoZXJ3aXNlIGl0ZXJhdG9yLm5leHQoKSB3b3VsZCBwaWNrIGl0IHVwIGFnYWluLlxuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLnA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgcHJvZHVjaW5nIGZhc3RlciB0aGFuIHRoZSBpdGVyYXRvciBjb25zdW1lcy5cbiAgICAgICAgICAgIC8vIHB1c2ggcmVzdWx0IG9udG8gcXVldWUuXG4gICAgICAgICAgICBzdGF0ZS5xLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBBIHVuYXJ5IFJQQyBjYWxsLiBVbmFyeSBtZWFucyB0aGVyZSBpcyBleGFjdGx5IG9uZSBpbnB1dCBtZXNzYWdlIGFuZFxuICogZXhhY3RseSBvbmUgb3V0cHV0IG1lc3NhZ2UgdW5sZXNzIGFuIGVycm9yIG9jY3VycmVkLlxuICovXG5leHBvcnQgY2xhc3MgVW5hcnlDYWxsIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCByZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVycykge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3RIZWFkZXJzO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnRyYWlsZXJzID0gdHJhaWxlcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaW5hbCBvdXRjb21lIG9mIHRoaXMgY2FsbCxcbiAgICAgKiB5b3UgY2FuIGF3YWl0IGl0IHRvIHJlY2VpdmUgYSBgRmluaXNoZWRVbmFyeUNhbGxgLlxuICAgICAqL1xuICAgIHRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZUZpbmlzaGVkKCkudGhlbih2YWx1ZSA9PiBvbmZ1bGZpbGxlZCA/IFByb21pc2UucmVzb2x2ZShvbmZ1bGZpbGxlZCh2YWx1ZSkpIDogdmFsdWUsIHJlYXNvbiA9PiBvbnJlamVjdGVkID8gUHJvbWlzZS5yZXNvbHZlKG9ucmVqZWN0ZWQocmVhc29uKSkgOiBQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgICB9XG4gICAgcHJvbWlzZUZpbmlzaGVkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IFtoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVyc10gPSB5aWVsZCBQcm9taXNlLmFsbChbdGhpcy5oZWFkZXJzLCB0aGlzLnJlc3BvbnNlLCB0aGlzLnN0YXR1cywgdGhpcy50cmFpbGVyc10pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiB0aGlzLnJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICB0cmFpbGVyc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKipcbiAqIEEgc2VydmVyIHN0cmVhbWluZyBSUEMgY2FsbC4gVGhlIGNsaWVudCBwcm92aWRlcyBleGFjdGx5IG9uZSBpbnB1dCBtZXNzYWdlXG4gKiBidXQgdGhlIHNlcnZlciBtYXkgcmVzcG9uZCB3aXRoIDAsIDEsIG9yIG1vcmUgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJTdHJlYW1pbmdDYWxsIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCByZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVycykge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3RIZWFkZXJzO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlcyA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgdGhpcy50cmFpbGVycyA9IHRyYWlsZXJzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnN0ZWFkIG9mIGF3YWl0aW5nIHRoZSByZXNwb25zZSBzdGF0dXMgYW5kIHRyYWlsZXJzLCB5b3UgY2FuXG4gICAgICoganVzdCBhcyB3ZWxsIGF3YWl0IHRoaXMgY2FsbCBpdHNlbGYgdG8gcmVjZWl2ZSB0aGUgc2VydmVyIG91dGNvbWUuXG4gICAgICogWW91IHNob3VsZCBmaXJzdCBzZXR1cCBzb21lIGxpc3RlbmVycyB0byB0aGUgYHJlcXVlc3RgIHRvXG4gICAgICogc2VlIHRoZSBhY3R1YWwgbWVzc2FnZXMgdGhlIHNlcnZlciByZXBsaWVkIHdpdGguXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlRmluaXNoZWQoKS50aGVuKHZhbHVlID0+IG9uZnVsZmlsbGVkID8gUHJvbWlzZS5yZXNvbHZlKG9uZnVsZmlsbGVkKHZhbHVlKSkgOiB2YWx1ZSwgcmVhc29uID0+IG9ucmVqZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUob25yZWplY3RlZChyZWFzb24pKSA6IFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICAgIH1cbiAgICBwcm9taXNlRmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWRlcnMsIHN0YXR1cywgdHJhaWxlcnNdID0geWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuaGVhZGVycywgdGhpcy5zdGF0dXMsIHRoaXMudHJhaWxlcnNdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogdGhpcy5yZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgdHJhaWxlcnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbi8qKlxuICogQSBjbGllbnQgc3RyZWFtaW5nIFJQQyBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudHMgc2VuZHMgMCwgMSwgb3JcbiAqIG1vcmUgbWVzc2FnZXMgdG8gdGhlIHNlcnZlciwgYW5kIHRoZSBzZXJ2ZXIgcmVwbGllcyB3aXRoIGV4YWN0bHkgb25lXG4gKiBtZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50U3RyZWFtaW5nQ2FsbCB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgcmVxdWVzdCwgaGVhZGVycywgcmVzcG9uc2UsIHN0YXR1cywgdHJhaWxlcnMpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSByZXF1ZXN0SGVhZGVycztcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMudHJhaWxlcnMgPSB0cmFpbGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zdGVhZCBvZiBhd2FpdGluZyB0aGUgcmVzcG9uc2Ugc3RhdHVzIGFuZCB0cmFpbGVycywgeW91IGNhblxuICAgICAqIGp1c3QgYXMgd2VsbCBhd2FpdCB0aGlzIGNhbGwgaXRzZWxmIHRvIHJlY2VpdmUgdGhlIHNlcnZlciBvdXRjb21lLlxuICAgICAqIE5vdGUgdGhhdCBpdCBtYXkgc3RpbGwgYmUgdmFsaWQgdG8gc2VuZCBtb3JlIHJlcXVlc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlRmluaXNoZWQoKS50aGVuKHZhbHVlID0+IG9uZnVsZmlsbGVkID8gUHJvbWlzZS5yZXNvbHZlKG9uZnVsZmlsbGVkKHZhbHVlKSkgOiB2YWx1ZSwgcmVhc29uID0+IG9ucmVqZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUob25yZWplY3RlZChyZWFzb24pKSA6IFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICAgIH1cbiAgICBwcm9taXNlRmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWRlcnMsIHJlc3BvbnNlLCBzdGF0dXMsIHRyYWlsZXJzXSA9IHlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmhlYWRlcnMsIHRoaXMucmVzcG9uc2UsIHRoaXMuc3RhdHVzLCB0aGlzLnRyYWlsZXJzXSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnM6IHRoaXMucmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgdHJhaWxlcnNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBBIGR1cGxleCBzdHJlYW1pbmcgUlBDIGNhbGwuIFRoaXMgbWVhbnMgdGhhdCB0aGUgY2xpZW50cyBzZW5kcyBhblxuICogYXJiaXRyYXJ5IGFtb3VudCBvZiBtZXNzYWdlcyB0byB0aGUgc2VydmVyLCB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lLFxuICogdGhlIHNlcnZlciBzZW5kcyBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEdXBsZXhTdHJlYW1pbmdDYWxsIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCByZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVycykge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3RIZWFkZXJzO1xuICAgICAgICB0aGlzLnJlcXVlc3RzID0gcmVxdWVzdDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5yZXNwb25zZXMgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMudHJhaWxlcnMgPSB0cmFpbGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zdGVhZCBvZiBhd2FpdGluZyB0aGUgcmVzcG9uc2Ugc3RhdHVzIGFuZCB0cmFpbGVycywgeW91IGNhblxuICAgICAqIGp1c3QgYXMgd2VsbCBhd2FpdCB0aGlzIGNhbGwgaXRzZWxmIHRvIHJlY2VpdmUgdGhlIHNlcnZlciBvdXRjb21lLlxuICAgICAqIE5vdGUgdGhhdCBpdCBtYXkgc3RpbGwgYmUgdmFsaWQgdG8gc2VuZCBtb3JlIHJlcXVlc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlRmluaXNoZWQoKS50aGVuKHZhbHVlID0+IG9uZnVsZmlsbGVkID8gUHJvbWlzZS5yZXNvbHZlKG9uZnVsZmlsbGVkKHZhbHVlKSkgOiB2YWx1ZSwgcmVhc29uID0+IG9ucmVqZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUob25yZWplY3RlZChyZWFzb24pKSA6IFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICAgIH1cbiAgICBwcm9taXNlRmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWRlcnMsIHN0YXR1cywgdHJhaWxlcnNdID0geWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuaGVhZGVycywgdGhpcy5zdGF0dXMsIHRoaXMudHJhaWxlcnNdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogdGhpcy5yZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICB0cmFpbGVycyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgUnBjRXJyb3IgfSBmcm9tIFwiLi9ycGMtZXJyb3JcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCJAcHJvdG9idWYtdHMvcnVudGltZVwiO1xuaW1wb3J0IHsgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlciB9IGZyb20gXCIuL3JwYy1vdXRwdXQtc3RyZWFtXCI7XG5pbXBvcnQgeyBtZXJnZVJwY09wdGlvbnMgfSBmcm9tIFwiLi9ycGMtb3B0aW9uc1wiO1xuaW1wb3J0IHsgVW5hcnlDYWxsIH0gZnJvbSBcIi4vdW5hcnktY2FsbFwiO1xuaW1wb3J0IHsgU2VydmVyU3RyZWFtaW5nQ2FsbCB9IGZyb20gXCIuL3NlcnZlci1zdHJlYW1pbmctY2FsbFwiO1xuaW1wb3J0IHsgQ2xpZW50U3RyZWFtaW5nQ2FsbCB9IGZyb20gXCIuL2NsaWVudC1zdHJlYW1pbmctY2FsbFwiO1xuaW1wb3J0IHsgRHVwbGV4U3RyZWFtaW5nQ2FsbCB9IGZyb20gXCIuL2R1cGxleC1zdHJlYW1pbmctY2FsbFwiO1xuLyoqXG4gKiBUcmFuc3BvcnQgZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXN0VHJhbnNwb3J0IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHdpdGggbW9jayBkYXRhLiBPbWl0dGVkIGZpZWxkcyBoYXZlIGRlZmF1bHQgdmFsdWUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU3VwcHJlc3Mgd2FybmluZyAvIGVycm9yIGFib3V0IHVuY2F1Z2h0IHJlamVjdGlvbnMgb2ZcbiAgICAgICAgICogXCJzdGF0dXNcIiBhbmQgXCJ0cmFpbGVyc1wiLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdXBwcmVzc1VuY2F1Z2h0UmVqZWN0aW9ucyA9IHRydWU7XG4gICAgICAgIHRoaXMuaGVhZGVyRGVsYXkgPSAxMDtcbiAgICAgICAgdGhpcy5yZXNwb25zZURlbGF5ID0gNTA7XG4gICAgICAgIHRoaXMuYmV0d2VlblJlc3BvbnNlRGVsYXkgPSAxMDtcbiAgICAgICAgdGhpcy5hZnRlclJlc3BvbnNlRGVsYXkgPSAxMDtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB2b2lkIDAgPyBkYXRhIDoge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbnQgbWVzc2FnZShzKSBkdXJpbmcgdGhlIGxhc3Qgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGdldCBzZW50TWVzc2FnZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RJbnB1dCBpbnN0YW5jZW9mIFRlc3RJbnB1dFN0cmVhbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdElucHV0LnNlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMubGFzdElucHV0ID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5sYXN0SW5wdXQuc2luZ2xlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRpbmcgbWVzc2FnZShzKSBjb21wbGV0ZWQ/XG4gICAgICovXG4gICAgZ2V0IHNlbmRDb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdElucHV0IGluc3RhbmNlb2YgVGVzdElucHV0U3RyZWFtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0SW5wdXQuY29tcGxldGVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLmxhc3RJbnB1dCA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIENyZWF0ZXMgYSBwcm9taXNlIGZvciByZXNwb25zZSBoZWFkZXJzIGZyb20gdGhlIG1vY2sgZGF0YS5cbiAgICBwcm9taXNlSGVhZGVycygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gKF9hID0gdGhpcy5kYXRhLmhlYWRlcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFRlc3RUcmFuc3BvcnQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIHJldHVybiBoZWFkZXJzIGluc3RhbmNlb2YgUnBjRXJyb3JcbiAgICAgICAgICAgID8gUHJvbWlzZS5yZWplY3QoaGVhZGVycylcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKGhlYWRlcnMpO1xuICAgIH1cbiAgICAvLyBDcmVhdGVzIGEgcHJvbWlzZSBmb3IgYSBzaW5nbGUsIHZhbGlkLCBtZXNzYWdlIGZyb20gdGhlIG1vY2sgZGF0YS5cbiAgICBwcm9taXNlU2luZ2xlUmVzcG9uc2UobWV0aG9kKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEucmVzcG9uc2UgaW5zdGFuY2VvZiBScGNFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHRoaXMuZGF0YS5yZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHI7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5yZXNwb25zZSkpIHtcbiAgICAgICAgICAgIGFzc2VydCh0aGlzLmRhdGEucmVzcG9uc2UubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICByID0gdGhpcy5kYXRhLnJlc3BvbnNlWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YS5yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByID0gdGhpcy5kYXRhLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgciA9IG1ldGhvZC5PLmNyZWF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChtZXRob2QuTy5pcyhyKSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2hlcyByZXNwb25zZSBtZXNzYWdlcyBmcm9tIHRoZSBtb2NrIGRhdGEgdG8gdGhlIG91dHB1dCBzdHJlYW0uXG4gICAgICogSWYgYW4gZXJyb3IgcmVzcG9uc2UsIHN0YXR1cyBvciB0cmFpbGVycyBhcmUgbW9ja2VkLCB0aGUgc3RyZWFtIGlzXG4gICAgICogY2xvc2VkIHdpdGggdGhlIHJlc3BlY3RpdmUgZXJyb3IuXG4gICAgICogT3RoZXJ3aXNlLCBzdHJlYW0gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHJlc29sdmVzIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuIEl0IHNob3VsZFxuICAgICAqIG5vdCByZWplY3QuIElmIGl0IGRvZXMsIGNvZGUgaXMgYnJva2VuLlxuICAgICAqL1xuICAgIHN0cmVhbVJlc3BvbnNlcyhtZXRob2QsIHN0cmVhbSwgYWJvcnQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBcImRhdGEucmVzcG9uc2VcIiBpbnRvIGFuIGFycmF5IG9mIHZhbGlkIG91dHB1dCBtZXNzYWdlc1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEucmVzcG9uc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2gobWV0aG9kLk8uY3JlYXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEucmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbXNnIG9mIHRoaXMuZGF0YS5yZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQobWV0aG9kLk8uaXMobXNnKSk7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2gobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghKHRoaXMuZGF0YS5yZXNwb25zZSBpbnN0YW5jZW9mIFJwY0Vycm9yKSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChtZXRob2QuTy5pcyh0aGlzLmRhdGEucmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMuZGF0YS5yZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzdGFydCB0aGUgc3RyZWFtIHdpdGggYW4gaW5pdGlhbCBkZWxheS5cbiAgICAgICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIGNhbmNlbGxlZCwgbm90aWZ5KCkgZXJyb3IgYW5kIGV4aXQuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGRlbGF5KHRoaXMucmVzcG9uc2VEZWxheSwgYWJvcnQpKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ubm90aWZ5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIGVycm9yIHJlc3BvbnNlIHdhcyBtb2NrZWQsIG5vdGlmeSgpIGVycm9yIChzdHJlYW0gaXMgbm93IGNsb3NlZCB3aXRoIGVycm9yKSBhbmQgZXhpdC5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEucmVzcG9uc2UgaW5zdGFuY2VvZiBScGNFcnJvcikge1xuICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcih0aGlzLmRhdGEucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlZ3VsYXIgcmVzcG9uc2UgbWVzc2FnZXMgd2VyZSBtb2NrZWQuIG5vdGlmeSgpIHRoZW0uXG4gICAgICAgICAgICBmb3IgKGxldCBtc2cgb2YgbWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ubm90aWZ5TWVzc2FnZShtc2cpO1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNob3J0IGRlbGF5IGJldHdlZW4gcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgY2FuY2VsbGVkLCBub3RpZnkoKSBlcnJvciBhbmQgZXhpdC5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBkZWxheSh0aGlzLmJldHdlZW5SZXNwb25zZURlbGF5LCBhYm9ydCkodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlcnJvciBzdGF0dXMgd2FzIG1vY2tlZCwgbm90aWZ5KCkgZXJyb3IgKHN0cmVhbSBpcyBub3cgY2xvc2VkIHdpdGggZXJyb3IpIGFuZCBleGl0LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5zdGF0dXMgaW5zdGFuY2VvZiBScGNFcnJvcikge1xuICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcih0aGlzLmRhdGEuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlcnJvciB0cmFpbGVycyB3ZXJlIG1vY2tlZCwgbm90aWZ5KCkgZXJyb3IgKHN0cmVhbSBpcyBub3cgY2xvc2VkIHdpdGggZXJyb3IpIGFuZCBleGl0LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50cmFpbGVycyBpbnN0YW5jZW9mIFJwY0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLm5vdGlmeUVycm9yKHRoaXMuZGF0YS50cmFpbGVycyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc3RyZWFtIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlDb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlcyBhIHByb21pc2UgZm9yIHJlc3BvbnNlIHN0YXR1cyBmcm9tIHRoZSBtb2NrIGRhdGEuXG4gICAgcHJvbWlzZVN0YXR1cygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSAoX2EgPSB0aGlzLmRhdGEuc3RhdHVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBUZXN0VHJhbnNwb3J0LmRlZmF1bHRTdGF0dXM7XG4gICAgICAgIHJldHVybiBzdGF0dXMgaW5zdGFuY2VvZiBScGNFcnJvclxuICAgICAgICAgICAgPyBQcm9taXNlLnJlamVjdChzdGF0dXMpXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShzdGF0dXMpO1xuICAgIH1cbiAgICAvLyBDcmVhdGVzIGEgcHJvbWlzZSBmb3IgcmVzcG9uc2UgdHJhaWxlcnMgZnJvbSB0aGUgbW9jayBkYXRhLlxuICAgIHByb21pc2VUcmFpbGVycygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB0cmFpbGVycyA9IChfYSA9IHRoaXMuZGF0YS50cmFpbGVycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogVGVzdFRyYW5zcG9ydC5kZWZhdWx0VHJhaWxlcnM7XG4gICAgICAgIHJldHVybiB0cmFpbGVycyBpbnN0YW5jZW9mIFJwY0Vycm9yXG4gICAgICAgICAgICA/IFByb21pc2UucmVqZWN0KHRyYWlsZXJzKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodHJhaWxlcnMpO1xuICAgIH1cbiAgICBtYXliZVN1cHByZXNzVW5jYXVnaHQoLi4ucHJvbWlzZSkge1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc1VuY2F1Z2h0UmVqZWN0aW9ucykge1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWVyZ2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlUnBjT3B0aW9ucyh7fSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHVuYXJ5KG1ldGhvZCwgaW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IChfYSA9IG9wdGlvbnMubWV0YSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30sIGhlYWRlcnNQcm9taXNlID0gdGhpcy5wcm9taXNlSGVhZGVycygpXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmhlYWRlckRlbGF5LCBvcHRpb25zLmFib3J0KSksIHJlc3BvbnNlUHJvbWlzZSA9IGhlYWRlcnNQcm9taXNlXG4gICAgICAgICAgICAuY2F0Y2goXyA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLnJlc3BvbnNlRGVsYXksIG9wdGlvbnMuYWJvcnQpKVxuICAgICAgICAgICAgLnRoZW4oXyA9PiB0aGlzLnByb21pc2VTaW5nbGVSZXNwb25zZShtZXRob2QpKSwgc3RhdHVzUHJvbWlzZSA9IHJlc3BvbnNlUHJvbWlzZVxuICAgICAgICAgICAgLmNhdGNoKF8gPT4ge1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5hZnRlclJlc3BvbnNlRGVsYXksIG9wdGlvbnMuYWJvcnQpKVxuICAgICAgICAgICAgLnRoZW4oXyA9PiB0aGlzLnByb21pc2VTdGF0dXMoKSksIHRyYWlsZXJzUHJvbWlzZSA9IHJlc3BvbnNlUHJvbWlzZVxuICAgICAgICAgICAgLmNhdGNoKF8gPT4ge1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5hZnRlclJlc3BvbnNlRGVsYXksIG9wdGlvbnMuYWJvcnQpKVxuICAgICAgICAgICAgLnRoZW4oXyA9PiB0aGlzLnByb21pc2VUcmFpbGVycygpKTtcbiAgICAgICAgdGhpcy5tYXliZVN1cHByZXNzVW5jYXVnaHQoc3RhdHVzUHJvbWlzZSwgdHJhaWxlcnNQcm9taXNlKTtcbiAgICAgICAgdGhpcy5sYXN0SW5wdXQgPSB7IHNpbmdsZTogaW5wdXQgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmFyeUNhbGwobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgaW5wdXQsIGhlYWRlcnNQcm9taXNlLCByZXNwb25zZVByb21pc2UsIHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgfVxuICAgIHNlcnZlclN0cmVhbWluZyhtZXRob2QsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSAoX2EgPSBvcHRpb25zLm1ldGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9LCBoZWFkZXJzUHJvbWlzZSA9IHRoaXMucHJvbWlzZUhlYWRlcnMoKVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5oZWFkZXJEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBvdXRwdXRTdHJlYW0gPSBuZXcgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlcigpLCByZXNwb25zZVN0cmVhbUNsb3NlZFByb21pc2UgPSBoZWFkZXJzUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5yZXNwb25zZURlbGF5LCBvcHRpb25zLmFib3J0KSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnN0cmVhbVJlc3BvbnNlcyhtZXRob2QsIG91dHB1dFN0cmVhbSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBzdGF0dXNQcm9taXNlID0gcmVzcG9uc2VTdHJlYW1DbG9zZWRQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnByb21pc2VTdGF0dXMoKSksIHRyYWlsZXJzUHJvbWlzZSA9IHJlc3BvbnNlU3RyZWFtQ2xvc2VkUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wcm9taXNlVHJhaWxlcnMoKSk7XG4gICAgICAgIHRoaXMubWF5YmVTdXBwcmVzc1VuY2F1Z2h0KHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgICAgIHRoaXMubGFzdElucHV0ID0geyBzaW5nbGU6IGlucHV0IH07XG4gICAgICAgIHJldHVybiBuZXcgU2VydmVyU3RyZWFtaW5nQ2FsbChtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCBpbnB1dCwgaGVhZGVyc1Byb21pc2UsIG91dHB1dFN0cmVhbSwgc3RhdHVzUHJvbWlzZSwgdHJhaWxlcnNQcm9taXNlKTtcbiAgICB9XG4gICAgY2xpZW50U3RyZWFtaW5nKG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gKF9hID0gb3B0aW9ucy5tZXRhKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSwgaGVhZGVyc1Byb21pc2UgPSB0aGlzLnByb21pc2VIZWFkZXJzKClcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMuaGVhZGVyRGVsYXksIG9wdGlvbnMuYWJvcnQpKSwgcmVzcG9uc2VQcm9taXNlID0gaGVhZGVyc1Byb21pc2VcbiAgICAgICAgICAgIC5jYXRjaChfID0+IHtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMucmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVNpbmdsZVJlc3BvbnNlKG1ldGhvZCkpLCBzdGF0dXNQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlXG4gICAgICAgICAgICAuY2F0Y2goXyA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVN0YXR1cygpKSwgdHJhaWxlcnNQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlXG4gICAgICAgICAgICAuY2F0Y2goXyA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVRyYWlsZXJzKCkpO1xuICAgICAgICB0aGlzLm1heWJlU3VwcHJlc3NVbmNhdWdodChzdGF0dXNQcm9taXNlLCB0cmFpbGVyc1Byb21pc2UpO1xuICAgICAgICB0aGlzLmxhc3RJbnB1dCA9IG5ldyBUZXN0SW5wdXRTdHJlYW0odGhpcy5kYXRhLCBvcHRpb25zLmFib3J0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRTdHJlYW1pbmdDYWxsKG1ldGhvZCwgcmVxdWVzdEhlYWRlcnMsIHRoaXMubGFzdElucHV0LCBoZWFkZXJzUHJvbWlzZSwgcmVzcG9uc2VQcm9taXNlLCBzdGF0dXNQcm9taXNlLCB0cmFpbGVyc1Byb21pc2UpO1xuICAgIH1cbiAgICBkdXBsZXgobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSAoX2EgPSBvcHRpb25zLm1ldGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9LCBoZWFkZXJzUHJvbWlzZSA9IHRoaXMucHJvbWlzZUhlYWRlcnMoKVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5oZWFkZXJEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBvdXRwdXRTdHJlYW0gPSBuZXcgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlcigpLCByZXNwb25zZVN0cmVhbUNsb3NlZFByb21pc2UgPSBoZWFkZXJzUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5yZXNwb25zZURlbGF5LCBvcHRpb25zLmFib3J0KSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnN0cmVhbVJlc3BvbnNlcyhtZXRob2QsIG91dHB1dFN0cmVhbSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBzdGF0dXNQcm9taXNlID0gcmVzcG9uc2VTdHJlYW1DbG9zZWRQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnByb21pc2VTdGF0dXMoKSksIHRyYWlsZXJzUHJvbWlzZSA9IHJlc3BvbnNlU3RyZWFtQ2xvc2VkUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wcm9taXNlVHJhaWxlcnMoKSk7XG4gICAgICAgIHRoaXMubWF5YmVTdXBwcmVzc1VuY2F1Z2h0KHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgICAgIHRoaXMubGFzdElucHV0ID0gbmV3IFRlc3RJbnB1dFN0cmVhbSh0aGlzLmRhdGEsIG9wdGlvbnMuYWJvcnQpO1xuICAgICAgICByZXR1cm4gbmV3IER1cGxleFN0cmVhbWluZ0NhbGwobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgdGhpcy5sYXN0SW5wdXQsIGhlYWRlcnNQcm9taXNlLCBvdXRwdXRTdHJlYW0sIHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgfVxufVxuVGVzdFRyYW5zcG9ydC5kZWZhdWx0SGVhZGVycyA9IHtcbiAgICByZXNwb25zZUhlYWRlcjogXCJ0ZXN0XCJcbn07XG5UZXN0VHJhbnNwb3J0LmRlZmF1bHRTdGF0dXMgPSB7XG4gICAgY29kZTogXCJPS1wiLCBkZXRhaWw6IFwiYWxsIGdvb2RcIlxufTtcblRlc3RUcmFuc3BvcnQuZGVmYXVsdFRyYWlsZXJzID0ge1xuICAgIHJlc3BvbnNlVHJhaWxlcjogXCJ0ZXN0XCJcbn07XG5mdW5jdGlvbiBkZWxheShtcywgYWJvcnQpIHtcbiAgICByZXR1cm4gKHYpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKGFib3J0ID09PSBudWxsIHx8IGFib3J0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhYm9ydC5hYm9ydGVkKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IFJwY0Vycm9yKFwidXNlciBjYW5jZWxcIiwgXCJDQU5DRUxMRURcIikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUodiksIG1zKTtcbiAgICAgICAgICAgIGlmIChhYm9ydCkge1xuICAgICAgICAgICAgICAgIGFib3J0LmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBldiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgUnBjRXJyb3IoXCJ1c2VyIGNhbmNlbFwiLCBcIkNBTkNFTExFRFwiKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmNsYXNzIFRlc3RJbnB1dFN0cmVhbSB7XG4gICAgY29uc3RydWN0b3IoZGF0YSwgYWJvcnQpIHtcbiAgICAgICAgdGhpcy5fY29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5hYm9ydCA9IGFib3J0O1xuICAgIH1cbiAgICBnZXQgc2VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbnQ7XG4gICAgfVxuICAgIGdldCBjb21wbGV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wbGV0ZWQ7XG4gICAgfVxuICAgIHNlbmQobWVzc2FnZSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmlucHV0TWVzc2FnZSBpbnN0YW5jZW9mIFJwY0Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5kYXRhLmlucHV0TWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsYXlNcyA9IHRoaXMuZGF0YS5pbnB1dE1lc3NhZ2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyAxMFxuICAgICAgICAgICAgOiB0aGlzLmRhdGEuaW5wdXRNZXNzYWdlO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NlbnQucHVzaChtZXNzYWdlKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KGRlbGF5TXMsIHRoaXMuYWJvcnQpKTtcbiAgICB9XG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaW5wdXRDb21wbGV0ZSBpbnN0YW5jZW9mIFJwY0Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5kYXRhLmlucHV0Q29tcGxldGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGF5TXMgPSB0aGlzLmRhdGEuaW5wdXRDb21wbGV0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDEwXG4gICAgICAgICAgICA6IHRoaXMuZGF0YS5pbnB1dENvbXBsZXRlO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheShkZWxheU1zLCB0aGlzLmFib3J0KSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tIFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIjtcbi8qKlxuICogQ3JlYXRlcyBhIFwic3RhY2tcIiBvZiBvZiBhbGwgaW50ZXJjZXB0b3JzIHNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gYFJwY09wdGlvbnNgLlxuICogVXNlZCBieSBnZW5lcmF0ZWQgY2xpZW50IGltcGxlbWVudGF0aW9ucy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2tJbnRlcmNlcHQoa2luZCwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMsIGlucHV0KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIGlmIChraW5kID09IFwidW5hcnlcIikge1xuICAgICAgICBsZXQgdGFpbCA9IChtdGQsIGlucCwgb3B0KSA9PiB0cmFuc3BvcnQudW5hcnkobXRkLCBpbnAsIG9wdCk7XG4gICAgICAgIGZvciAoY29uc3QgY3VyciBvZiAoKF9hID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5maWx0ZXIoaSA9PiBpLmludGVyY2VwdFVuYXJ5KS5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0YWlsO1xuICAgICAgICAgICAgdGFpbCA9IChtdGQsIGlucCwgb3B0KSA9PiBjdXJyLmludGVyY2VwdFVuYXJ5KG5leHQsIG10ZCwgaW5wLCBvcHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWlsKG1ldGhvZCwgaW5wdXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoa2luZCA9PSBcInNlcnZlclN0cmVhbWluZ1wiKSB7XG4gICAgICAgIGxldCB0YWlsID0gKG10ZCwgaW5wLCBvcHQpID0+IHRyYW5zcG9ydC5zZXJ2ZXJTdHJlYW1pbmcobXRkLCBpbnAsIG9wdCk7XG4gICAgICAgIGZvciAoY29uc3QgY3VyciBvZiAoKF9iID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKS5maWx0ZXIoaSA9PiBpLmludGVyY2VwdFNlcnZlclN0cmVhbWluZykucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGFpbDtcbiAgICAgICAgICAgIHRhaWwgPSAobXRkLCBpbnAsIG9wdCkgPT4gY3Vyci5pbnRlcmNlcHRTZXJ2ZXJTdHJlYW1pbmcobmV4dCwgbXRkLCBpbnAsIG9wdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhaWwobWV0aG9kLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChraW5kID09IFwiY2xpZW50U3RyZWFtaW5nXCIpIHtcbiAgICAgICAgbGV0IHRhaWwgPSAobXRkLCBvcHQpID0+IHRyYW5zcG9ydC5jbGllbnRTdHJlYW1pbmcobXRkLCBvcHQpO1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnIgb2YgKChfYyA9IG9wdGlvbnMuaW50ZXJjZXB0b3JzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBbXSkuZmlsdGVyKGkgPT4gaS5pbnRlcmNlcHRDbGllbnRTdHJlYW1pbmcpLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRhaWw7XG4gICAgICAgICAgICB0YWlsID0gKG10ZCwgb3B0KSA9PiBjdXJyLmludGVyY2VwdENsaWVudFN0cmVhbWluZyhuZXh0LCBtdGQsIG9wdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhaWwobWV0aG9kLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJkdXBsZXhcIikge1xuICAgICAgICBsZXQgdGFpbCA9IChtdGQsIG9wdCkgPT4gdHJhbnNwb3J0LmR1cGxleChtdGQsIG9wdCk7XG4gICAgICAgIGZvciAoY29uc3QgY3VyciBvZiAoKF9kID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFtdKS5maWx0ZXIoaSA9PiBpLmludGVyY2VwdER1cGxleCkucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGFpbDtcbiAgICAgICAgICAgIHRhaWwgPSAobXRkLCBvcHQpID0+IGN1cnIuaW50ZXJjZXB0RHVwbGV4KG5leHQsIG10ZCwgb3B0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFpbChtZXRob2QsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3NlcnROZXZlcihraW5kKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgYHN0YWNrSW50ZXJjZXB0KClgLCBzdGlsbCBoZXJlIHRvIHN1cHBvcnQgb2xkZXIgZ2VuZXJhdGVkIGNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YWNrVW5hcnlJbnRlcmNlcHRvcnModHJhbnNwb3J0LCBtZXRob2QsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHN0YWNrSW50ZXJjZXB0KFwidW5hcnlcIiwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMsIGlucHV0KTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgYHN0YWNrSW50ZXJjZXB0KClgLCBzdGlsbCBoZXJlIHRvIHN1cHBvcnQgb2xkZXIgZ2VuZXJhdGVkIGNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YWNrU2VydmVyU3RyZWFtaW5nSW50ZXJjZXB0b3JzKHRyYW5zcG9ydCwgbWV0aG9kLCBpbnB1dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBzdGFja0ludGVyY2VwdChcInNlcnZlclN0cmVhbWluZ1wiLCB0cmFuc3BvcnQsIG1ldGhvZCwgb3B0aW9ucywgaW5wdXQpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBgc3RhY2tJbnRlcmNlcHQoKWAsIHN0aWxsIGhlcmUgdG8gc3VwcG9ydCBvbGRlciBnZW5lcmF0ZWQgY29kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2tDbGllbnRTdHJlYW1pbmdJbnRlcmNlcHRvcnModHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gc3RhY2tJbnRlcmNlcHQoXCJjbGllbnRTdHJlYW1pbmdcIiwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBgc3RhY2tJbnRlcmNlcHQoKWAsIHN0aWxsIGhlcmUgdG8gc3VwcG9ydCBvbGRlciBnZW5lcmF0ZWQgY29kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2tEdXBsZXhTdHJlYW1pbmdJbnRlcmNlcHRvcnModHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gc3RhY2tJbnRlcmNlcHQoXCJkdXBsZXhcIiwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpO1xufVxuIiwiZXhwb3J0IGNsYXNzIFNlcnZlckNhbGxDb250ZXh0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kLCBoZWFkZXJzLCBkZWFkbGluZSwgc2VuZFJlc3BvbnNlSGVhZGVyc0ZuLCBkZWZhdWx0U3RhdHVzID0geyBjb2RlOiAnT0snLCBkZXRhaWw6ICcnIH0pIHtcbiAgICAgICAgdGhpcy5fY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5kZWFkbGluZSA9IGRlYWRsaW5lO1xuICAgICAgICB0aGlzLnRyYWlsZXJzID0ge307XG4gICAgICAgIHRoaXMuX3NlbmRSSCA9IHNlbmRSZXNwb25zZUhlYWRlcnNGbjtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBkZWZhdWx0U3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNhbGwgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogSW52b2tlcyBhbGwgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBvbkNhbmNlbCgpIGFuZFxuICAgICAqIHNldHMgYGNhbmNlbGxlZCA9IHRydWVgLlxuICAgICAqL1xuICAgIG5vdGlmeUNhbmNlbGxlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBsIG9mIHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHJlc3BvbnNlIGhlYWRlcnMuXG4gICAgICovXG4gICAgc2VuZFJlc3BvbnNlSGVhZGVycyhkYXRhKSB7XG4gICAgICAgIHRoaXMuX3NlbmRSSChkYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIGNhbGwgY2FuY2VsbGVkP1xuICAgICAqXG4gICAgICogV2hlbiB0aGUgY2xpZW50IGNsb3NlcyB0aGUgY29ubmVjdGlvbiBiZWZvcmUgdGhlIHNlcnZlclxuICAgICAqIGlzIGRvbmUsIHRoZSBjYWxsIGlzIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNhbmNlbCBhIHJlcXVlc3Qgb24gdGhlIHNlcnZlciwgdGhyb3cgYVxuICAgICAqIFJwY0Vycm9yIHdpdGggdGhlIENBTkNFTExFRCBzdGF0dXMgY29kZS5cbiAgICAgKi9cbiAgICBnZXQgY2FuY2VsbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FuY2VsbGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjYWxsYmFjayBmb3IgY2FuY2VsbGF0aW9uLlxuICAgICAqL1xuICAgIG9uQ2FuY2VsKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGwgPSB0aGlzLl9saXN0ZW5lcnM7XG4gICAgICAgIGwucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IGwuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaSA+PSAwKVxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKGksIDEpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIi8vIFB1YmxpYyBBUEkgb2YgdGhlIHJwYyBydW50aW1lLlxuLy8gTm90ZTogd2UgZG8gbm90IHVzZSBgZXhwb3J0ICogZnJvbSAuLi5gIHRvIGhlbHAgdHJlZSBzaGFrZXJzLFxuLy8gd2VicGFjayB2ZXJib3NlIG91dHB1dCBoaW50cyB0aGF0IHRoaXMgc2hvdWxkIGJlIHVzZWZ1bFxuZXhwb3J0IHsgU2VydmljZVR5cGUgfSBmcm9tICcuL3NlcnZpY2UtdHlwZSc7XG5leHBvcnQgeyByZWFkTWV0aG9kT3B0aW9ucywgcmVhZE1ldGhvZE9wdGlvbiwgcmVhZFNlcnZpY2VPcHRpb24gfSBmcm9tICcuL3JlZmxlY3Rpb24taW5mbyc7XG5leHBvcnQgeyBScGNFcnJvciB9IGZyb20gJy4vcnBjLWVycm9yJztcbmV4cG9ydCB7IG1lcmdlUnBjT3B0aW9ucyB9IGZyb20gJy4vcnBjLW9wdGlvbnMnO1xuZXhwb3J0IHsgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlciB9IGZyb20gJy4vcnBjLW91dHB1dC1zdHJlYW0nO1xuZXhwb3J0IHsgVGVzdFRyYW5zcG9ydCB9IGZyb20gJy4vdGVzdC10cmFuc3BvcnQnO1xuZXhwb3J0IHsgRGVmZXJyZWQsIERlZmVycmVkU3RhdGUgfSBmcm9tICcuL2RlZmVycmVkJztcbmV4cG9ydCB7IER1cGxleFN0cmVhbWluZ0NhbGwgfSBmcm9tICcuL2R1cGxleC1zdHJlYW1pbmctY2FsbCc7XG5leHBvcnQgeyBDbGllbnRTdHJlYW1pbmdDYWxsIH0gZnJvbSAnLi9jbGllbnQtc3RyZWFtaW5nLWNhbGwnO1xuZXhwb3J0IHsgU2VydmVyU3RyZWFtaW5nQ2FsbCB9IGZyb20gJy4vc2VydmVyLXN0cmVhbWluZy1jYWxsJztcbmV4cG9ydCB7IFVuYXJ5Q2FsbCB9IGZyb20gJy4vdW5hcnktY2FsbCc7XG5leHBvcnQgeyBzdGFja0ludGVyY2VwdCwgc3RhY2tEdXBsZXhTdHJlYW1pbmdJbnRlcmNlcHRvcnMsIHN0YWNrQ2xpZW50U3RyZWFtaW5nSW50ZXJjZXB0b3JzLCBzdGFja1NlcnZlclN0cmVhbWluZ0ludGVyY2VwdG9ycywgc3RhY2tVbmFyeUludGVyY2VwdG9ycyB9IGZyb20gJy4vcnBjLWludGVyY2VwdG9yJztcbmV4cG9ydCB7IFNlcnZlckNhbGxDb250ZXh0Q29udHJvbGxlciB9IGZyb20gJy4vc2VydmVyLWNhbGwtY29udGV4dCc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///28003\n')},64441:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ bn: () => (/* binding */ assertInt32),\n/* harmony export */ e1: () => (/* binding */ assertUInt32),\n/* harmony export */ vA: () => (/* binding */ assert),\n/* harmony export */ wO: () => (/* binding */ assertFloat32),\n/* harmony export */ xb: () => (/* binding */ assertNever)\n/* harmony export */ });\n/**\n * assert that condition is true or throw error (with message)\n */\nfunction assert(condition, msg) {\n if (!condition) {\n throw new Error(msg);\n }\n}\n/**\n * assert that value cannot exist = type `never`. throw runtime error if it does.\n */\nfunction assertNever(value, msg) {\n throw new Error(msg !== null && msg !== void 0 ? msg : 'Unexpected object: ' + value);\n}\nconst FLOAT32_MAX = 3.4028234663852886e+38, FLOAT32_MIN = -3.4028234663852886e+38, UINT32_MAX = 0xFFFFFFFF, INT32_MAX = 0X7FFFFFFF, INT32_MIN = -0X80000000;\nfunction assertInt32(arg) {\n if (typeof arg !== \"number\")\n throw new Error('invalid int 32: ' + typeof arg);\n if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN)\n throw new Error('invalid int 32: ' + arg);\n}\nfunction assertUInt32(arg) {\n if (typeof arg !== \"number\")\n throw new Error('invalid uint 32: ' + typeof arg);\n if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0)\n throw new Error('invalid uint 32: ' + arg);\n}\nfunction assertFloat32(arg) {\n if (typeof arg !== \"number\")\n throw new Error('invalid float 32: ' + typeof arg);\n if (!Number.isFinite(arg))\n return;\n if (arg > FLOAT32_MAX || arg < FLOAT32_MIN)\n throw new Error('invalid float 32: ' + arg);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ0NDEuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9hc3NlcnQuanM/MDNmYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGFzc2VydCB0aGF0IGNvbmRpdGlvbiBpcyB0cnVlIG9yIHRocm93IGVycm9yICh3aXRoIG1lc3NhZ2UpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCBtc2cpIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG59XG4vKipcbiAqIGFzc2VydCB0aGF0IHZhbHVlIGNhbm5vdCBleGlzdCA9IHR5cGUgYG5ldmVyYC4gdGhyb3cgcnVudGltZSBlcnJvciBpZiBpdCBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWUsIG1zZykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cgIT09IG51bGwgJiYgbXNnICE9PSB2b2lkIDAgPyBtc2cgOiAnVW5leHBlY3RlZCBvYmplY3Q6ICcgKyB2YWx1ZSk7XG59XG5jb25zdCBGTE9BVDMyX01BWCA9IDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIEZMT0FUMzJfTUlOID0gLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIFVJTlQzMl9NQVggPSAweEZGRkZGRkZGLCBJTlQzMl9NQVggPSAwWDdGRkZGRkZGLCBJTlQzMl9NSU4gPSAtMFg4MDAwMDAwMDtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbnQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGludCAzMjogJyArIHR5cGVvZiBhcmcpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhcmcpIHx8IGFyZyA+IElOVDMyX01BWCB8fCBhcmcgPCBJTlQzMl9NSU4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnQgMzI6ICcgKyBhcmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVJbnQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVpbnQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYXJnKSB8fCBhcmcgPiBVSU5UMzJfTUFYIHx8IGFyZyA8IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1aW50IDMyOiAnICsgYXJnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGbG9hdDMyKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmxvYXQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShhcmcpKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKGFyZyA+IEZMT0FUMzJfTUFYIHx8IGFyZyA8IEZMT0FUMzJfTUlOKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmxvYXQgMzI6ICcgKyBhcmcpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///64441\n")},8899:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Ix: () => (/* binding */ mergeBinaryOptions),\n/* harmony export */ O0: () => (/* binding */ WireType),\n/* harmony export */ f$: () => (/* binding */ UnknownFieldHandler)\n/* harmony export */ });\n/**\n * This handler implements the default behaviour for unknown fields.\n * When reading data, unknown fields are stored on the message, in a\n * symbol property.\n * When writing data, the symbol property is queried and unknown fields\n * are serialized into the output again.\n */\nvar UnknownFieldHandler;\n(function (UnknownFieldHandler) {\n /**\n * The symbol used to store unknown fields for a message.\n * The property must conform to `UnknownFieldContainer`.\n */\n UnknownFieldHandler.symbol = Symbol.for("protobuf-ts/unknown");\n /**\n * Store an unknown field during binary read directly on the message.\n * This method is compatible with `BinaryReadOptions.readUnknownField`.\n */\n UnknownFieldHandler.onRead = (typeName, message, fieldNo, wireType, data) => {\n let container = is(message) ? message[UnknownFieldHandler.symbol] : message[UnknownFieldHandler.symbol] = [];\n container.push({ no: fieldNo, wireType, data });\n };\n /**\n * Write unknown fields stored for the message to the writer.\n * This method is compatible with `BinaryWriteOptions.writeUnknownFields`.\n */\n UnknownFieldHandler.onWrite = (typeName, message, writer) => {\n for (let { no, wireType, data } of UnknownFieldHandler.list(message))\n writer.tag(no, wireType).raw(data);\n };\n /**\n * List unknown fields stored for the message.\n * Note that there may be multiples fields with the same number.\n */\n UnknownFieldHandler.list = (message, fieldNo) => {\n if (is(message)) {\n let all = message[UnknownFieldHandler.symbol];\n return fieldNo ? all.filter(uf => uf.no == fieldNo) : all;\n }\n return [];\n };\n /**\n * Returns the last unknown field by field number.\n */\n UnknownFieldHandler.last = (message, fieldNo) => UnknownFieldHandler.list(message, fieldNo).slice(-1)[0];\n const is = (message) => message && Array.isArray(message[UnknownFieldHandler.symbol]);\n})(UnknownFieldHandler || (UnknownFieldHandler = {}));\n/**\n * Merges binary write or read options. Later values override earlier values.\n */\nfunction mergeBinaryOptions(a, b) {\n return Object.assign(Object.assign({}, a), b);\n}\n/**\n * Protobuf binary format wire types.\n *\n * A wire type provides just enough information to find the length of the\n * following value.\n *\n * See https://developers.google.com/protocol-buffers/docs/encoding#structure\n */\nvar WireType;\n(function (WireType) {\n /**\n * Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum\n */\n WireType[WireType["Varint"] = 0] = "Varint";\n /**\n * Used for fixed64, sfixed64, double.\n * Always 8 bytes with little-endian byte order.\n */\n WireType[WireType["Bit64"] = 1] = "Bit64";\n /**\n * Used for string, bytes, embedded messages, packed repeated fields\n *\n * Only repeated numeric types (types which use the varint, 32-bit,\n * or 64-bit wire types) can be packed. In proto3, such fields are\n * packed by default.\n */\n WireType[WireType["LengthDelimited"] = 2] = "LengthDelimited";\n /**\n * Used for groups\n * @deprecated\n */\n WireType[WireType["StartGroup"] = 3] = "StartGroup";\n /**\n * Used for groups\n * @deprecated\n */\n WireType[WireType["EndGroup"] = 4] = "EndGroup";\n /**\n * Used for fixed32, sfixed32, float.\n * Always 4 bytes with little-endian byte order.\n */\n WireType[WireType["Bit32"] = 5] = "Bit32";\n})(WireType || (WireType = {}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODg5OS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsNkJBQTZCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxrREFBa0Q7QUFDbkQ7QUFDQTtBQUNBO0FBQ087QUFDUCx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRCQUE0QiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2JpbmFyeS1mb3JtYXQtY29udHJhY3QuanM/ZGIxYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgaGFuZGxlciBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdW5rbm93biBmaWVsZHMuXG4gKiBXaGVuIHJlYWRpbmcgZGF0YSwgdW5rbm93biBmaWVsZHMgYXJlIHN0b3JlZCBvbiB0aGUgbWVzc2FnZSwgaW4gYVxuICogc3ltYm9sIHByb3BlcnR5LlxuICogV2hlbiB3cml0aW5nIGRhdGEsIHRoZSBzeW1ib2wgcHJvcGVydHkgaXMgcXVlcmllZCBhbmQgdW5rbm93biBmaWVsZHNcbiAqIGFyZSBzZXJpYWxpemVkIGludG8gdGhlIG91dHB1dCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IHZhciBVbmtub3duRmllbGRIYW5kbGVyO1xuKGZ1bmN0aW9uIChVbmtub3duRmllbGRIYW5kbGVyKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN5bWJvbCB1c2VkIHRvIHN0b3JlIHVua25vd24gZmllbGRzIGZvciBhIG1lc3NhZ2UuXG4gICAgICogVGhlIHByb3BlcnR5IG11c3QgY29uZm9ybSB0byBgVW5rbm93bkZpZWxkQ29udGFpbmVyYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbCA9IFN5bWJvbC5mb3IoXCJwcm90b2J1Zi10cy91bmtub3duXCIpO1xuICAgIC8qKlxuICAgICAqIFN0b3JlIGFuIHVua25vd24gZmllbGQgZHVyaW5nIGJpbmFyeSByZWFkIGRpcmVjdGx5IG9uIHRoZSBtZXNzYWdlLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNvbXBhdGlibGUgd2l0aCBgQmluYXJ5UmVhZE9wdGlvbnMucmVhZFVua25vd25GaWVsZGAuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgPSAodHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkYXRhKSA9PiB7XG4gICAgICAgIGxldCBjb250YWluZXIgPSBpcyhtZXNzYWdlKSA/IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdIDogbWVzc2FnZVtVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbF0gPSBbXTtcbiAgICAgICAgY29udGFpbmVyLnB1c2goeyBubzogZmllbGRObywgd2lyZVR5cGUsIGRhdGEgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXcml0ZSB1bmtub3duIGZpZWxkcyBzdG9yZWQgZm9yIHRoZSBtZXNzYWdlIHRvIHRoZSB3cml0ZXIuXG4gICAgICogVGhpcyBtZXRob2QgaXMgY29tcGF0aWJsZSB3aXRoIGBCaW5hcnlXcml0ZU9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgPSAodHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcikgPT4ge1xuICAgICAgICBmb3IgKGxldCB7IG5vLCB3aXJlVHlwZSwgZGF0YSB9IG9mIFVua25vd25GaWVsZEhhbmRsZXIubGlzdChtZXNzYWdlKSlcbiAgICAgICAgICAgIHdyaXRlci50YWcobm8sIHdpcmVUeXBlKS5yYXcoZGF0YSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMaXN0IHVua25vd24gZmllbGRzIHN0b3JlZCBmb3IgdGhlIG1lc3NhZ2UuXG4gICAgICogTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZXMgZmllbGRzIHdpdGggdGhlIHNhbWUgbnVtYmVyLlxuICAgICAqL1xuICAgIFVua25vd25GaWVsZEhhbmRsZXIubGlzdCA9IChtZXNzYWdlLCBmaWVsZE5vKSA9PiB7XG4gICAgICAgIGlmIChpcyhtZXNzYWdlKSkge1xuICAgICAgICAgICAgbGV0IGFsbCA9IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdO1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkTm8gPyBhbGwuZmlsdGVyKHVmID0+IHVmLm5vID09IGZpZWxkTm8pIDogYWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxhc3QgdW5rbm93biBmaWVsZCBieSBmaWVsZCBudW1iZXIuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5sYXN0ID0gKG1lc3NhZ2UsIGZpZWxkTm8pID0+IFVua25vd25GaWVsZEhhbmRsZXIubGlzdChtZXNzYWdlLCBmaWVsZE5vKS5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgaXMgPSAobWVzc2FnZSkgPT4gbWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdKTtcbn0pKFVua25vd25GaWVsZEhhbmRsZXIgfHwgKFVua25vd25GaWVsZEhhbmRsZXIgPSB7fSkpO1xuLyoqXG4gKiBNZXJnZXMgYmluYXJ5IHdyaXRlIG9yIHJlYWQgb3B0aW9ucy4gTGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlPcHRpb25zKGEsIGIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYik7XG59XG4vKipcbiAqIFByb3RvYnVmIGJpbmFyeSBmb3JtYXQgd2lyZSB0eXBlcy5cbiAqXG4gKiBBIHdpcmUgdHlwZSBwcm92aWRlcyBqdXN0IGVub3VnaCBpbmZvcm1hdGlvbiB0byBmaW5kIHRoZSBsZW5ndGggb2YgdGhlXG4gKiBmb2xsb3dpbmcgdmFsdWUuXG4gKlxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZyNzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IHZhciBXaXJlVHlwZTtcbihmdW5jdGlvbiAoV2lyZVR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuICAgICAqL1xuICAgIFdpcmVUeXBlW1dpcmVUeXBlW1wiVmFyaW50XCJdID0gMF0gPSBcIlZhcmludFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkNjQsIHNmaXhlZDY0LCBkb3VibGUuXG4gICAgICogQWx3YXlzIDggYnl0ZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJCaXQ2NFwiXSA9IDFdID0gXCJCaXQ2NFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG4gICAgICpcbiAgICAgKiBPbmx5IHJlcGVhdGVkIG51bWVyaWMgdHlwZXMgKHR5cGVzIHdoaWNoIHVzZSB0aGUgdmFyaW50LCAzMi1iaXQsXG4gICAgICogb3IgNjQtYml0IHdpcmUgdHlwZXMpIGNhbiBiZSBwYWNrZWQuIEluIHByb3RvMywgc3VjaCBmaWVsZHMgYXJlXG4gICAgICogcGFja2VkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJMZW5ndGhEZWxpbWl0ZWRcIl0gPSAyXSA9IFwiTGVuZ3RoRGVsaW1pdGVkXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZ3JvdXBzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIlN0YXJ0R3JvdXBcIl0gPSAzXSA9IFwiU3RhcnRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGdyb3Vwc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJFbmRHcm91cFwiXSA9IDRdID0gXCJFbmRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkMzIsIHNmaXhlZDMyLCBmbG9hdC5cbiAgICAgKiBBbHdheXMgNCBieXRlcyB3aXRoIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci5cbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIkJpdDMyXCJdID0gNV0gPSBcIkJpdDMyXCI7XG59KShXaXJlVHlwZSB8fCAoV2lyZVR5cGUgPSB7fSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8899\n')},47764:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n BinaryReader: () => (/* reexport */ BinaryReader),\n BinaryWriter: () => (/* reexport */ BinaryWriter),\n LongType: () => (/* reexport */ LongType),\n MESSAGE_TYPE: () => (/* reexport */ MESSAGE_TYPE),\n MessageType: () => (/* reexport */ MessageType),\n PbLong: () => (/* reexport */ PbLong),\n PbULong: () => (/* reexport */ PbULong),\n ReflectionBinaryReader: () => (/* reexport */ ReflectionBinaryReader),\n ReflectionBinaryWriter: () => (/* reexport */ ReflectionBinaryWriter),\n ReflectionJsonReader: () => (/* reexport */ ReflectionJsonReader),\n ReflectionJsonWriter: () => (/* reexport */ ReflectionJsonWriter),\n ReflectionTypeCheck: () => (/* reexport */ ReflectionTypeCheck),\n RepeatType: () => (/* reexport */ RepeatType),\n ScalarType: () => (/* reexport */ ScalarType),\n UnknownFieldHandler: () => (/* reexport */ binary_format_contract/* UnknownFieldHandler */.f$),\n WireType: () => (/* reexport */ binary_format_contract/* WireType */.O0),\n assert: () => (/* reexport */ assert/* assert */.vA),\n assertFloat32: () => (/* reexport */ assert/* assertFloat32 */.wO),\n assertInt32: () => (/* reexport */ assert/* assertInt32 */.bn),\n assertNever: () => (/* reexport */ assert/* assertNever */.xb),\n assertUInt32: () => (/* reexport */ assert/* assertUInt32 */.e1),\n base64decode: () => (/* reexport */ base64decode),\n base64encode: () => (/* reexport */ base64encode),\n binaryReadOptions: () => (/* reexport */ binaryReadOptions),\n binaryWriteOptions: () => (/* reexport */ binaryWriteOptions),\n clearOneofValue: () => (/* reexport */ clearOneofValue),\n containsMessageType: () => (/* reexport */ containsMessageType),\n getOneofValue: () => (/* reexport */ getOneofValue),\n getSelectedOneofValue: () => (/* reexport */ getSelectedOneofValue),\n isEnumObject: () => (/* reexport */ isEnumObject),\n isJsonObject: () => (/* reexport */ isJsonObject),\n isOneofGroup: () => (/* reexport */ isOneofGroup),\n jsonReadOptions: () => (/* reexport */ json_format_contract/* jsonReadOptions */.bm),\n jsonWriteOptions: () => (/* reexport */ json_format_contract/* jsonWriteOptions */.yG),\n listEnumNames: () => (/* reexport */ listEnumNames),\n listEnumNumbers: () => (/* reexport */ listEnumNumbers),\n listEnumValues: () => (/* reexport */ listEnumValues),\n lowerCamelCase: () => (/* reexport */ lower_camel_case/* lowerCamelCase */.W),\n mergeBinaryOptions: () => (/* reexport */ binary_format_contract/* mergeBinaryOptions */.Ix),\n mergeJsonOptions: () => (/* reexport */ json_format_contract/* mergeJsonOptions */.Zc),\n normalizeFieldInfo: () => (/* reexport */ normalizeFieldInfo),\n readFieldOption: () => (/* reexport */ readFieldOption),\n readFieldOptions: () => (/* reexport */ readFieldOptions),\n readMessageOption: () => (/* reexport */ readMessageOption),\n reflectionCreate: () => (/* reexport */ reflectionCreate),\n reflectionEquals: () => (/* reexport */ reflectionEquals),\n reflectionMergePartial: () => (/* reexport */ reflectionMergePartial),\n reflectionScalarDefault: () => (/* reexport */ reflectionScalarDefault),\n setOneofValue: () => (/* reexport */ setOneofValue),\n typeofJsonValue: () => (/* reexport */ typeofJsonValue),\n utf8read: () => (/* reexport */ utf8read)\n});\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/json-typings.js\n/**\n * Get the type of a JSON value.\n * Distinguishes between array, null and object.\n */\nfunction typeofJsonValue(value) {\n let t = typeof value;\n if (t == "object") {\n if (Array.isArray(value))\n return "array";\n if (value === null)\n return "null";\n }\n return t;\n}\n/**\n * Is this a JSON object (instead of an array or null)?\n */\nfunction isJsonObject(value) {\n return value !== null && typeof value == "object" && !Array.isArray(value);\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/base64.js\n// lookup table from base64 character to byte\nlet encTable = \'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\'.split(\'\');\n// lookup table from base64 character *code* to byte because lookup by number is fast\nlet decTable = [];\nfor (let i = 0; i < encTable.length; i++)\n decTable[encTable[i].charCodeAt(0)] = i;\n// support base64url variants\ndecTable["-".charCodeAt(0)] = encTable.indexOf("+");\ndecTable["_".charCodeAt(0)] = encTable.indexOf("/");\n/**\n * Decodes a base64 string to a byte array.\n *\n * - ignores white-space, including line breaks and tabs\n * - allows inner padding (can decode concatenated base64 strings)\n * - does not require padding\n * - understands base64url encoding:\n * "-" instead of "+",\n * "_" instead of "/",\n * no padding\n */\nfunction base64decode(base64Str) {\n // estimate byte size, not accounting for inner padding and whitespace\n let es = base64Str.length * 3 / 4;\n // if (es % 3 !== 0)\n // throw new Error(\'invalid base64 string\');\n if (base64Str[base64Str.length - 2] == \'=\')\n es -= 2;\n else if (base64Str[base64Str.length - 1] == \'=\')\n es -= 1;\n let bytes = new Uint8Array(es), bytePos = 0, // position in byte array\n groupPos = 0, // position in base64 group\n b, // current byte\n p = 0 // previous byte\n ;\n for (let i = 0; i < base64Str.length; i++) {\n b = decTable[base64Str.charCodeAt(i)];\n if (b === undefined) {\n // noinspection FallThroughInSwitchStatementJS\n switch (base64Str[i]) {\n case \'=\':\n groupPos = 0; // reset state when padding found\n case \'\\n\':\n case \'\\r\':\n case \'\\t\':\n case \' \':\n continue; // skip white-space, and padding\n default:\n throw Error(`invalid base64 string.`);\n }\n }\n switch (groupPos) {\n case 0:\n p = b;\n groupPos = 1;\n break;\n case 1:\n bytes[bytePos++] = p << 2 | (b & 48) >> 4;\n p = b;\n groupPos = 2;\n break;\n case 2:\n bytes[bytePos++] = (p & 15) << 4 | (b & 60) >> 2;\n p = b;\n groupPos = 3;\n break;\n case 3:\n bytes[bytePos++] = (p & 3) << 6 | b;\n groupPos = 0;\n break;\n }\n }\n if (groupPos == 1)\n throw Error(`invalid base64 string.`);\n return bytes.subarray(0, bytePos);\n}\n/**\n * Encodes a byte array to a base64 string.\n * Adds padding at the end.\n * Does not insert newlines.\n */\nfunction base64encode(bytes) {\n let base64 = \'\', groupPos = 0, // position in base64 group\n b, // current byte\n p = 0; // carry over from previous byte\n for (let i = 0; i < bytes.length; i++) {\n b = bytes[i];\n switch (groupPos) {\n case 0:\n base64 += encTable[b >> 2];\n p = (b & 3) << 4;\n groupPos = 1;\n break;\n case 1:\n base64 += encTable[p | b >> 4];\n p = (b & 15) << 2;\n groupPos = 2;\n break;\n case 2:\n base64 += encTable[p | b >> 6];\n base64 += encTable[b & 63];\n groupPos = 0;\n break;\n }\n }\n // padding required?\n if (groupPos) {\n base64 += encTable[p];\n base64 += \'=\';\n if (groupPos == 1)\n base64 += \'=\';\n }\n return base64;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/protobufjs-utf8.js\n// Copyright (c) 2016, Daniel Wirtz All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// * Neither the name of its author, nor the names of its contributors\n// may be used to endorse or promote products derived from this software\n// without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\nconst fromCharCodes = (chunk) => String.fromCharCode.apply(String, chunk);\n/**\n * @deprecated This function will no longer be exported with the next major\n * release, since protobuf-ts has switch to TextDecoder API. If you need this\n * function, please migrate to @protobufjs/utf8. For context, see\n * https://github.com/timostamm/protobuf-ts/issues/184\n *\n * Reads UTF8 bytes as a string.\n *\n * See [protobufjs / utf8](https://github.com/protobufjs/protobuf.js/blob/9893e35b854621cce64af4bf6be2cff4fb892796/lib/utf8/index.js#L40)\n *\n * Copyright (c) 2016, Daniel Wirtz\n */\nfunction utf8read(bytes) {\n if (bytes.length < 1)\n return "";\n let pos = 0, // position in bytes\n parts = [], chunk = [], i = 0, // char offset\n t; // temporary\n let len = bytes.length;\n while (pos < len) {\n t = bytes[pos++];\n if (t < 128)\n chunk[i++] = t;\n else if (t > 191 && t < 224)\n chunk[i++] = (t & 31) << 6 | bytes[pos++] & 63;\n else if (t > 239 && t < 365) {\n t = ((t & 7) << 18 | (bytes[pos++] & 63) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63) - 0x10000;\n chunk[i++] = 0xD800 + (t >> 10);\n chunk[i++] = 0xDC00 + (t & 1023);\n }\n else\n chunk[i++] = (t & 15) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63;\n if (i > 8191) {\n parts.push(fromCharCodes(chunk));\n i = 0;\n }\n }\n if (parts.length) {\n if (i)\n parts.push(fromCharCodes(chunk.slice(0, i)));\n return parts.join("");\n }\n return fromCharCodes(chunk.slice(0, i));\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/binary-format-contract.js\nvar binary_format_contract = __webpack_require__(8899);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/goog-varint.js\n// Copyright 2008 Google Inc. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Code generated by the Protocol Buffer compiler is owned by the owner\n// of the input file used when generating it. This code is not\n// standalone and requires a support library to be linked with it. This\n// support library is itself covered by the above license.\n/**\n * Read a 64 bit varint as two JS numbers.\n *\n * Returns tuple:\n * [0]: low bits\n * [0]: high bits\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L175\n */\nfunction varint64read() {\n let lowBits = 0;\n let highBits = 0;\n for (let shift = 0; shift < 28; shift += 7) {\n let b = this.buf[this.pos++];\n lowBits |= (b & 0x7F) << shift;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n }\n let middleByte = this.buf[this.pos++];\n // last four bits of the first 32 bit number\n lowBits |= (middleByte & 0x0F) << 28;\n // 3 upper bits are part of the next 32 bit number\n highBits = (middleByte & 0x70) >> 4;\n if ((middleByte & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n for (let shift = 3; shift <= 31; shift += 7) {\n let b = this.buf[this.pos++];\n highBits |= (b & 0x7F) << shift;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n }\n throw new Error(\'invalid varint\');\n}\n/**\n * Write a 64 bit varint, given as two JS numbers, to the given bytes array.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344\n */\nfunction varint64write(lo, hi, bytes) {\n for (let i = 0; i < 28; i = i + 7) {\n const shift = lo >>> i;\n const hasNext = !((shift >>> 7) == 0 && hi == 0);\n const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;\n bytes.push(byte);\n if (!hasNext) {\n return;\n }\n }\n const splitBits = ((lo >>> 28) & 0x0F) | ((hi & 0x07) << 4);\n const hasMoreBits = !((hi >> 3) == 0);\n bytes.push((hasMoreBits ? splitBits | 0x80 : splitBits) & 0xFF);\n if (!hasMoreBits) {\n return;\n }\n for (let i = 3; i < 31; i = i + 7) {\n const shift = hi >>> i;\n const hasNext = !((shift >>> 7) == 0);\n const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;\n bytes.push(byte);\n if (!hasNext) {\n return;\n }\n }\n bytes.push((hi >>> 31) & 0x01);\n}\n// constants for binary math\nconst TWO_PWR_32_DBL = (1 << 16) * (1 << 16);\n/**\n * Parse decimal string of 64 bit integer value as two JS numbers.\n *\n * Returns tuple:\n * [0]: minus sign?\n * [1]: low bits\n * [2]: high bits\n *\n * Copyright 2008 Google Inc.\n */\nfunction int64fromString(dec) {\n // Check for minus sign.\n let minus = dec[0] == \'-\';\n if (minus)\n dec = dec.slice(1);\n // Work 6 decimal digits at a time, acting like we\'re converting base 1e6\n // digits to binary. This is safe to do with floating point math because\n // Number.isSafeInteger(ALL_32_BITS * 1e6) == true.\n const base = 1e6;\n let lowBits = 0;\n let highBits = 0;\n function add1e6digit(begin, end) {\n // Note: Number(\'\') is 0.\n const digit1e6 = Number(dec.slice(begin, end));\n highBits *= base;\n lowBits = lowBits * base + digit1e6;\n // Carry bits from lowBits to highBits\n if (lowBits >= TWO_PWR_32_DBL) {\n highBits = highBits + ((lowBits / TWO_PWR_32_DBL) | 0);\n lowBits = lowBits % TWO_PWR_32_DBL;\n }\n }\n add1e6digit(-24, -18);\n add1e6digit(-18, -12);\n add1e6digit(-12, -6);\n add1e6digit(-6);\n return [minus, lowBits, highBits];\n}\n/**\n * Format 64 bit integer value (as two JS numbers) to decimal string.\n *\n * Copyright 2008 Google Inc.\n */\nfunction int64toString(bitsLow, bitsHigh) {\n // Skip the expensive conversion if the number is small enough to use the\n // built-in conversions.\n if ((bitsHigh >>> 0) <= 0x1FFFFF) {\n return \'\' + (TWO_PWR_32_DBL * bitsHigh + (bitsLow >>> 0));\n }\n // What this code is doing is essentially converting the input number from\n // base-2 to base-1e7, which allows us to represent the 64-bit range with\n // only 3 (very large) digits. Those digits are then trivial to convert to\n // a base-10 string.\n // The magic numbers used here are -\n // 2^24 = 16777216 = (1,6777216) in base-1e7.\n // 2^48 = 281474976710656 = (2,8147497,6710656) in base-1e7.\n // Split 32:32 representation into 16:24:24 representation so our\n // intermediate digits don\'t overflow.\n let low = bitsLow & 0xFFFFFF;\n let mid = (((bitsLow >>> 24) | (bitsHigh << 8)) >>> 0) & 0xFFFFFF;\n let high = (bitsHigh >> 16) & 0xFFFF;\n // Assemble our three base-1e7 digits, ignoring carries. The maximum\n // value in a digit at this step is representable as a 48-bit integer, which\n // can be stored in a 64-bit floating point number.\n let digitA = low + (mid * 6777216) + (high * 6710656);\n let digitB = mid + (high * 8147497);\n let digitC = (high * 2);\n // Apply carries from A to B and from B to C.\n let base = 10000000;\n if (digitA >= base) {\n digitB += Math.floor(digitA / base);\n digitA %= base;\n }\n if (digitB >= base) {\n digitC += Math.floor(digitB / base);\n digitB %= base;\n }\n // Convert base-1e7 digits to base-10, with optional leading zeroes.\n function decimalFrom1e7(digit1e7, needLeadingZeros) {\n let partial = digit1e7 ? String(digit1e7) : \'\';\n if (needLeadingZeros) {\n return \'0000000\'.slice(partial.length) + partial;\n }\n return partial;\n }\n return decimalFrom1e7(digitC, /*needLeadingZeros=*/ 0) +\n decimalFrom1e7(digitB, /*needLeadingZeros=*/ digitC) +\n // If the final 1e7 digit didn\'t need leading zeros, we would have\n // returned via the trivial code path at the top.\n decimalFrom1e7(digitA, /*needLeadingZeros=*/ 1);\n}\n/**\n * Write a 32 bit varint, signed or unsigned. Same as `varint64write(0, value, bytes)`\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/1b18833f4f2a2f681f4e4a25cdf3b0a43115ec26/js/binary/encoder.js#L144\n */\nfunction varint32write(value, bytes) {\n if (value >= 0) {\n // write value as varint 32\n while (value > 0x7f) {\n bytes.push((value & 0x7f) | 0x80);\n value = value >>> 7;\n }\n bytes.push(value);\n }\n else {\n for (let i = 0; i < 9; i++) {\n bytes.push(value & 127 | 128);\n value = value >> 7;\n }\n bytes.push(1);\n }\n}\n/**\n * Read an unsigned 32 bit varint.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L220\n */\nfunction varint32read() {\n let b = this.buf[this.pos++];\n let result = b & 0x7F;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7F) << 7;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7F) << 14;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7F) << 21;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n // Extract only last 4 bits\n b = this.buf[this.pos++];\n result |= (b & 0x0F) << 28;\n for (let readBytes = 5; ((b & 0x80) !== 0) && readBytes < 10; readBytes++)\n b = this.buf[this.pos++];\n if ((b & 0x80) != 0)\n throw new Error(\'invalid varint\');\n this.assertBounds();\n // Result can have 32 bits, convert it to unsigned\n return result >>> 0;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/pb-long.js\n\nlet BI;\nfunction detectBi() {\n const dv = new DataView(new ArrayBuffer(8));\n const ok = globalThis.BigInt !== undefined\n && typeof dv.getBigInt64 === "function"\n && typeof dv.getBigUint64 === "function"\n && typeof dv.setBigInt64 === "function"\n && typeof dv.setBigUint64 === "function";\n BI = ok ? {\n MIN: BigInt("-9223372036854775808"),\n MAX: BigInt("9223372036854775807"),\n UMIN: BigInt("0"),\n UMAX: BigInt("18446744073709551615"),\n C: BigInt,\n V: dv,\n } : undefined;\n}\ndetectBi();\nfunction assertBi(bi) {\n if (!bi)\n throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support");\n}\n// used to validate from(string) input (when bigint is unavailable)\nconst RE_DECIMAL_STR = /^-?[0-9]+$/;\n// constants for binary math\nconst pb_long_TWO_PWR_32_DBL = 0x100000000;\nconst HALF_2_PWR_32 = 0x080000000;\n// base class for PbLong and PbULong provides shared code\nclass SharedPbLong {\n /**\n * Create a new instance with the given bits.\n */\n constructor(lo, hi) {\n this.lo = lo | 0;\n this.hi = hi | 0;\n }\n /**\n * Is this instance equal to 0?\n */\n isZero() {\n return this.lo == 0 && this.hi == 0;\n }\n /**\n * Convert to a native number.\n */\n toNumber() {\n let result = this.hi * pb_long_TWO_PWR_32_DBL + (this.lo >>> 0);\n if (!Number.isSafeInteger(result))\n throw new Error("cannot convert to safe number");\n return result;\n }\n}\n/**\n * 64-bit unsigned integer as two 32-bit values.\n * Converts between `string`, `number` and `bigint` representations.\n */\nclass PbULong extends SharedPbLong {\n /**\n * Create instance from a `string`, `number` or `bigint`.\n */\n static from(value) {\n if (BI)\n // noinspection FallThroughInSwitchStatementJS\n switch (typeof value) {\n case "string":\n if (value == "0")\n return this.ZERO;\n if (value == "")\n throw new Error(\'string is no integer\');\n value = BI.C(value);\n case "number":\n if (value === 0)\n return this.ZERO;\n value = BI.C(value);\n case "bigint":\n if (!value)\n return this.ZERO;\n if (value < BI.UMIN)\n throw new Error(\'signed value for ulong\');\n if (value > BI.UMAX)\n throw new Error(\'ulong too large\');\n BI.V.setBigUint64(0, value, true);\n return new PbULong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));\n }\n else\n switch (typeof value) {\n case "string":\n if (value == "0")\n return this.ZERO;\n value = value.trim();\n if (!RE_DECIMAL_STR.test(value))\n throw new Error(\'string is no integer\');\n let [minus, lo, hi] = int64fromString(value);\n if (minus)\n throw new Error(\'signed value for ulong\');\n return new PbULong(lo, hi);\n case "number":\n if (value == 0)\n return this.ZERO;\n if (!Number.isSafeInteger(value))\n throw new Error(\'number is no integer\');\n if (value < 0)\n throw new Error(\'signed value for ulong\');\n return new PbULong(value, value / pb_long_TWO_PWR_32_DBL);\n }\n throw new Error(\'unknown value \' + typeof value);\n }\n /**\n * Convert to decimal string.\n */\n toString() {\n return BI ? this.toBigInt().toString() : int64toString(this.lo, this.hi);\n }\n /**\n * Convert to native bigint.\n */\n toBigInt() {\n assertBi(BI);\n BI.V.setInt32(0, this.lo, true);\n BI.V.setInt32(4, this.hi, true);\n return BI.V.getBigUint64(0, true);\n }\n}\n/**\n * ulong 0 singleton.\n */\nPbULong.ZERO = new PbULong(0, 0);\n/**\n * 64-bit signed integer as two 32-bit values.\n * Converts between `string`, `number` and `bigint` representations.\n */\nclass PbLong extends SharedPbLong {\n /**\n * Create instance from a `string`, `number` or `bigint`.\n */\n static from(value) {\n if (BI)\n // noinspection FallThroughInSwitchStatementJS\n switch (typeof value) {\n case "string":\n if (value == "0")\n return this.ZERO;\n if (value == "")\n throw new Error(\'string is no integer\');\n value = BI.C(value);\n case "number":\n if (value === 0)\n return this.ZERO;\n value = BI.C(value);\n case "bigint":\n if (!value)\n return this.ZERO;\n if (value < BI.MIN)\n throw new Error(\'signed long too small\');\n if (value > BI.MAX)\n throw new Error(\'signed long too large\');\n BI.V.setBigInt64(0, value, true);\n return new PbLong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));\n }\n else\n switch (typeof value) {\n case "string":\n if (value == "0")\n return this.ZERO;\n value = value.trim();\n if (!RE_DECIMAL_STR.test(value))\n throw new Error(\'string is no integer\');\n let [minus, lo, hi] = int64fromString(value);\n if (minus) {\n if (hi > HALF_2_PWR_32 || (hi == HALF_2_PWR_32 && lo != 0))\n throw new Error(\'signed long too small\');\n }\n else if (hi >= HALF_2_PWR_32)\n throw new Error(\'signed long too large\');\n let pbl = new PbLong(lo, hi);\n return minus ? pbl.negate() : pbl;\n case "number":\n if (value == 0)\n return this.ZERO;\n if (!Number.isSafeInteger(value))\n throw new Error(\'number is no integer\');\n return value > 0\n ? new PbLong(value, value / pb_long_TWO_PWR_32_DBL)\n : new PbLong(-value, -value / pb_long_TWO_PWR_32_DBL).negate();\n }\n throw new Error(\'unknown value \' + typeof value);\n }\n /**\n * Do we have a minus sign?\n */\n isNegative() {\n return (this.hi & HALF_2_PWR_32) !== 0;\n }\n /**\n * Negate two\'s complement.\n * Invert all the bits and add one to the result.\n */\n negate() {\n let hi = ~this.hi, lo = this.lo;\n if (lo)\n lo = ~lo + 1;\n else\n hi += 1;\n return new PbLong(lo, hi);\n }\n /**\n * Convert to decimal string.\n */\n toString() {\n if (BI)\n return this.toBigInt().toString();\n if (this.isNegative()) {\n let n = this.negate();\n return \'-\' + int64toString(n.lo, n.hi);\n }\n return int64toString(this.lo, this.hi);\n }\n /**\n * Convert to native bigint.\n */\n toBigInt() {\n assertBi(BI);\n BI.V.setInt32(0, this.lo, true);\n BI.V.setInt32(4, this.hi, true);\n return BI.V.getBigInt64(0, true);\n }\n}\n/**\n * long 0 singleton.\n */\nPbLong.ZERO = new PbLong(0, 0);\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/binary-reader.js\n\n\n\nconst defaultsRead = {\n readUnknownField: true,\n readerFactory: bytes => new BinaryReader(bytes),\n};\n/**\n * Make options for reading binary data form partial options.\n */\nfunction binaryReadOptions(options) {\n return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead;\n}\nclass BinaryReader {\n constructor(buf, textDecoder) {\n this.varint64 = varint64read; // dirty cast for `this`\n /**\n * Read a `uint32` field, an unsigned 32 bit varint.\n */\n this.uint32 = varint32read; // dirty cast for `this` and access to protected `buf`\n this.buf = buf;\n this.len = buf.length;\n this.pos = 0;\n this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n this.textDecoder = textDecoder !== null && textDecoder !== void 0 ? textDecoder : new TextDecoder("utf-8", {\n fatal: true,\n ignoreBOM: true,\n });\n }\n /**\n * Reads a tag - field number and wire type.\n */\n tag() {\n let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;\n if (fieldNo <= 0 || wireType < 0 || wireType > 5)\n throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);\n return [fieldNo, wireType];\n }\n /**\n * Skip one element on the wire and return the skipped data.\n * Supports WireType.StartGroup since v2.0.0-alpha.23.\n */\n skip(wireType) {\n let start = this.pos;\n // noinspection FallThroughInSwitchStatementJS\n switch (wireType) {\n case binary_format_contract/* WireType */.O0.Varint:\n while (this.buf[this.pos++] & 0x80) {\n // ignore\n }\n break;\n case binary_format_contract/* WireType */.O0.Bit64:\n this.pos += 4;\n case binary_format_contract/* WireType */.O0.Bit32:\n this.pos += 4;\n break;\n case binary_format_contract/* WireType */.O0.LengthDelimited:\n let len = this.uint32();\n this.pos += len;\n break;\n case binary_format_contract/* WireType */.O0.StartGroup:\n // From descriptor.proto: Group type is deprecated, not supported in proto3.\n // But we must still be able to parse and treat as unknown.\n let t;\n while ((t = this.tag()[1]) !== binary_format_contract/* WireType */.O0.EndGroup) {\n this.skip(t);\n }\n break;\n default:\n throw new Error("cant skip wire type " + wireType);\n }\n this.assertBounds();\n return this.buf.subarray(start, this.pos);\n }\n /**\n * Throws error if position in byte array is out of range.\n */\n assertBounds() {\n if (this.pos > this.len)\n throw new RangeError("premature EOF");\n }\n /**\n * Read a `int32` field, a signed 32 bit varint.\n */\n int32() {\n return this.uint32() | 0;\n }\n /**\n * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.\n */\n sint32() {\n let zze = this.uint32();\n // decode zigzag\n return (zze >>> 1) ^ -(zze & 1);\n }\n /**\n * Read a `int64` field, a signed 64-bit varint.\n */\n int64() {\n return new PbLong(...this.varint64());\n }\n /**\n * Read a `uint64` field, an unsigned 64-bit varint.\n */\n uint64() {\n return new PbULong(...this.varint64());\n }\n /**\n * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64() {\n let [lo, hi] = this.varint64();\n // decode zig zag\n let s = -(lo & 1);\n lo = ((lo >>> 1 | (hi & 1) << 31) ^ s);\n hi = (hi >>> 1 ^ s);\n return new PbLong(lo, hi);\n }\n /**\n * Read a `bool` field, a variant.\n */\n bool() {\n let [lo, hi] = this.varint64();\n return lo !== 0 || hi !== 0;\n }\n /**\n * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.\n */\n fixed32() {\n return this.view.getUint32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.\n */\n sfixed32() {\n return this.view.getInt32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.\n */\n fixed64() {\n return new PbULong(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `fixed64` field, a signed, fixed-length 64-bit integer.\n */\n sfixed64() {\n return new PbLong(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `float` field, 32-bit floating point number.\n */\n float() {\n return this.view.getFloat32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `double` field, a 64-bit floating point number.\n */\n double() {\n return this.view.getFloat64((this.pos += 8) - 8, true);\n }\n /**\n * Read a `bytes` field, length-delimited arbitrary data.\n */\n bytes() {\n let len = this.uint32();\n let start = this.pos;\n this.pos += len;\n this.assertBounds();\n return this.buf.subarray(start, start + len);\n }\n /**\n * Read a `string` field, length-delimited data converted to UTF-8 text.\n */\n string() {\n return this.textDecoder.decode(this.bytes());\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/assert.js\nvar assert = __webpack_require__(64441);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/binary-writer.js\n\n\n\nconst defaultsWrite = {\n writeUnknownFields: true,\n writerFactory: () => new BinaryWriter(),\n};\n/**\n * Make options for writing binary data form partial options.\n */\nfunction binaryWriteOptions(options) {\n return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite;\n}\nclass BinaryWriter {\n constructor(textEncoder) {\n /**\n * Previous fork states.\n */\n this.stack = [];\n this.textEncoder = textEncoder !== null && textEncoder !== void 0 ? textEncoder : new TextEncoder();\n this.chunks = [];\n this.buf = [];\n }\n /**\n * Return all bytes written and reset this writer.\n */\n finish() {\n this.chunks.push(new Uint8Array(this.buf)); // flush the buffer\n let len = 0;\n for (let i = 0; i < this.chunks.length; i++)\n len += this.chunks[i].length;\n let bytes = new Uint8Array(len);\n let offset = 0;\n for (let i = 0; i < this.chunks.length; i++) {\n bytes.set(this.chunks[i], offset);\n offset += this.chunks[i].length;\n }\n this.chunks = [];\n return bytes;\n }\n /**\n * Start a new fork for length-delimited data like a message\n * or a packed repeated field.\n *\n * Must be joined later with `join()`.\n */\n fork() {\n this.stack.push({ chunks: this.chunks, buf: this.buf });\n this.chunks = [];\n this.buf = [];\n return this;\n }\n /**\n * Join the last fork. Write its length and bytes, then\n * return to the previous state.\n */\n join() {\n // get chunk of fork\n let chunk = this.finish();\n // restore previous state\n let prev = this.stack.pop();\n if (!prev)\n throw new Error(\'invalid state, fork stack empty\');\n this.chunks = prev.chunks;\n this.buf = prev.buf;\n // write length of chunk as varint\n this.uint32(chunk.byteLength);\n return this.raw(chunk);\n }\n /**\n * Writes a tag (field number and wire type).\n *\n * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.\n *\n * Generated code should compute the tag ahead of time and call `uint32()`.\n */\n tag(fieldNo, type) {\n return this.uint32((fieldNo << 3 | type) >>> 0);\n }\n /**\n * Write a chunk of raw bytes.\n */\n raw(chunk) {\n if (this.buf.length) {\n this.chunks.push(new Uint8Array(this.buf));\n this.buf = [];\n }\n this.chunks.push(chunk);\n return this;\n }\n /**\n * Write a `uint32` value, an unsigned 32 bit varint.\n */\n uint32(value) {\n (0,assert/* assertUInt32 */.e1)(value);\n // write value as varint 32, inlined for speed\n while (value > 0x7f) {\n this.buf.push((value & 0x7f) | 0x80);\n value = value >>> 7;\n }\n this.buf.push(value);\n return this;\n }\n /**\n * Write a `int32` value, a signed 32 bit varint.\n */\n int32(value) {\n (0,assert/* assertInt32 */.bn)(value);\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `bool` value, a variant.\n */\n bool(value) {\n this.buf.push(value ? 1 : 0);\n return this;\n }\n /**\n * Write a `bytes` value, length-delimited arbitrary data.\n */\n bytes(value) {\n this.uint32(value.byteLength); // write length of chunk as varint\n return this.raw(value);\n }\n /**\n * Write a `string` value, length-delimited data converted to UTF-8 text.\n */\n string(value) {\n let chunk = this.textEncoder.encode(value);\n this.uint32(chunk.byteLength); // write length of chunk as varint\n return this.raw(chunk);\n }\n /**\n * Write a `float` value, 32-bit floating point number.\n */\n float(value) {\n (0,assert/* assertFloat32 */.wO)(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setFloat32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `double` value, a 64-bit floating point number.\n */\n double(value) {\n let chunk = new Uint8Array(8);\n new DataView(chunk.buffer).setFloat64(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.\n */\n fixed32(value) {\n (0,assert/* assertUInt32 */.e1)(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setUint32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.\n */\n sfixed32(value) {\n (0,assert/* assertInt32 */.bn)(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setInt32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.\n */\n sint32(value) {\n (0,assert/* assertInt32 */.bn)(value);\n // zigzag encode\n value = ((value << 1) ^ (value >> 31)) >>> 0;\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `fixed64` value, a signed, fixed-length 64-bit integer.\n */\n sfixed64(value) {\n let chunk = new Uint8Array(8);\n let view = new DataView(chunk.buffer);\n let long = PbLong.from(value);\n view.setInt32(0, long.lo, true);\n view.setInt32(4, long.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.\n */\n fixed64(value) {\n let chunk = new Uint8Array(8);\n let view = new DataView(chunk.buffer);\n let long = PbULong.from(value);\n view.setInt32(0, long.lo, true);\n view.setInt32(4, long.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `int64` value, a signed 64-bit varint.\n */\n int64(value) {\n let long = PbLong.from(value);\n varint64write(long.lo, long.hi, this.buf);\n return this;\n }\n /**\n * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64(value) {\n let long = PbLong.from(value), \n // zigzag encode\n sign = long.hi >> 31, lo = (long.lo << 1) ^ sign, hi = ((long.hi << 1) | (long.lo >>> 31)) ^ sign;\n varint64write(lo, hi, this.buf);\n return this;\n }\n /**\n * Write a `uint64` value, an unsigned 64-bit varint.\n */\n uint64(value) {\n let long = PbULong.from(value);\n varint64write(long.lo, long.hi, this.buf);\n return this;\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/json-format-contract.js\nvar json_format_contract = __webpack_require__(69196);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/message-type-contract.js\n/**\n * The symbol used as a key on message objects to store the message type.\n *\n * Note that this is an experimental feature - it is here to stay, but\n * implementation details may change without notice.\n */\nconst MESSAGE_TYPE = Symbol.for("protobuf-ts/message-type");\n\n// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/lower-camel-case.js\nvar lower_camel_case = __webpack_require__(99378);\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-info.js\n\n/**\n * Scalar value types. This is a subset of field types declared by protobuf\n * enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE\n * are omitted, but the numerical values are identical.\n */\nvar ScalarType;\n(function (ScalarType) {\n // 0 is reserved for errors.\n // Order is weird for historical reasons.\n ScalarType[ScalarType["DOUBLE"] = 1] = "DOUBLE";\n ScalarType[ScalarType["FLOAT"] = 2] = "FLOAT";\n // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if\n // negative values are likely.\n ScalarType[ScalarType["INT64"] = 3] = "INT64";\n ScalarType[ScalarType["UINT64"] = 4] = "UINT64";\n // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if\n // negative values are likely.\n ScalarType[ScalarType["INT32"] = 5] = "INT32";\n ScalarType[ScalarType["FIXED64"] = 6] = "FIXED64";\n ScalarType[ScalarType["FIXED32"] = 7] = "FIXED32";\n ScalarType[ScalarType["BOOL"] = 8] = "BOOL";\n ScalarType[ScalarType["STRING"] = 9] = "STRING";\n // Tag-delimited aggregate.\n // Group type is deprecated and not supported in proto3. However, Proto3\n // implementations should still be able to parse the group wire format and\n // treat group fields as unknown fields.\n // TYPE_GROUP = 10,\n // TYPE_MESSAGE = 11, // Length-delimited aggregate.\n // New in version 2.\n ScalarType[ScalarType["BYTES"] = 12] = "BYTES";\n ScalarType[ScalarType["UINT32"] = 13] = "UINT32";\n // TYPE_ENUM = 14,\n ScalarType[ScalarType["SFIXED32"] = 15] = "SFIXED32";\n ScalarType[ScalarType["SFIXED64"] = 16] = "SFIXED64";\n ScalarType[ScalarType["SINT32"] = 17] = "SINT32";\n ScalarType[ScalarType["SINT64"] = 18] = "SINT64";\n})(ScalarType || (ScalarType = {}));\n/**\n * JavaScript representation of 64 bit integral types. Equivalent to the\n * field option "jstype".\n *\n * By default, protobuf-ts represents 64 bit types as `bigint`.\n *\n * You can change the default behaviour by enabling the plugin parameter\n * `long_type_string`, which will represent 64 bit types as `string`.\n *\n * Alternatively, you can change the behaviour for individual fields\n * with the field option "jstype":\n *\n * ```protobuf\n * uint64 my_field = 1 [jstype = JS_STRING];\n * uint64 other_field = 2 [jstype = JS_NUMBER];\n * ```\n */\nvar LongType;\n(function (LongType) {\n /**\n * Use JavaScript `bigint`.\n *\n * Field option `[jstype = JS_NORMAL]`.\n */\n LongType[LongType["BIGINT"] = 0] = "BIGINT";\n /**\n * Use JavaScript `string`.\n *\n * Field option `[jstype = JS_STRING]`.\n */\n LongType[LongType["STRING"] = 1] = "STRING";\n /**\n * Use JavaScript `number`.\n *\n * Large values will loose precision.\n *\n * Field option `[jstype = JS_NUMBER]`.\n */\n LongType[LongType["NUMBER"] = 2] = "NUMBER";\n})(LongType || (LongType = {}));\n/**\n * Protobuf 2.1.0 introduced packed repeated fields.\n * Setting the field option `[packed = true]` enables packing.\n *\n * In proto3, all repeated fields are packed by default.\n * Setting the field option `[packed = false]` disables packing.\n *\n * Packed repeated fields are encoded with a single tag,\n * then a length-delimiter, then the element values.\n *\n * Unpacked repeated fields are encoded with a tag and\n * value for each element.\n *\n * `bytes` and `string` cannot be packed.\n */\nvar RepeatType;\n(function (RepeatType) {\n /**\n * The field is not repeated.\n */\n RepeatType[RepeatType["NO"] = 0] = "NO";\n /**\n * The field is repeated and should be packed.\n * Invalid for `bytes` and `string`, they cannot be packed.\n */\n RepeatType[RepeatType["PACKED"] = 1] = "PACKED";\n /**\n * The field is repeated but should not be packed.\n * The only valid repeat type for repeated `bytes` and `string`.\n */\n RepeatType[RepeatType["UNPACKED"] = 2] = "UNPACKED";\n})(RepeatType || (RepeatType = {}));\n/**\n * Turns PartialFieldInfo into FieldInfo.\n */\nfunction normalizeFieldInfo(field) {\n var _a, _b, _c, _d;\n field.localName = (_a = field.localName) !== null && _a !== void 0 ? _a : (0,lower_camel_case/* lowerCamelCase */.W)(field.name);\n field.jsonName = (_b = field.jsonName) !== null && _b !== void 0 ? _b : (0,lower_camel_case/* lowerCamelCase */.W)(field.name);\n field.repeat = (_c = field.repeat) !== null && _c !== void 0 ? _c : RepeatType.NO;\n field.opt = (_d = field.opt) !== null && _d !== void 0 ? _d : (field.repeat ? false : field.oneof ? false : field.kind == "message");\n return field;\n}\n/**\n * Read custom field options from a generated message type.\n *\n * @deprecated use readFieldOption()\n */\nfunction readFieldOptions(messageType, fieldName, extensionName, extensionType) {\n var _a;\n const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;\n return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;\n}\nfunction readFieldOption(messageType, fieldName, extensionName, extensionType) {\n var _a;\n const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;\n if (!options) {\n return undefined;\n }\n const optionVal = options[extensionName];\n if (optionVal === undefined) {\n return optionVal;\n }\n return extensionType ? extensionType.fromJson(optionVal) : optionVal;\n}\nfunction readMessageOption(messageType, extensionName, extensionType) {\n const options = messageType.options;\n const optionVal = options[extensionName];\n if (optionVal === undefined) {\n return optionVal;\n }\n return extensionType ? extensionType.fromJson(optionVal) : optionVal;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/oneof.js\n/**\n * Is the given value a valid oneof group?\n *\n * We represent protobuf `oneof` as algebraic data types (ADT) in generated\n * code. But when working with messages of unknown type, the ADT does not\n * help us.\n *\n * This type guard checks if the given object adheres to the ADT rules, which\n * are as follows:\n *\n * 1) Must be an object.\n *\n * 2) Must have a "oneofKind" discriminator property.\n *\n * 3) If "oneofKind" is `undefined`, no member field is selected. The object\n * must not have any other properties.\n *\n * 4) If "oneofKind" is a `string`, the member field with this name is\n * selected.\n *\n * 5) If a member field is selected, the object must have a second property\n * with this name. The property must not be `undefined`.\n *\n * 6) No extra properties are allowed. The object has either one property\n * (no selection) or two properties (selection).\n *\n */\nfunction isOneofGroup(any) {\n if (typeof any != \'object\' || any === null || !any.hasOwnProperty(\'oneofKind\')) {\n return false;\n }\n switch (typeof any.oneofKind) {\n case "string":\n if (any[any.oneofKind] === undefined)\n return false;\n return Object.keys(any).length == 2;\n case "undefined":\n return Object.keys(any).length == 1;\n default:\n return false;\n }\n}\n/**\n * Returns the value of the given field in a oneof group.\n */\nfunction getOneofValue(oneof, kind) {\n return oneof[kind];\n}\nfunction setOneofValue(oneof, kind, value) {\n if (oneof.oneofKind !== undefined) {\n delete oneof[oneof.oneofKind];\n }\n oneof.oneofKind = kind;\n if (value !== undefined) {\n oneof[kind] = value;\n }\n}\nfunction setUnknownOneofValue(oneof, kind, value) {\n if (oneof.oneofKind !== undefined) {\n delete oneof[oneof.oneofKind];\n }\n oneof.oneofKind = kind;\n if (value !== undefined && kind !== undefined) {\n oneof[kind] = value;\n }\n}\n/**\n * Removes the selected field in a oneof group.\n *\n * Note that the recommended way to modify a oneof group is to set\n * a new object:\n *\n * ```ts\n * message.result = { oneofKind: undefined };\n * ```\n */\nfunction clearOneofValue(oneof) {\n if (oneof.oneofKind !== undefined) {\n delete oneof[oneof.oneofKind];\n }\n oneof.oneofKind = undefined;\n}\n/**\n * Returns the selected value of the given oneof group.\n *\n * Not that the recommended way to access a oneof group is to check\n * the "oneofKind" property and let TypeScript narrow down the union\n * type for you:\n *\n * ```ts\n * if (message.result.oneofKind === "error") {\n * message.result.error; // string\n * }\n * ```\n *\n * In the rare case you just need the value, and do not care about\n * which protobuf field is selected, you can use this function\n * for convenience.\n */\nfunction getSelectedOneofValue(oneof) {\n if (oneof.oneofKind === undefined) {\n return undefined;\n }\n return oneof[oneof.oneofKind];\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-type-check.js\n\n\n// noinspection JSMethodCanBeStatic\nclass ReflectionTypeCheck {\n constructor(info) {\n var _a;\n this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];\n }\n prepare() {\n if (this.data)\n return;\n const req = [], known = [], oneofs = [];\n for (let field of this.fields) {\n if (field.oneof) {\n if (!oneofs.includes(field.oneof)) {\n oneofs.push(field.oneof);\n req.push(field.oneof);\n known.push(field.oneof);\n }\n }\n else {\n known.push(field.localName);\n switch (field.kind) {\n case "scalar":\n case "enum":\n if (!field.opt || field.repeat)\n req.push(field.localName);\n break;\n case "message":\n if (field.repeat)\n req.push(field.localName);\n break;\n case "map":\n req.push(field.localName);\n break;\n }\n }\n }\n this.data = { req, known, oneofs: Object.values(oneofs) };\n }\n /**\n * Is the argument a valid message as specified by the\n * reflection information?\n *\n * Checks all field types recursively. The `depth`\n * specifies how deep into the structure the check will be.\n *\n * With a depth of 0, only the presence of fields\n * is checked.\n *\n * With a depth of 1 or more, the field types are checked.\n *\n * With a depth of 2 or more, the members of map, repeated\n * and message fields are checked.\n *\n * Message fields will be checked recursively with depth - 1.\n *\n * The number of map entries / repeated values being checked\n * is < depth.\n */\n is(message, depth, allowExcessProperties = false) {\n if (depth < 0)\n return true;\n if (message === null || message === undefined || typeof message != \'object\')\n return false;\n this.prepare();\n let keys = Object.keys(message), data = this.data;\n // if a required field is missing in arg, this cannot be a T\n if (keys.length < data.req.length || data.req.some(n => !keys.includes(n)))\n return false;\n if (!allowExcessProperties) {\n // if the arg contains a key we dont know, this is not a literal T\n if (keys.some(k => !data.known.includes(k)))\n return false;\n }\n // "With a depth of 0, only the presence and absence of fields is checked."\n // "With a depth of 1 or more, the field types are checked."\n if (depth < 1) {\n return true;\n }\n // check oneof group\n for (const name of data.oneofs) {\n const group = message[name];\n if (!isOneofGroup(group))\n return false;\n if (group.oneofKind === undefined)\n continue;\n const field = this.fields.find(f => f.localName === group.oneofKind);\n if (!field)\n return false; // we found no field, but have a kind, something is wrong\n if (!this.field(group[group.oneofKind], field, allowExcessProperties, depth))\n return false;\n }\n // check types\n for (const field of this.fields) {\n if (field.oneof !== undefined)\n continue;\n if (!this.field(message[field.localName], field, allowExcessProperties, depth))\n return false;\n }\n return true;\n }\n field(arg, field, allowExcessProperties, depth) {\n let repeated = field.repeat;\n switch (field.kind) {\n case "scalar":\n if (arg === undefined)\n return field.opt;\n if (repeated)\n return this.scalars(arg, field.T, depth, field.L);\n return this.scalar(arg, field.T, field.L);\n case "enum":\n if (arg === undefined)\n return field.opt;\n if (repeated)\n return this.scalars(arg, ScalarType.INT32, depth);\n return this.scalar(arg, ScalarType.INT32);\n case "message":\n if (arg === undefined)\n return true;\n if (repeated)\n return this.messages(arg, field.T(), allowExcessProperties, depth);\n return this.message(arg, field.T(), allowExcessProperties, depth);\n case "map":\n if (typeof arg != \'object\' || arg === null)\n return false;\n if (depth < 2)\n return true;\n if (!this.mapKeys(arg, field.K, depth))\n return false;\n switch (field.V.kind) {\n case "scalar":\n return this.scalars(Object.values(arg), field.V.T, depth, field.V.L);\n case "enum":\n return this.scalars(Object.values(arg), ScalarType.INT32, depth);\n case "message":\n return this.messages(Object.values(arg), field.V.T(), allowExcessProperties, depth);\n }\n break;\n }\n return true;\n }\n message(arg, type, allowExcessProperties, depth) {\n if (allowExcessProperties) {\n return type.isAssignable(arg, depth);\n }\n return type.is(arg, depth);\n }\n messages(arg, type, allowExcessProperties, depth) {\n if (!Array.isArray(arg))\n return false;\n if (depth < 2)\n return true;\n if (allowExcessProperties) {\n for (let i = 0; i < arg.length && i < depth; i++)\n if (!type.isAssignable(arg[i], depth - 1))\n return false;\n }\n else {\n for (let i = 0; i < arg.length && i < depth; i++)\n if (!type.is(arg[i], depth - 1))\n return false;\n }\n return true;\n }\n scalar(arg, type, longType) {\n let argType = typeof arg;\n switch (type) {\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n switch (longType) {\n case LongType.BIGINT:\n return argType == "bigint";\n case LongType.NUMBER:\n return argType == "number" && !isNaN(arg);\n default:\n return argType == "string";\n }\n case ScalarType.BOOL:\n return argType == \'boolean\';\n case ScalarType.STRING:\n return argType == \'string\';\n case ScalarType.BYTES:\n return arg instanceof Uint8Array;\n case ScalarType.DOUBLE:\n case ScalarType.FLOAT:\n return argType == \'number\' && !isNaN(arg);\n default:\n // case ScalarType.UINT32:\n // case ScalarType.FIXED32:\n // case ScalarType.INT32:\n // case ScalarType.SINT32:\n // case ScalarType.SFIXED32:\n return argType == \'number\' && Number.isInteger(arg);\n }\n }\n scalars(arg, type, depth, longType) {\n if (!Array.isArray(arg))\n return false;\n if (depth < 2)\n return true;\n if (Array.isArray(arg))\n for (let i = 0; i < arg.length && i < depth; i++)\n if (!this.scalar(arg[i], type, longType))\n return false;\n return true;\n }\n mapKeys(map, type, depth) {\n let keys = Object.keys(map);\n switch (type) {\n case ScalarType.INT32:\n case ScalarType.FIXED32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n case ScalarType.UINT32:\n return this.scalars(keys.slice(0, depth).map(k => parseInt(k)), type, depth);\n case ScalarType.BOOL:\n return this.scalars(keys.slice(0, depth).map(k => k == \'true\' ? true : k == \'false\' ? false : k), type, depth);\n default:\n return this.scalars(keys, type, depth, LongType.STRING);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-long-convert.js\n\n/**\n * Utility method to convert a PbLong or PbUlong to a JavaScript\n * representation during runtime.\n *\n * Works with generated field information, `undefined` is equivalent\n * to `STRING`.\n */\nfunction reflectionLongConvert(long, type) {\n switch (type) {\n case LongType.BIGINT:\n return long.toBigInt();\n case LongType.NUMBER:\n return long.toNumber();\n default:\n // case undefined:\n // case LongType.STRING:\n return long.toString();\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-json-reader.js\n\n\n\n\n\n\n/**\n * Reads proto3 messages in canonical JSON format using reflection information.\n *\n * https://developers.google.com/protocol-buffers/docs/proto3#json\n */\nclass ReflectionJsonReader {\n constructor(info) {\n this.info = info;\n }\n prepare() {\n var _a;\n if (this.fMap === undefined) {\n this.fMap = {};\n const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];\n for (const field of fieldsInput) {\n this.fMap[field.name] = field;\n this.fMap[field.jsonName] = field;\n this.fMap[field.localName] = field;\n }\n }\n }\n // Cannot parse JSON for #.\n assert(condition, fieldName, jsonValue) {\n if (!condition) {\n let what = typeofJsonValue(jsonValue);\n if (what == "number" || what == "boolean")\n what = jsonValue.toString();\n throw new Error(`Cannot parse JSON ${what} for ${this.info.typeName}#${fieldName}`);\n }\n }\n /**\n * Reads a message from canonical JSON format into the target message.\n *\n * Repeated fields are appended. Map entries are added, overwriting\n * existing keys.\n *\n * If a message field is already present, it will be merged with the\n * new data.\n */\n read(input, message, options) {\n this.prepare();\n const oneofsHandled = [];\n for (const [jsonKey, jsonValue] of Object.entries(input)) {\n const field = this.fMap[jsonKey];\n if (!field) {\n if (!options.ignoreUnknownFields)\n throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${jsonKey}`);\n continue;\n }\n const localName = field.localName;\n // handle oneof ADT\n let target; // this will be the target for the field value, whether it is member of a oneof or not\n if (field.oneof) {\n if (jsonValue === null && (field.kind !== \'enum\' || field.T()[0] !== \'google.protobuf.NullValue\')) {\n continue;\n }\n // since json objects are unordered by specification, it is not possible to take the last of multiple oneofs\n if (oneofsHandled.includes(field.oneof))\n throw new Error(`Multiple members of the oneof group "${field.oneof}" of ${this.info.typeName} are present in JSON.`);\n oneofsHandled.push(field.oneof);\n target = message[field.oneof] = {\n oneofKind: localName\n };\n }\n else {\n target = message;\n }\n // we have handled oneof above. we just have read the value into `target`.\n if (field.kind == \'map\') {\n if (jsonValue === null) {\n continue;\n }\n // check input\n this.assert(isJsonObject(jsonValue), field.name, jsonValue);\n // our target to put map entries into\n const fieldObj = target[localName];\n // read entries\n for (const [jsonObjKey, jsonObjValue] of Object.entries(jsonValue)) {\n this.assert(jsonObjValue !== null, field.name + " map value", null);\n // read value\n let val;\n switch (field.V.kind) {\n case "message":\n val = field.V.T().internalJsonRead(jsonObjValue, options);\n break;\n case "enum":\n val = this.enum(field.V.T(), jsonObjValue, field.name, options.ignoreUnknownFields);\n if (val === false)\n continue;\n break;\n case "scalar":\n val = this.scalar(jsonObjValue, field.V.T, field.V.L, field.name);\n break;\n }\n this.assert(val !== undefined, field.name + " map value", jsonObjValue);\n // read key\n let key = jsonObjKey;\n if (field.K == ScalarType.BOOL)\n key = key == "true" ? true : key == "false" ? false : key;\n key = this.scalar(key, field.K, LongType.STRING, field.name).toString();\n fieldObj[key] = val;\n }\n }\n else if (field.repeat) {\n if (jsonValue === null)\n continue;\n // check input\n this.assert(Array.isArray(jsonValue), field.name, jsonValue);\n // our target to put array entries into\n const fieldArr = target[localName];\n // read array entries\n for (const jsonItem of jsonValue) {\n this.assert(jsonItem !== null, field.name, null);\n let val;\n switch (field.kind) {\n case "message":\n val = field.T().internalJsonRead(jsonItem, options);\n break;\n case "enum":\n val = this.enum(field.T(), jsonItem, field.name, options.ignoreUnknownFields);\n if (val === false)\n continue;\n break;\n case "scalar":\n val = this.scalar(jsonItem, field.T, field.L, field.name);\n break;\n }\n this.assert(val !== undefined, field.name, jsonValue);\n fieldArr.push(val);\n }\n }\n else {\n switch (field.kind) {\n case "message":\n if (jsonValue === null && field.T().typeName != \'google.protobuf.Value\') {\n this.assert(field.oneof === undefined, field.name + " (oneof member)", null);\n continue;\n }\n target[localName] = field.T().internalJsonRead(jsonValue, options, target[localName]);\n break;\n case "enum":\n let val = this.enum(field.T(), jsonValue, field.name, options.ignoreUnknownFields);\n if (val === false)\n continue;\n target[localName] = val;\n break;\n case "scalar":\n target[localName] = this.scalar(jsonValue, field.T, field.L, field.name);\n break;\n }\n }\n }\n }\n /**\n * Returns `false` for unrecognized string representations.\n *\n * google.protobuf.NullValue accepts only JSON `null` (or the old `"NULL_VALUE"`).\n */\n enum(type, json, fieldName, ignoreUnknownFields) {\n if (type[0] == \'google.protobuf.NullValue\')\n (0,assert/* assert */.vA)(json === null || json === "NULL_VALUE", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} only accepts null.`);\n if (json === null)\n // we require 0 to be default value for all enums\n return 0;\n switch (typeof json) {\n case "number":\n (0,assert/* assert */.vA)(Number.isInteger(json), `Unable to parse field ${this.info.typeName}#${fieldName}, enum can only be integral number, got ${json}.`);\n return json;\n case "string":\n let localEnumName = json;\n if (type[2] && json.substring(0, type[2].length) === type[2])\n // lookup without the shared prefix\n localEnumName = json.substring(type[2].length);\n let enumNumber = type[1][localEnumName];\n if (typeof enumNumber === \'undefined\' && ignoreUnknownFields) {\n return false;\n }\n (0,assert/* assert */.vA)(typeof enumNumber == "number", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} has no value for "${json}".`);\n return enumNumber;\n }\n (0,assert/* assert */.vA)(false, `Unable to parse field ${this.info.typeName}#${fieldName}, cannot parse enum value from ${typeof json}".`);\n }\n scalar(json, type, longType, fieldName) {\n let e;\n try {\n switch (type) {\n // float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".\n // Either numbers or strings are accepted. Exponent notation is also accepted.\n case ScalarType.DOUBLE:\n case ScalarType.FLOAT:\n if (json === null)\n return .0;\n if (json === "NaN")\n return Number.NaN;\n if (json === "Infinity")\n return Number.POSITIVE_INFINITY;\n if (json === "-Infinity")\n return Number.NEGATIVE_INFINITY;\n if (json === "") {\n e = "empty string";\n break;\n }\n if (typeof json == "string" && json.trim().length !== json.length) {\n e = "extra whitespace";\n break;\n }\n if (typeof json != "string" && typeof json != "number") {\n break;\n }\n let float = Number(json);\n if (Number.isNaN(float)) {\n e = "not a number";\n break;\n }\n if (!Number.isFinite(float)) {\n // infinity and -infinity are handled by string representation above, so this is an error\n e = "too large or small";\n break;\n }\n if (type == ScalarType.FLOAT)\n (0,assert/* assertFloat32 */.wO)(float);\n return float;\n // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.\n case ScalarType.INT32:\n case ScalarType.FIXED32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n case ScalarType.UINT32:\n if (json === null)\n return 0;\n let int32;\n if (typeof json == "number")\n int32 = json;\n else if (json === "")\n e = "empty string";\n else if (typeof json == "string") {\n if (json.trim().length !== json.length)\n e = "extra whitespace";\n else\n int32 = Number(json);\n }\n if (int32 === undefined)\n break;\n if (type == ScalarType.UINT32)\n (0,assert/* assertUInt32 */.e1)(int32);\n else\n (0,assert/* assertInt32 */.bn)(int32);\n return int32;\n // int64, fixed64, uint64: JSON value will be a decimal string. Either numbers or strings are accepted.\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n if (json === null)\n return reflectionLongConvert(PbLong.ZERO, longType);\n if (typeof json != "number" && typeof json != "string")\n break;\n return reflectionLongConvert(PbLong.from(json), longType);\n case ScalarType.FIXED64:\n case ScalarType.UINT64:\n if (json === null)\n return reflectionLongConvert(PbULong.ZERO, longType);\n if (typeof json != "number" && typeof json != "string")\n break;\n return reflectionLongConvert(PbULong.from(json), longType);\n // bool:\n case ScalarType.BOOL:\n if (json === null)\n return false;\n if (typeof json !== "boolean")\n break;\n return json;\n // string:\n case ScalarType.STRING:\n if (json === null)\n return "";\n if (typeof json !== "string") {\n e = "extra whitespace";\n break;\n }\n try {\n encodeURIComponent(json);\n }\n catch (e) {\n e = "invalid UTF8";\n break;\n }\n return json;\n // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.\n // Either standard or URL-safe base64 encoding with/without paddings are accepted.\n case ScalarType.BYTES:\n if (json === null || json === "")\n return new Uint8Array(0);\n if (typeof json !== \'string\')\n break;\n return base64decode(json);\n }\n }\n catch (error) {\n e = error.message;\n }\n this.assert(false, fieldName + (e ? " - " + e : ""), json);\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-json-writer.js\n\n\n\n\n/**\n * Writes proto3 messages in canonical JSON format using reflection\n * information.\n *\n * https://developers.google.com/protocol-buffers/docs/proto3#json\n */\nclass ReflectionJsonWriter {\n constructor(info) {\n var _a;\n this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];\n }\n /**\n * Converts the message to a JSON object, based on the field descriptors.\n */\n write(message, options) {\n const json = {}, source = message;\n for (const field of this.fields) {\n // field is not part of a oneof, simply write as is\n if (!field.oneof) {\n let jsonValue = this.field(field, source[field.localName], options);\n if (jsonValue !== undefined)\n json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;\n continue;\n }\n // field is part of a oneof\n const group = source[field.oneof];\n if (group.oneofKind !== field.localName)\n continue; // not selected, skip\n const opt = field.kind == \'scalar\' || field.kind == \'enum\'\n ? Object.assign(Object.assign({}, options), { emitDefaultValues: true }) : options;\n let jsonValue = this.field(field, group[field.localName], opt);\n (0,assert/* assert */.vA)(jsonValue !== undefined);\n json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;\n }\n return json;\n }\n field(field, value, options) {\n let jsonValue = undefined;\n if (field.kind == \'map\') {\n (0,assert/* assert */.vA)(typeof value == "object" && value !== null);\n const jsonObj = {};\n switch (field.V.kind) {\n case "scalar":\n for (const [entryKey, entryValue] of Object.entries(value)) {\n const val = this.scalar(field.V.T, entryValue, field.name, false, true);\n (0,assert/* assert */.vA)(val !== undefined);\n jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key\n }\n break;\n case "message":\n const messageType = field.V.T();\n for (const [entryKey, entryValue] of Object.entries(value)) {\n const val = this.message(messageType, entryValue, field.name, options);\n (0,assert/* assert */.vA)(val !== undefined);\n jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key\n }\n break;\n case "enum":\n const enumInfo = field.V.T();\n for (const [entryKey, entryValue] of Object.entries(value)) {\n (0,assert/* assert */.vA)(entryValue === undefined || typeof entryValue == \'number\');\n const val = this.enum(enumInfo, entryValue, field.name, false, true, options.enumAsInteger);\n (0,assert/* assert */.vA)(val !== undefined);\n jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key\n }\n break;\n }\n if (options.emitDefaultValues || Object.keys(jsonObj).length > 0)\n jsonValue = jsonObj;\n }\n else if (field.repeat) {\n (0,assert/* assert */.vA)(Array.isArray(value));\n const jsonArr = [];\n switch (field.kind) {\n case "scalar":\n for (let i = 0; i < value.length; i++) {\n const val = this.scalar(field.T, value[i], field.name, field.opt, true);\n (0,assert/* assert */.vA)(val !== undefined);\n jsonArr.push(val);\n }\n break;\n case "enum":\n const enumInfo = field.T();\n for (let i = 0; i < value.length; i++) {\n (0,assert/* assert */.vA)(value[i] === undefined || typeof value[i] == \'number\');\n const val = this.enum(enumInfo, value[i], field.name, field.opt, true, options.enumAsInteger);\n (0,assert/* assert */.vA)(val !== undefined);\n jsonArr.push(val);\n }\n break;\n case "message":\n const messageType = field.T();\n for (let i = 0; i < value.length; i++) {\n const val = this.message(messageType, value[i], field.name, options);\n (0,assert/* assert */.vA)(val !== undefined);\n jsonArr.push(val);\n }\n break;\n }\n // add converted array to json output\n if (options.emitDefaultValues || jsonArr.length > 0 || options.emitDefaultValues)\n jsonValue = jsonArr;\n }\n else {\n switch (field.kind) {\n case "scalar":\n jsonValue = this.scalar(field.T, value, field.name, field.opt, options.emitDefaultValues);\n break;\n case "enum":\n jsonValue = this.enum(field.T(), value, field.name, field.opt, options.emitDefaultValues, options.enumAsInteger);\n break;\n case "message":\n jsonValue = this.message(field.T(), value, field.name, options);\n break;\n }\n }\n return jsonValue;\n }\n /**\n * Returns `null` as the default for google.protobuf.NullValue.\n */\n enum(type, value, fieldName, optional, emitDefaultValues, enumAsInteger) {\n if (type[0] == \'google.protobuf.NullValue\')\n return !emitDefaultValues && !optional ? undefined : null;\n if (value === undefined) {\n (0,assert/* assert */.vA)(optional);\n return undefined;\n }\n if (value === 0 && !emitDefaultValues && !optional)\n // we require 0 to be default value for all enums\n return undefined;\n (0,assert/* assert */.vA)(typeof value == \'number\');\n (0,assert/* assert */.vA)(Number.isInteger(value));\n if (enumAsInteger || !type[1].hasOwnProperty(value))\n // if we don\'t now the enum value, just return the number\n return value;\n if (type[2])\n // restore the dropped prefix\n return type[2] + type[1][value];\n return type[1][value];\n }\n message(type, value, fieldName, options) {\n if (value === undefined)\n return options.emitDefaultValues ? null : undefined;\n return type.internalJsonWrite(value, options);\n }\n scalar(type, value, fieldName, optional, emitDefaultValues) {\n if (value === undefined) {\n (0,assert/* assert */.vA)(optional);\n return undefined;\n }\n const ed = emitDefaultValues || optional;\n // noinspection FallThroughInSwitchStatementJS\n switch (type) {\n // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.\n case ScalarType.INT32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n if (value === 0)\n return ed ? 0 : undefined;\n (0,assert/* assertInt32 */.bn)(value);\n return value;\n case ScalarType.FIXED32:\n case ScalarType.UINT32:\n if (value === 0)\n return ed ? 0 : undefined;\n (0,assert/* assertUInt32 */.e1)(value);\n return value;\n // float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".\n // Either numbers or strings are accepted. Exponent notation is also accepted.\n case ScalarType.FLOAT:\n (0,assert/* assertFloat32 */.wO)(value);\n case ScalarType.DOUBLE:\n if (value === 0)\n return ed ? 0 : undefined;\n (0,assert/* assert */.vA)(typeof value == \'number\');\n if (Number.isNaN(value))\n return \'NaN\';\n if (value === Number.POSITIVE_INFINITY)\n return \'Infinity\';\n if (value === Number.NEGATIVE_INFINITY)\n return \'-Infinity\';\n return value;\n // string:\n case ScalarType.STRING:\n if (value === "")\n return ed ? \'\' : undefined;\n (0,assert/* assert */.vA)(typeof value == \'string\');\n return value;\n // bool:\n case ScalarType.BOOL:\n if (value === false)\n return ed ? false : undefined;\n (0,assert/* assert */.vA)(typeof value == \'boolean\');\n return value;\n // JSON value will be a decimal string. Either numbers or strings are accepted.\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n (0,assert/* assert */.vA)(typeof value == \'number\' || typeof value == \'string\' || typeof value == \'bigint\');\n let ulong = PbULong.from(value);\n if (ulong.isZero() && !ed)\n return undefined;\n return ulong.toString();\n // JSON value will be a decimal string. Either numbers or strings are accepted.\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n (0,assert/* assert */.vA)(typeof value == \'number\' || typeof value == \'string\' || typeof value == \'bigint\');\n let long = PbLong.from(value);\n if (long.isZero() && !ed)\n return undefined;\n return long.toString();\n // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.\n // Either standard or URL-safe base64 encoding with/without paddings are accepted.\n case ScalarType.BYTES:\n (0,assert/* assert */.vA)(value instanceof Uint8Array);\n if (!value.byteLength)\n return ed ? "" : undefined;\n return base64encode(value);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-scalar-default.js\n\n\n\n/**\n * Creates the default value for a scalar type.\n */\nfunction reflectionScalarDefault(type, longType = LongType.STRING) {\n switch (type) {\n case ScalarType.BOOL:\n return false;\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n return reflectionLongConvert(PbULong.ZERO, longType);\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n return reflectionLongConvert(PbLong.ZERO, longType);\n case ScalarType.DOUBLE:\n case ScalarType.FLOAT:\n return 0.0;\n case ScalarType.BYTES:\n return new Uint8Array(0);\n case ScalarType.STRING:\n return "";\n default:\n // case ScalarType.INT32:\n // case ScalarType.UINT32:\n // case ScalarType.SINT32:\n // case ScalarType.FIXED32:\n // case ScalarType.SFIXED32:\n return 0;\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-binary-reader.js\n\n\n\n\n/**\n * Reads proto3 messages in binary format using reflection information.\n *\n * https://developers.google.com/protocol-buffers/docs/encoding\n */\nclass ReflectionBinaryReader {\n constructor(info) {\n this.info = info;\n }\n prepare() {\n var _a;\n if (!this.fieldNoToField) {\n const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];\n this.fieldNoToField = new Map(fieldsInput.map(field => [field.no, field]));\n }\n }\n /**\n * Reads a message from binary format into the target message.\n *\n * Repeated fields are appended. Map entries are added, overwriting\n * existing keys.\n *\n * If a message field is already present, it will be merged with the\n * new data.\n */\n read(reader, message, options, length) {\n this.prepare();\n const end = length === undefined ? reader.len : reader.pos + length;\n while (reader.pos < end) {\n // read the tag and find the field\n const [fieldNo, wireType] = reader.tag(), field = this.fieldNoToField.get(fieldNo);\n if (!field) {\n let u = options.readUnknownField;\n if (u == "throw")\n throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.info.typeName}`);\n let d = reader.skip(wireType);\n if (u !== false)\n (u === true ? binary_format_contract/* UnknownFieldHandler */.f$.onRead : u)(this.info.typeName, message, fieldNo, wireType, d);\n continue;\n }\n // target object for the field we are reading\n let target = message, repeated = field.repeat, localName = field.localName;\n // if field is member of oneof ADT, use ADT as target\n if (field.oneof) {\n target = target[field.oneof];\n // if other oneof member selected, set new ADT\n if (target.oneofKind !== localName)\n target = message[field.oneof] = {\n oneofKind: localName\n };\n }\n // we have handled oneof above, we just have read the value into `target[localName]`\n switch (field.kind) {\n case "scalar":\n case "enum":\n let T = field.kind == "enum" ? ScalarType.INT32 : field.T;\n let L = field.kind == "scalar" ? field.L : undefined;\n if (repeated) {\n let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values\n if (wireType == binary_format_contract/* WireType */.O0.LengthDelimited && T != ScalarType.STRING && T != ScalarType.BYTES) {\n let e = reader.uint32() + reader.pos;\n while (reader.pos < e)\n arr.push(this.scalar(reader, T, L));\n }\n else\n arr.push(this.scalar(reader, T, L));\n }\n else\n target[localName] = this.scalar(reader, T, L);\n break;\n case "message":\n if (repeated) {\n let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values\n let msg = field.T().internalBinaryRead(reader, reader.uint32(), options);\n arr.push(msg);\n }\n else\n target[localName] = field.T().internalBinaryRead(reader, reader.uint32(), options, target[localName]);\n break;\n case "map":\n let [mapKey, mapVal] = this.mapEntry(field, reader, options);\n // safe to assume presence of map object, oneof cannot contain repeated values\n target[localName][mapKey] = mapVal;\n break;\n }\n }\n }\n /**\n * Read a map field, expecting key field = 1, value field = 2\n */\n mapEntry(field, reader, options) {\n let length = reader.uint32();\n let end = reader.pos + length;\n let key = undefined; // javascript only allows number or string for object properties\n let val = undefined;\n while (reader.pos < end) {\n let [fieldNo, wireType] = reader.tag();\n switch (fieldNo) {\n case 1:\n if (field.K == ScalarType.BOOL)\n key = reader.bool().toString();\n else\n // long types are read as string, number types are okay as number\n key = this.scalar(reader, field.K, LongType.STRING);\n break;\n case 2:\n switch (field.V.kind) {\n case "scalar":\n val = this.scalar(reader, field.V.T, field.V.L);\n break;\n case "enum":\n val = reader.int32();\n break;\n case "message":\n val = field.V.T().internalBinaryRead(reader, reader.uint32(), options);\n break;\n }\n break;\n default:\n throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) in map entry for ${this.info.typeName}#${field.name}`);\n }\n }\n if (key === undefined) {\n let keyRaw = reflectionScalarDefault(field.K);\n key = field.K == ScalarType.BOOL ? keyRaw.toString() : keyRaw;\n }\n if (val === undefined)\n switch (field.V.kind) {\n case "scalar":\n val = reflectionScalarDefault(field.V.T, field.V.L);\n break;\n case "enum":\n val = 0;\n break;\n case "message":\n val = field.V.T().create();\n break;\n }\n return [key, val];\n }\n scalar(reader, type, longType) {\n switch (type) {\n case ScalarType.INT32:\n return reader.int32();\n case ScalarType.STRING:\n return reader.string();\n case ScalarType.BOOL:\n return reader.bool();\n case ScalarType.DOUBLE:\n return reader.double();\n case ScalarType.FLOAT:\n return reader.float();\n case ScalarType.INT64:\n return reflectionLongConvert(reader.int64(), longType);\n case ScalarType.UINT64:\n return reflectionLongConvert(reader.uint64(), longType);\n case ScalarType.FIXED64:\n return reflectionLongConvert(reader.fixed64(), longType);\n case ScalarType.FIXED32:\n return reader.fixed32();\n case ScalarType.BYTES:\n return reader.bytes();\n case ScalarType.UINT32:\n return reader.uint32();\n case ScalarType.SFIXED32:\n return reader.sfixed32();\n case ScalarType.SFIXED64:\n return reflectionLongConvert(reader.sfixed64(), longType);\n case ScalarType.SINT32:\n return reader.sint32();\n case ScalarType.SINT64:\n return reflectionLongConvert(reader.sint64(), longType);\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-binary-writer.js\n\n\n\n\n/**\n * Writes proto3 messages in binary format using reflection information.\n *\n * https://developers.google.com/protocol-buffers/docs/encoding\n */\nclass ReflectionBinaryWriter {\n constructor(info) {\n this.info = info;\n }\n prepare() {\n if (!this.fields) {\n const fieldsInput = this.info.fields ? this.info.fields.concat() : [];\n this.fields = fieldsInput.sort((a, b) => a.no - b.no);\n }\n }\n /**\n * Writes the message to binary format.\n */\n write(message, writer, options) {\n this.prepare();\n for (const field of this.fields) {\n let value, // this will be our field value, whether it is member of a oneof or not\n emitDefault, // whether we emit the default value (only true for oneof members)\n repeated = field.repeat, localName = field.localName;\n // handle oneof ADT\n if (field.oneof) {\n const group = message[field.oneof];\n if (group.oneofKind !== localName)\n continue; // if field is not selected, skip\n value = group[localName];\n emitDefault = true;\n }\n else {\n value = message[localName];\n emitDefault = false;\n }\n // we have handled oneof above. we just have to honor `emitDefault`.\n switch (field.kind) {\n case "scalar":\n case "enum":\n let T = field.kind == "enum" ? ScalarType.INT32 : field.T;\n if (repeated) {\n (0,assert/* assert */.vA)(Array.isArray(value));\n if (repeated == RepeatType.PACKED)\n this.packed(writer, T, field.no, value);\n else\n for (const item of value)\n this.scalar(writer, T, field.no, item, true);\n }\n else if (value === undefined)\n (0,assert/* assert */.vA)(field.opt);\n else\n this.scalar(writer, T, field.no, value, emitDefault || field.opt);\n break;\n case "message":\n if (repeated) {\n (0,assert/* assert */.vA)(Array.isArray(value));\n for (const item of value)\n this.message(writer, options, field.T(), field.no, item);\n }\n else {\n this.message(writer, options, field.T(), field.no, value);\n }\n break;\n case "map":\n (0,assert/* assert */.vA)(typeof value == \'object\' && value !== null);\n for (const [key, val] of Object.entries(value))\n this.mapEntry(writer, options, field, key, val);\n break;\n }\n }\n let u = options.writeUnknownFields;\n if (u !== false)\n (u === true ? binary_format_contract/* UnknownFieldHandler */.f$.onWrite : u)(this.info.typeName, message, writer);\n }\n mapEntry(writer, options, field, key, value) {\n writer.tag(field.no, binary_format_contract/* WireType */.O0.LengthDelimited);\n writer.fork();\n // javascript only allows number or string for object properties\n // we convert from our representation to the protobuf type\n let keyValue = key;\n switch (field.K) {\n case ScalarType.INT32:\n case ScalarType.FIXED32:\n case ScalarType.UINT32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n keyValue = Number.parseInt(key);\n break;\n case ScalarType.BOOL:\n (0,assert/* assert */.vA)(key == \'true\' || key == \'false\');\n keyValue = key == \'true\';\n break;\n }\n // write key, expecting key field number = 1\n this.scalar(writer, field.K, 1, keyValue, true);\n // write value, expecting value field number = 2\n switch (field.V.kind) {\n case \'scalar\':\n this.scalar(writer, field.V.T, 2, value, true);\n break;\n case \'enum\':\n this.scalar(writer, ScalarType.INT32, 2, value, true);\n break;\n case \'message\':\n this.message(writer, options, field.V.T(), 2, value);\n break;\n }\n writer.join();\n }\n message(writer, options, handler, fieldNo, value) {\n if (value === undefined)\n return;\n handler.internalBinaryWrite(value, writer.tag(fieldNo, binary_format_contract/* WireType */.O0.LengthDelimited).fork(), options);\n writer.join();\n }\n /**\n * Write a single scalar value.\n */\n scalar(writer, type, fieldNo, value, emitDefault) {\n let [wireType, method, isDefault] = this.scalarInfo(type, value);\n if (!isDefault || emitDefault) {\n writer.tag(fieldNo, wireType);\n writer[method](value);\n }\n }\n /**\n * Write an array of scalar values in packed format.\n */\n packed(writer, type, fieldNo, value) {\n if (!value.length)\n return;\n (0,assert/* assert */.vA)(type !== ScalarType.BYTES && type !== ScalarType.STRING);\n // write tag\n writer.tag(fieldNo, binary_format_contract/* WireType */.O0.LengthDelimited);\n // begin length-delimited\n writer.fork();\n // write values without tags\n let [, method,] = this.scalarInfo(type);\n for (let i = 0; i < value.length; i++)\n writer[method](value[i]);\n // end length delimited\n writer.join();\n }\n /**\n * Get information for writing a scalar value.\n *\n * Returns tuple:\n * [0]: appropriate WireType\n * [1]: name of the appropriate method of IBinaryWriter\n * [2]: whether the given value is a default value\n *\n * If argument `value` is omitted, [2] is always false.\n */\n scalarInfo(type, value) {\n let t = binary_format_contract/* WireType */.O0.Varint;\n let m;\n let i = value === undefined;\n let d = value === 0;\n switch (type) {\n case ScalarType.INT32:\n m = "int32";\n break;\n case ScalarType.STRING:\n d = i || !value.length;\n t = binary_format_contract/* WireType */.O0.LengthDelimited;\n m = "string";\n break;\n case ScalarType.BOOL:\n d = value === false;\n m = "bool";\n break;\n case ScalarType.UINT32:\n m = "uint32";\n break;\n case ScalarType.DOUBLE:\n t = binary_format_contract/* WireType */.O0.Bit64;\n m = "double";\n break;\n case ScalarType.FLOAT:\n t = binary_format_contract/* WireType */.O0.Bit32;\n m = "float";\n break;\n case ScalarType.INT64:\n d = i || PbLong.from(value).isZero();\n m = "int64";\n break;\n case ScalarType.UINT64:\n d = i || PbULong.from(value).isZero();\n m = "uint64";\n break;\n case ScalarType.FIXED64:\n d = i || PbULong.from(value).isZero();\n t = binary_format_contract/* WireType */.O0.Bit64;\n m = "fixed64";\n break;\n case ScalarType.BYTES:\n d = i || !value.byteLength;\n t = binary_format_contract/* WireType */.O0.LengthDelimited;\n m = "bytes";\n break;\n case ScalarType.FIXED32:\n t = binary_format_contract/* WireType */.O0.Bit32;\n m = "fixed32";\n break;\n case ScalarType.SFIXED32:\n t = binary_format_contract/* WireType */.O0.Bit32;\n m = "sfixed32";\n break;\n case ScalarType.SFIXED64:\n d = i || PbLong.from(value).isZero();\n t = binary_format_contract/* WireType */.O0.Bit64;\n m = "sfixed64";\n break;\n case ScalarType.SINT32:\n m = "sint32";\n break;\n case ScalarType.SINT64:\n d = i || PbLong.from(value).isZero();\n m = "sint64";\n break;\n }\n return [t, m, i || d];\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-create.js\n\n\n/**\n * Creates an instance of the generic message, using the field\n * information.\n */\nfunction reflectionCreate(type) {\n /**\n * This ternary can be removed in the next major version.\n * The `Object.create()` code path utilizes a new `messagePrototype`\n * property on the `IMessageType` which has this same `MESSAGE_TYPE`\n * non-enumerable property on it. Doing it this way means that we only\n * pay the cost of `Object.defineProperty()` once per `IMessageType`\n * class of once per "instance". The falsy code path is only provided\n * for backwards compatibility in cases where the runtime library is\n * updated without also updating the generated code.\n */\n const msg = type.messagePrototype\n ? Object.create(type.messagePrototype)\n : Object.defineProperty({}, MESSAGE_TYPE, { value: type });\n for (let field of type.fields) {\n let name = field.localName;\n if (field.opt)\n continue;\n if (field.oneof)\n msg[field.oneof] = { oneofKind: undefined };\n else if (field.repeat)\n msg[name] = [];\n else\n switch (field.kind) {\n case "scalar":\n msg[name] = reflectionScalarDefault(field.T, field.L);\n break;\n case "enum":\n // we require 0 to be default value for all enums\n msg[name] = 0;\n break;\n case "map":\n msg[name] = {};\n break;\n }\n }\n return msg;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-merge-partial.js\n/**\n * Copy partial data into the target message.\n *\n * If a singular scalar or enum field is present in the source, it\n * replaces the field in the target.\n *\n * If a singular message field is present in the source, it is merged\n * with the target field by calling mergePartial() of the responsible\n * message type.\n *\n * If a repeated field is present in the source, its values replace\n * all values in the target array, removing extraneous values.\n * Repeated message fields are copied, not merged.\n *\n * If a map field is present in the source, entries are added to the\n * target map, replacing entries with the same key. Entries that only\n * exist in the target remain. Entries with message values are copied,\n * not merged.\n *\n * Note that this function differs from protobuf merge semantics,\n * which appends repeated fields.\n */\nfunction reflectionMergePartial(info, target, source) {\n let fieldValue, // the field value we are working with\n input = source, output; // where we want our field value to go\n for (let field of info.fields) {\n let name = field.localName;\n if (field.oneof) {\n const group = input[field.oneof]; // this is the oneof`s group in the source\n if ((group === null || group === void 0 ? void 0 : group.oneofKind) == undefined) { // the user is free to omit\n continue; // we skip this field, and all other members too\n }\n fieldValue = group[name]; // our value comes from the the oneof group of the source\n output = target[field.oneof]; // and our output is the oneof group of the target\n output.oneofKind = group.oneofKind; // always update discriminator\n if (fieldValue == undefined) {\n delete output[name]; // remove any existing value\n continue; // skip further work on field\n }\n }\n else {\n fieldValue = input[name]; // we are using the source directly\n output = target; // we want our field value to go directly into the target\n if (fieldValue == undefined) {\n continue; // skip further work on field, existing value is used as is\n }\n }\n if (field.repeat)\n output[name].length = fieldValue.length; // resize target array to match source array\n // now we just work with `fieldValue` and `output` to merge the value\n switch (field.kind) {\n case "scalar":\n case "enum":\n if (field.repeat)\n for (let i = 0; i < fieldValue.length; i++)\n output[name][i] = fieldValue[i]; // not a reference type\n else\n output[name] = fieldValue; // not a reference type\n break;\n case "message":\n let T = field.T();\n if (field.repeat)\n for (let i = 0; i < fieldValue.length; i++)\n output[name][i] = T.create(fieldValue[i]);\n else if (output[name] === undefined)\n output[name] = T.create(fieldValue); // nothing to merge with\n else\n T.mergePartial(output[name], fieldValue);\n break;\n case "map":\n // Map and repeated fields are simply overwritten, not appended or merged\n switch (field.V.kind) {\n case "scalar":\n case "enum":\n Object.assign(output[name], fieldValue); // elements are not reference types\n break;\n case "message":\n let T = field.V.T();\n for (let k of Object.keys(fieldValue))\n output[name][k] = T.create(fieldValue[k]);\n break;\n }\n break;\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-equals.js\n\n/**\n * Determines whether two message of the same type have the same field values.\n * Checks for deep equality, traversing repeated fields, oneof groups, maps\n * and messages recursively.\n * Will also return true if both messages are `undefined`.\n */\nfunction reflectionEquals(info, a, b) {\n if (a === b)\n return true;\n if (!a || !b)\n return false;\n for (let field of info.fields) {\n let localName = field.localName;\n let val_a = field.oneof ? a[field.oneof][localName] : a[localName];\n let val_b = field.oneof ? b[field.oneof][localName] : b[localName];\n switch (field.kind) {\n case "enum":\n case "scalar":\n let t = field.kind == "enum" ? ScalarType.INT32 : field.T;\n if (!(field.repeat\n ? repeatedPrimitiveEq(t, val_a, val_b)\n : primitiveEq(t, val_a, val_b)))\n return false;\n break;\n case "map":\n if (!(field.V.kind == "message"\n ? repeatedMsgEq(field.V.T(), objectValues(val_a), objectValues(val_b))\n : repeatedPrimitiveEq(field.V.kind == "enum" ? ScalarType.INT32 : field.V.T, objectValues(val_a), objectValues(val_b))))\n return false;\n break;\n case "message":\n let T = field.T();\n if (!(field.repeat\n ? repeatedMsgEq(T, val_a, val_b)\n : T.equals(val_a, val_b)))\n return false;\n break;\n }\n }\n return true;\n}\nconst objectValues = Object.values;\nfunction primitiveEq(type, a, b) {\n if (a === b)\n return true;\n if (type !== ScalarType.BYTES)\n return false;\n let ba = a;\n let bb = b;\n if (ba.length !== bb.length)\n return false;\n for (let i = 0; i < ba.length; i++)\n if (ba[i] != bb[i])\n return false;\n return true;\n}\nfunction repeatedPrimitiveEq(type, a, b) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!primitiveEq(type, a[i], b[i]))\n return false;\n return true;\n}\nfunction repeatedMsgEq(type, a, b) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!type.equals(a[i], b[i]))\n return false;\n return true;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/message-type.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst baseDescriptors = Object.getOwnPropertyDescriptors(Object.getPrototypeOf({}));\n/**\n * This standard message type provides reflection-based\n * operations to work with a message.\n */\nclass MessageType {\n constructor(name, fields, options) {\n this.defaultCheckDepth = 16;\n this.typeName = name;\n this.fields = fields.map(normalizeFieldInfo);\n this.options = options !== null && options !== void 0 ? options : {};\n this.messagePrototype = Object.create(null, Object.assign(Object.assign({}, baseDescriptors), { [MESSAGE_TYPE]: { value: this } }));\n this.refTypeCheck = new ReflectionTypeCheck(this);\n this.refJsonReader = new ReflectionJsonReader(this);\n this.refJsonWriter = new ReflectionJsonWriter(this);\n this.refBinReader = new ReflectionBinaryReader(this);\n this.refBinWriter = new ReflectionBinaryWriter(this);\n }\n create(value) {\n let message = reflectionCreate(this);\n if (value !== undefined) {\n reflectionMergePartial(this, message, value);\n }\n return message;\n }\n /**\n * Clone the message.\n *\n * Unknown fields are discarded.\n */\n clone(message) {\n let copy = this.create();\n reflectionMergePartial(this, copy, message);\n return copy;\n }\n /**\n * Determines whether two message of the same type have the same field values.\n * Checks for deep equality, traversing repeated fields, oneof groups, maps\n * and messages recursively.\n * Will also return true if both messages are `undefined`.\n */\n equals(a, b) {\n return reflectionEquals(this, a, b);\n }\n /**\n * Is the given value assignable to our message type\n * and contains no [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?\n */\n is(arg, depth = this.defaultCheckDepth) {\n return this.refTypeCheck.is(arg, depth, false);\n }\n /**\n * Is the given value assignable to our message type,\n * regardless of [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?\n */\n isAssignable(arg, depth = this.defaultCheckDepth) {\n return this.refTypeCheck.is(arg, depth, true);\n }\n /**\n * Copy partial data into the target message.\n */\n mergePartial(target, source) {\n reflectionMergePartial(this, target, source);\n }\n /**\n * Create a new message from binary format.\n */\n fromBinary(data, options) {\n let opt = binaryReadOptions(options);\n return this.internalBinaryRead(opt.readerFactory(data), data.byteLength, opt);\n }\n /**\n * Read a new message from a JSON value.\n */\n fromJson(json, options) {\n return this.internalJsonRead(json, (0,json_format_contract/* jsonReadOptions */.bm)(options));\n }\n /**\n * Read a new message from a JSON string.\n * This is equivalent to `T.fromJson(JSON.parse(json))`.\n */\n fromJsonString(json, options) {\n let value = JSON.parse(json);\n return this.fromJson(value, options);\n }\n /**\n * Write the message to canonical JSON value.\n */\n toJson(message, options) {\n return this.internalJsonWrite(message, (0,json_format_contract/* jsonWriteOptions */.yG)(options));\n }\n /**\n * Convert the message to canonical JSON string.\n * This is equivalent to `JSON.stringify(T.toJson(t))`\n */\n toJsonString(message, options) {\n var _a;\n let value = this.toJson(message, options);\n return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0);\n }\n /**\n * Write the message to binary format.\n */\n toBinary(message, options) {\n let opt = binaryWriteOptions(options);\n return this.internalBinaryWrite(message, opt.writerFactory(), opt).finish();\n }\n /**\n * This is an internal method. If you just want to read a message from\n * JSON, use `fromJson()` or `fromJsonString()`.\n *\n * Reads JSON value and merges the fields into the target\n * according to protobuf rules. If the target is omitted,\n * a new instance is created first.\n */\n internalJsonRead(json, options, target) {\n if (json !== null && typeof json == "object" && !Array.isArray(json)) {\n let message = target !== null && target !== void 0 ? target : this.create();\n this.refJsonReader.read(json, message, options);\n return message;\n }\n throw new Error(`Unable to parse message ${this.typeName} from JSON ${typeofJsonValue(json)}.`);\n }\n /**\n * This is an internal method. If you just want to write a message\n * to JSON, use `toJson()` or `toJsonString().\n *\n * Writes JSON value and returns it.\n */\n internalJsonWrite(message, options) {\n return this.refJsonWriter.write(message, options);\n }\n /**\n * This is an internal method. If you just want to write a message\n * in binary format, use `toBinary()`.\n *\n * Serializes the message in binary format and appends it to the given\n * writer. Returns passed writer.\n */\n internalBinaryWrite(message, writer, options) {\n this.refBinWriter.write(message, writer, options);\n return writer;\n }\n /**\n * This is an internal method. If you just want to read a message from\n * binary data, use `fromBinary()`.\n *\n * Reads data from binary format and merges the fields into\n * the target according to protobuf rules. If the target is\n * omitted, a new instance is created first.\n */\n internalBinaryRead(reader, length, options, target) {\n let message = target !== null && target !== void 0 ? target : this.create();\n this.refBinReader.read(reader, message, options, length);\n return message;\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/reflection-contains-message-type.js\n\n/**\n * Check if the provided object is a proto message.\n *\n * Note that this is an experimental feature - it is here to stay, but\n * implementation details may change without notice.\n */\nfunction containsMessageType(msg) {\n return msg[MESSAGE_TYPE] != null;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/enum-object.js\n/**\n * Is this a lookup object generated by Typescript, for a Typescript enum\n * generated by protobuf-ts?\n *\n * - No `const enum` (enum must not be inlined, we need reverse mapping).\n * - No string enum (we need int32 for protobuf).\n * - Must have a value for 0 (otherwise, we would need to support custom default values).\n */\nfunction isEnumObject(arg) {\n if (typeof arg != \'object\' || arg === null) {\n return false;\n }\n if (!arg.hasOwnProperty(0)) {\n return false;\n }\n for (let k of Object.keys(arg)) {\n let num = parseInt(k);\n if (!Number.isNaN(num)) {\n // is there a name for the number?\n let nam = arg[num];\n if (nam === undefined)\n return false;\n // does the name resolve back to the number?\n if (arg[nam] !== num)\n return false;\n }\n else {\n // is there a number for the name?\n let num = arg[k];\n if (num === undefined)\n return false;\n // is it a string enum?\n if (typeof num !== \'number\')\n return false;\n // do we know the number?\n if (arg[num] === undefined)\n return false;\n }\n }\n return true;\n}\n/**\n * Lists all values of a Typescript enum, as an array of objects with a "name"\n * property and a "number" property.\n *\n * Note that it is possible that a number appears more than once, because it is\n * possible to have aliases in an enum.\n *\n * Throws if the enum does not adhere to the rules of enums generated by\n * protobuf-ts. See `isEnumObject()`.\n */\nfunction listEnumValues(enumObject) {\n if (!isEnumObject(enumObject))\n throw new Error("not a typescript enum object");\n let values = [];\n for (let [name, number] of Object.entries(enumObject))\n if (typeof number == "number")\n values.push({ name, number });\n return values;\n}\n/**\n * Lists the names of a Typescript enum.\n *\n * Throws if the enum does not adhere to the rules of enums generated by\n * protobuf-ts. See `isEnumObject()`.\n */\nfunction listEnumNames(enumObject) {\n return listEnumValues(enumObject).map(val => val.name);\n}\n/**\n * Lists the numbers of a Typescript enum.\n *\n * Throws if the enum does not adhere to the rules of enums generated by\n * protobuf-ts. See `isEnumObject()`.\n */\nfunction listEnumNumbers(enumObject) {\n return listEnumValues(enumObject)\n .map(val => val.number)\n .filter((num, index, arr) => arr.indexOf(num) == index);\n}\n\n;// CONCATENATED MODULE: ./node_modules/@protobuf-ts/runtime/build/es2015/index.js\n// Public API of the protobuf-ts runtime.\n// Note: we do not use `export * from ...` to help tree shakers,\n// webpack verbose output hints that this should be useful\n// Convenience JSON typings and corresponding type guards\n\n// Base 64 encoding\n\n// UTF8 encoding\n\n// Binary format contracts, options for reading and writing, for example\n\n// Standard IBinaryReader implementation\n\n// Standard IBinaryWriter implementation\n\n// Int64 and UInt64 implementations required for the binary format\n\n// JSON format contracts, options for reading and writing, for example\n\n// Message type contract\n\n// Message type implementation via reflection\n\n// Reflection info, generated by the plugin, exposed to the user, used by reflection ops\n\n// Message operations via reflection\n\n\n\n\n\n\n\n\n\n\n// Oneof helpers\n\n// Enum object type guard and reflection util, may be interesting to the user.\n\n// lowerCamelCase() is exported for plugin, rpc-runtime and other rpc packages\n\n// assertion functions are exported for plugin, may also be useful to user\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsc0NBQXNDO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4UStEO0FBQy9EO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEd5RDtBQUNsQjtBQUN2QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTs7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQytEO0FBQy9EO0FBQ3NEO0FBQ3REO0FBQzZDO0FBQzdDO0FBQzhGO0FBQzlGO0FBQ2tFO0FBQ2xFO0FBQ21FO0FBQ25FO0FBQzRDO0FBQzVDO0FBQzZGO0FBQzdGO0FBQ3VEO0FBQ3ZEO0FBQzZDO0FBQzdDO0FBQytJO0FBQy9JO0FBQzhEO0FBQ1A7QUFDZTtBQUNGO0FBQ2I7QUFDYTtBQUNBO0FBQ0o7QUFDQTtBQUNTO0FBQ3pFO0FBQzZHO0FBQzdHO0FBQzZGO0FBQzdGO0FBQ29EO0FBQ3BEO0FBQ3lGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvanNvbi10eXBpbmdzLmpzPzJiZGIiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvYmFzZTY0LmpzP2E2ZTUiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcHJvdG9idWZqcy11dGY4LmpzPzAwNWQiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvZ29vZy12YXJpbnQuanM/MjM0NSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9wYi1sb25nLmpzP2M4YjkiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvYmluYXJ5LXJlYWRlci5qcz81NDYwIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2JpbmFyeS13cml0ZXIuanM/NGQxNCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9tZXNzYWdlLXR5cGUtY29udHJhY3QuanM/NGNkZCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWluZm8uanM/NWM4ZSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9vbmVvZi5qcz83YTNiIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tdHlwZS1jaGVjay5qcz9jOThkIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0LmpzPzNmNDEiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1qc29uLXJlYWRlci5qcz8zMWZhIiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tanNvbi13cml0ZXIuanM/NmRiOCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0LmpzP2RhZGMiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1iaW5hcnktcmVhZGVyLmpzPzVhMGUiLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1iaW5hcnktd3JpdGVyLmpzPzVmNTciLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1jcmVhdGUuanM/NTgxNSIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLW1lcmdlLXBhcnRpYWwuanM/OWU4ZCIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWVxdWFscy5qcz9jZDc1Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L21lc3NhZ2UtdHlwZS5qcz9jODE5Iiwid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tY29udGFpbnMtbWVzc2FnZS10eXBlLmpzP2Y4NDciLCJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvZW51bS1vYmplY3QuanM/NDI4MiIsIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9pbmRleC5qcz8zY2ZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2V0IHRoZSB0eXBlIG9mIGEgSlNPTiB2YWx1ZS5cbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhcnJheSwgbnVsbCBhbmQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZW9mSnNvblZhbHVlKHZhbHVlKSB7XG4gICAgbGV0IHQgPSB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIHJldHVybiB0O1xufVxuLyoqXG4gKiBJcyB0aGlzIGEgSlNPTiBvYmplY3QgKGluc3RlYWQgb2YgYW4gYXJyYXkgb3IgbnVsbCk/XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuIiwiLy8gbG9va3VwIHRhYmxlIGZyb20gYmFzZTY0IGNoYXJhY3RlciB0byBieXRlXG5sZXQgZW5jVGFibGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuLy8gbG9va3VwIHRhYmxlIGZyb20gYmFzZTY0IGNoYXJhY3RlciAqY29kZSogdG8gYnl0ZSBiZWNhdXNlIGxvb2t1cCBieSBudW1iZXIgaXMgZmFzdFxubGV0IGRlY1RhYmxlID0gW107XG5mb3IgKGxldCBpID0gMDsgaSA8IGVuY1RhYmxlLmxlbmd0aDsgaSsrKVxuICAgIGRlY1RhYmxlW2VuY1RhYmxlW2ldLmNoYXJDb2RlQXQoMCldID0gaTtcbi8vIHN1cHBvcnQgYmFzZTY0dXJsIHZhcmlhbnRzXG5kZWNUYWJsZVtcIi1cIi5jaGFyQ29kZUF0KDApXSA9IGVuY1RhYmxlLmluZGV4T2YoXCIrXCIpO1xuZGVjVGFibGVbXCJfXCIuY2hhckNvZGVBdCgwKV0gPSBlbmNUYWJsZS5pbmRleE9mKFwiL1wiKTtcbi8qKlxuICogRGVjb2RlcyBhIGJhc2U2NCBzdHJpbmcgdG8gYSBieXRlIGFycmF5LlxuICpcbiAqIC0gaWdub3JlcyB3aGl0ZS1zcGFjZSwgaW5jbHVkaW5nIGxpbmUgYnJlYWtzIGFuZCB0YWJzXG4gKiAtIGFsbG93cyBpbm5lciBwYWRkaW5nIChjYW4gZGVjb2RlIGNvbmNhdGVuYXRlZCBiYXNlNjQgc3RyaW5ncylcbiAqIC0gZG9lcyBub3QgcmVxdWlyZSBwYWRkaW5nXG4gKiAtIHVuZGVyc3RhbmRzIGJhc2U2NHVybCBlbmNvZGluZzpcbiAqICAgXCItXCIgaW5zdGVhZCBvZiBcIitcIixcbiAqICAgXCJfXCIgaW5zdGVhZCBvZiBcIi9cIixcbiAqICAgbm8gcGFkZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0ZGVjb2RlKGJhc2U2NFN0cikge1xuICAgIC8vIGVzdGltYXRlIGJ5dGUgc2l6ZSwgbm90IGFjY291bnRpbmcgZm9yIGlubmVyIHBhZGRpbmcgYW5kIHdoaXRlc3BhY2VcbiAgICBsZXQgZXMgPSBiYXNlNjRTdHIubGVuZ3RoICogMyAvIDQ7XG4gICAgLy8gaWYgKGVzICUgMyAhPT0gMClcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICAgIGlmIChiYXNlNjRTdHJbYmFzZTY0U3RyLmxlbmd0aCAtIDJdID09ICc9JylcbiAgICAgICAgZXMgLT0gMjtcbiAgICBlbHNlIGlmIChiYXNlNjRTdHJbYmFzZTY0U3RyLmxlbmd0aCAtIDFdID09ICc9JylcbiAgICAgICAgZXMgLT0gMTtcbiAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShlcyksIGJ5dGVQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBieXRlIGFycmF5XG4gICAgZ3JvdXBQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBiYXNlNjQgZ3JvdXBcbiAgICBiLCAvLyBjdXJyZW50IGJ5dGVcbiAgICBwID0gMCAvLyBwcmV2aW91cyBieXRlXG4gICAgO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZTY0U3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGIgPSBkZWNUYWJsZVtiYXNlNjRTdHIuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgICAgIHN3aXRjaCAoYmFzZTY0U3RyW2ldKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMDsgLy8gcmVzZXQgc3RhdGUgd2hlbiBwYWRkaW5nIGZvdW5kXG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHdoaXRlLXNwYWNlLCBhbmQgcGFkZGluZ1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGJhc2U2NCBzdHJpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChncm91cFBvcykge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHAgPSBiO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBieXRlc1tieXRlUG9zKytdID0gcCA8PCAyIHwgKGIgJiA0OCkgPj4gNDtcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IChwICYgMTUpIDw8IDQgfCAoYiAmIDYwKSA+PiAyO1xuICAgICAgICAgICAgICAgIHAgPSBiO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBieXRlc1tieXRlUG9zKytdID0gKHAgJiAzKSA8PCA2IHwgYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGdyb3VwUG9zID09IDEpXG4gICAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGJhc2U2NCBzdHJpbmcuYCk7XG4gICAgcmV0dXJuIGJ5dGVzLnN1YmFycmF5KDAsIGJ5dGVQb3MpO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSB0byBhIGJhc2U2NCBzdHJpbmcuXG4gKiBBZGRzIHBhZGRpbmcgYXQgdGhlIGVuZC5cbiAqIERvZXMgbm90IGluc2VydCBuZXdsaW5lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NGVuY29kZShieXRlcykge1xuICAgIGxldCBiYXNlNjQgPSAnJywgZ3JvdXBQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBiYXNlNjQgZ3JvdXBcbiAgICBiLCAvLyBjdXJyZW50IGJ5dGVcbiAgICBwID0gMDsgLy8gY2Fycnkgb3ZlciBmcm9tIHByZXZpb3VzIGJ5dGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGIgPSBieXRlc1tpXTtcbiAgICAgICAgc3dpdGNoIChncm91cFBvcykge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtiID4+IDJdO1xuICAgICAgICAgICAgICAgIHAgPSAoYiAmIDMpIDw8IDQ7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtwIHwgYiA+PiA0XTtcbiAgICAgICAgICAgICAgICBwID0gKGIgJiAxNSkgPDwgMjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgYmFzZTY0ICs9IGVuY1RhYmxlW3AgfCBiID4+IDZdO1xuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtiICYgNjNdO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwYWRkaW5nIHJlcXVpcmVkP1xuICAgIGlmIChncm91cFBvcykge1xuICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbcF07XG4gICAgICAgIGJhc2U2NCArPSAnPSc7XG4gICAgICAgIGlmIChncm91cFBvcyA9PSAxKVxuICAgICAgICAgICAgYmFzZTY0ICs9ICc9JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxNiwgRGFuaWVsIFdpcnR6ICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuLy8gbWV0OlxuLy9cbi8vICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy8gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4vLyAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4vLyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgaXRzIGF1dGhvciwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4vLyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuLy8gICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4vLyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Jcbi8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbi8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5jb25zdCBmcm9tQ2hhckNvZGVzID0gKGNodW5rKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY2h1bmspO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGJlIGV4cG9ydGVkIHdpdGggdGhlIG5leHQgbWFqb3JcbiAqIHJlbGVhc2UsIHNpbmNlIHByb3RvYnVmLXRzIGhhcyBzd2l0Y2ggdG8gVGV4dERlY29kZXIgQVBJLiBJZiB5b3UgbmVlZCB0aGlzXG4gKiBmdW5jdGlvbiwgcGxlYXNlIG1pZ3JhdGUgdG8gQHByb3RvYnVmanMvdXRmOC4gRm9yIGNvbnRleHQsIHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3RpbW9zdGFtbS9wcm90b2J1Zi10cy9pc3N1ZXMvMTg0XG4gKlxuICogUmVhZHMgVVRGOCBieXRlcyBhcyBhIHN0cmluZy5cbiAqXG4gKiBTZWUgW3Byb3RvYnVmanMgLyB1dGY4XShodHRwczovL2dpdGh1Yi5jb20vcHJvdG9idWZqcy9wcm90b2J1Zi5qcy9ibG9iLzk4OTNlMzViODU0NjIxY2NlNjRhZjRiZjZiZTJjZmY0ZmI4OTI3OTYvbGliL3V0ZjgvaW5kZXguanMjTDQwKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgRGFuaWVsIFdpcnR6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dGY4cmVhZChieXRlcykge1xuICAgIGlmIChieXRlcy5sZW5ndGggPCAxKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICBsZXQgcG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYnl0ZXNcbiAgICBwYXJ0cyA9IFtdLCBjaHVuayA9IFtdLCBpID0gMCwgLy8gY2hhciBvZmZzZXRcbiAgICB0OyAvLyB0ZW1wb3JhcnlcbiAgICBsZXQgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICAgICAgdCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgICAgaWYgKHQgPCAxMjgpXG4gICAgICAgICAgICBjaHVua1tpKytdID0gdDtcbiAgICAgICAgZWxzZSBpZiAodCA+IDE5MSAmJiB0IDwgMjI0KVxuICAgICAgICAgICAgY2h1bmtbaSsrXSA9ICh0ICYgMzEpIDw8IDYgfCBieXRlc1twb3MrK10gJiA2MztcbiAgICAgICAgZWxzZSBpZiAodCA+IDIzOSAmJiB0IDwgMzY1KSB7XG4gICAgICAgICAgICB0ID0gKCh0ICYgNykgPDwgMTggfCAoYnl0ZXNbcG9zKytdICYgNjMpIDw8IDEyIHwgKGJ5dGVzW3BvcysrXSAmIDYzKSA8PCA2IHwgYnl0ZXNbcG9zKytdICYgNjMpIC0gMHgxMDAwMDtcbiAgICAgICAgICAgIGNodW5rW2krK10gPSAweEQ4MDAgKyAodCA+PiAxMCk7XG4gICAgICAgICAgICBjaHVua1tpKytdID0gMHhEQzAwICsgKHQgJiAxMDIzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjaHVua1tpKytdID0gKHQgJiAxNSkgPDwgMTIgfCAoYnl0ZXNbcG9zKytdICYgNjMpIDw8IDYgfCBieXRlc1twb3MrK10gJiA2MztcbiAgICAgICAgaWYgKGkgPiA4MTkxKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGZyb21DaGFyQ29kZXMoY2h1bmspKTtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGkpXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGZyb21DaGFyQ29kZXMoY2h1bmsuc2xpY2UoMCwgaSkpKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIik7XG4gICAgfVxuICAgIHJldHVybiBmcm9tQ2hhckNvZGVzKGNodW5rLnNsaWNlKDAsIGkpKTtcbn1cbiIsIi8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuLy8gbWV0OlxuLy9cbi8vICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbi8vICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuLy8gZGlzdHJpYnV0aW9uLlxuLy8gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4vLyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Jcbi8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbi8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4vL1xuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIFByb3RvY29sIEJ1ZmZlciBjb21waWxlciBpcyBvd25lZCBieSB0aGUgb3duZXJcbi8vIG9mIHRoZSBpbnB1dCBmaWxlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGl0LiAgVGhpcyBjb2RlIGlzIG5vdFxuLy8gc3RhbmRhbG9uZSBhbmQgcmVxdWlyZXMgYSBzdXBwb3J0IGxpYnJhcnkgdG8gYmUgbGlua2VkIHdpdGggaXQuICBUaGlzXG4vLyBzdXBwb3J0IGxpYnJhcnkgaXMgaXRzZWxmIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGxpY2Vuc2UuXG4vKipcbiAqIFJlYWQgYSA2NCBiaXQgdmFyaW50IGFzIHR3byBKUyBudW1iZXJzLlxuICpcbiAqIFJldHVybnMgdHVwbGU6XG4gKiBbMF06IGxvdyBiaXRzXG4gKiBbMF06IGhpZ2ggYml0c1xuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvOGE3MTkyN2Q3NGE0Y2UzNGVmZTJkODc2OWZkYTE5OGY1MmQyMGQxMi9qcy9leHBlcmltZW50YWwvcnVudGltZS9rZXJuZWwvYnVmZmVyX2RlY29kZXIuanMjTDE3NVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaW50NjRyZWFkKCkge1xuICAgIGxldCBsb3dCaXRzID0gMDtcbiAgICBsZXQgaGlnaEJpdHMgPSAwO1xuICAgIGZvciAobGV0IHNoaWZ0ID0gMDsgc2hpZnQgPCAyODsgc2hpZnQgKz0gNykge1xuICAgICAgICBsZXQgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgICAgICBsb3dCaXRzIHw9IChiICYgMHg3RikgPDwgc2hpZnQ7XG4gICAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgICAgICByZXR1cm4gW2xvd0JpdHMsIGhpZ2hCaXRzXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgbWlkZGxlQnl0ZSA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIC8vIGxhc3QgZm91ciBiaXRzIG9mIHRoZSBmaXJzdCAzMiBiaXQgbnVtYmVyXG4gICAgbG93Qml0cyB8PSAobWlkZGxlQnl0ZSAmIDB4MEYpIDw8IDI4O1xuICAgIC8vIDMgdXBwZXIgYml0cyBhcmUgcGFydCBvZiB0aGUgbmV4dCAzMiBiaXQgbnVtYmVyXG4gICAgaGlnaEJpdHMgPSAobWlkZGxlQnl0ZSAmIDB4NzApID4+IDQ7XG4gICAgaWYgKChtaWRkbGVCeXRlICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gW2xvd0JpdHMsIGhpZ2hCaXRzXTtcbiAgICB9XG4gICAgZm9yIChsZXQgc2hpZnQgPSAzOyBzaGlmdCA8PSAzMTsgc2hpZnQgKz0gNykge1xuICAgICAgICBsZXQgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgICAgICBoaWdoQml0cyB8PSAoYiAmIDB4N0YpIDw8IHNoaWZ0O1xuICAgICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICAgICAgcmV0dXJuIFtsb3dCaXRzLCBoaWdoQml0c107XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhcmludCcpO1xufVxuLyoqXG4gKiBXcml0ZSBhIDY0IGJpdCB2YXJpbnQsIGdpdmVuIGFzIHR3byBKUyBudW1iZXJzLCB0byB0aGUgZ2l2ZW4gYnl0ZXMgYXJyYXkuXG4gKlxuICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi84YTcxOTI3ZDc0YTRjZTM0ZWZlMmQ4NzY5ZmRhMTk4ZjUyZDIwZDEyL2pzL2V4cGVyaW1lbnRhbC9ydW50aW1lL2tlcm5lbC93cml0ZXIuanMjTDM0NFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaW50NjR3cml0ZShsbywgaGksIGJ5dGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyODsgaSA9IGkgKyA3KSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gbG8gPj4+IGk7XG4gICAgICAgIGNvbnN0IGhhc05leHQgPSAhKChzaGlmdCA+Pj4gNykgPT0gMCAmJiBoaSA9PSAwKTtcbiAgICAgICAgY29uc3QgYnl0ZSA9IChoYXNOZXh0ID8gc2hpZnQgfCAweDgwIDogc2hpZnQpICYgMHhGRjtcbiAgICAgICAgYnl0ZXMucHVzaChieXRlKTtcbiAgICAgICAgaWYgKCFoYXNOZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3BsaXRCaXRzID0gKChsbyA+Pj4gMjgpICYgMHgwRikgfCAoKGhpICYgMHgwNykgPDwgNCk7XG4gICAgY29uc3QgaGFzTW9yZUJpdHMgPSAhKChoaSA+PiAzKSA9PSAwKTtcbiAgICBieXRlcy5wdXNoKChoYXNNb3JlQml0cyA/IHNwbGl0Qml0cyB8IDB4ODAgOiBzcGxpdEJpdHMpICYgMHhGRik7XG4gICAgaWYgKCFoYXNNb3JlQml0cykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgMzE7IGkgPSBpICsgNykge1xuICAgICAgICBjb25zdCBzaGlmdCA9IGhpID4+PiBpO1xuICAgICAgICBjb25zdCBoYXNOZXh0ID0gISgoc2hpZnQgPj4+IDcpID09IDApO1xuICAgICAgICBjb25zdCBieXRlID0gKGhhc05leHQgPyBzaGlmdCB8IDB4ODAgOiBzaGlmdCkgJiAweEZGO1xuICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICBpZiAoIWhhc05leHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBieXRlcy5wdXNoKChoaSA+Pj4gMzEpICYgMHgwMSk7XG59XG4vLyBjb25zdGFudHMgZm9yIGJpbmFyeSBtYXRoXG5jb25zdCBUV09fUFdSXzMyX0RCTCA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KTtcbi8qKlxuICogUGFyc2UgZGVjaW1hbCBzdHJpbmcgb2YgNjQgYml0IGludGVnZXIgdmFsdWUgYXMgdHdvIEpTIG51bWJlcnMuXG4gKlxuICogUmV0dXJucyB0dXBsZTpcbiAqIFswXTogbWludXMgc2lnbj9cbiAqIFsxXTogbG93IGJpdHNcbiAqIFsyXTogaGlnaCBiaXRzXG4gKlxuICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludDY0ZnJvbVN0cmluZyhkZWMpIHtcbiAgICAvLyBDaGVjayBmb3IgbWludXMgc2lnbi5cbiAgICBsZXQgbWludXMgPSBkZWNbMF0gPT0gJy0nO1xuICAgIGlmIChtaW51cylcbiAgICAgICAgZGVjID0gZGVjLnNsaWNlKDEpO1xuICAgIC8vIFdvcmsgNiBkZWNpbWFsIGRpZ2l0cyBhdCBhIHRpbWUsIGFjdGluZyBsaWtlIHdlJ3JlIGNvbnZlcnRpbmcgYmFzZSAxZTZcbiAgICAvLyBkaWdpdHMgdG8gYmluYXJ5LiBUaGlzIGlzIHNhZmUgdG8gZG8gd2l0aCBmbG9hdGluZyBwb2ludCBtYXRoIGJlY2F1c2VcbiAgICAvLyBOdW1iZXIuaXNTYWZlSW50ZWdlcihBTExfMzJfQklUUyAqIDFlNikgPT0gdHJ1ZS5cbiAgICBjb25zdCBiYXNlID0gMWU2O1xuICAgIGxldCBsb3dCaXRzID0gMDtcbiAgICBsZXQgaGlnaEJpdHMgPSAwO1xuICAgIGZ1bmN0aW9uIGFkZDFlNmRpZ2l0KGJlZ2luLCBlbmQpIHtcbiAgICAgICAgLy8gTm90ZTogTnVtYmVyKCcnKSBpcyAwLlxuICAgICAgICBjb25zdCBkaWdpdDFlNiA9IE51bWJlcihkZWMuc2xpY2UoYmVnaW4sIGVuZCkpO1xuICAgICAgICBoaWdoQml0cyAqPSBiYXNlO1xuICAgICAgICBsb3dCaXRzID0gbG93Qml0cyAqIGJhc2UgKyBkaWdpdDFlNjtcbiAgICAgICAgLy8gQ2FycnkgYml0cyBmcm9tIGxvd0JpdHMgdG8gaGlnaEJpdHNcbiAgICAgICAgaWYgKGxvd0JpdHMgPj0gVFdPX1BXUl8zMl9EQkwpIHtcbiAgICAgICAgICAgIGhpZ2hCaXRzID0gaGlnaEJpdHMgKyAoKGxvd0JpdHMgLyBUV09fUFdSXzMyX0RCTCkgfCAwKTtcbiAgICAgICAgICAgIGxvd0JpdHMgPSBsb3dCaXRzICUgVFdPX1BXUl8zMl9EQkw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkMWU2ZGlnaXQoLTI0LCAtMTgpO1xuICAgIGFkZDFlNmRpZ2l0KC0xOCwgLTEyKTtcbiAgICBhZGQxZTZkaWdpdCgtMTIsIC02KTtcbiAgICBhZGQxZTZkaWdpdCgtNik7XG4gICAgcmV0dXJuIFttaW51cywgbG93Qml0cywgaGlnaEJpdHNdO1xufVxuLyoqXG4gKiBGb3JtYXQgNjQgYml0IGludGVnZXIgdmFsdWUgKGFzIHR3byBKUyBudW1iZXJzKSB0byBkZWNpbWFsIHN0cmluZy5cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50NjR0b1N0cmluZyhiaXRzTG93LCBiaXRzSGlnaCkge1xuICAgIC8vIFNraXAgdGhlIGV4cGVuc2l2ZSBjb252ZXJzaW9uIGlmIHRoZSBudW1iZXIgaXMgc21hbGwgZW5vdWdoIHRvIHVzZSB0aGVcbiAgICAvLyBidWlsdC1pbiBjb252ZXJzaW9ucy5cbiAgICBpZiAoKGJpdHNIaWdoID4+PiAwKSA8PSAweDFGRkZGRikge1xuICAgICAgICByZXR1cm4gJycgKyAoVFdPX1BXUl8zMl9EQkwgKiBiaXRzSGlnaCArIChiaXRzTG93ID4+PiAwKSk7XG4gICAgfVxuICAgIC8vIFdoYXQgdGhpcyBjb2RlIGlzIGRvaW5nIGlzIGVzc2VudGlhbGx5IGNvbnZlcnRpbmcgdGhlIGlucHV0IG51bWJlciBmcm9tXG4gICAgLy8gYmFzZS0yIHRvIGJhc2UtMWU3LCB3aGljaCBhbGxvd3MgdXMgdG8gcmVwcmVzZW50IHRoZSA2NC1iaXQgcmFuZ2Ugd2l0aFxuICAgIC8vIG9ubHkgMyAodmVyeSBsYXJnZSkgZGlnaXRzLiBUaG9zZSBkaWdpdHMgYXJlIHRoZW4gdHJpdmlhbCB0byBjb252ZXJ0IHRvXG4gICAgLy8gYSBiYXNlLTEwIHN0cmluZy5cbiAgICAvLyBUaGUgbWFnaWMgbnVtYmVycyB1c2VkIGhlcmUgYXJlIC1cbiAgICAvLyAyXjI0ID0gMTY3NzcyMTYgPSAoMSw2Nzc3MjE2KSBpbiBiYXNlLTFlNy5cbiAgICAvLyAyXjQ4ID0gMjgxNDc0OTc2NzEwNjU2ID0gKDIsODE0NzQ5Nyw2NzEwNjU2KSBpbiBiYXNlLTFlNy5cbiAgICAvLyBTcGxpdCAzMjozMiByZXByZXNlbnRhdGlvbiBpbnRvIDE2OjI0OjI0IHJlcHJlc2VudGF0aW9uIHNvIG91clxuICAgIC8vIGludGVybWVkaWF0ZSBkaWdpdHMgZG9uJ3Qgb3ZlcmZsb3cuXG4gICAgbGV0IGxvdyA9IGJpdHNMb3cgJiAweEZGRkZGRjtcbiAgICBsZXQgbWlkID0gKCgoYml0c0xvdyA+Pj4gMjQpIHwgKGJpdHNIaWdoIDw8IDgpKSA+Pj4gMCkgJiAweEZGRkZGRjtcbiAgICBsZXQgaGlnaCA9IChiaXRzSGlnaCA+PiAxNikgJiAweEZGRkY7XG4gICAgLy8gQXNzZW1ibGUgb3VyIHRocmVlIGJhc2UtMWU3IGRpZ2l0cywgaWdub3JpbmcgY2Fycmllcy4gVGhlIG1heGltdW1cbiAgICAvLyB2YWx1ZSBpbiBhIGRpZ2l0IGF0IHRoaXMgc3RlcCBpcyByZXByZXNlbnRhYmxlIGFzIGEgNDgtYml0IGludGVnZXIsIHdoaWNoXG4gICAgLy8gY2FuIGJlIHN0b3JlZCBpbiBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgbGV0IGRpZ2l0QSA9IGxvdyArIChtaWQgKiA2Nzc3MjE2KSArIChoaWdoICogNjcxMDY1Nik7XG4gICAgbGV0IGRpZ2l0QiA9IG1pZCArIChoaWdoICogODE0NzQ5Nyk7XG4gICAgbGV0IGRpZ2l0QyA9IChoaWdoICogMik7XG4gICAgLy8gQXBwbHkgY2FycmllcyBmcm9tIEEgdG8gQiBhbmQgZnJvbSBCIHRvIEMuXG4gICAgbGV0IGJhc2UgPSAxMDAwMDAwMDtcbiAgICBpZiAoZGlnaXRBID49IGJhc2UpIHtcbiAgICAgICAgZGlnaXRCICs9IE1hdGguZmxvb3IoZGlnaXRBIC8gYmFzZSk7XG4gICAgICAgIGRpZ2l0QSAlPSBiYXNlO1xuICAgIH1cbiAgICBpZiAoZGlnaXRCID49IGJhc2UpIHtcbiAgICAgICAgZGlnaXRDICs9IE1hdGguZmxvb3IoZGlnaXRCIC8gYmFzZSk7XG4gICAgICAgIGRpZ2l0QiAlPSBiYXNlO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IGJhc2UtMWU3IGRpZ2l0cyB0byBiYXNlLTEwLCB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgemVyb2VzLlxuICAgIGZ1bmN0aW9uIGRlY2ltYWxGcm9tMWU3KGRpZ2l0MWU3LCBuZWVkTGVhZGluZ1plcm9zKSB7XG4gICAgICAgIGxldCBwYXJ0aWFsID0gZGlnaXQxZTcgPyBTdHJpbmcoZGlnaXQxZTcpIDogJyc7XG4gICAgICAgIGlmIChuZWVkTGVhZGluZ1plcm9zKSB7XG4gICAgICAgICAgICByZXR1cm4gJzAwMDAwMDAnLnNsaWNlKHBhcnRpYWwubGVuZ3RoKSArIHBhcnRpYWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRpYWw7XG4gICAgfVxuICAgIHJldHVybiBkZWNpbWFsRnJvbTFlNyhkaWdpdEMsIC8qbmVlZExlYWRpbmdaZXJvcz0qLyAwKSArXG4gICAgICAgIGRlY2ltYWxGcm9tMWU3KGRpZ2l0QiwgLypuZWVkTGVhZGluZ1plcm9zPSovIGRpZ2l0QykgK1xuICAgICAgICAvLyBJZiB0aGUgZmluYWwgMWU3IGRpZ2l0IGRpZG4ndCBuZWVkIGxlYWRpbmcgemVyb3MsIHdlIHdvdWxkIGhhdmVcbiAgICAgICAgLy8gcmV0dXJuZWQgdmlhIHRoZSB0cml2aWFsIGNvZGUgcGF0aCBhdCB0aGUgdG9wLlxuICAgICAgICBkZWNpbWFsRnJvbTFlNyhkaWdpdEEsIC8qbmVlZExlYWRpbmdaZXJvcz0qLyAxKTtcbn1cbi8qKlxuICogV3JpdGUgYSAzMiBiaXQgdmFyaW50LCBzaWduZWQgb3IgdW5zaWduZWQuIFNhbWUgYXMgYHZhcmludDY0d3JpdGUoMCwgdmFsdWUsIGJ5dGVzKWBcbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iLzFiMTg4MzNmNGYyYTJmNjgxZjRlNGEyNWNkZjNiMGE0MzExNWVjMjYvanMvYmluYXJ5L2VuY29kZXIuanMjTDE0NFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaW50MzJ3cml0ZSh2YWx1ZSwgYnl0ZXMpIHtcbiAgICBpZiAodmFsdWUgPj0gMCkge1xuICAgICAgICAvLyB3cml0ZSB2YWx1ZSBhcyB2YXJpbnQgMzJcbiAgICAgICAgd2hpbGUgKHZhbHVlID4gMHg3Zikge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCgodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA+Pj4gNztcbiAgICAgICAgfVxuICAgICAgICBieXRlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgOTsgaSsrKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKHZhbHVlICYgMTI3IHwgMTI4KTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4gNztcbiAgICAgICAgfVxuICAgICAgICBieXRlcy5wdXNoKDEpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCBhbiB1bnNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvOGE3MTkyN2Q3NGE0Y2UzNGVmZTJkODc2OWZkYTE5OGY1MmQyMGQxMi9qcy9leHBlcmltZW50YWwvcnVudGltZS9rZXJuZWwvYnVmZmVyX2RlY29kZXIuanMjTDIyMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaW50MzJyZWFkKCkge1xuICAgIGxldCBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgbGV0IHJlc3VsdCA9IGIgJiAweDdGO1xuICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8IDc7XG4gICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgMTQ7XG4gICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgMjE7XG4gICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBFeHRyYWN0IG9ubHkgbGFzdCA0IGJpdHNcbiAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgcmVzdWx0IHw9IChiICYgMHgwRikgPDwgMjg7XG4gICAgZm9yIChsZXQgcmVhZEJ5dGVzID0gNTsgKChiICYgMHg4MCkgIT09IDApICYmIHJlYWRCeXRlcyA8IDEwOyByZWFkQnl0ZXMrKylcbiAgICAgICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIGlmICgoYiAmIDB4ODApICE9IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YXJpbnQnKTtcbiAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgIC8vIFJlc3VsdCBjYW4gaGF2ZSAzMiBiaXRzLCBjb252ZXJ0IGl0IHRvIHVuc2lnbmVkXG4gICAgcmV0dXJuIHJlc3VsdCA+Pj4gMDtcbn1cbiIsImltcG9ydCB7IGludDY0ZnJvbVN0cmluZywgaW50NjR0b1N0cmluZyB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5sZXQgQkk7XG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0QmkoKSB7XG4gICAgY29uc3QgZHYgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDgpKTtcbiAgICBjb25zdCBvayA9IGdsb2JhbFRoaXMuQmlnSW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdHlwZW9mIGR2LmdldEJpZ0ludDY0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgJiYgdHlwZW9mIGR2LmdldEJpZ1VpbnQ2NCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICYmIHR5cGVvZiBkdi5zZXRCaWdJbnQ2NCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICYmIHR5cGVvZiBkdi5zZXRCaWdVaW50NjQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBCSSA9IG9rID8ge1xuICAgICAgICBNSU46IEJpZ0ludChcIi05MjIzMzcyMDM2ODU0Nzc1ODA4XCIpLFxuICAgICAgICBNQVg6IEJpZ0ludChcIjkyMjMzNzIwMzY4NTQ3NzU4MDdcIiksXG4gICAgICAgIFVNSU46IEJpZ0ludChcIjBcIiksXG4gICAgICAgIFVNQVg6IEJpZ0ludChcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIpLFxuICAgICAgICBDOiBCaWdJbnQsXG4gICAgICAgIFY6IGR2LFxuICAgIH0gOiB1bmRlZmluZWQ7XG59XG5kZXRlY3RCaSgpO1xuZnVuY3Rpb24gYXNzZXJ0QmkoYmkpIHtcbiAgICBpZiAoIWJpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgdW5hdmFpbGFibGUsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGltb3N0YW1tL3Byb3RvYnVmLXRzL2Jsb2IvdjEuMC44L01BTlVBTC5tZCNiaWdpbnQtc3VwcG9ydFwiKTtcbn1cbi8vIHVzZWQgdG8gdmFsaWRhdGUgZnJvbShzdHJpbmcpIGlucHV0ICh3aGVuIGJpZ2ludCBpcyB1bmF2YWlsYWJsZSlcbmNvbnN0IFJFX0RFQ0lNQUxfU1RSID0gL14tP1swLTldKyQvO1xuLy8gY29uc3RhbnRzIGZvciBiaW5hcnkgbWF0aFxuY29uc3QgVFdPX1BXUl8zMl9EQkwgPSAweDEwMDAwMDAwMDtcbmNvbnN0IEhBTEZfMl9QV1JfMzIgPSAweDA4MDAwMDAwMDtcbi8vIGJhc2UgY2xhc3MgZm9yIFBiTG9uZyBhbmQgUGJVTG9uZyBwcm92aWRlcyBzaGFyZWQgY29kZVxuY2xhc3MgU2hhcmVkUGJMb25nIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gYml0cy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihsbywgaGkpIHtcbiAgICAgICAgdGhpcy5sbyA9IGxvIHwgMDtcbiAgICAgICAgdGhpcy5oaSA9IGhpIHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhpcyBpbnN0YW5jZSBlcXVhbCB0byAwP1xuICAgICAqL1xuICAgIGlzWmVybygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG8gPT0gMCAmJiB0aGlzLmhpID09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gYSBuYXRpdmUgbnVtYmVyLlxuICAgICAqL1xuICAgIHRvTnVtYmVyKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5oaSAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG8gPj4+IDApO1xuICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlc3VsdCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3QgY29udmVydCB0byBzYWZlIG51bWJlclwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFzIHR3byAzMi1iaXQgdmFsdWVzLlxuICogQ29udmVydHMgYmV0d2VlbiBgc3RyaW5nYCwgYG51bWJlcmAgYW5kIGBiaWdpbnRgIHJlcHJlc2VudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBiVUxvbmcgZXh0ZW5kcyBTaGFyZWRQYkxvbmcge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBpbnN0YW5jZSBmcm9tIGEgYHN0cmluZ2AsIGBudW1iZXJgIG9yIGBiaWdpbnRgLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHZhbHVlKSB7XG4gICAgICAgIGlmIChCSSlcbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQkkuQyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgQkkuVU1JTilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIHZhbHVlIGZvciB1bG9uZycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBCSS5VTUFYKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bG9uZyB0b28gbGFyZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgQkkuVi5zZXRCaWdVaW50NjQoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBiVUxvbmcoQkkuVi5nZXRJbnQzMigwLCB0cnVlKSwgQkkuVi5nZXRJbnQzMig0LCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFSRV9ERUNJTUFMX1NUUi50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IFttaW51cywgbG8sIGhpXSA9IGludDY0ZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW51cylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIHZhbHVlIGZvciB1bG9uZycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBiVUxvbmcobG8sIGhpKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ251bWJlciBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCB2YWx1ZSBmb3IgdWxvbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYlVMb25nKHZhbHVlLCB2YWx1ZSAvIFRXT19QV1JfMzJfREJMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHZhbHVlICcgKyB0eXBlb2YgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIGRlY2ltYWwgc3RyaW5nLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gQkkgPyB0aGlzLnRvQmlnSW50KCkudG9TdHJpbmcoKSA6IGludDY0dG9TdHJpbmcodGhpcy5sbywgdGhpcy5oaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gbmF0aXZlIGJpZ2ludC5cbiAgICAgKi9cbiAgICB0b0JpZ0ludCgpIHtcbiAgICAgICAgYXNzZXJ0QmkoQkkpO1xuICAgICAgICBCSS5WLnNldEludDMyKDAsIHRoaXMubG8sIHRydWUpO1xuICAgICAgICBCSS5WLnNldEludDMyKDQsIHRoaXMuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gQkkuVi5nZXRCaWdVaW50NjQoMCwgdHJ1ZSk7XG4gICAgfVxufVxuLyoqXG4gKiB1bG9uZyAwIHNpbmdsZXRvbi5cbiAqL1xuUGJVTG9uZy5aRVJPID0gbmV3IFBiVUxvbmcoMCwgMCk7XG4vKipcbiAqIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhcyB0d28gMzItYml0IHZhbHVlcy5cbiAqIENvbnZlcnRzIGJldHdlZW4gYHN0cmluZ2AsIGBudW1iZXJgIGFuZCBgYmlnaW50YCByZXByZXNlbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYkxvbmcgZXh0ZW5kcyBTaGFyZWRQYkxvbmcge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBpbnN0YW5jZSBmcm9tIGEgYHN0cmluZ2AsIGBudW1iZXJgIG9yIGBiaWdpbnRgLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHZhbHVlKSB7XG4gICAgICAgIGlmIChCSSlcbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQkkuQyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgQkkuTUlOKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgbG9uZyB0b28gc21hbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gQkkuTUFYKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgbG9uZyB0b28gbGFyZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgQkkuVi5zZXRCaWdJbnQ2NCgwLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGJMb25nKEJJLlYuZ2V0SW50MzIoMCwgdHJ1ZSksIEJJLlYuZ2V0SW50MzIoNCwgdHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghUkVfREVDSU1BTF9TVFIudGVzdCh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmluZyBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBbbWludXMsIGxvLCBoaV0gPSBpbnQ2NGZyb21TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWludXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaSA+IEhBTEZfMl9QV1JfMzIgfHwgKGhpID09IEhBTEZfMl9QV1JfMzIgJiYgbG8gIT0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgbG9uZyB0b28gc21hbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoaSA+PSBIQUxGXzJfUFdSXzMyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgbG9uZyB0b28gbGFyZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBibCA9IG5ldyBQYkxvbmcobG8sIGhpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pbnVzID8gcGJsLm5lZ2F0ZSgpIDogcGJsO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbnVtYmVyIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgUGJMb25nKHZhbHVlLCB2YWx1ZSAvIFRXT19QV1JfMzJfREJMKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUGJMb25nKC12YWx1ZSwgLXZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpLm5lZ2F0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gdmFsdWUgJyArIHR5cGVvZiB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvIHdlIGhhdmUgYSBtaW51cyBzaWduP1xuICAgICAqL1xuICAgIGlzTmVnYXRpdmUoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5oaSAmIEhBTEZfMl9QV1JfMzIpICE9PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOZWdhdGUgdHdvJ3MgY29tcGxlbWVudC5cbiAgICAgKiBJbnZlcnQgYWxsIHRoZSBiaXRzIGFuZCBhZGQgb25lIHRvIHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgbmVnYXRlKCkge1xuICAgICAgICBsZXQgaGkgPSB+dGhpcy5oaSwgbG8gPSB0aGlzLmxvO1xuICAgICAgICBpZiAobG8pXG4gICAgICAgICAgICBsbyA9IH5sbyArIDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGhpICs9IDE7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKGxvLCBoaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gZGVjaW1hbCBzdHJpbmcuXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmIChCSSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvQmlnSW50KCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgICBsZXQgbiA9IHRoaXMubmVnYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gJy0nICsgaW50NjR0b1N0cmluZyhuLmxvLCBuLmhpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50NjR0b1N0cmluZyh0aGlzLmxvLCB0aGlzLmhpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBuYXRpdmUgYmlnaW50LlxuICAgICAqL1xuICAgIHRvQmlnSW50KCkge1xuICAgICAgICBhc3NlcnRCaShCSSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoMCwgdGhpcy5sbywgdHJ1ZSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoNCwgdGhpcy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBCSS5WLmdldEJpZ0ludDY0KDAsIHRydWUpO1xuICAgIH1cbn1cbi8qKlxuICogbG9uZyAwIHNpbmdsZXRvbi5cbiAqL1xuUGJMb25nLlpFUk8gPSBuZXcgUGJMb25nKDAsIDApO1xuIiwiaW1wb3J0IHsgV2lyZVR5cGUgfSBmcm9tIFwiLi9iaW5hcnktZm9ybWF0LWNvbnRyYWN0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG5pbXBvcnQgeyB2YXJpbnQzMnJlYWQsIHZhcmludDY0cmVhZCB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5jb25zdCBkZWZhdWx0c1JlYWQgPSB7XG4gICAgcmVhZFVua25vd25GaWVsZDogdHJ1ZSxcbiAgICByZWFkZXJGYWN0b3J5OiBieXRlcyA9PiBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSxcbn07XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3IgcmVhZGluZyBiaW5hcnkgZGF0YSBmb3JtIHBhcnRpYWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVJlYWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHNSZWFkKSwgb3B0aW9ucykgOiBkZWZhdWx0c1JlYWQ7XG59XG5leHBvcnQgY2xhc3MgQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihidWYsIHRleHREZWNvZGVyKSB7XG4gICAgICAgIHRoaXMudmFyaW50NjQgPSB2YXJpbnQ2NHJlYWQ7IC8vIGRpcnR5IGNhc3QgZm9yIGB0aGlzYFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVhZCBhIGB1aW50MzJgIGZpZWxkLCBhbiB1bnNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51aW50MzIgPSB2YXJpbnQzMnJlYWQ7IC8vIGRpcnR5IGNhc3QgZm9yIGB0aGlzYCBhbmQgYWNjZXNzIHRvIHByb3RlY3RlZCBgYnVmYFxuICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgdGhpcy5sZW4gPSBidWYubGVuZ3RoO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyhidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLnRleHREZWNvZGVyID0gdGV4dERlY29kZXIgIT09IG51bGwgJiYgdGV4dERlY29kZXIgIT09IHZvaWQgMCA/IHRleHREZWNvZGVyIDogbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiwge1xuICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVCT006IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIHRhZyAtIGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlLlxuICAgICAqL1xuICAgIHRhZygpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRoaXMudWludDMyKCksIGZpZWxkTm8gPSB0YWcgPj4+IDMsIHdpcmVUeXBlID0gdGFnICYgNztcbiAgICAgICAgaWYgKGZpZWxkTm8gPD0gMCB8fCB3aXJlVHlwZSA8IDAgfHwgd2lyZVR5cGUgPiA1KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0YWc6IGZpZWxkIG5vIFwiICsgZmllbGRObyArIFwiIHdpcmUgdHlwZSBcIiArIHdpcmVUeXBlKTtcbiAgICAgICAgcmV0dXJuIFtmaWVsZE5vLCB3aXJlVHlwZV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNraXAgb25lIGVsZW1lbnQgb24gdGhlIHdpcmUgYW5kIHJldHVybiB0aGUgc2tpcHBlZCBkYXRhLlxuICAgICAqIFN1cHBvcnRzIFdpcmVUeXBlLlN0YXJ0R3JvdXAgc2luY2UgdjIuMC4wLWFscGhhLjIzLlxuICAgICAqL1xuICAgIHNraXAod2lyZVR5cGUpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgc3dpdGNoICh3aXJlVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBXaXJlVHlwZS5WYXJpbnQ6XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdICYgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkJpdDY0OlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkJpdDMyOlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDpcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLlN0YXJ0R3JvdXA6XG4gICAgICAgICAgICAgICAgLy8gRnJvbSBkZXNjcmlwdG9yLnByb3RvOiBHcm91cCB0eXBlIGlzIGRlcHJlY2F0ZWQsIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSBtdXN0IHN0aWxsIGJlIGFibGUgdG8gcGFyc2UgYW5kIHRyZWF0IGFzIHVua25vd24uXG4gICAgICAgICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCh0ID0gdGhpcy50YWcoKVsxXSkgIT09IFdpcmVUeXBlLkVuZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbnQgc2tpcCB3aXJlIHR5cGUgXCIgKyB3aXJlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCB0aGlzLnBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRocm93cyBlcnJvciBpZiBwb3NpdGlvbiBpbiBieXRlIGFycmF5IGlzIG91dCBvZiByYW5nZS5cbiAgICAgKi9cbiAgICBhc3NlcnRCb3VuZHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+IHRoaXMubGVuKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJwcmVtYXR1cmUgRU9GXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGludDMyYCBmaWVsZCwgYSBzaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyKCkgfCAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQzMmAgZmllbGQsIGEgc2lnbmVkLCB6aWd6YWctZW5jb2RlZCAzMi1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHNpbnQzMigpIHtcbiAgICAgICAgbGV0IHp6ZSA9IHRoaXMudWludDMyKCk7XG4gICAgICAgIC8vIGRlY29kZSB6aWd6YWdcbiAgICAgICAgcmV0dXJuICh6emUgPj4+IDEpIF4gLSh6emUgJiAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBpbnQ2NGAgZmllbGQsIGEgc2lnbmVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgaW50NjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKC4uLnRoaXMudmFyaW50NjQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgdWludDY0YCBmaWVsZCwgYW4gdW5zaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50NjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyguLi50aGlzLnZhcmludDY0KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQ2NGAgZmllbGQsIGEgc2lnbmVkLCB6aWctemFnLWVuY29kZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBzaW50NjQoKSB7XG4gICAgICAgIGxldCBbbG8sIGhpXSA9IHRoaXMudmFyaW50NjQoKTtcbiAgICAgICAgLy8gZGVjb2RlIHppZyB6YWdcbiAgICAgICAgbGV0IHMgPSAtKGxvICYgMSk7XG4gICAgICAgIGxvID0gKChsbyA+Pj4gMSB8IChoaSAmIDEpIDw8IDMxKSBeIHMpO1xuICAgICAgICBoaSA9IChoaSA+Pj4gMSBeIHMpO1xuICAgICAgICByZXR1cm4gbmV3IFBiTG9uZyhsbywgaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGJvb2xgIGZpZWxkLCBhIHZhcmlhbnQuXG4gICAgICovXG4gICAgYm9vbCgpIHtcbiAgICAgICAgbGV0IFtsbywgaGldID0gdGhpcy52YXJpbnQ2NCgpO1xuICAgICAgICByZXR1cm4gbG8gIT09IDAgfHwgaGkgIT09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQzMmAgZmllbGQsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIoKHRoaXMucG9zICs9IDQpIC0gNCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc2ZpeGVkMzJgIGZpZWxkLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDMyKCh0aGlzLnBvcyArPSA0KSAtIDQsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGZpeGVkNjRgIGZpZWxkLCBhbiB1bnNpZ25lZCwgZml4ZWQtbGVuZ3RoIDY0IGJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIGZpeGVkNjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyh0aGlzLnNmaXhlZDMyKCksIHRoaXMuc2ZpeGVkMzIoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQ2NGAgZmllbGQsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQtYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkNjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKHRoaXMuc2ZpeGVkMzIoKSwgdGhpcy5zZml4ZWQzMigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmbG9hdGAgZmllbGQsIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQzMigodGhpcy5wb3MgKz0gNCkgLSA0LCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBkb3VibGVgIGZpZWxkLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0NjQoKHRoaXMucG9zICs9IDgpIC0gOCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgYnl0ZXNgIGZpZWxkLCBsZW5ndGgtZGVsaW1pdGVkIGFyYml0cmFyeSBkYXRhLlxuICAgICAqL1xuICAgIGJ5dGVzKCkge1xuICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc3RyaW5nYCBmaWVsZCwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dERlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuaW1wb3J0IHsgdmFyaW50MzJ3cml0ZSwgdmFyaW50NjR3cml0ZSB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5pbXBvcnQgeyBhc3NlcnRGbG9hdDMyLCBhc3NlcnRJbnQzMiwgYXNzZXJ0VUludDMyIH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG5jb25zdCBkZWZhdWx0c1dyaXRlID0ge1xuICAgIHdyaXRlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICB3cml0ZXJGYWN0b3J5OiAoKSA9PiBuZXcgQmluYXJ5V3JpdGVyKCksXG59O1xuLyoqXG4gKiBNYWtlIG9wdGlvbnMgZm9yIHdyaXRpbmcgYmluYXJ5IGRhdGEgZm9ybSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlXcml0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1dyaXRlKSwgb3B0aW9ucykgOiBkZWZhdWx0c1dyaXRlO1xufVxuZXhwb3J0IGNsYXNzIEJpbmFyeVdyaXRlciB7XG4gICAgY29uc3RydWN0b3IodGV4dEVuY29kZXIpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByZXZpb3VzIGZvcmsgc3RhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xuICAgICAgICB0aGlzLnRleHRFbmNvZGVyID0gdGV4dEVuY29kZXIgIT09IG51bGwgJiYgdGV4dEVuY29kZXIgIT09IHZvaWQgMCA/IHRleHRFbmNvZGVyIDogbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuYnVmID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbGwgYnl0ZXMgd3JpdHRlbiBhbmQgcmVzZXQgdGhpcyB3cml0ZXIuXG4gICAgICovXG4gICAgZmluaXNoKCkge1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBVaW50OEFycmF5KHRoaXMuYnVmKSk7IC8vIGZsdXNoIHRoZSBidWZmZXJcbiAgICAgICAgbGV0IGxlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVua3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBsZW4gKz0gdGhpcy5jaHVua3NbaV0ubGVuZ3RoO1xuICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnl0ZXMuc2V0KHRoaXMuY2h1bmtzW2ldLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY2h1bmtzW2ldLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGEgbmV3IGZvcmsgZm9yIGxlbmd0aC1kZWxpbWl0ZWQgZGF0YSBsaWtlIGEgbWVzc2FnZVxuICAgICAqIG9yIGEgcGFja2VkIHJlcGVhdGVkIGZpZWxkLlxuICAgICAqXG4gICAgICogTXVzdCBiZSBqb2luZWQgbGF0ZXIgd2l0aCBgam9pbigpYC5cbiAgICAgKi9cbiAgICBmb3JrKCkge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBjaHVua3M6IHRoaXMuY2h1bmtzLCBidWY6IHRoaXMuYnVmIH0pO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSm9pbiB0aGUgbGFzdCBmb3JrLiBXcml0ZSBpdHMgbGVuZ3RoIGFuZCBieXRlcywgdGhlblxuICAgICAqIHJldHVybiB0byB0aGUgcHJldmlvdXMgc3RhdGUuXG4gICAgICovXG4gICAgam9pbigpIHtcbiAgICAgICAgLy8gZ2V0IGNodW5rIG9mIGZvcmtcbiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5maW5pc2goKTtcbiAgICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICBsZXQgcHJldiA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghcHJldilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSwgZm9yayBzdGFjayBlbXB0eScpO1xuICAgICAgICB0aGlzLmNodW5rcyA9IHByZXYuY2h1bmtzO1xuICAgICAgICB0aGlzLmJ1ZiA9IHByZXYuYnVmO1xuICAgICAgICAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSB0YWcgKGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlKS5cbiAgICAgKlxuICAgICAqIEVxdWl2YWxlbnQgdG8gYHVpbnQzMiggKGZpZWxkTm8gPDwgMyB8IHR5cGUpID4+PiAwIClgLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVkIGNvZGUgc2hvdWxkIGNvbXB1dGUgdGhlIHRhZyBhaGVhZCBvZiB0aW1lIGFuZCBjYWxsIGB1aW50MzIoKWAuXG4gICAgICovXG4gICAgdGFnKGZpZWxkTm8sIHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyKChmaWVsZE5vIDw8IDMgfCB0eXBlKSA+Pj4gMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgY2h1bmsgb2YgcmF3IGJ5dGVzLlxuICAgICAqL1xuICAgIHJhdyhjaHVuaykge1xuICAgICAgICBpZiAodGhpcy5idWYubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBVaW50OEFycmF5KHRoaXMuYnVmKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgdWludDMyYCB2YWx1ZSwgYW4gdW5zaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50MzIodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VUludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWUgYXMgdmFyaW50IDMyLCBpbmxpbmVkIGZvciBzcGVlZFxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+PiA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgaW50MzJgIHZhbHVlLCBhIHNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAqL1xuICAgIGludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgdmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgYm9vbGAgdmFsdWUsIGEgdmFyaWFudC5cbiAgICAgKi9cbiAgICBib29sKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBieXRlc2AgdmFsdWUsIGxlbmd0aC1kZWxpbWl0ZWQgYXJiaXRyYXJ5IGRhdGEuXG4gICAgICovXG4gICAgYnl0ZXModmFsdWUpIHtcbiAgICAgICAgdGhpcy51aW50MzIodmFsdWUuYnl0ZUxlbmd0aCk7IC8vIHdyaXRlIGxlbmd0aCBvZiBjaHVuayBhcyB2YXJpbnRcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc3RyaW5nYCB2YWx1ZSwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpOyAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGZsb2F0YCB2YWx1ZSwgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICAgKi9cbiAgICBmbG9hdCh2YWx1ZSkge1xuICAgICAgICBhc3NlcnRGbG9hdDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEZsb2F0MzIoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBkb3VibGVgIHZhbHVlLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoY2h1bmsuYnVmZmVyKS5zZXRGbG9hdDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQzMmAgdmFsdWUsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRVSW50MzIodmFsdWUpO1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcikuc2V0VWludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ZpeGVkMzJgIHZhbHVlLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ludDMyYCB2YWx1ZSwgYSBzaWduZWQsIHppZ3phZy1lbmNvZGVkIDMyLWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICB2YWx1ZSA9ICgodmFsdWUgPDwgMSkgXiAodmFsdWUgPj4gMzEpKSA+Pj4gMDtcbiAgICAgICAgdmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQ2NGAgdmFsdWUsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQtYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkNjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcik7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDAsIGxvbmcubG8sIHRydWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDQsIGxvbmcuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBmaXhlZDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQsIGZpeGVkLWxlbmd0aCA2NCBiaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBmaXhlZDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBsZXQgdmlldyA9IG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpO1xuICAgICAgICBsZXQgbG9uZyA9IFBiVUxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoMCwgbG9uZy5sbywgdHJ1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoNCwgbG9uZy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGludDY0YCB2YWx1ZSwgYSBzaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQ2NCh2YWx1ZSkge1xuICAgICAgICBsZXQgbG9uZyA9IFBiTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgdmFyaW50NjR3cml0ZShsb25nLmxvLCBsb25nLmhpLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBzaW50NjRgIHZhbHVlLCBhIHNpZ25lZCwgemlnLXphZy1lbmNvZGVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpLCBcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICBzaWduID0gbG9uZy5oaSA+PiAzMSwgbG8gPSAobG9uZy5sbyA8PCAxKSBeIHNpZ24sIGhpID0gKChsb25nLmhpIDw8IDEpIHwgKGxvbmcubG8gPj4+IDMxKSkgXiBzaWduO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvLCBoaSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgdWludDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50NjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGxvbmcgPSBQYlVMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvbmcubG8sIGxvbmcuaGksIHRoaXMuYnVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBUaGUgc3ltYm9sIHVzZWQgYXMgYSBrZXkgb24gbWVzc2FnZSBvYmplY3RzIHRvIHN0b3JlIHRoZSBtZXNzYWdlIHR5cGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgLSBpdCBpcyBoZXJlIHRvIHN0YXksIGJ1dFxuICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9UWVBFID0gU3ltYm9sLmZvcihcInByb3RvYnVmLXRzL21lc3NhZ2UtdHlwZVwiKTtcbiIsImltcG9ydCB7IGxvd2VyQ2FtZWxDYXNlIH0gZnJvbSBcIi4vbG93ZXItY2FtZWwtY2FzZVwiO1xuLyoqXG4gKiBTY2FsYXIgdmFsdWUgdHlwZXMuIFRoaXMgaXMgYSBzdWJzZXQgb2YgZmllbGQgdHlwZXMgZGVjbGFyZWQgYnkgcHJvdG9idWZcbiAqIGVudW0gZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgVGhlIHR5cGVzIEdST1VQIGFuZCBNRVNTQUdFXG4gKiBhcmUgb21pdHRlZCwgYnV0IHRoZSBudW1lcmljYWwgdmFsdWVzIGFyZSBpZGVudGljYWwuXG4gKi9cbmV4cG9ydCB2YXIgU2NhbGFyVHlwZTtcbihmdW5jdGlvbiAoU2NhbGFyVHlwZSkge1xuICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycy5cbiAgICAvLyBPcmRlciBpcyB3ZWlyZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLlxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkRPVUJMRVwiXSA9IDFdID0gXCJET1VCTEVcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJGTE9BVFwiXSA9IDJdID0gXCJGTE9BVFwiO1xuICAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQ2NCBpZlxuICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LlxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIklOVDY0XCJdID0gM10gPSBcIklOVDY0XCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiVUlOVDY0XCJdID0gNF0gPSBcIlVJTlQ2NFwiO1xuICAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQzMiBpZlxuICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LlxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIklOVDMyXCJdID0gNV0gPSBcIklOVDMyXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiRklYRUQ2NFwiXSA9IDZdID0gXCJGSVhFRDY0XCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiRklYRUQzMlwiXSA9IDddID0gXCJGSVhFRDMyXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiQk9PTFwiXSA9IDhdID0gXCJCT09MXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU1RSSU5HXCJdID0gOV0gPSBcIlNUUklOR1wiO1xuICAgIC8vIFRhZy1kZWxpbWl0ZWQgYWdncmVnYXRlLlxuICAgIC8vIEdyb3VwIHR5cGUgaXMgZGVwcmVjYXRlZCBhbmQgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMuIEhvd2V2ZXIsIFByb3RvM1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byBwYXJzZSB0aGUgZ3JvdXAgd2lyZSBmb3JtYXQgYW5kXG4gICAgLy8gdHJlYXQgZ3JvdXAgZmllbGRzIGFzIHVua25vd24gZmllbGRzLlxuICAgIC8vIFRZUEVfR1JPVVAgPSAxMCxcbiAgICAvLyBUWVBFX01FU1NBR0UgPSAxMSwgIC8vIExlbmd0aC1kZWxpbWl0ZWQgYWdncmVnYXRlLlxuICAgIC8vIE5ldyBpbiB2ZXJzaW9uIDIuXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiQllURVNcIl0gPSAxMl0gPSBcIkJZVEVTXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiVUlOVDMyXCJdID0gMTNdID0gXCJVSU5UMzJcIjtcbiAgICAvLyBUWVBFX0VOVU0gPSAxNCxcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTRklYRUQzMlwiXSA9IDE1XSA9IFwiU0ZJWEVEMzJcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTRklYRUQ2NFwiXSA9IDE2XSA9IFwiU0ZJWEVENjRcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTSU5UMzJcIl0gPSAxN10gPSBcIlNJTlQzMlwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNJTlQ2NFwiXSA9IDE4XSA9IFwiU0lOVDY0XCI7XG59KShTY2FsYXJUeXBlIHx8IChTY2FsYXJUeXBlID0ge30pKTtcbi8qKlxuICogSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiA2NCBiaXQgaW50ZWdyYWwgdHlwZXMuIEVxdWl2YWxlbnQgdG8gdGhlXG4gKiBmaWVsZCBvcHRpb24gXCJqc3R5cGVcIi5cbiAqXG4gKiBCeSBkZWZhdWx0LCBwcm90b2J1Zi10cyByZXByZXNlbnRzIDY0IGJpdCB0eXBlcyBhcyBgYmlnaW50YC5cbiAqXG4gKiBZb3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgYnkgZW5hYmxpbmcgdGhlIHBsdWdpbiBwYXJhbWV0ZXJcbiAqIGBsb25nX3R5cGVfc3RyaW5nYCwgd2hpY2ggd2lsbCByZXByZXNlbnQgNjQgYml0IHR5cGVzIGFzIGBzdHJpbmdgLlxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY2hhbmdlIHRoZSBiZWhhdmlvdXIgZm9yIGluZGl2aWR1YWwgZmllbGRzXG4gKiB3aXRoIHRoZSBmaWVsZCBvcHRpb24gXCJqc3R5cGVcIjpcbiAqXG4gKiBgYGBwcm90b2J1ZlxuICogdWludDY0IG15X2ZpZWxkID0gMSBbanN0eXBlID0gSlNfU1RSSU5HXTtcbiAqIHVpbnQ2NCBvdGhlcl9maWVsZCA9IDIgW2pzdHlwZSA9IEpTX05VTUJFUl07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHZhciBMb25nVHlwZTtcbihmdW5jdGlvbiAoTG9uZ1R5cGUpIHtcbiAgICAvKipcbiAgICAgKiBVc2UgSmF2YVNjcmlwdCBgYmlnaW50YC5cbiAgICAgKlxuICAgICAqIEZpZWxkIG9wdGlvbiBgW2pzdHlwZSA9IEpTX05PUk1BTF1gLlxuICAgICAqL1xuICAgIExvbmdUeXBlW0xvbmdUeXBlW1wiQklHSU5UXCJdID0gMF0gPSBcIkJJR0lOVFwiO1xuICAgIC8qKlxuICAgICAqIFVzZSBKYXZhU2NyaXB0IGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogRmllbGQgb3B0aW9uIGBbanN0eXBlID0gSlNfU1RSSU5HXWAuXG4gICAgICovXG4gICAgTG9uZ1R5cGVbTG9uZ1R5cGVbXCJTVFJJTkdcIl0gPSAxXSA9IFwiU1RSSU5HXCI7XG4gICAgLyoqXG4gICAgICogVXNlIEphdmFTY3JpcHQgYG51bWJlcmAuXG4gICAgICpcbiAgICAgKiBMYXJnZSB2YWx1ZXMgd2lsbCBsb29zZSBwcmVjaXNpb24uXG4gICAgICpcbiAgICAgKiBGaWVsZCBvcHRpb24gYFtqc3R5cGUgPSBKU19OVU1CRVJdYC5cbiAgICAgKi9cbiAgICBMb25nVHlwZVtMb25nVHlwZVtcIk5VTUJFUlwiXSA9IDJdID0gXCJOVU1CRVJcIjtcbn0pKExvbmdUeXBlIHx8IChMb25nVHlwZSA9IHt9KSk7XG4vKipcbiAqIFByb3RvYnVmIDIuMS4wIGludHJvZHVjZWQgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy5cbiAqIFNldHRpbmcgdGhlIGZpZWxkIG9wdGlvbiBgW3BhY2tlZCA9IHRydWVdYCBlbmFibGVzIHBhY2tpbmcuXG4gKlxuICogSW4gcHJvdG8zLCBhbGwgcmVwZWF0ZWQgZmllbGRzIGFyZSBwYWNrZWQgYnkgZGVmYXVsdC5cbiAqIFNldHRpbmcgdGhlIGZpZWxkIG9wdGlvbiBgW3BhY2tlZCA9IGZhbHNlXWAgZGlzYWJsZXMgcGFja2luZy5cbiAqXG4gKiBQYWNrZWQgcmVwZWF0ZWQgZmllbGRzIGFyZSBlbmNvZGVkIHdpdGggYSBzaW5nbGUgdGFnLFxuICogdGhlbiBhIGxlbmd0aC1kZWxpbWl0ZXIsIHRoZW4gdGhlIGVsZW1lbnQgdmFsdWVzLlxuICpcbiAqIFVucGFja2VkIHJlcGVhdGVkIGZpZWxkcyBhcmUgZW5jb2RlZCB3aXRoIGEgdGFnIGFuZFxuICogdmFsdWUgZm9yIGVhY2ggZWxlbWVudC5cbiAqXG4gKiBgYnl0ZXNgIGFuZCBgc3RyaW5nYCBjYW5ub3QgYmUgcGFja2VkLlxuICovXG5leHBvcnQgdmFyIFJlcGVhdFR5cGU7XG4oZnVuY3Rpb24gKFJlcGVhdFR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgaXMgbm90IHJlcGVhdGVkLlxuICAgICAqL1xuICAgIFJlcGVhdFR5cGVbUmVwZWF0VHlwZVtcIk5PXCJdID0gMF0gPSBcIk5PXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIGlzIHJlcGVhdGVkIGFuZCBzaG91bGQgYmUgcGFja2VkLlxuICAgICAqIEludmFsaWQgZm9yIGBieXRlc2AgYW5kIGBzdHJpbmdgLCB0aGV5IGNhbm5vdCBiZSBwYWNrZWQuXG4gICAgICovXG4gICAgUmVwZWF0VHlwZVtSZXBlYXRUeXBlW1wiUEFDS0VEXCJdID0gMV0gPSBcIlBBQ0tFRFwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBpcyByZXBlYXRlZCBidXQgc2hvdWxkIG5vdCBiZSBwYWNrZWQuXG4gICAgICogVGhlIG9ubHkgdmFsaWQgcmVwZWF0IHR5cGUgZm9yIHJlcGVhdGVkIGBieXRlc2AgYW5kIGBzdHJpbmdgLlxuICAgICAqL1xuICAgIFJlcGVhdFR5cGVbUmVwZWF0VHlwZVtcIlVOUEFDS0VEXCJdID0gMl0gPSBcIlVOUEFDS0VEXCI7XG59KShSZXBlYXRUeXBlIHx8IChSZXBlYXRUeXBlID0ge30pKTtcbi8qKlxuICogVHVybnMgUGFydGlhbEZpZWxkSW5mbyBpbnRvIEZpZWxkSW5mby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZpZWxkSW5mbyhmaWVsZCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICBmaWVsZC5sb2NhbE5hbWUgPSAoX2EgPSBmaWVsZC5sb2NhbE5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGxvd2VyQ2FtZWxDYXNlKGZpZWxkLm5hbWUpO1xuICAgIGZpZWxkLmpzb25OYW1lID0gKF9iID0gZmllbGQuanNvbk5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGxvd2VyQ2FtZWxDYXNlKGZpZWxkLm5hbWUpO1xuICAgIGZpZWxkLnJlcGVhdCA9IChfYyA9IGZpZWxkLnJlcGVhdCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogUmVwZWF0VHlwZS5OTztcbiAgICBmaWVsZC5vcHQgPSAoX2QgPSBmaWVsZC5vcHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IChmaWVsZC5yZXBlYXQgPyBmYWxzZSA6IGZpZWxkLm9uZW9mID8gZmFsc2UgOiBmaWVsZC5raW5kID09IFwibWVzc2FnZVwiKTtcbiAgICByZXR1cm4gZmllbGQ7XG59XG4vKipcbiAqIFJlYWQgY3VzdG9tIGZpZWxkIG9wdGlvbnMgZnJvbSBhIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIHJlYWRGaWVsZE9wdGlvbigpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRmllbGRPcHRpb25zKG1lc3NhZ2VUeXBlLCBmaWVsZE5hbWUsIGV4dGVuc2lvbk5hbWUsIGV4dGVuc2lvblR5cGUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qgb3B0aW9ucyA9IChfYSA9IG1lc3NhZ2VUeXBlLmZpZWxkcy5maW5kKChtLCBpKSA9PiBtLmxvY2FsTmFtZSA9PSBmaWVsZE5hbWUgfHwgaSA9PSBmaWVsZE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW9ucztcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zW2V4dGVuc2lvbk5hbWVdID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25zW2V4dGVuc2lvbk5hbWVdKSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWFkRmllbGRPcHRpb24obWVzc2FnZVR5cGUsIGZpZWxkTmFtZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvcHRpb25zID0gKF9hID0gbWVzc2FnZVR5cGUuZmllbGRzLmZpbmQoKG0sIGkpID0+IG0ubG9jYWxOYW1lID09IGZpZWxkTmFtZSB8fCBpID09IGZpZWxkTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25WYWwgPSBvcHRpb25zW2V4dGVuc2lvbk5hbWVdO1xuICAgIGlmIChvcHRpb25WYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb3B0aW9uVmFsO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uVHlwZSA/IGV4dGVuc2lvblR5cGUuZnJvbUpzb24ob3B0aW9uVmFsKSA6IG9wdGlvblZhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWFkTWVzc2FnZU9wdGlvbihtZXNzYWdlVHlwZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBtZXNzYWdlVHlwZS5vcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvblZhbCA9IG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV07XG4gICAgaWYgKG9wdGlvblZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWw7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25UeXBlID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25WYWwpIDogb3B0aW9uVmFsO1xufVxuIiwiLyoqXG4gKiBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSB2YWxpZCBvbmVvZiBncm91cD9cbiAqXG4gKiBXZSByZXByZXNlbnQgcHJvdG9idWYgYG9uZW9mYCBhcyBhbGdlYnJhaWMgZGF0YSB0eXBlcyAoQURUKSBpbiBnZW5lcmF0ZWRcbiAqIGNvZGUuIEJ1dCB3aGVuIHdvcmtpbmcgd2l0aCBtZXNzYWdlcyBvZiB1bmtub3duIHR5cGUsIHRoZSBBRFQgZG9lcyBub3RcbiAqIGhlbHAgdXMuXG4gKlxuICogVGhpcyB0eXBlIGd1YXJkIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGFkaGVyZXMgdG8gdGhlIEFEVCBydWxlcywgd2hpY2hcbiAqIGFyZSBhcyBmb2xsb3dzOlxuICpcbiAqIDEpIE11c3QgYmUgYW4gb2JqZWN0LlxuICpcbiAqIDIpIE11c3QgaGF2ZSBhIFwib25lb2ZLaW5kXCIgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS5cbiAqXG4gKiAzKSBJZiBcIm9uZW9mS2luZFwiIGlzIGB1bmRlZmluZWRgLCBubyBtZW1iZXIgZmllbGQgaXMgc2VsZWN0ZWQuIFRoZSBvYmplY3RcbiAqIG11c3Qgbm90IGhhdmUgYW55IG90aGVyIHByb3BlcnRpZXMuXG4gKlxuICogNCkgSWYgXCJvbmVvZktpbmRcIiBpcyBhIGBzdHJpbmdgLCB0aGUgbWVtYmVyIGZpZWxkIHdpdGggdGhpcyBuYW1lIGlzXG4gKiBzZWxlY3RlZC5cbiAqXG4gKiA1KSBJZiBhIG1lbWJlciBmaWVsZCBpcyBzZWxlY3RlZCwgdGhlIG9iamVjdCBtdXN0IGhhdmUgYSBzZWNvbmQgcHJvcGVydHlcbiAqIHdpdGggdGhpcyBuYW1lLiBUaGUgcHJvcGVydHkgbXVzdCBub3QgYmUgYHVuZGVmaW5lZGAuXG4gKlxuICogNikgTm8gZXh0cmEgcHJvcGVydGllcyBhcmUgYWxsb3dlZC4gVGhlIG9iamVjdCBoYXMgZWl0aGVyIG9uZSBwcm9wZXJ0eVxuICogKG5vIHNlbGVjdGlvbikgb3IgdHdvIHByb3BlcnRpZXMgKHNlbGVjdGlvbikuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPbmVvZkdyb3VwKGFueSkge1xuICAgIGlmICh0eXBlb2YgYW55ICE9ICdvYmplY3QnIHx8IGFueSA9PT0gbnVsbCB8fCAhYW55Lmhhc093blByb3BlcnR5KCdvbmVvZktpbmQnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZW9mIGFueS5vbmVvZktpbmQpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgaWYgKGFueVthbnkub25lb2ZLaW5kXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhbnkpLmxlbmd0aCA9PSAyO1xuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYW55KS5sZW5ndGggPT0gMTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBpbiBhIG9uZW9mIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T25lb2ZWYWx1ZShvbmVvZiwga2luZCkge1xuICAgIHJldHVybiBvbmVvZltraW5kXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRPbmVvZlZhbHVlKG9uZW9mLCBraW5kLCB2YWx1ZSkge1xuICAgIGlmIChvbmVvZi5vbmVvZktpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgb25lb2Zbb25lb2Yub25lb2ZLaW5kXTtcbiAgICB9XG4gICAgb25lb2Yub25lb2ZLaW5kID0ga2luZDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvbmVvZltraW5kXSA9IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRVbmtub3duT25lb2ZWYWx1ZShvbmVvZiwga2luZCwgdmFsdWUpIHtcbiAgICBpZiAob25lb2Yub25lb2ZLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIG9uZW9mW29uZW9mLm9uZW9mS2luZF07XG4gICAgfVxuICAgIG9uZW9mLm9uZW9mS2luZCA9IGtpbmQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9uZW9mW2tpbmRdID0gdmFsdWU7XG4gICAgfVxufVxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzZWxlY3RlZCBmaWVsZCBpbiBhIG9uZW9mIGdyb3VwLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIG1vZGlmeSBhIG9uZW9mIGdyb3VwIGlzIHRvIHNldFxuICogYSBuZXcgb2JqZWN0OlxuICpcbiAqIGBgYHRzXG4gKiBtZXNzYWdlLnJlc3VsdCA9IHsgb25lb2ZLaW5kOiB1bmRlZmluZWQgfTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJPbmVvZlZhbHVlKG9uZW9mKSB7XG4gICAgaWYgKG9uZW9mLm9uZW9mS2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvbmVvZltvbmVvZi5vbmVvZktpbmRdO1xuICAgIH1cbiAgICBvbmVvZi5vbmVvZktpbmQgPSB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBnaXZlbiBvbmVvZiBncm91cC5cbiAqXG4gKiBOb3QgdGhhdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGFjY2VzcyBhIG9uZW9mIGdyb3VwIGlzIHRvIGNoZWNrXG4gKiB0aGUgXCJvbmVvZktpbmRcIiBwcm9wZXJ0eSBhbmQgbGV0IFR5cGVTY3JpcHQgbmFycm93IGRvd24gdGhlIHVuaW9uXG4gKiB0eXBlIGZvciB5b3U6XG4gKlxuICogYGBgdHNcbiAqIGlmIChtZXNzYWdlLnJlc3VsdC5vbmVvZktpbmQgPT09IFwiZXJyb3JcIikge1xuICogICBtZXNzYWdlLnJlc3VsdC5lcnJvcjsgLy8gc3RyaW5nXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBJbiB0aGUgcmFyZSBjYXNlIHlvdSBqdXN0IG5lZWQgdGhlIHZhbHVlLCBhbmQgZG8gbm90IGNhcmUgYWJvdXRcbiAqIHdoaWNoIHByb3RvYnVmIGZpZWxkIGlzIHNlbGVjdGVkLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uXG4gKiBmb3IgY29udmVuaWVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3RlZE9uZW9mVmFsdWUob25lb2YpIHtcbiAgICBpZiAob25lb2Yub25lb2ZLaW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIG9uZW9mW29uZW9mLm9uZW9mS2luZF07XG59XG4iLCJpbXBvcnQgeyBMb25nVHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgaXNPbmVvZkdyb3VwIH0gZnJvbSBcIi4vb25lb2ZcIjtcbi8vIG5vaW5zcGVjdGlvbiBKU01ldGhvZENhbkJlU3RhdGljXG5leHBvcnQgY2xhc3MgUmVmbGVjdGlvblR5cGVDaGVjayB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZmllbGRzID0gKF9hID0gaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgIH1cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCByZXEgPSBbXSwga25vd24gPSBbXSwgb25lb2ZzID0gW107XG4gICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9uZW9mcy5pbmNsdWRlcyhmaWVsZC5vbmVvZikpIHtcbiAgICAgICAgICAgICAgICAgICAgb25lb2ZzLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5vbmVvZik7XG4gICAgICAgICAgICAgICAgICAgIGtub3duLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtub3duLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHQgfHwgZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5yZXBlYXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5sb2NhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YSA9IHsgcmVxLCBrbm93biwgb25lb2ZzOiBPYmplY3QudmFsdWVzKG9uZW9mcykgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIGFyZ3VtZW50IGEgdmFsaWQgbWVzc2FnZSBhcyBzcGVjaWZpZWQgYnkgdGhlXG4gICAgICogcmVmbGVjdGlvbiBpbmZvcm1hdGlvbj9cbiAgICAgKlxuICAgICAqIENoZWNrcyBhbGwgZmllbGQgdHlwZXMgcmVjdXJzaXZlbHkuIFRoZSBgZGVwdGhgXG4gICAgICogc3BlY2lmaWVzIGhvdyBkZWVwIGludG8gdGhlIHN0cnVjdHVyZSB0aGUgY2hlY2sgd2lsbCBiZS5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAwLCBvbmx5IHRoZSBwcmVzZW5jZSBvZiBmaWVsZHNcbiAgICAgKiBpcyBjaGVja2VkLlxuICAgICAqXG4gICAgICogV2l0aCBhIGRlcHRoIG9mIDEgb3IgbW9yZSwgdGhlIGZpZWxkIHR5cGVzIGFyZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogV2l0aCBhIGRlcHRoIG9mIDIgb3IgbW9yZSwgdGhlIG1lbWJlcnMgb2YgbWFwLCByZXBlYXRlZFxuICAgICAqIGFuZCBtZXNzYWdlIGZpZWxkcyBhcmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIE1lc3NhZ2UgZmllbGRzIHdpbGwgYmUgY2hlY2tlZCByZWN1cnNpdmVseSB3aXRoIGRlcHRoIC0gMS5cbiAgICAgKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbWFwIGVudHJpZXMgLyByZXBlYXRlZCB2YWx1ZXMgYmVpbmcgY2hlY2tlZFxuICAgICAqIGlzIDwgZGVwdGguXG4gICAgICovXG4gICAgaXMobWVzc2FnZSwgZGVwdGgsIGFsbG93RXhjZXNzUHJvcGVydGllcyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChkZXB0aCA8IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXNzYWdlICE9ICdvYmplY3QnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnByZXBhcmUoKTtcbiAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhtZXNzYWdlKSwgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgLy8gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nIGluIGFyZywgdGhpcyBjYW5ub3QgYmUgYSBUXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA8IGRhdGEucmVxLmxlbmd0aCB8fCBkYXRhLnJlcS5zb21lKG4gPT4gIWtleXMuaW5jbHVkZXMobikpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWFsbG93RXhjZXNzUHJvcGVydGllcykge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGFyZyBjb250YWlucyBhIGtleSB3ZSBkb250IGtub3csIHRoaXMgaXMgbm90IGEgbGl0ZXJhbCBUXG4gICAgICAgICAgICBpZiAoa2V5cy5zb21lKGsgPT4gIWRhdGEua25vd24uaW5jbHVkZXMoaykpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBcIldpdGggYSBkZXB0aCBvZiAwLCBvbmx5IHRoZSBwcmVzZW5jZSBhbmQgYWJzZW5jZSBvZiBmaWVsZHMgaXMgY2hlY2tlZC5cIlxuICAgICAgICAvLyBcIldpdGggYSBkZXB0aCBvZiAxIG9yIG1vcmUsIHRoZSBmaWVsZCB0eXBlcyBhcmUgY2hlY2tlZC5cIlxuICAgICAgICBpZiAoZGVwdGggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBvbmVvZiBncm91cFxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgZGF0YS5vbmVvZnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbWVzc2FnZVtuYW1lXTtcbiAgICAgICAgICAgIGlmICghaXNPbmVvZkdyb3VwKGdyb3VwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZiA9PiBmLmxvY2FsTmFtZSA9PT0gZ3JvdXAub25lb2ZLaW5kKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSBmb3VuZCBubyBmaWVsZCwgYnV0IGhhdmUgYSBraW5kLCBzb21ldGhpbmcgaXMgd3JvbmdcbiAgICAgICAgICAgIGlmICghdGhpcy5maWVsZChncm91cFtncm91cC5vbmVvZktpbmRdLCBmaWVsZCwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHR5cGVzXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5vbmVvZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpZWxkKG1lc3NhZ2VbZmllbGQubG9jYWxOYW1lXSwgZmllbGQsIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZmllbGQoYXJnLCBmaWVsZCwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkge1xuICAgICAgICBsZXQgcmVwZWF0ZWQgPSBmaWVsZC5yZXBlYXQ7XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLm9wdDtcbiAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoYXJnLCBmaWVsZC5ULCBkZXB0aCwgZmllbGQuTCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFyKGFyZywgZmllbGQuVCwgZmllbGQuTCk7XG4gICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLm9wdDtcbiAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoYXJnLCBTY2FsYXJUeXBlLklOVDMyLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFyKGFyZywgU2NhbGFyVHlwZS5JTlQzMik7XG4gICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyhhcmcsIGZpZWxkLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZShhcmcsIGZpZWxkLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT0gJ29iamVjdCcgfHwgYXJnID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoIDwgMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcEtleXMoYXJnLCBmaWVsZC5LLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKE9iamVjdC52YWx1ZXMoYXJnKSwgZmllbGQuVi5ULCBkZXB0aCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoT2JqZWN0LnZhbHVlcyhhcmcpLCBTY2FsYXJUeXBlLklOVDMyLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyhPYmplY3QudmFsdWVzKGFyZyksIGZpZWxkLlYuVCgpLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1lc3NhZ2UoYXJnLCB0eXBlLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSB7XG4gICAgICAgIGlmIChhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQXNzaWduYWJsZShhcmcsIGRlcHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZS5pcyhhcmcsIGRlcHRoKTtcbiAgICB9XG4gICAgbWVzc2FnZXMoYXJnLCB0eXBlLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGVwdGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnLmxlbmd0aCAmJiBpIDwgZGVwdGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXNBc3NpZ25hYmxlKGFyZ1tpXSwgZGVwdGggLSAxKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmcubGVuZ3RoICYmIGkgPCBkZXB0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmICghdHlwZS5pcyhhcmdbaV0sIGRlcHRoIC0gMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2NhbGFyKGFyZywgdHlwZSwgbG9uZ1R5cGUpIHtcbiAgICAgICAgbGV0IGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChsb25nVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExvbmdUeXBlLkJJR0lOVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTG9uZ1R5cGUuTlVNQkVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gXCJudW1iZXJcIiAmJiAhaXNOYU4oYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ2Jvb2xlYW4nO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSAnc3RyaW5nJztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgVWludDhBcnJheTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ251bWJlcicgJiYgIWlzTmFOKGFyZyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoYXJnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FsYXJzKGFyZywgdHlwZSwgZGVwdGgsIGxvbmdUeXBlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGVwdGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZy5sZW5ndGggJiYgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjYWxhcihhcmdbaV0sIHR5cGUsIGxvbmdUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbWFwS2V5cyhtYXAsIHR5cGUsIGRlcHRoKSB7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoa2V5cy5zbGljZSgwLCBkZXB0aCkubWFwKGsgPT4gcGFyc2VJbnQoaykpLCB0eXBlLCBkZXB0aCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGtleXMuc2xpY2UoMCwgZGVwdGgpLm1hcChrID0+IGsgPT0gJ3RydWUnID8gdHJ1ZSA6IGsgPT0gJ2ZhbHNlJyA/IGZhbHNlIDogayksIHR5cGUsIGRlcHRoKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFycyhrZXlzLCB0eXBlLCBkZXB0aCwgTG9uZ1R5cGUuU1RSSU5HKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IExvbmdUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG4vKipcbiAqIFV0aWxpdHkgbWV0aG9kIHRvIGNvbnZlcnQgYSBQYkxvbmcgb3IgUGJVbG9uZyB0byBhIEphdmFTY3JpcHRcbiAqIHJlcHJlc2VudGF0aW9uIGR1cmluZyBydW50aW1lLlxuICpcbiAqIFdvcmtzIHdpdGggZ2VuZXJhdGVkIGZpZWxkIGluZm9ybWF0aW9uLCBgdW5kZWZpbmVkYCBpcyBlcXVpdmFsZW50XG4gKiB0byBgU1RSSU5HYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25Mb25nQ29udmVydChsb25nLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgTG9uZ1R5cGUuQklHSU5UOlxuICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9CaWdJbnQoKTtcbiAgICAgICAgY2FzZSBMb25nVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICByZXR1cm4gbG9uZy50b051bWJlcigpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAvLyBjYXNlIExvbmdUeXBlLlNUUklORzpcbiAgICAgICAgICAgIHJldHVybiBsb25nLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgaXNKc29uT2JqZWN0LCB0eXBlb2ZKc29uVmFsdWUgfSBmcm9tIFwiLi9qc29uLXR5cGluZ3NcIjtcbmltcG9ydCB7IGJhc2U2NGRlY29kZSB9IGZyb20gXCIuL2Jhc2U2NFwiO1xuaW1wb3J0IHsgTG9uZ1R5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IFBiTG9uZywgUGJVTG9uZyB9IGZyb20gXCIuL3BiLWxvbmdcIjtcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0RmxvYXQzMiwgYXNzZXJ0SW50MzIsIGFzc2VydFVJbnQzMiB9IGZyb20gXCIuL2Fzc2VydFwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbkxvbmdDb252ZXJ0IH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1sb25nLWNvbnZlcnRcIjtcbi8qKlxuICogUmVhZHMgcHJvdG8zIG1lc3NhZ2VzIGluIGNhbm9uaWNhbCBKU09OIGZvcm1hdCB1c2luZyByZWZsZWN0aW9uIGluZm9ybWF0aW9uLlxuICpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICovXG5leHBvcnQgY2xhc3MgUmVmbGVjdGlvbkpzb25SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5mTWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZk1hcCA9IHt9O1xuICAgICAgICAgICAgY29uc3QgZmllbGRzSW5wdXQgPSAoX2EgPSB0aGlzLmluZm8uZmllbGRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzSW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZNYXBbZmllbGQubmFtZV0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICB0aGlzLmZNYXBbZmllbGQuanNvbk5hbWVdID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5mTWFwW2ZpZWxkLmxvY2FsTmFtZV0gPSBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYW5ub3QgcGFyc2UgSlNPTiA8dHlwZSBvZiBqc29uVmFsdWU+IGZvciA8dHlwZSBuYW1lPiM8ZmllbGROYW1lPi5cbiAgICBhc3NlcnQoY29uZGl0aW9uLCBmaWVsZE5hbWUsIGpzb25WYWx1ZSkge1xuICAgICAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgbGV0IHdoYXQgPSB0eXBlb2ZKc29uVmFsdWUoanNvblZhbHVlKTtcbiAgICAgICAgICAgIGlmICh3aGF0ID09IFwibnVtYmVyXCIgfHwgd2hhdCA9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgICAgICB3aGF0ID0ganNvblZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBKU09OICR7d2hhdH0gZm9yICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIG1lc3NhZ2UgZnJvbSBjYW5vbmljYWwgSlNPTiBmb3JtYXQgaW50byB0aGUgdGFyZ2V0IG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBSZXBlYXRlZCBmaWVsZHMgYXJlIGFwcGVuZGVkLiBNYXAgZW50cmllcyBhcmUgYWRkZWQsIG92ZXJ3cml0aW5nXG4gICAgICogZXhpc3Rpbmcga2V5cy5cbiAgICAgKlxuICAgICAqIElmIGEgbWVzc2FnZSBmaWVsZCBpcyBhbHJlYWR5IHByZXNlbnQsIGl0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlXG4gICAgICogbmV3IGRhdGEuXG4gICAgICovXG4gICAgcmVhZChpbnB1dCwgbWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnByZXBhcmUoKTtcbiAgICAgICAgY29uc3Qgb25lb2ZzSGFuZGxlZCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtqc29uS2V5LCBqc29uVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZNYXBbanNvbktleV07XG4gICAgICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgdW5rbm93biBmaWVsZCB3aGlsZSByZWFkaW5nICR7dGhpcy5pbmZvLnR5cGVOYW1lfSBmcm9tIEpTT04gZm9ybWF0LiBKU09OIGtleTogJHtqc29uS2V5fWApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gaGFuZGxlIG9uZW9mIEFEVFxuICAgICAgICAgICAgbGV0IHRhcmdldDsgLy8gdGhpcyB3aWxsIGJlIHRoZSB0YXJnZXQgZm9yIHRoZSBmaWVsZCB2YWx1ZSwgd2hldGhlciBpdCBpcyBtZW1iZXIgb2YgYSBvbmVvZiBvciBub3RcbiAgICAgICAgICAgIGlmIChmaWVsZC5vbmVvZikge1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwgJiYgKGZpZWxkLmtpbmQgIT09ICdlbnVtJyB8fCBmaWVsZC5UKClbMF0gIT09ICdnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHNpbmNlIGpzb24gb2JqZWN0cyBhcmUgdW5vcmRlcmVkIGJ5IHNwZWNpZmljYXRpb24sIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0YWtlIHRoZSBsYXN0IG9mIG11bHRpcGxlIG9uZW9mc1xuICAgICAgICAgICAgICAgIGlmIChvbmVvZnNIYW5kbGVkLmluY2x1ZGVzKGZpZWxkLm9uZW9mKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBsZSBtZW1iZXJzIG9mIHRoZSBvbmVvZiBncm91cCBcIiR7ZmllbGQub25lb2Z9XCIgb2YgJHt0aGlzLmluZm8udHlwZU5hbWV9IGFyZSBwcmVzZW50IGluIEpTT04uYCk7XG4gICAgICAgICAgICAgICAgb25lb2ZzSGFuZGxlZC5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBtZXNzYWdlW2ZpZWxkLm9uZW9mXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb25lb2ZLaW5kOiBsb2NhbE5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGhhdmUgaGFuZGxlZCBvbmVvZiBhYm92ZS4gd2UganVzdCBoYXZlIHJlYWQgdGhlIHZhbHVlIGludG8gYHRhcmdldGAuXG4gICAgICAgICAgICBpZiAoZmllbGQua2luZCA9PSAnbWFwJykge1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlucHV0XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoaXNKc29uT2JqZWN0KGpzb25WYWx1ZSksIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gb3VyIHRhcmdldCB0byBwdXQgbWFwIGVudHJpZXMgaW50b1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkT2JqID0gdGFyZ2V0W2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgLy8gcmVhZCBlbnRyaWVzXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbanNvbk9iaktleSwganNvbk9ialZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KGpzb25PYmpWYWx1ZSAhPT0gbnVsbCwgZmllbGQubmFtZSArIFwiIG1hcCB2YWx1ZVwiLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5WLlQoKS5pbnRlcm5hbEpzb25SZWFkKGpzb25PYmpWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuZW51bShmaWVsZC5WLlQoKSwganNvbk9ialZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNjYWxhcihqc29uT2JqVmFsdWUsIGZpZWxkLlYuVCwgZmllbGQuVi5MLCBmaWVsZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCwgZmllbGQubmFtZSArIFwiIG1hcCB2YWx1ZVwiLCBqc29uT2JqVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGtleVxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ganNvbk9iaktleTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MKVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5ID09IFwidHJ1ZVwiID8gdHJ1ZSA6IGtleSA9PSBcImZhbHNlXCIgPyBmYWxzZSA6IGtleTtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5zY2FsYXIoa2V5LCBmaWVsZC5LLCBMb25nVHlwZS5TVFJJTkcsIGZpZWxkLm5hbWUpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqW2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5wdXRcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChBcnJheS5pc0FycmF5KGpzb25WYWx1ZSksIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gb3VyIHRhcmdldCB0byBwdXQgYXJyYXkgZW50cmllcyBpbnRvXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRBcnIgPSB0YXJnZXRbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICAvLyByZWFkIGFycmF5IGVudHJpZXNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGpzb25JdGVtIG9mIGpzb25WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChqc29uSXRlbSAhPT0gbnVsbCwgZmllbGQubmFtZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5UKCkuaW50ZXJuYWxKc29uUmVhZChqc29uSXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuZW51bShmaWVsZC5UKCksIGpzb25JdGVtLCBmaWVsZC5uYW1lLCBvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNjYWxhcihqc29uSXRlbSwgZmllbGQuVCwgZmllbGQuTCwgZmllbGQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQodmFsICE9PSB1bmRlZmluZWQsIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwgJiYgZmllbGQuVCgpLnR5cGVOYW1lICE9ICdnb29nbGUucHJvdG9idWYuVmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoZmllbGQub25lb2YgPT09IHVuZGVmaW5lZCwgZmllbGQubmFtZSArIFwiIChvbmVvZiBtZW1iZXIpXCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSBmaWVsZC5UKCkuaW50ZXJuYWxKc29uUmVhZChqc29uVmFsdWUsIG9wdGlvbnMsIHRhcmdldFtsb2NhbE5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZW51bShmaWVsZC5UKCksIGpzb25WYWx1ZSwgZmllbGQubmFtZSwgb3B0aW9ucy5pZ25vcmVVbmtub3duRmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSB0aGlzLnNjYWxhcihqc29uVmFsdWUsIGZpZWxkLlQsIGZpZWxkLkwsIGZpZWxkLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBmb3IgdW5yZWNvZ25pemVkIHN0cmluZyByZXByZXNlbnRhdGlvbnMuXG4gICAgICpcbiAgICAgKiBnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlIGFjY2VwdHMgb25seSBKU09OIGBudWxsYCAob3IgdGhlIG9sZCBgXCJOVUxMX1ZBTFVFXCJgKS5cbiAgICAgKi9cbiAgICBlbnVtKHR5cGUsIGpzb24sIGZpZWxkTmFtZSwgaWdub3JlVW5rbm93bkZpZWxkcykge1xuICAgICAgICBpZiAodHlwZVswXSA9PSAnZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZScpXG4gICAgICAgICAgICBhc3NlcnQoanNvbiA9PT0gbnVsbCB8fCBqc29uID09PSBcIk5VTExfVkFMVUVcIiwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBlbnVtICR7dHlwZVswXX0gb25seSBhY2NlcHRzIG51bGwuYCk7XG4gICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgLy8gd2UgcmVxdWlyZSAwIHRvIGJlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBlbnVtc1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGpzb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihqc29uKSwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBlbnVtIGNhbiBvbmx5IGJlIGludGVncmFsIG51bWJlciwgZ290ICR7anNvbn0uYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsRW51bU5hbWUgPSBqc29uO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlWzJdICYmIGpzb24uc3Vic3RyaW5nKDAsIHR5cGVbMl0ubGVuZ3RoKSA9PT0gdHlwZVsyXSlcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9va3VwIHdpdGhvdXQgdGhlIHNoYXJlZCBwcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxFbnVtTmFtZSA9IGpzb24uc3Vic3RyaW5nKHR5cGVbMl0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsZXQgZW51bU51bWJlciA9IHR5cGVbMV1bbG9jYWxFbnVtTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnVtTnVtYmVyID09PSAndW5kZWZpbmVkJyAmJiBpZ25vcmVVbmtub3duRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiBlbnVtTnVtYmVyID09IFwibnVtYmVyXCIsIGBVbmFibGUgdG8gcGFyc2UgZmllbGQgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfSwgZW51bSAke3R5cGVbMF19IGhhcyBubyB2YWx1ZSBmb3IgXCIke2pzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudW1OdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBgVW5hYmxlIHRvIHBhcnNlIGZpZWxkICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX0sIGNhbm5vdCBwYXJzZSBlbnVtIHZhbHVlIGZyb20gJHt0eXBlb2YganNvbn1cIi5gKTtcbiAgICB9XG4gICAgc2NhbGFyKGpzb24sIHR5cGUsIGxvbmdUeXBlLCBmaWVsZE5hbWUpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCwgZG91YmxlOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZXMgXCJOYU5cIiwgXCJJbmZpbml0eVwiLCBhbmQgXCItSW5maW5pdHlcIi5cbiAgICAgICAgICAgICAgICAvLyBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC4gRXhwb25lbnQgbm90YXRpb24gaXMgYWxzbyBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLjA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIk5hTlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5OYU47XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIkluZmluaXR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gXCItSW5maW5pdHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJlbXB0eSBzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiA9PSBcInN0cmluZ1wiICYmIGpzb24udHJpbSgpLmxlbmd0aCAhPT0ganNvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImV4dHJhIHdoaXRlc3BhY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPSBcInN0cmluZ1wiICYmIHR5cGVvZiBqc29uICE9IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG9hdCA9IE51bWJlcihqc29uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihmbG9hdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcIm5vdCBhIG51bWJlclwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZmxvYXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZpbml0eSBhbmQgLWluZmluaXR5IGFyZSBoYW5kbGVkIGJ5IHN0cmluZyByZXByZXNlbnRhdGlvbiBhYm92ZSwgc28gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwidG9vIGxhcmdlIG9yIHNtYWxsXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTY2FsYXJUeXBlLkZMT0FUKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmxvYXQzMihmbG9hdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdDtcbiAgICAgICAgICAgICAgICAvLyBpbnQzMiwgZml4ZWQzMiwgdWludDMyOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIG51bWJlci4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnQzMjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uID09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiA9IGpzb247XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpzb24gPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJlbXB0eSBzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGpzb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24udHJpbSgpLmxlbmd0aCAhPT0ganNvbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZXh0cmEgd2hpdGVzcGFjZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyID0gTnVtYmVyKGpzb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnQzMiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNjYWxhclR5cGUuVUlOVDMyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VUludDMyKGludDMyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SW50MzIoaW50MzIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50MzI7XG4gICAgICAgICAgICAgICAgLy8gaW50NjQsIGZpeGVkNjQsIHVpbnQ2NDogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBzdHJpbmcuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiTG9uZy5aRVJPLCBsb25nVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPSBcIm51bWJlclwiICYmIHR5cGVvZiBqc29uICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYkxvbmcuZnJvbShqc29uKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYlVMb25nLlpFUk8sIGxvbmdUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9IFwibnVtYmVyXCIgJiYgdHlwZW9mIGpzb24gIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiVUxvbmcuZnJvbShqc29uKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgIC8vIGJvb2w6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZzpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImV4dHJhIHdoaXRlc3BhY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoanNvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImludmFsaWQgVVRGOFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgLy8gYnl0ZXM6IEpTT04gdmFsdWUgd2lsbCBiZSB0aGUgZGF0YSBlbmNvZGVkIGFzIGEgc3RyaW5nIHVzaW5nIHN0YW5kYXJkIGJhc2U2NCBlbmNvZGluZyB3aXRoIHBhZGRpbmdzLlxuICAgICAgICAgICAgICAgIC8vIEVpdGhlciBzdGFuZGFyZCBvciBVUkwtc2FmZSBiYXNlNjQgZW5jb2Rpbmcgd2l0aC93aXRob3V0IHBhZGRpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsIHx8IGpzb24gPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NGRlY29kZShqc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGUgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXNzZXJ0KGZhbHNlLCBmaWVsZE5hbWUgKyAoZSA/IFwiIC0gXCIgKyBlIDogXCJcIiksIGpzb24pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGJhc2U2NGVuY29kZSB9IGZyb20gXCIuL2Jhc2U2NFwiO1xuaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuaW1wb3J0IHsgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnRGbG9hdDMyLCBhc3NlcnRJbnQzMiwgYXNzZXJ0VUludDMyIH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG4vKipcbiAqIFdyaXRlcyBwcm90bzMgbWVzc2FnZXMgaW4gY2Fub25pY2FsIEpTT04gZm9ybWF0IHVzaW5nIHJlZmxlY3Rpb25cbiAqIGluZm9ybWF0aW9uLlxuICpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICovXG5leHBvcnQgY2xhc3MgUmVmbGVjdGlvbkpzb25Xcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IChfYSA9IGluZm8uZmllbGRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIG1lc3NhZ2UgdG8gYSBKU09OIG9iamVjdCwgYmFzZWQgb24gdGhlIGZpZWxkIGRlc2NyaXB0b3JzLlxuICAgICAqL1xuICAgIHdyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QganNvbiA9IHt9LCBzb3VyY2UgPSBtZXNzYWdlO1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICAvLyBmaWVsZCBpcyBub3QgcGFydCBvZiBhIG9uZW9mLCBzaW1wbHkgd3JpdGUgYXMgaXNcbiAgICAgICAgICAgIGlmICghZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICBsZXQganNvblZhbHVlID0gdGhpcy5maWVsZChmaWVsZCwgc291cmNlW2ZpZWxkLmxvY2FsTmFtZV0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAganNvbltvcHRpb25zLnVzZVByb3RvRmllbGROYW1lID8gZmllbGQubmFtZSA6IGZpZWxkLmpzb25OYW1lXSA9IGpzb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZpZWxkIGlzIHBhcnQgb2YgYSBvbmVvZlxuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBzb3VyY2VbZmllbGQub25lb2ZdO1xuICAgICAgICAgICAgaWYgKGdyb3VwLm9uZW9mS2luZCAhPT0gZmllbGQubG9jYWxOYW1lKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3Qgc2VsZWN0ZWQsIHNraXBcbiAgICAgICAgICAgIGNvbnN0IG9wdCA9IGZpZWxkLmtpbmQgPT0gJ3NjYWxhcicgfHwgZmllbGQua2luZCA9PSAnZW51bSdcbiAgICAgICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgZW1pdERlZmF1bHRWYWx1ZXM6IHRydWUgfSkgOiBvcHRpb25zO1xuICAgICAgICAgICAgbGV0IGpzb25WYWx1ZSA9IHRoaXMuZmllbGQoZmllbGQsIGdyb3VwW2ZpZWxkLmxvY2FsTmFtZV0sIG9wdCk7XG4gICAgICAgICAgICBhc3NlcnQoanNvblZhbHVlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAganNvbltvcHRpb25zLnVzZVByb3RvRmllbGROYW1lID8gZmllbGQubmFtZSA6IGZpZWxkLmpzb25OYW1lXSA9IGpzb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgZmllbGQoZmllbGQsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBqc29uVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChmaWVsZC5raW5kID09ICdtYXAnKSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpO1xuICAgICAgICAgICAgY29uc3QganNvbk9iaiA9IHt9O1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2VudHJ5S2V5LCBlbnRyeVZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuc2NhbGFyKGZpZWxkLlYuVCwgZW50cnlWYWx1ZSwgZmllbGQubmFtZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25PYmpbZW50cnlLZXkudG9TdHJpbmcoKV0gPSB2YWw7IC8vIEpTT04gc3RhbmRhcmQgYWxsb3dzIG9ubHkgKGRvdWJsZSBxdW90ZWQpIHN0cmluZyBhcyBwcm9wZXJ0eSBrZXlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IGZpZWxkLlYuVCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtlbnRyeUtleSwgZW50cnlWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1lc3NhZ2UobWVzc2FnZVR5cGUsIGVudHJ5VmFsdWUsIGZpZWxkLm5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25PYmpbZW50cnlLZXkudG9TdHJpbmcoKV0gPSB2YWw7IC8vIEpTT04gc3RhbmRhcmQgYWxsb3dzIG9ubHkgKGRvdWJsZSBxdW90ZWQpIHN0cmluZyBhcyBwcm9wZXJ0eSBrZXlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtSW5mbyA9IGZpZWxkLlYuVCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtlbnRyeUtleSwgZW50cnlWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZW50cnlWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBlbnRyeVZhbHVlID09ICdudW1iZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZW51bShlbnVtSW5mbywgZW50cnlWYWx1ZSwgZmllbGQubmFtZSwgZmFsc2UsIHRydWUsIG9wdGlvbnMuZW51bUFzSW50ZWdlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbk9ialtlbnRyeUtleS50b1N0cmluZygpXSA9IHZhbDsgLy8gSlNPTiBzdGFuZGFyZCBhbGxvd3Mgb25seSAoZG91YmxlIHF1b3RlZCkgc3RyaW5nIGFzIHByb3BlcnR5IGtleVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMgfHwgT2JqZWN0LmtleXMoanNvbk9iaikubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSBqc29uT2JqO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpZWxkLnJlcGVhdCkge1xuICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICAgIGNvbnN0IGpzb25BcnIgPSBbXTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5zY2FsYXIoZmllbGQuVCwgdmFsdWVbaV0sIGZpZWxkLm5hbWUsIGZpZWxkLm9wdCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbkFyci5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bUluZm8gPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWx1ZVtpXSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZVtpXSA9PSAnbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmVudW0oZW51bUluZm8sIHZhbHVlW2ldLCBmaWVsZC5uYW1lLCBmaWVsZC5vcHQsIHRydWUsIG9wdGlvbnMuZW51bUFzSW50ZWdlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbkFyci5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubWVzc2FnZShtZXNzYWdlVHlwZSwgdmFsdWVbaV0sIGZpZWxkLm5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25BcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIGNvbnZlcnRlZCBhcnJheSB0byBqc29uIG91dHB1dFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMgfHwganNvbkFyci5sZW5ndGggPiAwIHx8IG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMpXG4gICAgICAgICAgICAgICAganNvblZhbHVlID0ganNvbkFycjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAganNvblZhbHVlID0gdGhpcy5zY2FsYXIoZmllbGQuVCwgdmFsdWUsIGZpZWxkLm5hbWUsIGZpZWxkLm9wdCwgb3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IHRoaXMuZW51bShmaWVsZC5UKCksIHZhbHVlLCBmaWVsZC5uYW1lLCBmaWVsZC5vcHQsIG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMsIG9wdGlvbnMuZW51bUFzSW50ZWdlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IHRoaXMubWVzc2FnZShmaWVsZC5UKCksIHZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb25WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgbnVsbGAgYXMgdGhlIGRlZmF1bHQgZm9yIGdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUuXG4gICAgICovXG4gICAgZW51bSh0eXBlLCB2YWx1ZSwgZmllbGROYW1lLCBvcHRpb25hbCwgZW1pdERlZmF1bHRWYWx1ZXMsIGVudW1Bc0ludGVnZXIpIHtcbiAgICAgICAgaWYgKHR5cGVbMF0gPT0gJ2dvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUnKVxuICAgICAgICAgICAgcmV0dXJuICFlbWl0RGVmYXVsdFZhbHVlcyAmJiAhb3B0aW9uYWwgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSAwICYmICFlbWl0RGVmYXVsdFZhbHVlcyAmJiAhb3B0aW9uYWwpXG4gICAgICAgICAgICAvLyB3ZSByZXF1aXJlIDAgdG8gYmUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIGVudW1zXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInKTtcbiAgICAgICAgYXNzZXJ0KE51bWJlci5pc0ludGVnZXIodmFsdWUpKTtcbiAgICAgICAgaWYgKGVudW1Bc0ludGVnZXIgfHwgIXR5cGVbMV0uaGFzT3duUHJvcGVydHkodmFsdWUpKVxuICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3Qgbm93IHRoZSBlbnVtIHZhbHVlLCBqdXN0IHJldHVybiB0aGUgbnVtYmVyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlWzJdKVxuICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgZHJvcHBlZCBwcmVmaXhcbiAgICAgICAgICAgIHJldHVybiB0eXBlWzJdICsgdHlwZVsxXVt2YWx1ZV07XG4gICAgICAgIHJldHVybiB0eXBlWzFdW3ZhbHVlXTtcbiAgICB9XG4gICAgbWVzc2FnZSh0eXBlLCB2YWx1ZSwgZmllbGROYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMgPyBudWxsIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdHlwZS5pbnRlcm5hbEpzb25Xcml0ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHNjYWxhcih0eXBlLCB2YWx1ZSwgZmllbGROYW1lLCBvcHRpb25hbCwgZW1pdERlZmF1bHRWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydChvcHRpb25hbCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVkID0gZW1pdERlZmF1bHRWYWx1ZXMgfHwgb3B0aW9uYWw7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAvLyBpbnQzMiwgZml4ZWQzMiwgdWludDMyOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIG51bWJlci4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnRJbnQzMih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnRVSW50MzIodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGZsb2F0LCBkb3VibGU6IEpTT04gdmFsdWUgd2lsbCBiZSBhIG51bWJlciBvciBvbmUgb2YgdGhlIHNwZWNpYWwgc3RyaW5nIHZhbHVlcyBcIk5hTlwiLCBcIkluZmluaXR5XCIsIGFuZCBcIi1JbmZpbml0eVwiLlxuICAgICAgICAgICAgLy8gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuIEV4cG9uZW50IG5vdGF0aW9uIGlzIGFsc28gYWNjZXB0ZWQuXG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0RmxvYXQzMih2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInKTtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdOYU4nO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0luZmluaXR5JztcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICctSW5maW5pdHknO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vIHN0cmluZzpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAvLyBib29sOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnYm9vbGVhbicpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vIEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgc3RyaW5nLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ2JpZ2ludCcpO1xuICAgICAgICAgICAgICAgIGxldCB1bG9uZyA9IFBiVUxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHVsb25nLmlzWmVybygpICYmICFlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdWxvbmcudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgc3RyaW5nLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09ICdiaWdpbnQnKTtcbiAgICAgICAgICAgICAgICBsZXQgbG9uZyA9IFBiTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAobG9uZy5pc1plcm8oKSAmJiAhZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIGJ5dGVzOiBKU09OIHZhbHVlIHdpbGwgYmUgdGhlIGRhdGEgZW5jb2RlZCBhcyBhIHN0cmluZyB1c2luZyBzdGFuZGFyZCBiYXNlNjQgZW5jb2Rpbmcgd2l0aCBwYWRkaW5ncy5cbiAgICAgICAgICAgIC8vIEVpdGhlciBzdGFuZGFyZCBvciBVUkwtc2FmZSBiYXNlNjQgZW5jb2Rpbmcgd2l0aC93aXRob3V0IHBhZGRpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICBhc3NlcnQodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IFwiXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NGVuY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBMb25nVHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbkxvbmdDb252ZXJ0IH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1sb25nLWNvbnZlcnRcIjtcbmltcG9ydCB7IFBiTG9uZywgUGJVTG9uZyB9IGZyb20gXCIuL3BiLWxvbmdcIjtcbi8qKlxuICogQ3JlYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBzY2FsYXIgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0KHR5cGUsIGxvbmdUeXBlID0gTG9uZ1R5cGUuU1RSSU5HKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJVTG9uZy5aRVJPLCBsb25nVHlwZSk7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDY0OlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYkxvbmcuWkVSTywgbG9uZ1R5cGUpO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyLCBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IExvbmdUeXBlLCBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTG9uZ0NvbnZlcnQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWxvbmctY29udmVydFwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvblNjYWxhckRlZmF1bHQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0XCI7XG4vKipcbiAqIFJlYWRzIHByb3RvMyBtZXNzYWdlcyBpbiBiaW5hcnkgZm9ybWF0IHVzaW5nIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgfVxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkTm9Ub0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IChfYSA9IHRoaXMuaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZE5vVG9GaWVsZCA9IG5ldyBNYXAoZmllbGRzSW5wdXQubWFwKGZpZWxkID0+IFtmaWVsZC5ubywgZmllbGRdKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBtZXNzYWdlIGZyb20gYmluYXJ5IGZvcm1hdCBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFJlcGVhdGVkIGZpZWxkcyBhcmUgYXBwZW5kZWQuIE1hcCBlbnRyaWVzIGFyZSBhZGRlZCwgb3ZlcndyaXRpbmdcbiAgICAgKiBleGlzdGluZyBrZXlzLlxuICAgICAqXG4gICAgICogSWYgYSBtZXNzYWdlIGZpZWxkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGVcbiAgICAgKiBuZXcgZGF0YS5cbiAgICAgKi9cbiAgICByZWFkKHJlYWRlciwgbWVzc2FnZSwgb3B0aW9ucywgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBjb25zdCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgLy8gcmVhZCB0aGUgdGFnIGFuZCBmaW5kIHRoZSBmaWVsZFxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKSwgZmllbGQgPSB0aGlzLmZpZWxkTm9Ub0ZpZWxkLmdldChmaWVsZE5vKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMuaW5mby50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLmluZm8udHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRhcmdldCBvYmplY3QgZm9yIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZ1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IG1lc3NhZ2UsIHJlcGVhdGVkID0gZmllbGQucmVwZWF0LCBsb2NhbE5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgICAgICAvLyBpZiBmaWVsZCBpcyBtZW1iZXIgb2Ygb25lb2YgQURULCB1c2UgQURUIGFzIHRhcmdldFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgICAgICAvLyBpZiBvdGhlciBvbmVvZiBtZW1iZXIgc2VsZWN0ZWQsIHNldCBuZXcgQURUXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5vbmVvZktpbmQgIT09IGxvY2FsTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWVzc2FnZVtmaWVsZC5vbmVvZl0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmVvZktpbmQ6IGxvY2FsTmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBoYW5kbGVkIG9uZW9mIGFib3ZlLCB3ZSBqdXN0IGhhdmUgcmVhZCB0aGUgdmFsdWUgaW50byBgdGFyZ2V0W2xvY2FsTmFtZV1gXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5raW5kID09IFwiZW51bVwiID8gU2NhbGFyVHlwZS5JTlQzMiA6IGZpZWxkLlQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBMID0gZmllbGQua2luZCA9PSBcInNjYWxhclwiID8gZmllbGQuTCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGFyZ2V0W2xvY2FsTmFtZV07IC8vIHNhZmUgdG8gYXNzdW1lIHByZXNlbmNlIG9mIGFycmF5LCBvbmVvZiBjYW5ub3QgY29udGFpbiByZXBlYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aXJlVHlwZSA9PSBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQgJiYgVCAhPSBTY2FsYXJUeXBlLlNUUklORyAmJiBUICE9IFNjYWxhclR5cGUuQllURVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLnNjYWxhcihyZWFkZXIsIFQsIEwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLnNjYWxhcihyZWFkZXIsIFQsIEwpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IHRoaXMuc2NhbGFyKHJlYWRlciwgVCwgTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyciA9IHRhcmdldFtsb2NhbE5hbWVdOyAvLyBzYWZlIHRvIGFzc3VtZSBwcmVzZW5jZSBvZiBhcnJheSwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gZmllbGQuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChtc2cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gZmllbGQuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgdGFyZ2V0W2xvY2FsTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgIGxldCBbbWFwS2V5LCBtYXBWYWxdID0gdGhpcy5tYXBFbnRyeShmaWVsZCwgcmVhZGVyLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2FmZSB0byBhc3N1bWUgcHJlc2VuY2Ugb2YgbWFwIG9iamVjdCwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdW21hcEtleV0gPSBtYXBWYWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBtYXAgZmllbGQsIGV4cGVjdGluZyBrZXkgZmllbGQgPSAxLCB2YWx1ZSBmaWVsZCA9IDJcbiAgICAgKi9cbiAgICBtYXBFbnRyeShmaWVsZCwgcmVhZGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsZW5ndGggPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgIGxldCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBsZXQga2V5ID0gdW5kZWZpbmVkOyAvLyBqYXZhc2NyaXB0IG9ubHkgYWxsb3dzIG51bWJlciBvciBzdHJpbmcgZm9yIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgIGxldCB2YWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MKVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcmVhZGVyLmJvb2woKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb25nIHR5cGVzIGFyZSByZWFkIGFzIHN0cmluZywgbnVtYmVyIHR5cGVzIGFyZSBva2F5IGFzIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5zY2FsYXIocmVhZGVyLCBmaWVsZC5LLCBMb25nVHlwZS5TVFJJTkcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5zY2FsYXIocmVhZGVyLCBmaWVsZC5WLlQsIGZpZWxkLlYuTCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5WLlQoKS5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGluIG1hcCBlbnRyeSBmb3IgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGQubmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBrZXlSYXcgPSByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdChmaWVsZC5LKTtcbiAgICAgICAgICAgIGtleSA9IGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MID8ga2V5UmF3LnRvU3RyaW5nKCkgOiBrZXlSYXc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0KGZpZWxkLlYuVCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gZmllbGQuVi5UKCkuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgdmFsXTtcbiAgICB9XG4gICAgc2NhbGFyKHJlYWRlciwgdHlwZSwgbG9uZ1R5cGUpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuZG91YmxlKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChyZWFkZXIudWludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmZpeGVkNjQoKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5maXhlZDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ZpeGVkMzIoKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KHJlYWRlci5zZml4ZWQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ludDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLnNpbnQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyLCBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IFJlcGVhdFR5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuL2Fzc2VydFwiO1xuaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuLyoqXG4gKiBXcml0ZXMgcHJvdG8zIG1lc3NhZ2VzIGluIGJpbmFyeSBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2RpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25CaW5hcnlXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzSW5wdXQgPSB0aGlzLmluZm8uZmllbGRzID8gdGhpcy5pbmZvLmZpZWxkcy5jb25jYXQoKSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHNJbnB1dC5zb3J0KChhLCBiKSA9PiBhLm5vIC0gYi5ubyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQuXG4gICAgICovXG4gICAgd3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUsIC8vIHRoaXMgd2lsbCBiZSBvdXIgZmllbGQgdmFsdWUsIHdoZXRoZXIgaXQgaXMgbWVtYmVyIG9mIGEgb25lb2Ygb3Igbm90XG4gICAgICAgICAgICBlbWl0RGVmYXVsdCwgLy8gd2hldGhlciB3ZSBlbWl0IHRoZSBkZWZhdWx0IHZhbHVlIChvbmx5IHRydWUgZm9yIG9uZW9mIG1lbWJlcnMpXG4gICAgICAgICAgICByZXBlYXRlZCA9IGZpZWxkLnJlcGVhdCwgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gaGFuZGxlIG9uZW9mIEFEVFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBtZXNzYWdlW2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kICE9PSBsb2NhbE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZiBmaWVsZCBpcyBub3Qgc2VsZWN0ZWQsIHNraXBcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdyb3VwW2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgZW1pdERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBtZXNzYWdlW2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgZW1pdERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGhhdmUgaGFuZGxlZCBvbmVvZiBhYm92ZS4gd2UganVzdCBoYXZlIHRvIGhvbm9yIGBlbWl0RGVmYXVsdGAuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5raW5kID09IFwiZW51bVwiID8gU2NhbGFyVHlwZS5JTlQzMiA6IGZpZWxkLlQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCA9PSBSZXBlYXRUeXBlLlBBQ0tFRClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhY2tlZCh3cml0ZXIsIFQsIGZpZWxkLm5vLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIFQsIGZpZWxkLm5vLCBpdGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZpZWxkLm9wdCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgVCwgZmllbGQubm8sIHZhbHVlLCBlbWl0RGVmYXVsdCB8fCBmaWVsZC5vcHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKHdyaXRlciwgb3B0aW9ucywgZmllbGQuVCgpLCBmaWVsZC5ubywgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5UKCksIGZpZWxkLm5vLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMuaW5mby50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICB9XG4gICAgbWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWx1ZSkge1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkLm5vLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpO1xuICAgICAgICB3cml0ZXIuZm9yaygpO1xuICAgICAgICAvLyBqYXZhc2NyaXB0IG9ubHkgYWxsb3dzIG51bWJlciBvciBzdHJpbmcgZm9yIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIHdlIGNvbnZlcnQgZnJvbSBvdXIgcmVwcmVzZW50YXRpb24gdG8gdGhlIHByb3RvYnVmIHR5cGVcbiAgICAgICAgbGV0IGtleVZhbHVlID0ga2V5O1xuICAgICAgICBzd2l0Y2ggKGZpZWxkLkspIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAga2V5VmFsdWUgPSBOdW1iZXIucGFyc2VJbnQoa2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGFzc2VydChrZXkgPT0gJ3RydWUnIHx8IGtleSA9PSAnZmFsc2UnKTtcbiAgICAgICAgICAgICAgICBrZXlWYWx1ZSA9IGtleSA9PSAndHJ1ZSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd3JpdGUga2V5LCBleHBlY3Rpbmcga2V5IGZpZWxkIG51bWJlciA9IDFcbiAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBmaWVsZC5LLCAxLCBrZXlWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlLCBleHBlY3RpbmcgdmFsdWUgZmllbGQgbnVtYmVyID0gMlxuICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIGZpZWxkLlYuVCwgMiwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBTY2FsYXJUeXBlLklOVDMyLCAyLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5WLlQoKSwgMiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIG1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBoYW5kbGVyLCBmaWVsZE5vLCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaGFuZGxlci5pbnRlcm5hbEJpbmFyeVdyaXRlKHZhbHVlLCB3cml0ZXIudGFnKGZpZWxkTm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKTtcbiAgICAgICAgd3JpdGVyLmpvaW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBzaW5nbGUgc2NhbGFyIHZhbHVlLlxuICAgICAqL1xuICAgIHNjYWxhcih3cml0ZXIsIHR5cGUsIGZpZWxkTm8sIHZhbHVlLCBlbWl0RGVmYXVsdCkge1xuICAgICAgICBsZXQgW3dpcmVUeXBlLCBtZXRob2QsIGlzRGVmYXVsdF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVmYXVsdCB8fCBlbWl0RGVmYXVsdCkge1xuICAgICAgICAgICAgd3JpdGVyLnRhZyhmaWVsZE5vLCB3aXJlVHlwZSk7XG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYW4gYXJyYXkgb2Ygc2NhbGFyIHZhbHVlcyBpbiBwYWNrZWQgZm9ybWF0LlxuICAgICAqL1xuICAgIHBhY2tlZCh3cml0ZXIsIHR5cGUsIGZpZWxkTm8sIHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBhc3NlcnQodHlwZSAhPT0gU2NhbGFyVHlwZS5CWVRFUyAmJiB0eXBlICE9PSBTY2FsYXJUeXBlLlNUUklORyk7XG4gICAgICAgIC8vIHdyaXRlIHRhZ1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkTm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7XG4gICAgICAgIC8vIGJlZ2luIGxlbmd0aC1kZWxpbWl0ZWRcbiAgICAgICAgd3JpdGVyLmZvcmsoKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWVzIHdpdGhvdXQgdGFnc1xuICAgICAgICBsZXQgWywgbWV0aG9kLF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZVtpXSk7XG4gICAgICAgIC8vIGVuZCBsZW5ndGggZGVsaW1pdGVkXG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBpbmZvcm1hdGlvbiBmb3Igd3JpdGluZyBhIHNjYWxhciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdHVwbGU6XG4gICAgICogWzBdOiBhcHByb3ByaWF0ZSBXaXJlVHlwZVxuICAgICAqIFsxXTogbmFtZSBvZiB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIG9mIElCaW5hcnlXcml0ZXJcbiAgICAgKiBbMl06IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGVmYXVsdCB2YWx1ZVxuICAgICAqXG4gICAgICogSWYgYXJndW1lbnQgYHZhbHVlYCBpcyBvbWl0dGVkLCBbMl0gaXMgYWx3YXlzIGZhbHNlLlxuICAgICAqL1xuICAgIHNjYWxhckluZm8odHlwZSwgdmFsdWUpIHtcbiAgICAgICAgbGV0IHQgPSBXaXJlVHlwZS5WYXJpbnQ7XG4gICAgICAgIGxldCBtO1xuICAgICAgICBsZXQgaSA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkID0gdmFsdWUgPT09IDA7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIG0gPSBcImludDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8ICF2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDtcbiAgICAgICAgICAgICAgICBtID0gXCJzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGQgPSB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbSA9IFwiYm9vbFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJ1aW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDY0O1xuICAgICAgICAgICAgICAgIG0gPSBcImRvdWJsZVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQzMjtcbiAgICAgICAgICAgICAgICBtID0gXCJmbG9hdFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8IFBiTG9uZy5mcm9tKHZhbHVlKS5pc1plcm8oKTtcbiAgICAgICAgICAgICAgICBtID0gXCJpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBQYlVMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInVpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJVTG9uZy5mcm9tKHZhbHVlKS5pc1plcm8oKTtcbiAgICAgICAgICAgICAgICB0ID0gV2lyZVR5cGUuQml0NjQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiZml4ZWQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8ICF2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiYnl0ZXNcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQzMjtcbiAgICAgICAgICAgICAgICBtID0gXCJmaXhlZDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDMyO1xuICAgICAgICAgICAgICAgIG0gPSBcInNmaXhlZDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQ2NDtcbiAgICAgICAgICAgICAgICBtID0gXCJzZml4ZWQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJzaW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInNpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdCwgbSwgaSB8fCBkXTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tc2NhbGFyLWRlZmF1bHRcIjtcbmltcG9ydCB7IE1FU1NBR0VfVFlQRSB9IGZyb20gJy4vbWVzc2FnZS10eXBlLWNvbnRyYWN0Jztcbi8qKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2VuZXJpYyBtZXNzYWdlLCB1c2luZyB0aGUgZmllbGRcbiAqIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdGlvbkNyZWF0ZSh0eXBlKSB7XG4gICAgLyoqXG4gICAgICogVGhpcyB0ZXJuYXJ5IGNhbiBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uXG4gICAgICogVGhlIGBPYmplY3QuY3JlYXRlKClgIGNvZGUgcGF0aCB1dGlsaXplcyBhIG5ldyBgbWVzc2FnZVByb3RvdHlwZWBcbiAgICAgKiBwcm9wZXJ0eSBvbiB0aGUgYElNZXNzYWdlVHlwZWAgd2hpY2ggaGFzIHRoaXMgc2FtZSBgTUVTU0FHRV9UWVBFYFxuICAgICAqIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIGl0LiBEb2luZyBpdCB0aGlzIHdheSBtZWFucyB0aGF0IHdlIG9ubHlcbiAgICAgKiBwYXkgdGhlIGNvc3Qgb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCBvbmNlIHBlciBgSU1lc3NhZ2VUeXBlYFxuICAgICAqIGNsYXNzIG9mIG9uY2UgcGVyIFwiaW5zdGFuY2VcIi4gVGhlIGZhbHN5IGNvZGUgcGF0aCBpcyBvbmx5IHByb3ZpZGVkXG4gICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGluIGNhc2VzIHdoZXJlIHRoZSBydW50aW1lIGxpYnJhcnkgaXNcbiAgICAgKiB1cGRhdGVkIHdpdGhvdXQgYWxzbyB1cGRhdGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4gICAgICovXG4gICAgY29uc3QgbXNnID0gdHlwZS5tZXNzYWdlUHJvdG90eXBlXG4gICAgICAgID8gT2JqZWN0LmNyZWF0ZSh0eXBlLm1lc3NhZ2VQcm90b3R5cGUpXG4gICAgICAgIDogT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCBNRVNTQUdFX1RZUEUsIHsgdmFsdWU6IHR5cGUgfSk7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgdHlwZS5maWVsZHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgIGlmIChmaWVsZC5vcHQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGZpZWxkLm9uZW9mKVxuICAgICAgICAgICAgbXNnW2ZpZWxkLm9uZW9mXSA9IHsgb25lb2ZLaW5kOiB1bmRlZmluZWQgfTtcbiAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgbXNnW25hbWVdID0gW107XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgbXNnW25hbWVdID0gcmVmbGVjdGlvblNjYWxhckRlZmF1bHQoZmllbGQuVCwgZmllbGQuTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlcXVpcmUgMCB0byBiZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZW51bXNcbiAgICAgICAgICAgICAgICAgICAgbXNnW25hbWVdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICBtc2dbbmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtc2c7XG59XG4iLCIvKipcbiAqIENvcHkgcGFydGlhbCBkYXRhIGludG8gdGhlIHRhcmdldCBtZXNzYWdlLlxuICpcbiAqIElmIGEgc2luZ3VsYXIgc2NhbGFyIG9yIGVudW0gZmllbGQgaXMgcHJlc2VudCBpbiB0aGUgc291cmNlLCBpdFxuICogcmVwbGFjZXMgdGhlIGZpZWxkIGluIHRoZSB0YXJnZXQuXG4gKlxuICogSWYgYSBzaW5ndWxhciBtZXNzYWdlIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXQgaXMgbWVyZ2VkXG4gKiB3aXRoIHRoZSB0YXJnZXQgZmllbGQgYnkgY2FsbGluZyBtZXJnZVBhcnRpYWwoKSBvZiB0aGUgcmVzcG9uc2libGVcbiAqIG1lc3NhZ2UgdHlwZS5cbiAqXG4gKiBJZiBhIHJlcGVhdGVkIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXRzIHZhbHVlcyByZXBsYWNlXG4gKiBhbGwgdmFsdWVzIGluIHRoZSB0YXJnZXQgYXJyYXksIHJlbW92aW5nIGV4dHJhbmVvdXMgdmFsdWVzLlxuICogUmVwZWF0ZWQgbWVzc2FnZSBmaWVsZHMgYXJlIGNvcGllZCwgbm90IG1lcmdlZC5cbiAqXG4gKiBJZiBhIG1hcCBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZVxuICogdGFyZ2V0IG1hcCwgcmVwbGFjaW5nIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBrZXkuIEVudHJpZXMgdGhhdCBvbmx5XG4gKiBleGlzdCBpbiB0aGUgdGFyZ2V0IHJlbWFpbi4gRW50cmllcyB3aXRoIG1lc3NhZ2UgdmFsdWVzIGFyZSBjb3BpZWQsXG4gKiBub3QgbWVyZ2VkLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSBwcm90b2J1ZiBtZXJnZSBzZW1hbnRpY3MsXG4gKiB3aGljaCBhcHBlbmRzIHJlcGVhdGVkIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwoaW5mbywgdGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBsZXQgZmllbGRWYWx1ZSwgLy8gdGhlIGZpZWxkIHZhbHVlIHdlIGFyZSB3b3JraW5nIHdpdGhcbiAgICBpbnB1dCA9IHNvdXJjZSwgb3V0cHV0OyAvLyB3aGVyZSB3ZSB3YW50IG91ciBmaWVsZCB2YWx1ZSB0byBnb1xuICAgIGZvciAobGV0IGZpZWxkIG9mIGluZm8uZmllbGRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gaW5wdXRbZmllbGQub25lb2ZdOyAvLyB0aGlzIGlzIHRoZSBvbmVvZmBzIGdyb3VwIGluIHRoZSBzb3VyY2VcbiAgICAgICAgICAgIGlmICgoZ3JvdXAgPT09IG51bGwgfHwgZ3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdyb3VwLm9uZW9mS2luZCkgPT0gdW5kZWZpbmVkKSB7IC8vIHRoZSB1c2VyIGlzIGZyZWUgdG8gb21pdFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB3ZSBza2lwIHRoaXMgZmllbGQsIGFuZCBhbGwgb3RoZXIgbWVtYmVycyB0b29cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBncm91cFtuYW1lXTsgLy8gb3VyIHZhbHVlIGNvbWVzIGZyb20gdGhlIHRoZSBvbmVvZiBncm91cCBvZiB0aGUgc291cmNlXG4gICAgICAgICAgICBvdXRwdXQgPSB0YXJnZXRbZmllbGQub25lb2ZdOyAvLyBhbmQgb3VyIG91dHB1dCBpcyB0aGUgb25lb2YgZ3JvdXAgb2YgdGhlIHRhcmdldFxuICAgICAgICAgICAgb3V0cHV0Lm9uZW9mS2luZCA9IGdyb3VwLm9uZW9mS2luZDsgLy8gYWx3YXlzIHVwZGF0ZSBkaXNjcmltaW5hdG9yXG4gICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgb3V0cHV0W25hbWVdOyAvLyByZW1vdmUgYW55IGV4aXN0aW5nIHZhbHVlXG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZnVydGhlciB3b3JrIG9uIGZpZWxkXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gaW5wdXRbbmFtZV07IC8vIHdlIGFyZSB1c2luZyB0aGUgc291cmNlIGRpcmVjdGx5XG4gICAgICAgICAgICBvdXRwdXQgPSB0YXJnZXQ7IC8vIHdlIHdhbnQgb3VyIGZpZWxkIHZhbHVlIHRvIGdvIGRpcmVjdGx5IGludG8gdGhlIHRhcmdldFxuICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZnVydGhlciB3b3JrIG9uIGZpZWxkLCBleGlzdGluZyB2YWx1ZSBpcyB1c2VkIGFzIGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgIG91dHB1dFtuYW1lXS5sZW5ndGggPSBmaWVsZFZhbHVlLmxlbmd0aDsgLy8gcmVzaXplIHRhcmdldCBhcnJheSB0byBtYXRjaCBzb3VyY2UgYXJyYXlcbiAgICAgICAgLy8gbm93IHdlIGp1c3Qgd29yayB3aXRoIGBmaWVsZFZhbHVlYCBhbmQgYG91dHB1dGAgdG8gbWVyZ2UgdGhlIHZhbHVlXG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkVmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmFtZV1baV0gPSBmaWVsZFZhbHVlW2ldOyAvLyBub3QgYSByZWZlcmVuY2UgdHlwZVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdID0gZmllbGRWYWx1ZTsgLy8gbm90IGEgcmVmZXJlbmNlIHR5cGVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2ldID0gVC5jcmVhdGUoZmllbGRWYWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3V0cHV0W25hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IFQuY3JlYXRlKGZpZWxkVmFsdWUpOyAvLyBub3RoaW5nIHRvIG1lcmdlIHdpdGhcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIFQubWVyZ2VQYXJ0aWFsKG91dHB1dFtuYW1lXSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgLy8gTWFwIGFuZCByZXBlYXRlZCBmaWVsZHMgYXJlIHNpbXBseSBvdmVyd3JpdHRlbiwgbm90IGFwcGVuZGVkIG9yIG1lcmdlZFxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0W25hbWVdLCBmaWVsZFZhbHVlKTsgLy8gZWxlbWVudHMgYXJlIG5vdCByZWZlcmVuY2UgdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5WLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmtleXMoZmllbGRWYWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2tdID0gVC5jcmVhdGUoZmllbGRWYWx1ZVtrXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGhhdmUgdGhlIHNhbWUgZmllbGQgdmFsdWVzLlxuICogQ2hlY2tzIGZvciBkZWVwIGVxdWFsaXR5LCB0cmF2ZXJzaW5nIHJlcGVhdGVkIGZpZWxkcywgb25lb2YgZ3JvdXBzLCBtYXBzXG4gKiBhbmQgbWVzc2FnZXMgcmVjdXJzaXZlbHkuXG4gKiBXaWxsIGFsc28gcmV0dXJuIHRydWUgaWYgYm90aCBtZXNzYWdlcyBhcmUgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uRXF1YWxzKGluZm8sIGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFhIHx8ICFiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgaW5mby5maWVsZHMpIHtcbiAgICAgICAgbGV0IGxvY2FsTmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgbGV0IHZhbF9hID0gZmllbGQub25lb2YgPyBhW2ZpZWxkLm9uZW9mXVtsb2NhbE5hbWVdIDogYVtsb2NhbE5hbWVdO1xuICAgICAgICBsZXQgdmFsX2IgPSBmaWVsZC5vbmVvZiA/IGJbZmllbGQub25lb2ZdW2xvY2FsTmFtZV0gOiBiW2xvY2FsTmFtZV07XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGZpZWxkLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVDtcbiAgICAgICAgICAgICAgICBpZiAoIShmaWVsZC5yZXBlYXRcbiAgICAgICAgICAgICAgICAgICAgPyByZXBlYXRlZFByaW1pdGl2ZUVxKHQsIHZhbF9hLCB2YWxfYilcbiAgICAgICAgICAgICAgICAgICAgOiBwcmltaXRpdmVFcSh0LCB2YWxfYSwgdmFsX2IpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIGlmICghKGZpZWxkLlYua2luZCA9PSBcIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlcGVhdGVkTXNnRXEoZmllbGQuVi5UKCksIG9iamVjdFZhbHVlcyh2YWxfYSksIG9iamVjdFZhbHVlcyh2YWxfYikpXG4gICAgICAgICAgICAgICAgICAgIDogcmVwZWF0ZWRQcmltaXRpdmVFcShmaWVsZC5WLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVi5ULCBvYmplY3RWYWx1ZXModmFsX2EpLCBvYmplY3RWYWx1ZXModmFsX2IpKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZmllbGQucmVwZWF0XG4gICAgICAgICAgICAgICAgICAgID8gcmVwZWF0ZWRNc2dFcShULCB2YWxfYSwgdmFsX2IpXG4gICAgICAgICAgICAgICAgICAgIDogVC5lcXVhbHModmFsX2EsIHZhbF9iKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IG9iamVjdFZhbHVlcyA9IE9iamVjdC52YWx1ZXM7XG5mdW5jdGlvbiBwcmltaXRpdmVFcSh0eXBlLCBhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0eXBlICE9PSBTY2FsYXJUeXBlLkJZVEVTKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGJhID0gYTtcbiAgICBsZXQgYmIgPSBiO1xuICAgIGlmIChiYS5sZW5ndGggIT09IGJiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChiYVtpXSAhPSBiYltpXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlcGVhdGVkUHJpbWl0aXZlRXEodHlwZSwgYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghcHJpbWl0aXZlRXEodHlwZSwgYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXBlYXRlZE1zZ0VxKHR5cGUsIGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIXR5cGUuZXF1YWxzKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgTUVTU0FHRV9UWVBFIH0gZnJvbSBcIi4vbWVzc2FnZS10eXBlLWNvbnRyYWN0XCI7XG5pbXBvcnQgeyBub3JtYWxpemVGaWVsZEluZm8gfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25UeXBlQ2hlY2sgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLXR5cGUtY2hlY2tcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25Kc29uUmVhZGVyIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1qc29uLXJlYWRlclwiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbkpzb25Xcml0ZXIgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWpzb24td3JpdGVyXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1iaW5hcnktcmVhZGVyXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uQmluYXJ5V3JpdGVyIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1iaW5hcnktd3JpdGVyXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uQ3JlYXRlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1jcmVhdGVcIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLW1lcmdlLXBhcnRpYWxcIjtcbmltcG9ydCB7IHR5cGVvZkpzb25WYWx1ZSB9IGZyb20gXCIuL2pzb24tdHlwaW5nc1wiO1xuaW1wb3J0IHsganNvblJlYWRPcHRpb25zLCBqc29uV3JpdGVPcHRpb25zLCB9IGZyb20gXCIuL2pzb24tZm9ybWF0LWNvbnRyYWN0XCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uRXF1YWxzIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1lcXVhbHNcIjtcbmltcG9ydCB7IGJpbmFyeVdyaXRlT3B0aW9ucyB9IGZyb20gXCIuL2JpbmFyeS13cml0ZXJcIjtcbmltcG9ydCB7IGJpbmFyeVJlYWRPcHRpb25zIH0gZnJvbSBcIi4vYmluYXJ5LXJlYWRlclwiO1xuY29uc3QgYmFzZURlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0LmdldFByb3RvdHlwZU9mKHt9KSk7XG4vKipcbiAqIFRoaXMgc3RhbmRhcmQgbWVzc2FnZSB0eXBlIHByb3ZpZGVzIHJlZmxlY3Rpb24tYmFzZWRcbiAqIG9wZXJhdGlvbnMgdG8gd29yayB3aXRoIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBmaWVsZHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q2hlY2tEZXB0aCA9IDE2O1xuICAgICAgICB0aGlzLnR5cGVOYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHMubWFwKG5vcm1hbGl6ZUZpZWxkSW5mbyk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuICAgICAgICB0aGlzLm1lc3NhZ2VQcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZURlc2NyaXB0b3JzKSwgeyBbTUVTU0FHRV9UWVBFXTogeyB2YWx1ZTogdGhpcyB9IH0pKTtcbiAgICAgICAgdGhpcy5yZWZUeXBlQ2hlY2sgPSBuZXcgUmVmbGVjdGlvblR5cGVDaGVjayh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZKc29uUmVhZGVyID0gbmV3IFJlZmxlY3Rpb25Kc29uUmVhZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkpzb25Xcml0ZXIgPSBuZXcgUmVmbGVjdGlvbkpzb25Xcml0ZXIodGhpcyk7XG4gICAgICAgIHRoaXMucmVmQmluUmVhZGVyID0gbmV3IFJlZmxlY3Rpb25CaW5hcnlSZWFkZXIodGhpcyk7XG4gICAgICAgIHRoaXMucmVmQmluV3JpdGVyID0gbmV3IFJlZmxlY3Rpb25CaW5hcnlXcml0ZXIodGhpcyk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHJlZmxlY3Rpb25DcmVhdGUodGhpcyk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvbmUgdGhlIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBVbmtub3duIGZpZWxkcyBhcmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGNsb25lKG1lc3NhZ2UpIHtcbiAgICAgICAgbGV0IGNvcHkgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIGNvcHksIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgaGF2ZSB0aGUgc2FtZSBmaWVsZCB2YWx1ZXMuXG4gICAgICogQ2hlY2tzIGZvciBkZWVwIGVxdWFsaXR5LCB0cmF2ZXJzaW5nIHJlcGVhdGVkIGZpZWxkcywgb25lb2YgZ3JvdXBzLCBtYXBzXG4gICAgICogYW5kIG1lc3NhZ2VzIHJlY3Vyc2l2ZWx5LlxuICAgICAqIFdpbGwgYWxzbyByZXR1cm4gdHJ1ZSBpZiBib3RoIG1lc3NhZ2VzIGFyZSBgdW5kZWZpbmVkYC5cbiAgICAgKi9cbiAgICBlcXVhbHMoYSwgYikge1xuICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkVxdWFscyh0aGlzLCBhLCBiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIGdpdmVuIHZhbHVlIGFzc2lnbmFibGUgdG8gb3VyIG1lc3NhZ2UgdHlwZVxuICAgICAqIGFuZCBjb250YWlucyBubyBbZXhjZXNzIHByb3BlcnRpZXNdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2ludGVyZmFjZXMuaHRtbCNleGNlc3MtcHJvcGVydHktY2hlY2tzKT9cbiAgICAgKi9cbiAgICBpcyhhcmcsIGRlcHRoID0gdGhpcy5kZWZhdWx0Q2hlY2tEZXB0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZUeXBlQ2hlY2suaXMoYXJnLCBkZXB0aCwgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgZ2l2ZW4gdmFsdWUgYXNzaWduYWJsZSB0byBvdXIgbWVzc2FnZSB0eXBlLFxuICAgICAqIHJlZ2FyZGxlc3Mgb2YgW2V4Y2VzcyBwcm9wZXJ0aWVzXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9pbnRlcmZhY2VzLmh0bWwjZXhjZXNzLXByb3BlcnR5LWNoZWNrcyk/XG4gICAgICovXG4gICAgaXNBc3NpZ25hYmxlKGFyZywgZGVwdGggPSB0aGlzLmRlZmF1bHRDaGVja0RlcHRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZlR5cGVDaGVjay5pcyhhcmcsIGRlcHRoLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29weSBwYXJ0aWFsIGRhdGEgaW50byB0aGUgdGFyZ2V0IG1lc3NhZ2UuXG4gICAgICovXG4gICAgbWVyZ2VQYXJ0aWFsKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgdGFyZ2V0LCBzb3VyY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgbWVzc2FnZSBmcm9tIGJpbmFyeSBmb3JtYXQuXG4gICAgICovXG4gICAgZnJvbUJpbmFyeShkYXRhLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBvcHQgPSBiaW5hcnlSZWFkT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCaW5hcnlSZWFkKG9wdC5yZWFkZXJGYWN0b3J5KGRhdGEpLCBkYXRhLmJ5dGVMZW5ndGgsIG9wdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBuZXcgbWVzc2FnZSBmcm9tIGEgSlNPTiB2YWx1ZS5cbiAgICAgKi9cbiAgICBmcm9tSnNvbihqc29uLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsSnNvblJlYWQoanNvbiwganNvblJlYWRPcHRpb25zKG9wdGlvbnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIG5ldyBtZXNzYWdlIGZyb20gYSBKU09OIHN0cmluZy5cbiAgICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYFQuZnJvbUpzb24oSlNPTi5wYXJzZShqc29uKSlgLlxuICAgICAqL1xuICAgIGZyb21Kc29uU3RyaW5nKGpzb24sIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbUpzb24odmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSB0aGUgbWVzc2FnZSB0byBjYW5vbmljYWwgSlNPTiB2YWx1ZS5cbiAgICAgKi9cbiAgICB0b0pzb24obWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBqc29uV3JpdGVPcHRpb25zKG9wdGlvbnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0aGUgbWVzc2FnZSB0byBjYW5vbmljYWwgSlNPTiBzdHJpbmcuXG4gICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBKU09OLnN0cmluZ2lmeShULnRvSnNvbih0KSlgXG4gICAgICovXG4gICAgdG9Kc29uU3RyaW5nKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnRvSnNvbihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldHR5U3BhY2VzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdC5cbiAgICAgKi9cbiAgICB0b0JpbmFyeShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBvcHQgPSBiaW5hcnlXcml0ZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgb3B0LndyaXRlckZhY3RvcnkoKSwgb3B0KS5maW5pc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QuIElmIHlvdSBqdXN0IHdhbnQgdG8gcmVhZCBhIG1lc3NhZ2UgZnJvbVxuICAgICAqIEpTT04sIHVzZSBgZnJvbUpzb24oKWAgb3IgYGZyb21Kc29uU3RyaW5nKClgLlxuICAgICAqXG4gICAgICogUmVhZHMgSlNPTiB2YWx1ZSBhbmQgbWVyZ2VzIHRoZSBmaWVsZHMgaW50byB0aGUgdGFyZ2V0XG4gICAgICogYWNjb3JkaW5nIHRvIHByb3RvYnVmIHJ1bGVzLiBJZiB0aGUgdGFyZ2V0IGlzIG9taXR0ZWQsXG4gICAgICogYSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZCBmaXJzdC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAoanNvbiAhPT0gbnVsbCAmJiB0eXBlb2YganNvbiA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnJlZkpzb25SZWFkZXIucmVhZChqc29uLCBtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG1lc3NhZ2UgJHt0aGlzLnR5cGVOYW1lfSBmcm9tIEpTT04gJHt0eXBlb2ZKc29uVmFsdWUoanNvbil9LmApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byB3cml0ZSBhIG1lc3NhZ2VcbiAgICAgKiB0byBKU09OLCB1c2UgYHRvSnNvbigpYCBvciBgdG9Kc29uU3RyaW5nKCkuXG4gICAgICpcbiAgICAgKiBXcml0ZXMgSlNPTiB2YWx1ZSBhbmQgcmV0dXJucyBpdC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZkpzb25Xcml0ZXIud3JpdGUobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLiBJZiB5b3UganVzdCB3YW50IHRvIHdyaXRlIGEgbWVzc2FnZVxuICAgICAqIGluIGJpbmFyeSBmb3JtYXQsIHVzZSBgdG9CaW5hcnkoKWAuXG4gICAgICpcbiAgICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIGluIGJpbmFyeSBmb3JtYXQgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGdpdmVuXG4gICAgICogd3JpdGVyLiBSZXR1cm5zIHBhc3NlZCB3cml0ZXIuXG4gICAgICovXG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5yZWZCaW5Xcml0ZXIud3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QuIElmIHlvdSBqdXN0IHdhbnQgdG8gcmVhZCBhIG1lc3NhZ2UgZnJvbVxuICAgICAqIGJpbmFyeSBkYXRhLCB1c2UgYGZyb21CaW5hcnkoKWAuXG4gICAgICpcbiAgICAgKiBSZWFkcyBkYXRhIGZyb20gYmluYXJ5IGZvcm1hdCBhbmQgbWVyZ2VzIHRoZSBmaWVsZHMgaW50b1xuICAgICAqIHRoZSB0YXJnZXQgYWNjb3JkaW5nIHRvIHByb3RvYnVmIHJ1bGVzLiBJZiB0aGUgdGFyZ2V0IGlzXG4gICAgICogb21pdHRlZCwgYSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZCBmaXJzdC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRoaXMucmVmQmluUmVhZGVyLnJlYWQocmVhZGVyLCBtZXNzYWdlLCBvcHRpb25zLCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBNRVNTQUdFX1RZUEUgfSBmcm9tICcuL21lc3NhZ2UtdHlwZS1jb250cmFjdCc7XG4vKipcbiAqIENoZWNrIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYSBwcm90byBtZXNzYWdlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIC0gaXQgaXMgaGVyZSB0byBzdGF5LCBidXRcbiAqIGltcGxlbWVudGF0aW9uIGRldGFpbHMgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zTWVzc2FnZVR5cGUobXNnKSB7XG4gICAgcmV0dXJuIG1zZ1tNRVNTQUdFX1RZUEVdICE9IG51bGw7XG59XG4iLCIvKipcbiAqIElzIHRoaXMgYSBsb29rdXAgb2JqZWN0IGdlbmVyYXRlZCBieSBUeXBlc2NyaXB0LCBmb3IgYSBUeXBlc2NyaXB0IGVudW1cbiAqIGdlbmVyYXRlZCBieSBwcm90b2J1Zi10cz9cbiAqXG4gKiAtIE5vIGBjb25zdCBlbnVtYCAoZW51bSBtdXN0IG5vdCBiZSBpbmxpbmVkLCB3ZSBuZWVkIHJldmVyc2UgbWFwcGluZykuXG4gKiAtIE5vIHN0cmluZyBlbnVtICh3ZSBuZWVkIGludDMyIGZvciBwcm90b2J1ZikuXG4gKiAtIE11c3QgaGF2ZSBhIHZhbHVlIGZvciAwIChvdGhlcndpc2UsIHdlIHdvdWxkIG5lZWQgdG8gc3VwcG9ydCBjdXN0b20gZGVmYXVsdCB2YWx1ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtT2JqZWN0KGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9ICdvYmplY3QnIHx8IGFyZyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXJnLmhhc093blByb3BlcnR5KDApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgayBvZiBPYmplY3Qua2V5cyhhcmcpKSB7XG4gICAgICAgIGxldCBudW0gPSBwYXJzZUludChrKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBuYW1lIGZvciB0aGUgbnVtYmVyP1xuICAgICAgICAgICAgbGV0IG5hbSA9IGFyZ1tudW1dO1xuICAgICAgICAgICAgaWYgKG5hbSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8vIGRvZXMgdGhlIG5hbWUgcmVzb2x2ZSBiYWNrIHRvIHRoZSBudW1iZXI/XG4gICAgICAgICAgICBpZiAoYXJnW25hbV0gIT09IG51bSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpcyB0aGVyZSBhIG51bWJlciBmb3IgdGhlIG5hbWU/XG4gICAgICAgICAgICBsZXQgbnVtID0gYXJnW2tdO1xuICAgICAgICAgICAgaWYgKG51bSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8vIGlzIGl0IGEgc3RyaW5nIGVudW0/XG4gICAgICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gZG8gd2Uga25vdyB0aGUgbnVtYmVyP1xuICAgICAgICAgICAgaWYgKGFyZ1tudW1dID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBMaXN0cyBhbGwgdmFsdWVzIG9mIGEgVHlwZXNjcmlwdCBlbnVtLCBhcyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggYSBcIm5hbWVcIlxuICogcHJvcGVydHkgYW5kIGEgXCJudW1iZXJcIiBwcm9wZXJ0eS5cbiAqXG4gKiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdCBhIG51bWJlciBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlLCBiZWNhdXNlIGl0IGlzXG4gKiBwb3NzaWJsZSB0byBoYXZlIGFsaWFzZXMgaW4gYW4gZW51bS5cbiAqXG4gKiBUaHJvd3MgaWYgdGhlIGVudW0gZG9lcyBub3QgYWRoZXJlIHRvIHRoZSBydWxlcyBvZiBlbnVtcyBnZW5lcmF0ZWQgYnlcbiAqIHByb3RvYnVmLXRzLiBTZWUgYGlzRW51bU9iamVjdCgpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RFbnVtVmFsdWVzKGVudW1PYmplY3QpIHtcbiAgICBpZiAoIWlzRW51bU9iamVjdChlbnVtT2JqZWN0KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGEgdHlwZXNjcmlwdCBlbnVtIG9iamVjdFwiKTtcbiAgICBsZXQgdmFsdWVzID0gW107XG4gICAgZm9yIChsZXQgW25hbWUsIG51bWJlcl0gb2YgT2JqZWN0LmVudHJpZXMoZW51bU9iamVjdCkpXG4gICAgICAgIGlmICh0eXBlb2YgbnVtYmVyID09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh7IG5hbWUsIG51bWJlciB9KTtcbiAgICByZXR1cm4gdmFsdWVzO1xufVxuLyoqXG4gKiBMaXN0cyB0aGUgbmFtZXMgb2YgYSBUeXBlc2NyaXB0IGVudW0uXG4gKlxuICogVGhyb3dzIGlmIHRoZSBlbnVtIGRvZXMgbm90IGFkaGVyZSB0byB0aGUgcnVsZXMgb2YgZW51bXMgZ2VuZXJhdGVkIGJ5XG4gKiBwcm90b2J1Zi10cy4gU2VlIGBpc0VudW1PYmplY3QoKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RW51bU5hbWVzKGVudW1PYmplY3QpIHtcbiAgICByZXR1cm4gbGlzdEVudW1WYWx1ZXMoZW51bU9iamVjdCkubWFwKHZhbCA9PiB2YWwubmFtZSk7XG59XG4vKipcbiAqIExpc3RzIHRoZSBudW1iZXJzIG9mIGEgVHlwZXNjcmlwdCBlbnVtLlxuICpcbiAqIFRocm93cyBpZiB0aGUgZW51bSBkb2VzIG5vdCBhZGhlcmUgdG8gdGhlIHJ1bGVzIG9mIGVudW1zIGdlbmVyYXRlZCBieVxuICogcHJvdG9idWYtdHMuIFNlZSBgaXNFbnVtT2JqZWN0KClgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdEVudW1OdW1iZXJzKGVudW1PYmplY3QpIHtcbiAgICByZXR1cm4gbGlzdEVudW1WYWx1ZXMoZW51bU9iamVjdClcbiAgICAgICAgLm1hcCh2YWwgPT4gdmFsLm51bWJlcilcbiAgICAgICAgLmZpbHRlcigobnVtLCBpbmRleCwgYXJyKSA9PiBhcnIuaW5kZXhPZihudW0pID09IGluZGV4KTtcbn1cbiIsIi8vIFB1YmxpYyBBUEkgb2YgdGhlIHByb3RvYnVmLXRzIHJ1bnRpbWUuXG4vLyBOb3RlOiB3ZSBkbyBub3QgdXNlIGBleHBvcnQgKiBmcm9tIC4uLmAgdG8gaGVscCB0cmVlIHNoYWtlcnMsXG4vLyB3ZWJwYWNrIHZlcmJvc2Ugb3V0cHV0IGhpbnRzIHRoYXQgdGhpcyBzaG91bGQgYmUgdXNlZnVsXG4vLyBDb252ZW5pZW5jZSBKU09OIHR5cGluZ3MgYW5kIGNvcnJlc3BvbmRpbmcgdHlwZSBndWFyZHNcbmV4cG9ydCB7IHR5cGVvZkpzb25WYWx1ZSwgaXNKc29uT2JqZWN0IH0gZnJvbSAnLi9qc29uLXR5cGluZ3MnO1xuLy8gQmFzZSA2NCBlbmNvZGluZ1xuZXhwb3J0IHsgYmFzZTY0ZGVjb2RlLCBiYXNlNjRlbmNvZGUgfSBmcm9tICcuL2Jhc2U2NCc7XG4vLyBVVEY4IGVuY29kaW5nXG5leHBvcnQgeyB1dGY4cmVhZCB9IGZyb20gJy4vcHJvdG9idWZqcy11dGY4Jztcbi8vIEJpbmFyeSBmb3JtYXQgY29udHJhY3RzLCBvcHRpb25zIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLCBmb3IgZXhhbXBsZVxuZXhwb3J0IHsgV2lyZVR5cGUsIG1lcmdlQmluYXJ5T3B0aW9ucywgVW5rbm93bkZpZWxkSGFuZGxlciwgfSBmcm9tICcuL2JpbmFyeS1mb3JtYXQtY29udHJhY3QnO1xuLy8gU3RhbmRhcmQgSUJpbmFyeVJlYWRlciBpbXBsZW1lbnRhdGlvblxuZXhwb3J0IHsgQmluYXJ5UmVhZGVyLCBiaW5hcnlSZWFkT3B0aW9ucyB9IGZyb20gJy4vYmluYXJ5LXJlYWRlcic7XG4vLyBTdGFuZGFyZCBJQmluYXJ5V3JpdGVyIGltcGxlbWVudGF0aW9uXG5leHBvcnQgeyBCaW5hcnlXcml0ZXIsIGJpbmFyeVdyaXRlT3B0aW9ucyB9IGZyb20gJy4vYmluYXJ5LXdyaXRlcic7XG4vLyBJbnQ2NCBhbmQgVUludDY0IGltcGxlbWVudGF0aW9ucyByZXF1aXJlZCBmb3IgdGhlIGJpbmFyeSBmb3JtYXRcbmV4cG9ydCB7IFBiTG9uZywgUGJVTG9uZyB9IGZyb20gJy4vcGItbG9uZyc7XG4vLyBKU09OIGZvcm1hdCBjb250cmFjdHMsIG9wdGlvbnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsIGZvciBleGFtcGxlXG5leHBvcnQgeyBqc29uUmVhZE9wdGlvbnMsIGpzb25Xcml0ZU9wdGlvbnMsIG1lcmdlSnNvbk9wdGlvbnMgfSBmcm9tICcuL2pzb24tZm9ybWF0LWNvbnRyYWN0Jztcbi8vIE1lc3NhZ2UgdHlwZSBjb250cmFjdFxuZXhwb3J0IHsgTUVTU0FHRV9UWVBFIH0gZnJvbSAnLi9tZXNzYWdlLXR5cGUtY29udHJhY3QnO1xuLy8gTWVzc2FnZSB0eXBlIGltcGxlbWVudGF0aW9uIHZpYSByZWZsZWN0aW9uXG5leHBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gJy4vbWVzc2FnZS10eXBlJztcbi8vIFJlZmxlY3Rpb24gaW5mbywgZ2VuZXJhdGVkIGJ5IHRoZSBwbHVnaW4sIGV4cG9zZWQgdG8gdGhlIHVzZXIsIHVzZWQgYnkgcmVmbGVjdGlvbiBvcHNcbmV4cG9ydCB7IFNjYWxhclR5cGUsIExvbmdUeXBlLCBSZXBlYXRUeXBlLCBub3JtYWxpemVGaWVsZEluZm8sIHJlYWRGaWVsZE9wdGlvbnMsIHJlYWRGaWVsZE9wdGlvbiwgcmVhZE1lc3NhZ2VPcHRpb24gfSBmcm9tICcuL3JlZmxlY3Rpb24taW5mbyc7XG4vLyBNZXNzYWdlIG9wZXJhdGlvbnMgdmlhIHJlZmxlY3Rpb25cbmV4cG9ydCB7IFJlZmxlY3Rpb25UeXBlQ2hlY2sgfSBmcm9tICcuL3JlZmxlY3Rpb24tdHlwZS1jaGVjayc7XG5leHBvcnQgeyByZWZsZWN0aW9uQ3JlYXRlIH0gZnJvbSAnLi9yZWZsZWN0aW9uLWNyZWF0ZSc7XG5leHBvcnQgeyByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCB9IGZyb20gJy4vcmVmbGVjdGlvbi1zY2FsYXItZGVmYXVsdCc7XG5leHBvcnQgeyByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsIH0gZnJvbSAnLi9yZWZsZWN0aW9uLW1lcmdlLXBhcnRpYWwnO1xuZXhwb3J0IHsgcmVmbGVjdGlvbkVxdWFscyB9IGZyb20gJy4vcmVmbGVjdGlvbi1lcXVhbHMnO1xuZXhwb3J0IHsgUmVmbGVjdGlvbkJpbmFyeVJlYWRlciB9IGZyb20gJy4vcmVmbGVjdGlvbi1iaW5hcnktcmVhZGVyJztcbmV4cG9ydCB7IFJlZmxlY3Rpb25CaW5hcnlXcml0ZXIgfSBmcm9tICcuL3JlZmxlY3Rpb24tYmluYXJ5LXdyaXRlcic7XG5leHBvcnQgeyBSZWZsZWN0aW9uSnNvblJlYWRlciB9IGZyb20gJy4vcmVmbGVjdGlvbi1qc29uLXJlYWRlcic7XG5leHBvcnQgeyBSZWZsZWN0aW9uSnNvbldyaXRlciB9IGZyb20gJy4vcmVmbGVjdGlvbi1qc29uLXdyaXRlcic7XG5leHBvcnQgeyBjb250YWluc01lc3NhZ2VUeXBlIH0gZnJvbSAnLi9yZWZsZWN0aW9uLWNvbnRhaW5zLW1lc3NhZ2UtdHlwZSc7XG4vLyBPbmVvZiBoZWxwZXJzXG5leHBvcnQgeyBpc09uZW9mR3JvdXAsIHNldE9uZW9mVmFsdWUsIGdldE9uZW9mVmFsdWUsIGNsZWFyT25lb2ZWYWx1ZSwgZ2V0U2VsZWN0ZWRPbmVvZlZhbHVlIH0gZnJvbSAnLi9vbmVvZic7XG4vLyBFbnVtIG9iamVjdCB0eXBlIGd1YXJkIGFuZCByZWZsZWN0aW9uIHV0aWwsIG1heSBiZSBpbnRlcmVzdGluZyB0byB0aGUgdXNlci5cbmV4cG9ydCB7IGxpc3RFbnVtVmFsdWVzLCBsaXN0RW51bU5hbWVzLCBsaXN0RW51bU51bWJlcnMsIGlzRW51bU9iamVjdCB9IGZyb20gJy4vZW51bS1vYmplY3QnO1xuLy8gbG93ZXJDYW1lbENhc2UoKSBpcyBleHBvcnRlZCBmb3IgcGx1Z2luLCBycGMtcnVudGltZSBhbmQgb3RoZXIgcnBjIHBhY2thZ2VzXG5leHBvcnQgeyBsb3dlckNhbWVsQ2FzZSB9IGZyb20gJy4vbG93ZXItY2FtZWwtY2FzZSc7XG4vLyBhc3NlcnRpb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmb3IgcGx1Z2luLCBtYXkgYWxzbyBiZSB1c2VmdWwgdG8gdXNlclxuZXhwb3J0IHsgYXNzZXJ0LCBhc3NlcnROZXZlciwgYXNzZXJ0SW50MzIsIGFzc2VydFVJbnQzMiwgYXNzZXJ0RmxvYXQzMiB9IGZyb20gJy4vYXNzZXJ0JztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///47764\n')},69196:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Zc: () => (/* binding */ mergeJsonOptions),\n/* harmony export */ bm: () => (/* binding */ jsonReadOptions),\n/* harmony export */ yG: () => (/* binding */ jsonWriteOptions)\n/* harmony export */ });\nconst defaultsWrite = {\n emitDefaultValues: false,\n enumAsInteger: false,\n useProtoFieldName: false,\n prettySpaces: 0,\n}, defaultsRead = {\n ignoreUnknownFields: false,\n};\n/**\n * Make options for reading JSON data from partial options.\n */\nfunction jsonReadOptions(options) {\n return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead;\n}\n/**\n * Make options for writing JSON data from partial options.\n */\nfunction jsonWriteOptions(options) {\n return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite;\n}\n/**\n * Merges JSON write or read options. Later values override earlier values. Type registries are merged.\n */\nfunction mergeJsonOptions(a, b) {\n var _a, _b;\n let c = Object.assign(Object.assign({}, a), b);\n c.typeRegistry = [...((_a = a === null || a === void 0 ? void 0 : a.typeRegistry) !== null && _a !== void 0 ? _a : []), ...((_b = b === null || b === void 0 ? void 0 : b.typeRegistry) !== null && _b !== void 0 ? _b : [])];\n return c;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkxOTYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9qc29uLWZvcm1hdC1jb250cmFjdC5qcz83NWM4Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGRlZmF1bHRzV3JpdGUgPSB7XG4gICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgIGVudW1Bc0ludGVnZXI6IGZhbHNlLFxuICAgIHVzZVByb3RvRmllbGROYW1lOiBmYWxzZSxcbiAgICBwcmV0dHlTcGFjZXM6IDAsXG59LCBkZWZhdWx0c1JlYWQgPSB7XG4gICAgaWdub3JlVW5rbm93bkZpZWxkczogZmFsc2UsXG59O1xuLyoqXG4gKiBNYWtlIG9wdGlvbnMgZm9yIHJlYWRpbmcgSlNPTiBkYXRhIGZyb20gcGFydGlhbCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJlYWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHNSZWFkKSwgb3B0aW9ucykgOiBkZWZhdWx0c1JlYWQ7XG59XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3Igd3JpdGluZyBKU09OIGRhdGEgZnJvbSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uV3JpdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHNXcml0ZSksIG9wdGlvbnMpIDogZGVmYXVsdHNXcml0ZTtcbn1cbi8qKlxuICogTWVyZ2VzIEpTT04gd3JpdGUgb3IgcmVhZCBvcHRpb25zLiBMYXRlciB2YWx1ZXMgb3ZlcnJpZGUgZWFybGllciB2YWx1ZXMuIFR5cGUgcmVnaXN0cmllcyBhcmUgbWVyZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VKc29uT3B0aW9ucyhhLCBiKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgYyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYSksIGIpO1xuICAgIGMudHlwZVJlZ2lzdHJ5ID0gWy4uLigoX2EgPSBhID09PSBudWxsIHx8IGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGEudHlwZVJlZ2lzdHJ5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSksIC4uLigoX2IgPSBiID09PSBudWxsIHx8IGIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGIudHlwZVJlZ2lzdHJ5KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXSldO1xuICAgIHJldHVybiBjO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///69196\n")},99378:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ W: () => (/* binding */ lowerCamelCase)\n/* harmony export */ });\n/**\n * Converts snake_case to lowerCamelCase.\n *\n * Should behave like protoc:\n * https://github.com/protocolbuffers/protobuf/blob/e8ae137c96444ea313485ed1118c5e43b2099cf1/src/google/protobuf/compiler/java/java_helpers.cc#L118\n */\nfunction lowerCamelCase(snakeCase) {\n let capNext = false;\n const sb = [];\n for (let i = 0; i < snakeCase.length; i++) {\n let next = snakeCase.charAt(i);\n if (next == '_') {\n capNext = true;\n }\n else if (/\\d/.test(next)) {\n sb.push(next);\n capNext = true;\n }\n else if (capNext) {\n sb.push(next.toUpperCase());\n capNext = false;\n }\n else if (i == 0) {\n sb.push(next.toLowerCase());\n }\n else {\n sb.push(next);\n }\n }\n return sb.join('');\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkzNzguanMiLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9sb3dlci1jYW1lbC1jYXNlLmpzPzQ3NGMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb252ZXJ0cyBzbmFrZV9jYXNlIHRvIGxvd2VyQ2FtZWxDYXNlLlxuICpcbiAqIFNob3VsZCBiZWhhdmUgbGlrZSBwcm90b2M6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvZThhZTEzN2M5NjQ0NGVhMzEzNDg1ZWQxMTE4YzVlNDNiMjA5OWNmMS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjI0wxMThcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvd2VyQ2FtZWxDYXNlKHNuYWtlQ2FzZSkge1xuICAgIGxldCBjYXBOZXh0ID0gZmFsc2U7XG4gICAgY29uc3Qgc2IgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNuYWtlQ2FzZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmV4dCA9IHNuYWtlQ2FzZS5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChuZXh0ID09ICdfJykge1xuICAgICAgICAgICAgY2FwTmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoL1xcZC8udGVzdChuZXh0KSkge1xuICAgICAgICAgICAgc2IucHVzaChuZXh0KTtcbiAgICAgICAgICAgIGNhcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhcE5leHQpIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgIGNhcE5leHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNiLmpvaW4oJycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///99378\n")},66584:(module,exports,__webpack_require__)=>{"use strict";eval('/**\n * @author Toru Nagashima \n * See LICENSE file in root directory for full license.\n */\n\n\nObject.defineProperty(exports, "__esModule", ({ value: true }));\n\nvar eventTargetShim = __webpack_require__(14988);\n\n/**\n * The signal class.\n * @see https://dom.spec.whatwg.org/#abortsignal\n */\nclass AbortSignal extends eventTargetShim.EventTarget {\n /**\n * AbortSignal cannot be constructed directly.\n */\n constructor() {\n super();\n throw new TypeError("AbortSignal cannot be constructed directly");\n }\n /**\n * Returns `true` if this `AbortSignal`\'s `AbortController` has signaled to abort, and `false` otherwise.\n */\n get aborted() {\n const aborted = abortedFlags.get(this);\n if (typeof aborted !== "boolean") {\n throw new TypeError(`Expected \'this\' to be an \'AbortSignal\' object, but got ${this === null ? "null" : typeof this}`);\n }\n return aborted;\n }\n}\neventTargetShim.defineEventAttribute(AbortSignal.prototype, "abort");\n/**\n * Create an AbortSignal object.\n */\nfunction createAbortSignal() {\n const signal = Object.create(AbortSignal.prototype);\n eventTargetShim.EventTarget.call(signal);\n abortedFlags.set(signal, false);\n return signal;\n}\n/**\n * Abort a given signal.\n */\nfunction abortSignal(signal) {\n if (abortedFlags.get(signal) !== false) {\n return;\n }\n abortedFlags.set(signal, true);\n signal.dispatchEvent({ type: "abort" });\n}\n/**\n * Aborted flag for each instances.\n */\nconst abortedFlags = new WeakMap();\n// Properties should be enumerable.\nObject.defineProperties(AbortSignal.prototype, {\n aborted: { enumerable: true },\n});\n// `toString()` should return `"[object AbortSignal]"`\nif (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") {\n Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, {\n configurable: true,\n value: "AbortSignal",\n });\n}\n\n/**\n * The AbortController.\n * @see https://dom.spec.whatwg.org/#abortcontroller\n */\nclass AbortController {\n /**\n * Initialize this controller.\n */\n constructor() {\n signals.set(this, createAbortSignal());\n }\n /**\n * Returns the `AbortSignal` object associated with this object.\n */\n get signal() {\n return getSignal(this);\n }\n /**\n * Abort and signal to any observers that the associated activity is to be aborted.\n */\n abort() {\n abortSignal(getSignal(this));\n }\n}\n/**\n * Associated signals.\n */\nconst signals = new WeakMap();\n/**\n * Get the associated signal of a given controller.\n */\nfunction getSignal(controller) {\n const signal = signals.get(controller);\n if (signal == null) {\n throw new TypeError(`Expected \'this\' to be an \'AbortController\' object, but got ${controller === null ? "null" : typeof controller}`);\n }\n return signal;\n}\n// Properties should be enumerable.\nObject.defineProperties(AbortController.prototype, {\n signal: { enumerable: true },\n abort: { enumerable: true },\n});\nif (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") {\n Object.defineProperty(AbortController.prototype, Symbol.toStringTag, {\n configurable: true,\n value: "AbortController",\n });\n}\n\nexports.AbortController = AbortController;\nexports.AbortSignal = AbortSignal;\nexports["default"] = AbortController;\n\nmodule.exports = AbortController\nmodule.exports.AbortController = module.exports["default"] = AbortController\nmodule.exports.AbortSignal = AbortSignal\n//# sourceMappingURL=abort-controller.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjY1ODQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDYTs7QUFFYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7O0FBRTdELHNCQUFzQixtQkFBTyxDQUFDLEtBQW1COztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRkFBMEYscUNBQXFDO0FBQy9IO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGVBQWU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBGQUEwRixpREFBaUQ7QUFDM0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsa0JBQWtCO0FBQ2hDLGFBQWEsa0JBQWtCO0FBQy9CLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSx1QkFBdUI7QUFDdkIsbUJBQW1CO0FBQ25CLGtCQUFlOztBQUVmO0FBQ0EsOEJBQThCLEdBQUcseUJBQXlCO0FBQzFELDBCQUEwQjtBQUMxQiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvYWJvcnQtY29udHJvbGxlci9kaXN0L2Fib3J0LWNvbnRyb2xsZXIuanM/Y2Y0MCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBhdXRob3IgVG9ydSBOYWdhc2hpbWEgPGh0dHBzOi8vZ2l0aHViLmNvbS9teXN0aWNhdGVhPlxuICogU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGRpcmVjdG9yeSBmb3IgZnVsbCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBldmVudFRhcmdldFNoaW0gPSByZXF1aXJlKCdldmVudC10YXJnZXQtc2hpbScpO1xuXG4vKipcbiAqIFRoZSBzaWduYWwgY2xhc3MuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jYWJvcnRzaWduYWxcbiAqL1xuY2xhc3MgQWJvcnRTaWduYWwgZXh0ZW5kcyBldmVudFRhcmdldFNoaW0uRXZlbnRUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBgQWJvcnRTaWduYWxgJ3MgYEFib3J0Q29udHJvbGxlcmAgaGFzIHNpZ25hbGVkIHRvIGFib3J0LCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZ2V0IGFib3J0ZWQoKSB7XG4gICAgICAgIGNvbnN0IGFib3J0ZWQgPSBhYm9ydGVkRmxhZ3MuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIGFib3J0ZWQgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0U2lnbmFsJyBvYmplY3QsIGJ1dCBnb3QgJHt0aGlzID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdGhpc31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWJvcnRlZDtcbiAgICB9XG59XG5ldmVudFRhcmdldFNoaW0uZGVmaW5lRXZlbnRBdHRyaWJ1dGUoQWJvcnRTaWduYWwucHJvdG90eXBlLCBcImFib3J0XCIpO1xuLyoqXG4gKiBDcmVhdGUgYW4gQWJvcnRTaWduYWwgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjcmVhdGVBYm9ydFNpZ25hbCgpIHtcbiAgICBjb25zdCBzaWduYWwgPSBPYmplY3QuY3JlYXRlKEFib3J0U2lnbmFsLnByb3RvdHlwZSk7XG4gICAgZXZlbnRUYXJnZXRTaGltLkV2ZW50VGFyZ2V0LmNhbGwoc2lnbmFsKTtcbiAgICBhYm9ydGVkRmxhZ3Muc2V0KHNpZ25hbCwgZmFsc2UpO1xuICAgIHJldHVybiBzaWduYWw7XG59XG4vKipcbiAqIEFib3J0IGEgZ2l2ZW4gc2lnbmFsLlxuICovXG5mdW5jdGlvbiBhYm9ydFNpZ25hbChzaWduYWwpIHtcbiAgICBpZiAoYWJvcnRlZEZsYWdzLmdldChzaWduYWwpICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFib3J0ZWRGbGFncy5zZXQoc2lnbmFsLCB0cnVlKTtcbiAgICBzaWduYWwuZGlzcGF0Y2hFdmVudCh7IHR5cGU6IFwiYWJvcnRcIiB9KTtcbn1cbi8qKlxuICogQWJvcnRlZCBmbGFnIGZvciBlYWNoIGluc3RhbmNlcy5cbiAqL1xuY29uc3QgYWJvcnRlZEZsYWdzID0gbmV3IFdlYWtNYXAoKTtcbi8vIFByb3BlcnRpZXMgc2hvdWxkIGJlIGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBYm9ydFNpZ25hbC5wcm90b3R5cGUsIHtcbiAgICBhYm9ydGVkOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbn0pO1xuLy8gYHRvU3RyaW5nKClgIHNob3VsZCByZXR1cm4gYFwiW29iamVjdCBBYm9ydFNpZ25hbF1cImBcbmlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gXCJzeW1ib2xcIikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBcIkFib3J0U2lnbmFsXCIsXG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhlIEFib3J0Q29udHJvbGxlci5cbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNhYm9ydGNvbnRyb2xsZXJcbiAqL1xuY2xhc3MgQWJvcnRDb250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoaXMgY29udHJvbGxlci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc2lnbmFscy5zZXQodGhpcywgY3JlYXRlQWJvcnRTaWduYWwoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBBYm9ydFNpZ25hbGAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC5cbiAgICAgKi9cbiAgICBnZXQgc2lnbmFsKCkge1xuICAgICAgICByZXR1cm4gZ2V0U2lnbmFsKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydCBhbmQgc2lnbmFsIHRvIGFueSBvYnNlcnZlcnMgdGhhdCB0aGUgYXNzb2NpYXRlZCBhY3Rpdml0eSBpcyB0byBiZSBhYm9ydGVkLlxuICAgICAqL1xuICAgIGFib3J0KCkge1xuICAgICAgICBhYm9ydFNpZ25hbChnZXRTaWduYWwodGhpcykpO1xuICAgIH1cbn1cbi8qKlxuICogQXNzb2NpYXRlZCBzaWduYWxzLlxuICovXG5jb25zdCBzaWduYWxzID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogR2V0IHRoZSBhc3NvY2lhdGVkIHNpZ25hbCBvZiBhIGdpdmVuIGNvbnRyb2xsZXIuXG4gKi9cbmZ1bmN0aW9uIGdldFNpZ25hbChjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gc2lnbmFscy5nZXQoY29udHJvbGxlcik7XG4gICAgaWYgKHNpZ25hbCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkICd0aGlzJyB0byBiZSBhbiAnQWJvcnRDb250cm9sbGVyJyBvYmplY3QsIGJ1dCBnb3QgJHtjb250cm9sbGVyID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgY29udHJvbGxlcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZ25hbDtcbn1cbi8vIFByb3BlcnRpZXMgc2hvdWxkIGJlIGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgc2lnbmFsOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBhYm9ydDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG59KTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gXCJzeW1ib2xcIikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogXCJBYm9ydENvbnRyb2xsZXJcIixcbiAgICB9KTtcbn1cblxuZXhwb3J0cy5BYm9ydENvbnRyb2xsZXIgPSBBYm9ydENvbnRyb2xsZXI7XG5leHBvcnRzLkFib3J0U2lnbmFsID0gQWJvcnRTaWduYWw7XG5leHBvcnRzLmRlZmF1bHQgPSBBYm9ydENvbnRyb2xsZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gQWJvcnRDb250cm9sbGVyXG5tb2R1bGUuZXhwb3J0cy5BYm9ydENvbnRyb2xsZXIgPSBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBBYm9ydENvbnRyb2xsZXJcbm1vZHVsZS5leHBvcnRzLkFib3J0U2lnbmFsID0gQWJvcnRTaWduYWxcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFib3J0LWNvbnRyb2xsZXIuanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///66584\n')},68599:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * archiver-utils\n *\n * Copyright (c) 2012-2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-archiver/blob/master/LICENSE-MIT\n */\nvar fs = __webpack_require__(63735);\nvar path = __webpack_require__(16928);\n\nvar flatten = __webpack_require__(35970);\nvar difference = __webpack_require__(66245);\nvar union = __webpack_require__(80299);\nvar isPlainObject = __webpack_require__(11331);\n\nvar glob = __webpack_require__(6492);\n\nvar file = module.exports = {};\n\nvar pathSeparatorRe = /[\\/\\\\]/g;\n\n// Process specified wildcard glob patterns or filenames against a\n// callback, excluding and uniquing files in the result set.\nvar processPatterns = function(patterns, fn) {\n // Filepaths to return.\n var result = [];\n // Iterate over flattened patterns array.\n flatten(patterns).forEach(function(pattern) {\n // If the first character is ! it should be omitted\n var exclusion = pattern.indexOf('!') === 0;\n // If the pattern is an exclusion, remove the !\n if (exclusion) { pattern = pattern.slice(1); }\n // Find all matching files for this pattern.\n var matches = fn(pattern);\n if (exclusion) {\n // If an exclusion, remove matching files.\n result = difference(result, matches);\n } else {\n // Otherwise add matching files.\n result = union(result, matches);\n }\n });\n return result;\n};\n\n// True if the file path exists.\nfile.exists = function() {\n var filepath = path.join.apply(path, arguments);\n return fs.existsSync(filepath);\n};\n\n// Return an array of all file paths that match the given wildcard patterns.\nfile.expand = function(...args) {\n // If the first argument is an options object, save those options to pass\n // into the File.prototype.glob.sync method.\n var options = isPlainObject(args[0]) ? args.shift() : {};\n // Use the first argument if it's an Array, otherwise convert the arguments\n // object to an array and use that.\n var patterns = Array.isArray(args[0]) ? args[0] : args;\n // Return empty set if there are no patterns or filepaths.\n if (patterns.length === 0) { return []; }\n // Return all matching filepaths.\n var matches = processPatterns(patterns, function(pattern) {\n // Find all matching files for this pattern.\n return glob.sync(pattern, options);\n });\n // Filter result set?\n if (options.filter) {\n matches = matches.filter(function(filepath) {\n filepath = path.join(options.cwd || '', filepath);\n try {\n if (typeof options.filter === 'function') {\n return options.filter(filepath);\n } else {\n // If the file is of the right type and exists, this should work.\n return fs.statSync(filepath)[options.filter]();\n }\n } catch(e) {\n // Otherwise, it's probably not the right type.\n return false;\n }\n });\n }\n return matches;\n};\n\n// Build a multi task \"files\" object dynamically.\nfile.expandMapping = function(patterns, destBase, options) {\n options = Object.assign({\n rename: function(destBase, destPath) {\n return path.join(destBase || '', destPath);\n }\n }, options);\n var files = [];\n var fileByDest = {};\n // Find all files matching pattern, using passed-in options.\n file.expand(options, patterns).forEach(function(src) {\n var destPath = src;\n // Flatten?\n if (options.flatten) {\n destPath = path.basename(destPath);\n }\n // Change the extension?\n if (options.ext) {\n destPath = destPath.replace(/(\\.[^\\/]*)?$/, options.ext);\n }\n // Generate destination filename.\n var dest = options.rename(destBase, destPath, options);\n // Prepend cwd to src path if necessary.\n if (options.cwd) { src = path.join(options.cwd, src); }\n // Normalize filepaths to be unix-style.\n dest = dest.replace(pathSeparatorRe, '/');\n src = src.replace(pathSeparatorRe, '/');\n // Map correct src path to dest path.\n if (fileByDest[dest]) {\n // If dest already exists, push this src onto that dest's src array.\n fileByDest[dest].src.push(src);\n } else {\n // Otherwise create a new src-dest file mapping object.\n files.push({\n src: [src],\n dest: dest,\n });\n // And store a reference for later use.\n fileByDest[dest] = files[files.length - 1];\n }\n });\n return files;\n};\n\n// reusing bits of grunt's multi-task source normalization\nfile.normalizeFilesArray = function(data) {\n var files = [];\n\n data.forEach(function(obj) {\n var prop;\n if ('src' in obj || 'dest' in obj) {\n files.push(obj);\n }\n });\n\n if (files.length === 0) {\n return [];\n }\n\n files = _(files).chain().forEach(function(obj) {\n if (!('src' in obj) || !obj.src) { return; }\n // Normalize .src properties to flattened array.\n if (Array.isArray(obj.src)) {\n obj.src = flatten(obj.src);\n } else {\n obj.src = [obj.src];\n }\n }).map(function(obj) {\n // Build options object, removing unwanted properties.\n var expandOptions = Object.assign({}, obj);\n delete expandOptions.src;\n delete expandOptions.dest;\n\n // Expand file mappings.\n if (obj.expand) {\n return file.expandMapping(obj.src, obj.dest, expandOptions).map(function(mapObj) {\n // Copy obj properties to result.\n var result = Object.assign({}, obj);\n // Make a clone of the orig obj available.\n result.orig = Object.assign({}, obj);\n // Set .src and .dest, processing both as templates.\n result.src = mapObj.src;\n result.dest = mapObj.dest;\n // Remove unwanted properties.\n ['expand', 'cwd', 'flatten', 'rename', 'ext'].forEach(function(prop) {\n delete result[prop];\n });\n return result;\n });\n }\n\n // Copy obj properties to result, adding an .orig property.\n var result = Object.assign({}, obj);\n // Make a clone of the orig obj available.\n result.orig = Object.assign({}, obj);\n\n if ('src' in result) {\n // Expose an expand-on-demand getter method as .src.\n Object.defineProperty(result, 'src', {\n enumerable: true,\n get: function fn() {\n var src;\n if (!('result' in fn)) {\n src = obj.src;\n // If src is an array, flatten it. Otherwise, make it into an array.\n src = Array.isArray(src) ? flatten(src) : [src];\n // Expand src files, memoizing result.\n fn.result = file.expand(expandOptions, src);\n }\n return fn.result;\n }\n });\n }\n\n if ('dest' in result) {\n result.dest = obj.dest;\n }\n\n return result;\n }).flatten().value();\n\n return files;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjg1OTkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG1CQUFPLENBQUMsS0FBYTtBQUM5QixXQUFXLG1CQUFPLENBQUMsS0FBTTs7QUFFekIsY0FBYyxtQkFBTyxDQUFDLEtBQWdCO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLEtBQW1CO0FBQzVDLFlBQVksbUJBQU8sQ0FBQyxLQUFjO0FBQ2xDLG9CQUFvQixtQkFBTyxDQUFDLEtBQXNCOztBQUVsRCxXQUFXLG1CQUFPLENBQUMsSUFBTTs7QUFFekI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvYXJjaGl2ZXItdXRpbHMvZmlsZS5qcz9kNWVlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXJjaGl2ZXItdXRpbHNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWFyY2hpdmVyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbnZhciBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxudmFyIGZsYXR0ZW4gPSByZXF1aXJlKCdsb2Rhc2gvZmxhdHRlbicpO1xudmFyIGRpZmZlcmVuY2UgPSByZXF1aXJlKCdsb2Rhc2gvZGlmZmVyZW5jZScpO1xudmFyIHVuaW9uID0gcmVxdWlyZSgnbG9kYXNoL3VuaW9uJyk7XG52YXIgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC9pc1BsYWluT2JqZWN0Jyk7XG5cbnZhciBnbG9iID0gcmVxdWlyZSgnZ2xvYicpO1xuXG52YXIgZmlsZSA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnZhciBwYXRoU2VwYXJhdG9yUmUgPSAvW1xcL1xcXFxdL2c7XG5cbi8vIFByb2Nlc3Mgc3BlY2lmaWVkIHdpbGRjYXJkIGdsb2IgcGF0dGVybnMgb3IgZmlsZW5hbWVzIGFnYWluc3QgYVxuLy8gY2FsbGJhY2ssIGV4Y2x1ZGluZyBhbmQgdW5pcXVpbmcgZmlsZXMgaW4gdGhlIHJlc3VsdCBzZXQuXG52YXIgcHJvY2Vzc1BhdHRlcm5zID0gZnVuY3Rpb24ocGF0dGVybnMsIGZuKSB7XG4gIC8vIEZpbGVwYXRocyB0byByZXR1cm4uXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgLy8gSXRlcmF0ZSBvdmVyIGZsYXR0ZW5lZCBwYXR0ZXJucyBhcnJheS5cbiAgZmxhdHRlbihwYXR0ZXJucykuZm9yRWFjaChmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgLy8gSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAhIGl0IHNob3VsZCBiZSBvbWl0dGVkXG4gICAgdmFyIGV4Y2x1c2lvbiA9IHBhdHRlcm4uaW5kZXhPZignIScpID09PSAwO1xuICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGFuIGV4Y2x1c2lvbiwgcmVtb3ZlIHRoZSAhXG4gICAgaWYgKGV4Y2x1c2lvbikgeyBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsgfVxuICAgIC8vIEZpbmQgYWxsIG1hdGNoaW5nIGZpbGVzIGZvciB0aGlzIHBhdHRlcm4uXG4gICAgdmFyIG1hdGNoZXMgPSBmbihwYXR0ZXJuKTtcbiAgICBpZiAoZXhjbHVzaW9uKSB7XG4gICAgICAvLyBJZiBhbiBleGNsdXNpb24sIHJlbW92ZSBtYXRjaGluZyBmaWxlcy5cbiAgICAgIHJlc3VsdCA9IGRpZmZlcmVuY2UocmVzdWx0LCBtYXRjaGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBtYXRjaGluZyBmaWxlcy5cbiAgICAgIHJlc3VsdCA9IHVuaW9uKHJlc3VsdCwgbWF0Y2hlcyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIFRydWUgaWYgdGhlIGZpbGUgcGF0aCBleGlzdHMuXG5maWxlLmV4aXN0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsZXBhdGggPSBwYXRoLmpvaW4uYXBwbHkocGF0aCwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMoZmlsZXBhdGgpO1xufTtcblxuLy8gUmV0dXJuIGFuIGFycmF5IG9mIGFsbCBmaWxlIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHdpbGRjYXJkIHBhdHRlcm5zLlxuZmlsZS5leHBhbmQgPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gIC8vIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBvcHRpb25zIG9iamVjdCwgc2F2ZSB0aG9zZSBvcHRpb25zIHRvIHBhc3NcbiAgLy8gaW50byB0aGUgRmlsZS5wcm90b3R5cGUuZ2xvYi5zeW5jIG1ldGhvZC5cbiAgdmFyIG9wdGlvbnMgPSBpc1BsYWluT2JqZWN0KGFyZ3NbMF0pID8gYXJncy5zaGlmdCgpIDoge307XG4gIC8vIFVzZSB0aGUgZmlyc3QgYXJndW1lbnQgaWYgaXQncyBhbiBBcnJheSwgb3RoZXJ3aXNlIGNvbnZlcnQgdGhlIGFyZ3VtZW50c1xuICAvLyBvYmplY3QgdG8gYW4gYXJyYXkgYW5kIHVzZSB0aGF0LlxuICB2YXIgcGF0dGVybnMgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pID8gYXJnc1swXSA6IGFyZ3M7XG4gIC8vIFJldHVybiBlbXB0eSBzZXQgaWYgdGhlcmUgYXJlIG5vIHBhdHRlcm5zIG9yIGZpbGVwYXRocy5cbiAgaWYgKHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gW107IH1cbiAgLy8gUmV0dXJuIGFsbCBtYXRjaGluZyBmaWxlcGF0aHMuXG4gIHZhciBtYXRjaGVzID0gcHJvY2Vzc1BhdHRlcm5zKHBhdHRlcm5zLCBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgLy8gRmluZCBhbGwgbWF0Y2hpbmcgZmlsZXMgZm9yIHRoaXMgcGF0dGVybi5cbiAgICByZXR1cm4gZ2xvYi5zeW5jKHBhdHRlcm4sIG9wdGlvbnMpO1xuICB9KTtcbiAgLy8gRmlsdGVyIHJlc3VsdCBzZXQ/XG4gIGlmIChvcHRpb25zLmZpbHRlcikge1xuICAgIG1hdGNoZXMgPSBtYXRjaGVzLmZpbHRlcihmdW5jdGlvbihmaWxlcGF0aCkge1xuICAgICAgZmlsZXBhdGggPSBwYXRoLmpvaW4ob3B0aW9ucy5jd2QgfHwgJycsIGZpbGVwYXRoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIoZmlsZXBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGlzIG9mIHRoZSByaWdodCB0eXBlIGFuZCBleGlzdHMsIHRoaXMgc2hvdWxkIHdvcmsuXG4gICAgICAgICAgcmV0dXJuIGZzLnN0YXRTeW5jKGZpbGVwYXRoKVtvcHRpb25zLmZpbHRlcl0oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IHR5cGUuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn07XG5cbi8vIEJ1aWxkIGEgbXVsdGkgdGFzayBcImZpbGVzXCIgb2JqZWN0IGR5bmFtaWNhbGx5LlxuZmlsZS5leHBhbmRNYXBwaW5nID0gZnVuY3Rpb24ocGF0dGVybnMsIGRlc3RCYXNlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByZW5hbWU6IGZ1bmN0aW9uKGRlc3RCYXNlLCBkZXN0UGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGguam9pbihkZXN0QmFzZSB8fCAnJywgZGVzdFBhdGgpO1xuICAgIH1cbiAgfSwgb3B0aW9ucyk7XG4gIHZhciBmaWxlcyA9IFtdO1xuICB2YXIgZmlsZUJ5RGVzdCA9IHt9O1xuICAvLyBGaW5kIGFsbCBmaWxlcyBtYXRjaGluZyBwYXR0ZXJuLCB1c2luZyBwYXNzZWQtaW4gb3B0aW9ucy5cbiAgZmlsZS5leHBhbmQob3B0aW9ucywgcGF0dGVybnMpLmZvckVhY2goZnVuY3Rpb24oc3JjKSB7XG4gICAgdmFyIGRlc3RQYXRoID0gc3JjO1xuICAgIC8vIEZsYXR0ZW4/XG4gICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgZGVzdFBhdGggPSBwYXRoLmJhc2VuYW1lKGRlc3RQYXRoKTtcbiAgICB9XG4gICAgLy8gQ2hhbmdlIHRoZSBleHRlbnNpb24/XG4gICAgaWYgKG9wdGlvbnMuZXh0KSB7XG4gICAgICBkZXN0UGF0aCA9IGRlc3RQYXRoLnJlcGxhY2UoLyhcXC5bXlxcL10qKT8kLywgb3B0aW9ucy5leHQpO1xuICAgIH1cbiAgICAvLyBHZW5lcmF0ZSBkZXN0aW5hdGlvbiBmaWxlbmFtZS5cbiAgICB2YXIgZGVzdCA9IG9wdGlvbnMucmVuYW1lKGRlc3RCYXNlLCBkZXN0UGF0aCwgb3B0aW9ucyk7XG4gICAgLy8gUHJlcGVuZCBjd2QgdG8gc3JjIHBhdGggaWYgbmVjZXNzYXJ5LlxuICAgIGlmIChvcHRpb25zLmN3ZCkgeyBzcmMgPSBwYXRoLmpvaW4ob3B0aW9ucy5jd2QsIHNyYyk7IH1cbiAgICAvLyBOb3JtYWxpemUgZmlsZXBhdGhzIHRvIGJlIHVuaXgtc3R5bGUuXG4gICAgZGVzdCA9IGRlc3QucmVwbGFjZShwYXRoU2VwYXJhdG9yUmUsICcvJyk7XG4gICAgc3JjID0gc3JjLnJlcGxhY2UocGF0aFNlcGFyYXRvclJlLCAnLycpO1xuICAgIC8vIE1hcCBjb3JyZWN0IHNyYyBwYXRoIHRvIGRlc3QgcGF0aC5cbiAgICBpZiAoZmlsZUJ5RGVzdFtkZXN0XSkge1xuICAgICAgLy8gSWYgZGVzdCBhbHJlYWR5IGV4aXN0cywgcHVzaCB0aGlzIHNyYyBvbnRvIHRoYXQgZGVzdCdzIHNyYyBhcnJheS5cbiAgICAgIGZpbGVCeURlc3RbZGVzdF0uc3JjLnB1c2goc3JjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBzcmMtZGVzdCBmaWxlIG1hcHBpbmcgb2JqZWN0LlxuICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgIHNyYzogW3NyY10sXG4gICAgICAgIGRlc3Q6IGRlc3QsXG4gICAgICB9KTtcbiAgICAgIC8vIEFuZCBzdG9yZSBhIHJlZmVyZW5jZSBmb3IgbGF0ZXIgdXNlLlxuICAgICAgZmlsZUJ5RGVzdFtkZXN0XSA9IGZpbGVzW2ZpbGVzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmaWxlcztcbn07XG5cbi8vIHJldXNpbmcgYml0cyBvZiBncnVudCdzIG11bHRpLXRhc2sgc291cmNlIG5vcm1hbGl6YXRpb25cbmZpbGUubm9ybWFsaXplRmlsZXNBcnJheSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgdmFyIGZpbGVzID0gW107XG5cbiAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBwcm9wO1xuICAgIGlmICgnc3JjJyBpbiBvYmogfHwgJ2Rlc3QnIGluIG9iaikge1xuICAgICAgZmlsZXMucHVzaChvYmopO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGZpbGVzID0gXyhmaWxlcykuY2hhaW4oKS5mb3JFYWNoKGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghKCdzcmMnIGluIG9iaikgfHwgIW9iai5zcmMpIHsgcmV0dXJuOyB9XG4gICAgLy8gTm9ybWFsaXplIC5zcmMgcHJvcGVydGllcyB0byBmbGF0dGVuZWQgYXJyYXkuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqLnNyYykpIHtcbiAgICAgIG9iai5zcmMgPSBmbGF0dGVuKG9iai5zcmMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmouc3JjID0gW29iai5zcmNdO1xuICAgIH1cbiAgfSkubWFwKGZ1bmN0aW9uKG9iaikge1xuICAgIC8vIEJ1aWxkIG9wdGlvbnMgb2JqZWN0LCByZW1vdmluZyB1bndhbnRlZCBwcm9wZXJ0aWVzLlxuICAgIHZhciBleHBhbmRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgICBkZWxldGUgZXhwYW5kT3B0aW9ucy5zcmM7XG4gICAgZGVsZXRlIGV4cGFuZE9wdGlvbnMuZGVzdDtcblxuICAgIC8vIEV4cGFuZCBmaWxlIG1hcHBpbmdzLlxuICAgIGlmIChvYmouZXhwYW5kKSB7XG4gICAgICByZXR1cm4gZmlsZS5leHBhbmRNYXBwaW5nKG9iai5zcmMsIG9iai5kZXN0LCBleHBhbmRPcHRpb25zKS5tYXAoZnVuY3Rpb24obWFwT2JqKSB7XG4gICAgICAgIC8vIENvcHkgb2JqIHByb3BlcnRpZXMgdG8gcmVzdWx0LlxuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgICAgICAgLy8gTWFrZSBhIGNsb25lIG9mIHRoZSBvcmlnIG9iaiBhdmFpbGFibGUuXG4gICAgICAgIHJlc3VsdC5vcmlnID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgICAgICAgLy8gU2V0IC5zcmMgYW5kIC5kZXN0LCBwcm9jZXNzaW5nIGJvdGggYXMgdGVtcGxhdGVzLlxuICAgICAgICByZXN1bHQuc3JjID0gbWFwT2JqLnNyYztcbiAgICAgICAgcmVzdWx0LmRlc3QgPSBtYXBPYmouZGVzdDtcbiAgICAgICAgLy8gUmVtb3ZlIHVud2FudGVkIHByb3BlcnRpZXMuXG4gICAgICAgIFsnZXhwYW5kJywgJ2N3ZCcsICdmbGF0dGVuJywgJ3JlbmFtZScsICdleHQnXS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgICBkZWxldGUgcmVzdWx0W3Byb3BdO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvcHkgb2JqIHByb3BlcnRpZXMgdG8gcmVzdWx0LCBhZGRpbmcgYW4gLm9yaWcgcHJvcGVydHkuXG4gICAgdmFyIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9iaik7XG4gICAgLy8gTWFrZSBhIGNsb25lIG9mIHRoZSBvcmlnIG9iaiBhdmFpbGFibGUuXG4gICAgcmVzdWx0Lm9yaWcgPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKCdzcmMnIGluIHJlc3VsdCkge1xuICAgICAgLy8gRXhwb3NlIGFuIGV4cGFuZC1vbi1kZW1hbmQgZ2V0dGVyIG1ldGhvZCBhcyAuc3JjLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgJ3NyYycsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBmbigpIHtcbiAgICAgICAgICB2YXIgc3JjO1xuICAgICAgICAgIGlmICghKCdyZXN1bHQnIGluIGZuKSkge1xuICAgICAgICAgICAgc3JjID0gb2JqLnNyYztcbiAgICAgICAgICAgIC8vIElmIHNyYyBpcyBhbiBhcnJheSwgZmxhdHRlbiBpdC4gT3RoZXJ3aXNlLCBtYWtlIGl0IGludG8gYW4gYXJyYXkuXG4gICAgICAgICAgICBzcmMgPSBBcnJheS5pc0FycmF5KHNyYykgPyBmbGF0dGVuKHNyYykgOiBbc3JjXTtcbiAgICAgICAgICAgIC8vIEV4cGFuZCBzcmMgZmlsZXMsIG1lbW9pemluZyByZXN1bHQuXG4gICAgICAgICAgICBmbi5yZXN1bHQgPSBmaWxlLmV4cGFuZChleHBhbmRPcHRpb25zLCBzcmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZm4ucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoJ2Rlc3QnIGluIHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRlc3QgPSBvYmouZGVzdDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KS5mbGF0dGVuKCkudmFsdWUoKTtcblxuICByZXR1cm4gZmlsZXM7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///68599\n")},91789:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * archiver-utils\n *\n * Copyright (c) 2015 Chris Talkington.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/archiver-utils/blob/master/LICENSE\n */\nvar fs = __webpack_require__(63735);\nvar path = __webpack_require__(16928);\nvar isStream = __webpack_require__(31232);\nvar lazystream = __webpack_require__(85);\nvar normalizePath = __webpack_require__(14100);\nvar defaults = __webpack_require__(84684);\n\nvar Stream = (__webpack_require__(2203).Stream);\nvar PassThrough = (__webpack_require__(34478).PassThrough);\n\nvar utils = module.exports = {};\nutils.file = __webpack_require__(68599);\n\nutils.collectStream = function(source, callback) {\n var collection = [];\n var size = 0;\n\n source.on('error', callback);\n\n source.on('data', function(chunk) {\n collection.push(chunk);\n size += chunk.length;\n });\n\n source.on('end', function() {\n var buf = Buffer.alloc(size);\n var offset = 0;\n\n collection.forEach(function(data) {\n data.copy(buf, offset);\n offset += data.length;\n });\n\n callback(null, buf);\n });\n};\n\nutils.dateify = function(dateish) {\n dateish = dateish || new Date();\n\n if (dateish instanceof Date) {\n dateish = dateish;\n } else if (typeof dateish === 'string') {\n dateish = new Date(dateish);\n } else {\n dateish = new Date();\n }\n\n return dateish;\n};\n\n// this is slightly different from lodash version\nutils.defaults = function(object, source, guard) {\n var args = arguments;\n args[0] = args[0] || {};\n\n return defaults(...args);\n};\n\nutils.isStream = function(source) {\n return isStream(source);\n};\n\nutils.lazyReadStream = function(filepath) {\n return new lazystream.Readable(function() {\n return fs.createReadStream(filepath);\n });\n};\n\nutils.normalizeInputSource = function(source) {\n if (source === null) {\n return Buffer.alloc(0);\n } else if (typeof source === 'string') {\n return Buffer.from(source);\n } else if (utils.isStream(source)) {\n // Always pipe through a PassThrough stream to guarantee pausing the stream if it's already flowing,\n // since it will only be processed in a (distant) future iteration of the event loop, and will lose\n // data if already flowing now.\n return source.pipe(new PassThrough());\n }\n\n return source;\n};\n\nutils.sanitizePath = function(filepath) {\n return normalizePath(filepath, false).replace(/^\\w+:/, '').replace(/^(\\.\\.\\/|\\/)+/, '');\n};\n\nutils.trailingSlashIt = function(str) {\n return str.slice(-1) !== '/' ? str + '/' : str;\n};\n\nutils.unixifyPath = function(filepath) {\n return normalizePath(filepath, false).replace(/^\\w+:/, '');\n};\n\nutils.walkdir = function(dirpath, base, callback) {\n var results = [];\n\n if (typeof base === 'function') {\n callback = base;\n base = dirpath;\n }\n\n fs.readdir(dirpath, function(err, list) {\n var i = 0;\n var file;\n var filepath;\n\n if (err) {\n return callback(err);\n }\n\n (function next() {\n file = list[i++];\n\n if (!file) {\n return callback(null, results);\n }\n\n filepath = path.join(dirpath, file);\n\n fs.stat(filepath, function(err, stats) {\n results.push({\n path: filepath,\n relative: path.relative(base, filepath).replace(/\\\\/g, '/'),\n stats: stats\n });\n\n if (stats && stats.isDirectory()) {\n utils.walkdir(filepath, base, function(err, res) {\n\t if(err){\n\t return callback(err);\n\t }\n\n res.forEach(function(dirEntry) {\n results.push(dirEntry);\n });\n\t\t \n next(); \n });\n } else {\n next();\n }\n });\n })();\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTE3ODkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG1CQUFPLENBQUMsS0FBYTtBQUM5QixXQUFXLG1CQUFPLENBQUMsS0FBTTtBQUN6QixlQUFlLG1CQUFPLENBQUMsS0FBVztBQUNsQyxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFZO0FBQ3JDLG9CQUFvQixtQkFBTyxDQUFDLEtBQWdCO0FBQzVDLGVBQWUsbUJBQU8sQ0FBQyxLQUFpQjs7QUFFeEMsYUFBYSxrQ0FBd0I7QUFDckMsa0JBQWtCLHdDQUFzQzs7QUFFeEQ7QUFDQSxhQUFhLG1CQUFPLENBQUMsS0FBVzs7QUFFaEM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci11dGlscy9pbmRleC5qcz83MTFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXJjaGl2ZXItdXRpbHNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgQ2hyaXMgVGFsa2luZ3Rvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL2FyY2hpdmVyLXV0aWxzL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xudmFyIGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGlzU3RyZWFtID0gcmVxdWlyZSgnaXMtc3RyZWFtJyk7XG52YXIgbGF6eXN0cmVhbSA9IHJlcXVpcmUoJ2xhenlzdHJlYW0nKTtcbnZhciBub3JtYWxpemVQYXRoID0gcmVxdWlyZSgnbm9ybWFsaXplLXBhdGgnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJ2xvZGFzaC9kZWZhdWx0cycpO1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtO1xudmFyIFBhc3NUaHJvdWdoID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUGFzc1Rocm91Z2g7XG5cbnZhciB1dGlscyA9IG1vZHVsZS5leHBvcnRzID0ge307XG51dGlscy5maWxlID0gcmVxdWlyZSgnLi9maWxlLmpzJyk7XG5cbnV0aWxzLmNvbGxlY3RTdHJlYW0gPSBmdW5jdGlvbihzb3VyY2UsIGNhbGxiYWNrKSB7XG4gIHZhciBjb2xsZWN0aW9uID0gW107XG4gIHZhciBzaXplID0gMDtcblxuICBzb3VyY2Uub24oJ2Vycm9yJywgY2FsbGJhY2spO1xuXG4gIHNvdXJjZS5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgY29sbGVjdGlvbi5wdXNoKGNodW5rKTtcbiAgICBzaXplICs9IGNodW5rLmxlbmd0aDtcbiAgfSk7XG5cbiAgc291cmNlLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgIHZhciBvZmZzZXQgPSAwO1xuXG4gICAgY29sbGVjdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIGRhdGEuY29weShidWYsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgfSk7XG5cbiAgICBjYWxsYmFjayhudWxsLCBidWYpO1xuICB9KTtcbn07XG5cbnV0aWxzLmRhdGVpZnkgPSBmdW5jdGlvbihkYXRlaXNoKSB7XG4gIGRhdGVpc2ggPSBkYXRlaXNoIHx8IG5ldyBEYXRlKCk7XG5cbiAgaWYgKGRhdGVpc2ggaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgZGF0ZWlzaCA9IGRhdGVpc2g7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGVpc2ggPT09ICdzdHJpbmcnKSB7XG4gICAgZGF0ZWlzaCA9IG5ldyBEYXRlKGRhdGVpc2gpO1xuICB9IGVsc2Uge1xuICAgIGRhdGVpc2ggPSBuZXcgRGF0ZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGVpc2g7XG59O1xuXG4vLyB0aGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIGxvZGFzaCB2ZXJzaW9uXG51dGlscy5kZWZhdWx0cyA9IGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBndWFyZCkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgYXJnc1swXSA9IGFyZ3NbMF0gfHwge307XG5cbiAgcmV0dXJuIGRlZmF1bHRzKC4uLmFyZ3MpO1xufTtcblxudXRpbHMuaXNTdHJlYW0gPSBmdW5jdGlvbihzb3VyY2UpIHtcbiAgcmV0dXJuIGlzU3RyZWFtKHNvdXJjZSk7XG59O1xuXG51dGlscy5sYXp5UmVhZFN0cmVhbSA9IGZ1bmN0aW9uKGZpbGVwYXRoKSB7XG4gIHJldHVybiBuZXcgbGF6eXN0cmVhbS5SZWFkYWJsZShmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlcGF0aCk7XG4gIH0pO1xufTtcblxudXRpbHMubm9ybWFsaXplSW5wdXRTb3VyY2UgPSBmdW5jdGlvbihzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgfSBlbHNlIGlmICh1dGlscy5pc1N0cmVhbShzb3VyY2UpKSB7XG4gICAgLy8gQWx3YXlzIHBpcGUgdGhyb3VnaCBhIFBhc3NUaHJvdWdoIHN0cmVhbSB0byBndWFyYW50ZWUgcGF1c2luZyB0aGUgc3RyZWFtIGlmIGl0J3MgYWxyZWFkeSBmbG93aW5nLFxuICAgIC8vIHNpbmNlIGl0IHdpbGwgb25seSBiZSBwcm9jZXNzZWQgaW4gYSAoZGlzdGFudCkgZnV0dXJlIGl0ZXJhdGlvbiBvZiB0aGUgZXZlbnQgbG9vcCwgYW5kIHdpbGwgbG9zZVxuICAgIC8vIGRhdGEgaWYgYWxyZWFkeSBmbG93aW5nIG5vdy5cbiAgICByZXR1cm4gc291cmNlLnBpcGUobmV3IFBhc3NUaHJvdWdoKCkpO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZTtcbn07XG5cbnV0aWxzLnNhbml0aXplUGF0aCA9IGZ1bmN0aW9uKGZpbGVwYXRoKSB7XG4gIHJldHVybiBub3JtYWxpemVQYXRoKGZpbGVwYXRoLCBmYWxzZSkucmVwbGFjZSgvXlxcdys6LywgJycpLnJlcGxhY2UoL14oXFwuXFwuXFwvfFxcLykrLywgJycpO1xufTtcblxudXRpbHMudHJhaWxpbmdTbGFzaEl0ID0gZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiBzdHIuc2xpY2UoLTEpICE9PSAnLycgPyBzdHIgKyAnLycgOiBzdHI7XG59O1xuXG51dGlscy51bml4aWZ5UGF0aCA9IGZ1bmN0aW9uKGZpbGVwYXRoKSB7XG4gIHJldHVybiBub3JtYWxpemVQYXRoKGZpbGVwYXRoLCBmYWxzZSkucmVwbGFjZSgvXlxcdys6LywgJycpO1xufTtcblxudXRpbHMud2Fsa2RpciA9IGZ1bmN0aW9uKGRpcnBhdGgsIGJhc2UsIGNhbGxiYWNrKSB7XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgaWYgKHR5cGVvZiBiYXNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBiYXNlO1xuICAgIGJhc2UgPSBkaXJwYXRoO1xuICB9XG5cbiAgZnMucmVhZGRpcihkaXJwYXRoLCBmdW5jdGlvbihlcnIsIGxpc3QpIHtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGZpbGU7XG4gICAgdmFyIGZpbGVwYXRoO1xuXG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgKGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBmaWxlID0gbGlzdFtpKytdO1xuXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMpO1xuICAgICAgfVxuXG4gICAgICBmaWxlcGF0aCA9IHBhdGguam9pbihkaXJwYXRoLCBmaWxlKTtcblxuICAgICAgZnMuc3RhdChmaWxlcGF0aCwgZnVuY3Rpb24oZXJyLCBzdGF0cykge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIHBhdGg6IGZpbGVwYXRoLFxuICAgICAgICAgIHJlbGF0aXZlOiBwYXRoLnJlbGF0aXZlKGJhc2UsIGZpbGVwYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJyksXG4gICAgICAgICAgc3RhdHM6IHN0YXRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdGF0cyAmJiBzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgdXRpbHMud2Fsa2RpcihmaWxlcGF0aCwgYmFzZSwgZnVuY3Rpb24oZXJyLCByZXMpIHtcblx0ICAgIGlmKGVycil7XG5cdCAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuXHQgICAgfVxuXG4gICAgICAgICAgICByZXMuZm9yRWFjaChmdW5jdGlvbihkaXJFbnRyeSkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZGlyRW50cnkpO1xuICAgICAgICAgICAgfSk7XG5cdFx0ICBcbiAgICAgICAgICAgIG5leHQoKTsgIFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSkoKTtcbiAgfSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///91789\n")},58264:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var balanced = __webpack_require__(8505);\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m) return [str];\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n if (/\\$$/.test(m.pre)) { \n for (var k = 0; k < post.length; k++) {\n var expansion = pre+ '{' + m.body + '}' + post[k];\n expansions.push(expansion);\n }\n } else {\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,.*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = [];\n\n for (var j = 0; j < n.length; j++) {\n N.push.apply(N, expand(n[j], false));\n }\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n }\n\n return expansions;\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgyNjQuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLElBQWdCOztBQUV2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLElBQUk7QUFDL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLEtBQUs7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGFBQWE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQix1Q0FBdUMsR0FBRztBQUMxQyxZQUFZLEdBQUcseUJBQXlCO0FBQ3hDO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsY0FBYyxHQUFHO0FBQ2pCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUJBQXFCLEtBQUs7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckMsNkJBQTZCLGVBQWU7QUFDNUM7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxFQUFFO0FBQ1osNkJBQTZCO0FBQzdCLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGNBQWMsS0FBSyxRQUFRLEVBQUUsSUFBSSxFQUFFO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxzQkFBc0IsWUFBWTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUEsc0JBQXNCLGNBQWM7QUFDcEM7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixjQUFjO0FBQ2xDLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyLXV0aWxzL25vZGVfbW9kdWxlcy9icmFjZS1leHBhbnNpb24vaW5kZXguanM/YzAxMyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFsYW5jZWQgPSByZXF1aXJlKCdiYWxhbmNlZC1tYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cGFuZFRvcDtcblxudmFyIGVzY1NsYXNoID0gJ1xcMFNMQVNIJytNYXRoLnJhbmRvbSgpKydcXDAnO1xudmFyIGVzY09wZW4gPSAnXFwwT1BFTicrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDbG9zZSA9ICdcXDBDTE9TRScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDb21tYSA9ICdcXDBDT01NQScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NQZXJpb2QgPSAnXFwwUEVSSU9EJytNYXRoLnJhbmRvbSgpKydcXDAnO1xuXG5mdW5jdGlvbiBudW1lcmljKHN0cikge1xuICByZXR1cm4gcGFyc2VJbnQoc3RyLCAxMCkgPT0gc3RyXG4gICAgPyBwYXJzZUludChzdHIsIDEwKVxuICAgIDogc3RyLmNoYXJDb2RlQXQoMCk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnXFxcXFxcXFwnKS5qb2luKGVzY1NsYXNoKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxceycpLmpvaW4oZXNjT3BlbilcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXH0nKS5qb2luKGVzY0Nsb3NlKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcLCcpLmpvaW4oZXNjQ29tbWEpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFwuJykuam9pbihlc2NQZXJpb2QpO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdChlc2NTbGFzaCkuam9pbignXFxcXCcpXG4gICAgICAgICAgICAuc3BsaXQoZXNjT3Blbikuam9pbigneycpXG4gICAgICAgICAgICAuc3BsaXQoZXNjQ2xvc2UpLmpvaW4oJ30nKVxuICAgICAgICAgICAgLnNwbGl0KGVzY0NvbW1hKS5qb2luKCcsJylcbiAgICAgICAgICAgIC5zcGxpdChlc2NQZXJpb2QpLmpvaW4oJy4nKTtcbn1cblxuXG4vLyBCYXNpY2FsbHkganVzdCBzdHIuc3BsaXQoXCIsXCIpLCBidXQgaGFuZGxpbmcgY2FzZXNcbi8vIHdoZXJlIHdlIGhhdmUgbmVzdGVkIGJyYWNlZCBzZWN0aW9ucywgd2hpY2ggc2hvdWxkIGJlXG4vLyB0cmVhdGVkIGFzIGluZGl2aWR1YWwgbWVtYmVycywgbGlrZSB7YSx7YixjfSxkfVxuZnVuY3Rpb24gcGFyc2VDb21tYVBhcnRzKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gWycnXTtcblxuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG0gPSBiYWxhbmNlZCgneycsICd9Jywgc3RyKTtcblxuICBpZiAoIW0pXG4gICAgcmV0dXJuIHN0ci5zcGxpdCgnLCcpO1xuXG4gIHZhciBwcmUgPSBtLnByZTtcbiAgdmFyIGJvZHkgPSBtLmJvZHk7XG4gIHZhciBwb3N0ID0gbS5wb3N0O1xuICB2YXIgcCA9IHByZS5zcGxpdCgnLCcpO1xuXG4gIHBbcC5sZW5ndGgtMV0gKz0gJ3snICsgYm9keSArICd9JztcbiAgdmFyIHBvc3RQYXJ0cyA9IHBhcnNlQ29tbWFQYXJ0cyhwb3N0KTtcbiAgaWYgKHBvc3QubGVuZ3RoKSB7XG4gICAgcFtwLmxlbmd0aC0xXSArPSBwb3N0UGFydHMuc2hpZnQoKTtcbiAgICBwLnB1c2guYXBwbHkocCwgcG9zdFBhcnRzKTtcbiAgfVxuXG4gIHBhcnRzLnB1c2guYXBwbHkocGFydHMsIHApO1xuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuZnVuY3Rpb24gZXhwYW5kVG9wKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gW107XG5cbiAgLy8gSSBkb24ndCBrbm93IHdoeSBCYXNoIDQuMyBkb2VzIHRoaXMsIGJ1dCBpdCBkb2VzLlxuICAvLyBBbnl0aGluZyBzdGFydGluZyB3aXRoIHt9IHdpbGwgaGF2ZSB0aGUgZmlyc3QgdHdvIGJ5dGVzIHByZXNlcnZlZFxuICAvLyBidXQgKm9ubHkqIGF0IHRoZSB0b3AgbGV2ZWwsIHNvIHt9LGF9YiB3aWxsIG5vdCBleHBhbmQgdG8gYW55dGhpbmcsXG4gIC8vIGJ1dCBhe30sYn1jIHdpbGwgYmUgZXhwYW5kZWQgdG8gW2F9YyxhYmNdLlxuICAvLyBPbmUgY291bGQgYXJndWUgdGhhdCB0aGlzIGlzIGEgYnVnIGluIEJhc2gsIGJ1dCBzaW5jZSB0aGUgZ29hbCBvZlxuICAvLyB0aGlzIG1vZHVsZSBpcyB0byBtYXRjaCBCYXNoJ3MgcnVsZXMsIHdlIGVzY2FwZSBhIGxlYWRpbmcge31cbiAgaWYgKHN0ci5zdWJzdHIoMCwgMikgPT09ICd7fScpIHtcbiAgICBzdHIgPSAnXFxcXHtcXFxcfScgKyBzdHIuc3Vic3RyKDIpO1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZChlc2NhcGVCcmFjZXMoc3RyKSwgdHJ1ZSkubWFwKHVuZXNjYXBlQnJhY2VzKTtcbn1cblxuZnVuY3Rpb24gZW1icmFjZShzdHIpIHtcbiAgcmV0dXJuICd7JyArIHN0ciArICd9Jztcbn1cbmZ1bmN0aW9uIGlzUGFkZGVkKGVsKSB7XG4gIHJldHVybiAvXi0/MFxcZC8udGVzdChlbCk7XG59XG5cbmZ1bmN0aW9uIGx0ZShpLCB5KSB7XG4gIHJldHVybiBpIDw9IHk7XG59XG5mdW5jdGlvbiBndGUoaSwgeSkge1xuICByZXR1cm4gaSA+PSB5O1xufVxuXG5mdW5jdGlvbiBleHBhbmQoc3RyLCBpc1RvcCkge1xuICB2YXIgZXhwYW5zaW9ucyA9IFtdO1xuXG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG4gIGlmICghbSkgcmV0dXJuIFtzdHJdO1xuXG4gIC8vIG5vIG5lZWQgdG8gZXhwYW5kIHByZSwgc2luY2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBmcmVlIG9mIGJyYWNlLXNldHNcbiAgdmFyIHByZSA9IG0ucHJlO1xuICB2YXIgcG9zdCA9IG0ucG9zdC5sZW5ndGhcbiAgICA/IGV4cGFuZChtLnBvc3QsIGZhbHNlKVxuICAgIDogWycnXTtcblxuICBpZiAoL1xcJCQvLnRlc3QobS5wcmUpKSB7ICAgIFxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcG9zdC5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSsgJ3snICsgbS5ib2R5ICsgJ30nICsgcG9zdFtrXTtcbiAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXNOdW1lcmljU2VxdWVuY2UgPSAvXi0/XFxkK1xcLlxcLi0/XFxkKyg/OlxcLlxcLi0/XFxkKyk/JC8udGVzdChtLmJvZHkpO1xuICAgIHZhciBpc0FscGhhU2VxdWVuY2UgPSAvXlthLXpBLVpdXFwuXFwuW2EtekEtWl0oPzpcXC5cXC4tP1xcZCspPyQvLnRlc3QobS5ib2R5KTtcbiAgICB2YXIgaXNTZXF1ZW5jZSA9IGlzTnVtZXJpY1NlcXVlbmNlIHx8IGlzQWxwaGFTZXF1ZW5jZTtcbiAgICB2YXIgaXNPcHRpb25zID0gbS5ib2R5LmluZGV4T2YoJywnKSA+PSAwO1xuICAgIGlmICghaXNTZXF1ZW5jZSAmJiAhaXNPcHRpb25zKSB7XG4gICAgICAvLyB7YX0sYn1cbiAgICAgIGlmIChtLnBvc3QubWF0Y2goLywuKlxcfS8pKSB7XG4gICAgICAgIHN0ciA9IG0ucHJlICsgJ3snICsgbS5ib2R5ICsgZXNjQ2xvc2UgKyBtLnBvc3Q7XG4gICAgICAgIHJldHVybiBleHBhbmQoc3RyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc3RyXTtcbiAgICB9XG5cbiAgICB2YXIgbjtcbiAgICBpZiAoaXNTZXF1ZW5jZSkge1xuICAgICAgbiA9IG0uYm9keS5zcGxpdCgvXFwuXFwuLyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBwYXJzZUNvbW1hUGFydHMobS5ib2R5KTtcbiAgICAgIGlmIChuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyB4e3thLGJ9fXkgPT0+IHh7YX15IHh7Yn15XG4gICAgICAgIG4gPSBleHBhbmQoblswXSwgZmFsc2UpLm1hcChlbWJyYWNlKTtcbiAgICAgICAgaWYgKG4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3QubWFwKGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICAgIHJldHVybiBtLnByZSArIG5bMF0gKyBwO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgbiBpcyB0aGUgcGFydHMsIGFuZCB3ZSBrbm93IGl0J3Mgbm90IGEgY29tbWEgc2V0XG4gICAgLy8gd2l0aCBhIHNpbmdsZSBlbnRyeS5cbiAgICB2YXIgTjtcblxuICAgIGlmIChpc1NlcXVlbmNlKSB7XG4gICAgICB2YXIgeCA9IG51bWVyaWMoblswXSk7XG4gICAgICB2YXIgeSA9IG51bWVyaWMoblsxXSk7XG4gICAgICB2YXIgd2lkdGggPSBNYXRoLm1heChuWzBdLmxlbmd0aCwgblsxXS5sZW5ndGgpXG4gICAgICB2YXIgaW5jciA9IG4ubGVuZ3RoID09IDNcbiAgICAgICAgPyBNYXRoLmFicyhudW1lcmljKG5bMl0pKVxuICAgICAgICA6IDE7XG4gICAgICB2YXIgdGVzdCA9IGx0ZTtcbiAgICAgIHZhciByZXZlcnNlID0geSA8IHg7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICBpbmNyICo9IC0xO1xuICAgICAgICB0ZXN0ID0gZ3RlO1xuICAgICAgfVxuICAgICAgdmFyIHBhZCA9IG4uc29tZShpc1BhZGRlZCk7XG5cbiAgICAgIE4gPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IHg7IHRlc3QoaSwgeSk7IGkgKz0gaW5jcikge1xuICAgICAgICB2YXIgYztcbiAgICAgICAgaWYgKGlzQWxwaGFTZXF1ZW5jZSkge1xuICAgICAgICAgIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgICAgICAgIGlmIChjID09PSAnXFxcXCcpXG4gICAgICAgICAgICBjID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYyA9IFN0cmluZyhpKTtcbiAgICAgICAgICBpZiAocGFkKSB7XG4gICAgICAgICAgICB2YXIgbmVlZCA9IHdpZHRoIC0gYy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobmVlZCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIHogPSBuZXcgQXJyYXkobmVlZCArIDEpLmpvaW4oJzAnKTtcbiAgICAgICAgICAgICAgaWYgKGkgPCAwKVxuICAgICAgICAgICAgICAgIGMgPSAnLScgKyB6ICsgYy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGMgPSB6ICsgYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTi5wdXNoKGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBOID0gW107XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbi5sZW5ndGg7IGorKykge1xuICAgICAgICBOLnB1c2guYXBwbHkoTiwgZXhwYW5kKG5bal0sIGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBOLmxlbmd0aDsgaisrKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSArIE5bal0gKyBwb3N0W2tdO1xuICAgICAgICBpZiAoIWlzVG9wIHx8IGlzU2VxdWVuY2UgfHwgZXhwYW5zaW9uKVxuICAgICAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbnNpb25zO1xufVxuXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///58264\n")},99133:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * Archiver Vending\n *\n * @ignore\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar Archiver = __webpack_require__(10826);\n\nvar formats = {};\n\n/**\n * Dispenses a new Archiver instance.\n *\n * @constructor\n * @param {String} format The archive format to use.\n * @param {Object} options See [Archiver]{@link Archiver}\n * @return {Archiver}\n */\nvar vending = function(format, options) {\n return vending.create(format, options);\n};\n\n/**\n * Creates a new Archiver instance.\n *\n * @param {String} format The archive format to use.\n * @param {Object} options See [Archiver]{@link Archiver}\n * @return {Archiver}\n */\nvending.create = function(format, options) {\n if (formats[format]) {\n var instance = new Archiver(format, options);\n instance.setFormat(format);\n instance.setModule(new formats[format](options));\n\n return instance;\n } else {\n throw new Error('create(' + format + '): format not registered');\n }\n};\n\n/**\n * Registers a format for use with archiver.\n *\n * @param {String} format The name of the format.\n * @param {Function} module The function for archiver to interact with.\n * @return void\n */\nvending.registerFormat = function(format, module) {\n if (formats[format]) {\n throw new Error('register(' + format + '): format already registered');\n }\n\n if (typeof module !== 'function') {\n throw new Error('register(' + format + '): format module invalid');\n }\n\n if (typeof module.prototype.append !== 'function' || typeof module.prototype.finalize !== 'function') {\n throw new Error('register(' + format + '): format module missing methods');\n }\n\n formats[format] = module;\n};\n\n/**\n * Check if the format is already registered.\n * \n * @param {String} format the name of the format.\n * @return boolean\n */\nvending.isRegisteredFormat = function (format) {\n if (formats[format]) {\n return true;\n }\n \n return false;\n};\n\nvending.registerFormat('zip', __webpack_require__(43541));\nvending.registerFormat('tar', __webpack_require__(60741));\nvending.registerFormat('json', __webpack_require__(76530));\n\nmodule.exports = vending;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkxMzMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxLQUFZOztBQUVuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVEsdUJBQXVCO0FBQzNDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRLHVCQUF1QjtBQUMzQyxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIsbUJBQU8sQ0FBQyxLQUFtQjtBQUN6RCw4QkFBOEIsbUJBQU8sQ0FBQyxLQUFtQjtBQUN6RCwrQkFBK0IsbUJBQU8sQ0FBQyxLQUFvQjs7QUFFM0QiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyL2luZGV4LmpzPzYzZGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcmNoaXZlciBWZW5kaW5nXG4gKlxuICogQGlnbm9yZVxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIEFyY2hpdmVyID0gcmVxdWlyZSgnLi9saWIvY29yZScpO1xuXG52YXIgZm9ybWF0cyA9IHt9O1xuXG4vKipcbiAqIERpc3BlbnNlcyBhIG5ldyBBcmNoaXZlciBpbnN0YW5jZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSAge1N0cmluZ30gZm9ybWF0IFRoZSBhcmNoaXZlIGZvcm1hdCB0byB1c2UuXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgU2VlIFtBcmNoaXZlcl17QGxpbmsgQXJjaGl2ZXJ9XG4gKiBAcmV0dXJuIHtBcmNoaXZlcn1cbiAqL1xudmFyIHZlbmRpbmcgPSBmdW5jdGlvbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHZlbmRpbmcuY3JlYXRlKGZvcm1hdCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQXJjaGl2ZXIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBmb3JtYXQgVGhlIGFyY2hpdmUgZm9ybWF0IHRvIHVzZS5cbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyBTZWUgW0FyY2hpdmVyXXtAbGluayBBcmNoaXZlcn1cbiAqIEByZXR1cm4ge0FyY2hpdmVyfVxuICovXG52ZW5kaW5nLmNyZWF0ZSA9IGZ1bmN0aW9uKGZvcm1hdCwgb3B0aW9ucykge1xuICBpZiAoZm9ybWF0c1tmb3JtYXRdKSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IEFyY2hpdmVyKGZvcm1hdCwgb3B0aW9ucyk7XG4gICAgaW5zdGFuY2Uuc2V0Rm9ybWF0KGZvcm1hdCk7XG4gICAgaW5zdGFuY2Uuc2V0TW9kdWxlKG5ldyBmb3JtYXRzW2Zvcm1hdF0ob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlKCcgKyBmb3JtYXQgKyAnKTogZm9ybWF0IG5vdCByZWdpc3RlcmVkJyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgZm9ybWF0IGZvciB1c2Ugd2l0aCBhcmNoaXZlci5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGZvcm1hdCBUaGUgbmFtZSBvZiB0aGUgZm9ybWF0LlxuICogQHBhcmFtICB7RnVuY3Rpb259IG1vZHVsZSBUaGUgZnVuY3Rpb24gZm9yIGFyY2hpdmVyIHRvIGludGVyYWN0IHdpdGguXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xudmVuZGluZy5yZWdpc3RlckZvcm1hdCA9IGZ1bmN0aW9uKGZvcm1hdCwgbW9kdWxlKSB7XG4gIGlmIChmb3JtYXRzW2Zvcm1hdF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlZ2lzdGVyKCcgKyBmb3JtYXQgKyAnKTogZm9ybWF0IGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlZ2lzdGVyKCcgKyBmb3JtYXQgKyAnKTogZm9ybWF0IG1vZHVsZSBpbnZhbGlkJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG1vZHVsZS5wcm90b3R5cGUuYXBwZW5kICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBtb2R1bGUucHJvdG90eXBlLmZpbmFsaXplICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWdpc3RlcignICsgZm9ybWF0ICsgJyk6IGZvcm1hdCBtb2R1bGUgbWlzc2luZyBtZXRob2RzJyk7XG4gIH1cblxuICBmb3JtYXRzW2Zvcm1hdF0gPSBtb2R1bGU7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBmb3JtYXQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IHRoZSBuYW1lIG9mIHRoZSBmb3JtYXQuXG4gKiBAcmV0dXJuIGJvb2xlYW5cbiAqL1xudmVuZGluZy5pc1JlZ2lzdGVyZWRGb3JtYXQgPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gIGlmIChmb3JtYXRzW2Zvcm1hdF0pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmVuZGluZy5yZWdpc3RlckZvcm1hdCgnemlwJywgcmVxdWlyZSgnLi9saWIvcGx1Z2lucy96aXAnKSk7XG52ZW5kaW5nLnJlZ2lzdGVyRm9ybWF0KCd0YXInLCByZXF1aXJlKCcuL2xpYi9wbHVnaW5zL3RhcicpKTtcbnZlbmRpbmcucmVnaXN0ZXJGb3JtYXQoJ2pzb24nLCByZXF1aXJlKCcuL2xpYi9wbHVnaW5zL2pzb24nKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdmVuZGluZzsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///99133\n")},10826:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * Archiver Core\n *\n * @ignore\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar fs = __webpack_require__(79896);\nvar glob = __webpack_require__(76965);\nvar async = __webpack_require__(22268);\nvar path = __webpack_require__(16928);\nvar util = __webpack_require__(91789);\n\nvar inherits = (__webpack_require__(39023).inherits);\nvar ArchiverError = __webpack_require__(82383);\nvar Transform = (__webpack_require__(34478).Transform);\n\nvar win32 = process.platform === 'win32';\n\n/**\n * @constructor\n * @param {String} format The archive format to use.\n * @param {(CoreOptions|TransformOptions)} options See also {@link ZipOptions} and {@link TarOptions}.\n */\nvar Archiver = function(format, options) {\n if (!(this instanceof Archiver)) {\n return new Archiver(format, options);\n }\n\n if (typeof format !== 'string') {\n options = format;\n format = 'zip';\n }\n\n options = this.options = util.defaults(options, {\n highWaterMark: 1024 * 1024,\n statConcurrency: 4\n });\n\n Transform.call(this, options);\n\n this._format = false;\n this._module = false;\n this._pending = 0;\n this._pointer = 0;\n\n this._entriesCount = 0;\n this._entriesProcessedCount = 0;\n this._fsEntriesTotalBytes = 0;\n this._fsEntriesProcessedBytes = 0;\n\n this._queue = async.queue(this._onQueueTask.bind(this), 1);\n this._queue.drain(this._onQueueDrain.bind(this));\n\n this._statQueue = async.queue(this._onStatQueueTask.bind(this), options.statConcurrency);\n this._statQueue.drain(this._onQueueDrain.bind(this));\n\n this._state = {\n aborted: false,\n finalize: false,\n finalizing: false,\n finalized: false,\n modulePiped: false\n };\n\n this._streams = [];\n};\n\ninherits(Archiver, Transform);\n\n/**\n * Internal logic for `abort`.\n *\n * @private\n * @return void\n */\nArchiver.prototype._abort = function() {\n this._state.aborted = true;\n this._queue.kill();\n this._statQueue.kill();\n\n if (this._queue.idle()) {\n this._shutdown();\n }\n};\n\n/**\n * Internal helper for appending files.\n *\n * @private\n * @param {String} filepath The source filepath.\n * @param {EntryData} data The entry data.\n * @return void\n */\nArchiver.prototype._append = function(filepath, data) {\n data = data || {};\n\n var task = {\n source: null,\n filepath: filepath\n };\n\n if (!data.name) {\n data.name = filepath;\n }\n\n data.sourcePath = filepath;\n task.data = data;\n this._entriesCount++;\n\n if (data.stats && data.stats instanceof fs.Stats) {\n task = this._updateQueueTaskWithStats(task, data.stats);\n if (task) {\n if (data.stats.size) {\n this._fsEntriesTotalBytes += data.stats.size;\n }\n\n this._queue.push(task);\n }\n } else {\n this._statQueue.push(task);\n }\n};\n\n/**\n * Internal logic for `finalize`.\n *\n * @private\n * @return void\n */\nArchiver.prototype._finalize = function() {\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n return;\n }\n\n this._state.finalizing = true;\n\n this._moduleFinalize();\n\n this._state.finalizing = false;\n this._state.finalized = true;\n};\n\n/**\n * Checks the various state variables to determine if we can `finalize`.\n *\n * @private\n * @return {Boolean}\n */\nArchiver.prototype._maybeFinalize = function() {\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n return false;\n }\n\n if (this._state.finalize && this._pending === 0 && this._queue.idle() && this._statQueue.idle()) {\n this._finalize();\n return true;\n }\n\n return false;\n};\n\n/**\n * Appends an entry to the module.\n *\n * @private\n * @fires Archiver#entry\n * @param {(Buffer|Stream)} source\n * @param {EntryData} data\n * @param {Function} callback\n * @return void\n */\nArchiver.prototype._moduleAppend = function(source, data, callback) {\n if (this._state.aborted) {\n callback();\n return;\n }\n\n this._module.append(source, data, function(err) {\n this._task = null;\n\n if (this._state.aborted) {\n this._shutdown();\n return;\n }\n\n if (err) {\n this.emit('error', err);\n setImmediate(callback);\n return;\n }\n\n /**\n * Fires when the entry's input has been processed and appended to the archive.\n *\n * @event Archiver#entry\n * @type {EntryData}\n */\n this.emit('entry', data);\n this._entriesProcessedCount++;\n\n if (data.stats && data.stats.size) {\n this._fsEntriesProcessedBytes += data.stats.size;\n }\n\n /**\n * @event Archiver#progress\n * @type {ProgressData}\n */\n this.emit('progress', {\n entries: {\n total: this._entriesCount,\n processed: this._entriesProcessedCount\n },\n fs: {\n totalBytes: this._fsEntriesTotalBytes,\n processedBytes: this._fsEntriesProcessedBytes\n }\n });\n\n setImmediate(callback);\n }.bind(this));\n};\n\n/**\n * Finalizes the module.\n *\n * @private\n * @return void\n */\nArchiver.prototype._moduleFinalize = function() {\n if (typeof this._module.finalize === 'function') {\n this._module.finalize();\n } else if (typeof this._module.end === 'function') {\n this._module.end();\n } else {\n this.emit('error', new ArchiverError('NOENDMETHOD'));\n }\n};\n\n/**\n * Pipes the module to our internal stream with error bubbling.\n *\n * @private\n * @return void\n */\nArchiver.prototype._modulePipe = function() {\n this._module.on('error', this._onModuleError.bind(this));\n this._module.pipe(this);\n this._state.modulePiped = true;\n};\n\n/**\n * Determines if the current module supports a defined feature.\n *\n * @private\n * @param {String} key\n * @return {Boolean}\n */\nArchiver.prototype._moduleSupports = function(key) {\n if (!this._module.supports || !this._module.supports[key]) {\n return false;\n }\n\n return this._module.supports[key];\n};\n\n/**\n * Unpipes the module from our internal stream.\n *\n * @private\n * @return void\n */\nArchiver.prototype._moduleUnpipe = function() {\n this._module.unpipe(this);\n this._state.modulePiped = false;\n};\n\n/**\n * Normalizes entry data with fallbacks for key properties.\n *\n * @private\n * @param {Object} data\n * @param {fs.Stats} stats\n * @return {Object}\n */\nArchiver.prototype._normalizeEntryData = function(data, stats) {\n data = util.defaults(data, {\n type: 'file',\n name: null,\n date: null,\n mode: null,\n prefix: null,\n sourcePath: null,\n stats: false\n });\n\n if (stats && data.stats === false) {\n data.stats = stats;\n }\n\n var isDir = data.type === 'directory';\n\n if (data.name) {\n if (typeof data.prefix === 'string' && '' !== data.prefix) {\n data.name = data.prefix + '/' + data.name;\n data.prefix = null;\n }\n\n data.name = util.sanitizePath(data.name);\n\n if (data.type !== 'symlink' && data.name.slice(-1) === '/') {\n isDir = true;\n data.type = 'directory';\n } else if (isDir) {\n data.name += '/';\n }\n }\n\n // 511 === 0777; 493 === 0755; 438 === 0666; 420 === 0644\n if (typeof data.mode === 'number') {\n if (win32) {\n data.mode &= 511;\n } else {\n data.mode &= 4095\n }\n } else if (data.stats && data.mode === null) {\n if (win32) {\n data.mode = data.stats.mode & 511;\n } else {\n data.mode = data.stats.mode & 4095;\n }\n\n // stat isn't reliable on windows; force 0755 for dir\n if (win32 && isDir) {\n data.mode = 493;\n }\n } else if (data.mode === null) {\n data.mode = isDir ? 493 : 420;\n }\n\n if (data.stats && data.date === null) {\n data.date = data.stats.mtime;\n } else {\n data.date = util.dateify(data.date);\n }\n\n return data;\n};\n\n/**\n * Error listener that re-emits error on to our internal stream.\n *\n * @private\n * @param {Error} err\n * @return void\n */\nArchiver.prototype._onModuleError = function(err) {\n /**\n * @event Archiver#error\n * @type {ErrorData}\n */\n this.emit('error', err);\n};\n\n/**\n * Checks the various state variables after queue has drained to determine if\n * we need to `finalize`.\n *\n * @private\n * @return void\n */\nArchiver.prototype._onQueueDrain = function() {\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n return;\n }\n\n if (this._state.finalize && this._pending === 0 && this._queue.idle() && this._statQueue.idle()) {\n this._finalize();\n }\n};\n\n/**\n * Appends each queue task to the module.\n *\n * @private\n * @param {Object} task\n * @param {Function} callback\n * @return void\n */\nArchiver.prototype._onQueueTask = function(task, callback) {\n var fullCallback = () => {\n if(task.data.callback) {\n task.data.callback();\n }\n callback();\n }\n\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n fullCallback();\n return;\n }\n\n this._task = task;\n this._moduleAppend(task.source, task.data, fullCallback);\n};\n\n/**\n * Performs a file stat and reinjects the task back into the queue.\n *\n * @private\n * @param {Object} task\n * @param {Function} callback\n * @return void\n */\nArchiver.prototype._onStatQueueTask = function(task, callback) {\n if (this._state.finalizing || this._state.finalized || this._state.aborted) {\n callback();\n return;\n }\n\n fs.lstat(task.filepath, function(err, stats) {\n if (this._state.aborted) {\n setImmediate(callback);\n return;\n }\n\n if (err) {\n this._entriesCount--;\n\n /**\n * @event Archiver#warning\n * @type {ErrorData}\n */\n this.emit('warning', err);\n setImmediate(callback);\n return;\n }\n\n task = this._updateQueueTaskWithStats(task, stats);\n\n if (task) {\n if (stats.size) {\n this._fsEntriesTotalBytes += stats.size;\n }\n\n this._queue.push(task);\n }\n\n setImmediate(callback);\n }.bind(this));\n};\n\n/**\n * Unpipes the module and ends our internal stream.\n *\n * @private\n * @return void\n */\nArchiver.prototype._shutdown = function() {\n this._moduleUnpipe();\n this.end();\n};\n\n/**\n * Tracks the bytes emitted by our internal stream.\n *\n * @private\n * @param {Buffer} chunk\n * @param {String} encoding\n * @param {Function} callback\n * @return void\n */\nArchiver.prototype._transform = function(chunk, encoding, callback) {\n if (chunk) {\n this._pointer += chunk.length;\n }\n\n callback(null, chunk);\n};\n\n/**\n * Updates and normalizes a queue task using stats data.\n *\n * @private\n * @param {Object} task\n * @param {fs.Stats} stats\n * @return {Object}\n */\nArchiver.prototype._updateQueueTaskWithStats = function(task, stats) {\n if (stats.isFile()) {\n task.data.type = 'file';\n task.data.sourceType = 'stream';\n task.source = util.lazyReadStream(task.filepath);\n } else if (stats.isDirectory() && this._moduleSupports('directory')) {\n task.data.name = util.trailingSlashIt(task.data.name);\n task.data.type = 'directory';\n task.data.sourcePath = util.trailingSlashIt(task.filepath);\n task.data.sourceType = 'buffer';\n task.source = Buffer.concat([]);\n } else if (stats.isSymbolicLink() && this._moduleSupports('symlink')) {\n var linkPath = fs.readlinkSync(task.filepath);\n var dirName = path.dirname(task.filepath);\n task.data.type = 'symlink';\n task.data.linkname = path.relative(dirName, path.resolve(dirName, linkPath));\n task.data.sourceType = 'buffer';\n task.source = Buffer.concat([]);\n } else {\n if (stats.isDirectory()) {\n this.emit('warning', new ArchiverError('DIRECTORYNOTSUPPORTED', task.data));\n } else if (stats.isSymbolicLink()) {\n this.emit('warning', new ArchiverError('SYMLINKNOTSUPPORTED', task.data));\n } else {\n this.emit('warning', new ArchiverError('ENTRYNOTSUPPORTED', task.data));\n }\n\n return null;\n }\n\n task.data = this._normalizeEntryData(task.data, stats);\n\n return task;\n};\n\n/**\n * Aborts the archiving process, taking a best-effort approach, by:\n *\n * - removing any pending queue tasks\n * - allowing any active queue workers to finish\n * - detaching internal module pipes\n * - ending both sides of the Transform stream\n *\n * It will NOT drain any remaining sources.\n *\n * @return {this}\n */\nArchiver.prototype.abort = function() {\n if (this._state.aborted || this._state.finalized) {\n return this;\n }\n\n this._abort();\n\n return this;\n};\n\n/**\n * Appends an input source (text string, buffer, or stream) to the instance.\n *\n * When the instance has received, processed, and emitted the input, the `entry`\n * event is fired.\n *\n * @fires Archiver#entry\n * @param {(Buffer|Stream|String)} source The input source.\n * @param {EntryData} data See also {@link ZipEntryData} and {@link TarEntryData}.\n * @return {this}\n */\nArchiver.prototype.append = function(source, data) {\n if (this._state.finalize || this._state.aborted) {\n this.emit('error', new ArchiverError('QUEUECLOSED'));\n return this;\n }\n\n data = this._normalizeEntryData(data);\n\n if (typeof data.name !== 'string' || data.name.length === 0) {\n this.emit('error', new ArchiverError('ENTRYNAMEREQUIRED'));\n return this;\n }\n\n if (data.type === 'directory' && !this._moduleSupports('directory')) {\n this.emit('error', new ArchiverError('DIRECTORYNOTSUPPORTED', { name: data.name }));\n return this;\n }\n\n source = util.normalizeInputSource(source);\n\n if (Buffer.isBuffer(source)) {\n data.sourceType = 'buffer';\n } else if (util.isStream(source)) {\n data.sourceType = 'stream';\n } else {\n this.emit('error', new ArchiverError('INPUTSTEAMBUFFERREQUIRED', { name: data.name }));\n return this;\n }\n\n this._entriesCount++;\n this._queue.push({\n data: data,\n source: source\n });\n\n return this;\n};\n\n/**\n * Appends a directory and its files, recursively, given its dirpath.\n *\n * @param {String} dirpath The source directory path.\n * @param {String} destpath The destination path within the archive.\n * @param {(EntryData|Function)} data See also [ZipEntryData]{@link ZipEntryData} and\n * [TarEntryData]{@link TarEntryData}.\n * @return {this}\n */\nArchiver.prototype.directory = function(dirpath, destpath, data) {\n if (this._state.finalize || this._state.aborted) {\n this.emit('error', new ArchiverError('QUEUECLOSED'));\n return this;\n }\n\n if (typeof dirpath !== 'string' || dirpath.length === 0) {\n this.emit('error', new ArchiverError('DIRECTORYDIRPATHREQUIRED'));\n return this;\n }\n\n this._pending++;\n\n if (destpath === false) {\n destpath = '';\n } else if (typeof destpath !== 'string'){\n destpath = dirpath;\n }\n\n var dataFunction = false;\n if (typeof data === 'function') {\n dataFunction = data;\n data = {};\n } else if (typeof data !== 'object') {\n data = {};\n }\n\n var globOptions = {\n stat: true,\n dot: true\n };\n\n function onGlobEnd() {\n this._pending--;\n this._maybeFinalize();\n }\n\n function onGlobError(err) {\n this.emit('error', err);\n }\n\n function onGlobMatch(match){\n globber.pause();\n\n var ignoreMatch = false;\n var entryData = Object.assign({}, data);\n entryData.name = match.relative;\n entryData.prefix = destpath;\n entryData.stats = match.stat;\n entryData.callback = globber.resume.bind(globber);\n\n try {\n if (dataFunction) {\n entryData = dataFunction(entryData);\n\n if (entryData === false) {\n ignoreMatch = true;\n } else if (typeof entryData !== 'object') {\n throw new ArchiverError('DIRECTORYFUNCTIONINVALIDDATA', { dirpath: dirpath });\n }\n }\n } catch(e) {\n this.emit('error', e);\n return;\n }\n\n if (ignoreMatch) {\n globber.resume();\n return;\n }\n\n this._append(match.absolute, entryData);\n }\n\n var globber = glob(dirpath, globOptions);\n globber.on('error', onGlobError.bind(this));\n globber.on('match', onGlobMatch.bind(this));\n globber.on('end', onGlobEnd.bind(this));\n\n return this;\n};\n\n/**\n * Appends a file given its filepath using a\n * [lazystream]{@link https://github.com/jpommerening/node-lazystream} wrapper to\n * prevent issues with open file limits.\n *\n * When the instance has received, processed, and emitted the file, the `entry`\n * event is fired.\n *\n * @param {String} filepath The source filepath.\n * @param {EntryData} data See also [ZipEntryData]{@link ZipEntryData} and\n * [TarEntryData]{@link TarEntryData}.\n * @return {this}\n */\nArchiver.prototype.file = function(filepath, data) {\n if (this._state.finalize || this._state.aborted) {\n this.emit('error', new ArchiverError('QUEUECLOSED'));\n return this;\n }\n\n if (typeof filepath !== 'string' || filepath.length === 0) {\n this.emit('error', new ArchiverError('FILEFILEPATHREQUIRED'));\n return this;\n }\n\n this._append(filepath, data);\n\n return this;\n};\n\n/**\n * Appends multiple files that match a glob pattern.\n *\n * @param {String} pattern The [glob pattern]{@link https://github.com/isaacs/minimatch} to match.\n * @param {Object} options See [node-readdir-glob]{@link https://github.com/yqnn/node-readdir-glob#options}.\n * @param {EntryData} data See also [ZipEntryData]{@link ZipEntryData} and\n * [TarEntryData]{@link TarEntryData}.\n * @return {this}\n */\nArchiver.prototype.glob = function(pattern, options, data) {\n this._pending++;\n\n options = util.defaults(options, {\n stat: true,\n pattern: pattern\n });\n\n function onGlobEnd() {\n this._pending--;\n this._maybeFinalize();\n }\n\n function onGlobError(err) {\n this.emit('error', err);\n }\n\n function onGlobMatch(match){\n globber.pause();\n var entryData = Object.assign({}, data);\n entryData.callback = globber.resume.bind(globber);\n entryData.stats = match.stat;\n entryData.name = match.relative;\n\n this._append(match.absolute, entryData);\n }\n\n var globber = glob(options.cwd || '.', options);\n globber.on('error', onGlobError.bind(this));\n globber.on('match', onGlobMatch.bind(this));\n globber.on('end', onGlobEnd.bind(this));\n\n return this;\n};\n\n/**\n * Finalizes the instance and prevents further appending to the archive\n * structure (queue will continue til drained).\n *\n * The `end`, `close` or `finish` events on the destination stream may fire\n * right after calling this method so you should set listeners beforehand to\n * properly detect stream completion.\n *\n * @return {Promise}\n */\nArchiver.prototype.finalize = function() {\n if (this._state.aborted) {\n var abortedError = new ArchiverError('ABORTED');\n this.emit('error', abortedError);\n return Promise.reject(abortedError);\n }\n\n if (this._state.finalize) {\n var finalizingError = new ArchiverError('FINALIZING');\n this.emit('error', finalizingError);\n return Promise.reject(finalizingError);\n }\n\n this._state.finalize = true;\n\n if (this._pending === 0 && this._queue.idle() && this._statQueue.idle()) {\n this._finalize();\n }\n\n var self = this;\n\n return new Promise(function(resolve, reject) {\n var errored;\n\n self._module.on('end', function() {\n if (!errored) {\n resolve();\n }\n })\n\n self._module.on('error', function(err) {\n errored = true;\n reject(err);\n })\n })\n};\n\n/**\n * Sets the module format name used for archiving.\n *\n * @param {String} format The name of the format.\n * @return {this}\n */\nArchiver.prototype.setFormat = function(format) {\n if (this._format) {\n this.emit('error', new ArchiverError('FORMATSET'));\n return this;\n }\n\n this._format = format;\n\n return this;\n};\n\n/**\n * Sets the module used for archiving.\n *\n * @param {Function} module The function for archiver to interact with.\n * @return {this}\n */\nArchiver.prototype.setModule = function(module) {\n if (this._state.aborted) {\n this.emit('error', new ArchiverError('ABORTED'));\n return this;\n }\n\n if (this._state.module) {\n this.emit('error', new ArchiverError('MODULESET'));\n return this;\n }\n\n this._module = module;\n this._modulePipe();\n\n return this;\n};\n\n/**\n * Appends a symlink to the instance.\n *\n * This does NOT interact with filesystem and is used for programmatically creating symlinks.\n *\n * @param {String} filepath The symlink path (within archive).\n * @param {String} target The target path (within archive).\n * @param {Number} mode Sets the entry permissions.\n * @return {this}\n */\nArchiver.prototype.symlink = function(filepath, target, mode) {\n if (this._state.finalize || this._state.aborted) {\n this.emit('error', new ArchiverError('QUEUECLOSED'));\n return this;\n }\n\n if (typeof filepath !== 'string' || filepath.length === 0) {\n this.emit('error', new ArchiverError('SYMLINKFILEPATHREQUIRED'));\n return this;\n }\n\n if (typeof target !== 'string' || target.length === 0) {\n this.emit('error', new ArchiverError('SYMLINKTARGETREQUIRED', { filepath: filepath }));\n return this;\n }\n\n if (!this._moduleSupports('symlink')) {\n this.emit('error', new ArchiverError('SYMLINKNOTSUPPORTED', { filepath: filepath }));\n return this;\n }\n\n var data = {};\n data.type = 'symlink';\n data.name = filepath.replace(/\\\\/g, '/');\n data.linkname = target.replace(/\\\\/g, '/');\n data.sourceType = 'buffer';\n\n if (typeof mode === \"number\") {\n data.mode = mode;\n }\n\n this._entriesCount++;\n this._queue.push({\n data: data,\n source: Buffer.concat([])\n });\n\n return this;\n};\n\n/**\n * Returns the current length (in bytes) that has been emitted.\n *\n * @return {Number}\n */\nArchiver.prototype.pointer = function() {\n return this._pointer;\n};\n\n/**\n * Middleware-like helper that has yet to be fully implemented.\n *\n * @private\n * @param {Function} plugin\n * @return {this}\n */\nArchiver.prototype.use = function(plugin) {\n this._streams.push(plugin);\n return this;\n};\n\nmodule.exports = Archiver;\n\n/**\n * @typedef {Object} CoreOptions\n * @global\n * @property {Number} [statConcurrency=4] Sets the number of workers used to\n * process the internal fs stat queue.\n */\n\n/**\n * @typedef {Object} TransformOptions\n * @property {Boolean} [allowHalfOpen=true] If set to false, then the stream\n * will automatically end the readable side when the writable side ends and vice\n * versa.\n * @property {Boolean} [readableObjectMode=false] Sets objectMode for readable\n * side of the stream. Has no effect if objectMode is true.\n * @property {Boolean} [writableObjectMode=false] Sets objectMode for writable\n * side of the stream. Has no effect if objectMode is true.\n * @property {Boolean} [decodeStrings=true] Whether or not to decode strings\n * into Buffers before passing them to _write(). `Writable`\n * @property {String} [encoding=NULL] If specified, then buffers will be decoded\n * to strings using the specified encoding. `Readable`\n * @property {Number} [highWaterMark=16kb] The maximum number of bytes to store\n * in the internal buffer before ceasing to read from the underlying resource.\n * `Readable` `Writable`\n * @property {Boolean} [objectMode=false] Whether this stream should behave as a\n * stream of objects. Meaning that stream.read(n) returns a single value instead\n * of a Buffer of size n. `Readable` `Writable`\n */\n\n/**\n * @typedef {Object} EntryData\n * @property {String} name Sets the entry name including internal path.\n * @property {(String|Date)} [date=NOW()] Sets the entry date.\n * @property {Number} [mode=D:0755/F:0644] Sets the entry permissions.\n * @property {String} [prefix] Sets a path prefix for the entry name. Useful\n * when working with methods like `directory` or `glob`.\n * @property {fs.Stats} [stats] Sets the fs stat data for this entry allowing\n * for reduction of fs stat calls when stat data is already known.\n */\n\n/**\n * @typedef {Object} ErrorData\n * @property {String} message The message of the error.\n * @property {String} code The error code assigned to this error.\n * @property {String} data Additional data provided for reporting or debugging (where available).\n */\n\n/**\n * @typedef {Object} ProgressData\n * @property {Object} entries\n * @property {Number} entries.total Number of entries that have been appended.\n * @property {Number} entries.processed Number of entries that have been processed.\n * @property {Object} fs\n * @property {Number} fs.totalBytes Number of bytes that have been appended. Calculated asynchronously and might not be accurate: it growth while entries are added. (based on fs.Stats)\n * @property {Number} fs.processedBytes Number of bytes that have been processed. (based on fs.Stats)\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsZUFBZTtBQUM3QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEI7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2FyY2hpdmVyL2xpYi9jb3JlLmpzP2U3YTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcmNoaXZlciBDb3JlXG4gKlxuICogQGlnbm9yZVxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBnbG9iID0gcmVxdWlyZSgncmVhZGRpci1nbG9iJyk7XG52YXIgYXN5bmMgPSByZXF1aXJlKCdhc3luYycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ2FyY2hpdmVyLXV0aWxzJyk7XG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0cztcbnZhciBBcmNoaXZlckVycm9yID0gcmVxdWlyZSgnLi9lcnJvcicpO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlRyYW5zZm9ybTtcblxudmFyIHdpbjMyID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgVGhlIGFyY2hpdmUgZm9ybWF0IHRvIHVzZS5cbiAqIEBwYXJhbSB7KENvcmVPcHRpb25zfFRyYW5zZm9ybU9wdGlvbnMpfSBvcHRpb25zIFNlZSBhbHNvIHtAbGluayBaaXBPcHRpb25zfSBhbmQge0BsaW5rIFRhck9wdGlvbnN9LlxuICovXG52YXIgQXJjaGl2ZXIgPSBmdW5jdGlvbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFyY2hpdmVyKSkge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXIoZm9ybWF0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZm9ybWF0ICE9PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSBmb3JtYXQ7XG4gICAgZm9ybWF0ID0gJ3ppcCc7XG4gIH1cblxuICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdXRpbC5kZWZhdWx0cyhvcHRpb25zLCB7XG4gICAgaGlnaFdhdGVyTWFyazogMTAyNCAqIDEwMjQsXG4gICAgc3RhdENvbmN1cnJlbmN5OiA0XG4gIH0pO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX2Zvcm1hdCA9IGZhbHNlO1xuICB0aGlzLl9tb2R1bGUgPSBmYWxzZTtcbiAgdGhpcy5fcGVuZGluZyA9IDA7XG4gIHRoaXMuX3BvaW50ZXIgPSAwO1xuXG4gIHRoaXMuX2VudHJpZXNDb3VudCA9IDA7XG4gIHRoaXMuX2VudHJpZXNQcm9jZXNzZWRDb3VudCA9IDA7XG4gIHRoaXMuX2ZzRW50cmllc1RvdGFsQnl0ZXMgPSAwO1xuICB0aGlzLl9mc0VudHJpZXNQcm9jZXNzZWRCeXRlcyA9IDA7XG5cbiAgdGhpcy5fcXVldWUgPSBhc3luYy5xdWV1ZSh0aGlzLl9vblF1ZXVlVGFzay5iaW5kKHRoaXMpLCAxKTtcbiAgdGhpcy5fcXVldWUuZHJhaW4odGhpcy5fb25RdWV1ZURyYWluLmJpbmQodGhpcykpO1xuXG4gIHRoaXMuX3N0YXRRdWV1ZSA9IGFzeW5jLnF1ZXVlKHRoaXMuX29uU3RhdFF1ZXVlVGFzay5iaW5kKHRoaXMpLCBvcHRpb25zLnN0YXRDb25jdXJyZW5jeSk7XG4gIHRoaXMuX3N0YXRRdWV1ZS5kcmFpbih0aGlzLl9vblF1ZXVlRHJhaW4uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5fc3RhdGUgPSB7XG4gICAgYWJvcnRlZDogZmFsc2UsXG4gICAgZmluYWxpemU6IGZhbHNlLFxuICAgIGZpbmFsaXppbmc6IGZhbHNlLFxuICAgIGZpbmFsaXplZDogZmFsc2UsXG4gICAgbW9kdWxlUGlwZWQ6IGZhbHNlXG4gIH07XG5cbiAgdGhpcy5fc3RyZWFtcyA9IFtdO1xufTtcblxuaW5oZXJpdHMoQXJjaGl2ZXIsIFRyYW5zZm9ybSk7XG5cbi8qKlxuICogSW50ZXJuYWwgbG9naWMgZm9yIGBhYm9ydGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX2Fib3J0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N0YXRlLmFib3J0ZWQgPSB0cnVlO1xuICB0aGlzLl9xdWV1ZS5raWxsKCk7XG4gIHRoaXMuX3N0YXRRdWV1ZS5raWxsKCk7XG5cbiAgaWYgKHRoaXMuX3F1ZXVlLmlkbGUoKSkge1xuICAgIHRoaXMuX3NodXRkb3duKCk7XG4gIH1cbn07XG5cbi8qKlxuICogSW50ZXJuYWwgaGVscGVyIGZvciBhcHBlbmRpbmcgZmlsZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge1N0cmluZ30gZmlsZXBhdGggVGhlIHNvdXJjZSBmaWxlcGF0aC5cbiAqIEBwYXJhbSAge0VudHJ5RGF0YX0gZGF0YSBUaGUgZW50cnkgZGF0YS5cbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX2FwcGVuZCA9IGZ1bmN0aW9uKGZpbGVwYXRoLCBkYXRhKSB7XG4gIGRhdGEgPSBkYXRhIHx8IHt9O1xuXG4gIHZhciB0YXNrID0ge1xuICAgIHNvdXJjZTogbnVsbCxcbiAgICBmaWxlcGF0aDogZmlsZXBhdGhcbiAgfTtcblxuICBpZiAoIWRhdGEubmFtZSkge1xuICAgIGRhdGEubmFtZSA9IGZpbGVwYXRoO1xuICB9XG5cbiAgZGF0YS5zb3VyY2VQYXRoID0gZmlsZXBhdGg7XG4gIHRhc2suZGF0YSA9IGRhdGE7XG4gIHRoaXMuX2VudHJpZXNDb3VudCsrO1xuXG4gIGlmIChkYXRhLnN0YXRzICYmIGRhdGEuc3RhdHMgaW5zdGFuY2VvZiBmcy5TdGF0cykge1xuICAgIHRhc2sgPSB0aGlzLl91cGRhdGVRdWV1ZVRhc2tXaXRoU3RhdHModGFzaywgZGF0YS5zdGF0cyk7XG4gICAgaWYgKHRhc2spIHtcbiAgICAgIGlmIChkYXRhLnN0YXRzLnNpemUpIHtcbiAgICAgICAgdGhpcy5fZnNFbnRyaWVzVG90YWxCeXRlcyArPSBkYXRhLnN0YXRzLnNpemU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2godGFzayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX3N0YXRRdWV1ZS5wdXNoKHRhc2spO1xuICB9XG59O1xuXG4vKipcbiAqIEludGVybmFsIGxvZ2ljIGZvciBgZmluYWxpemVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9maW5hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemluZyB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX3N0YXRlLmZpbmFsaXppbmcgPSB0cnVlO1xuXG4gIHRoaXMuX21vZHVsZUZpbmFsaXplKCk7XG5cbiAgdGhpcy5fc3RhdGUuZmluYWxpemluZyA9IGZhbHNlO1xuICB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBDaGVja3MgdGhlIHZhcmlvdXMgc3RhdGUgdmFyaWFibGVzIHRvIGRldGVybWluZSBpZiB3ZSBjYW4gYGZpbmFsaXplYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9tYXliZUZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6aW5nIHx8IHRoaXMuX3N0YXRlLmZpbmFsaXplZCB8fCB0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXplICYmIHRoaXMuX3BlbmRpbmcgPT09IDAgJiYgdGhpcy5fcXVldWUuaWRsZSgpICYmIHRoaXMuX3N0YXRRdWV1ZS5pZGxlKCkpIHtcbiAgICB0aGlzLl9maW5hbGl6ZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGFuIGVudHJ5IHRvIHRoZSBtb2R1bGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmaXJlcyAgQXJjaGl2ZXIjZW50cnlcbiAqIEBwYXJhbSAgeyhCdWZmZXJ8U3RyZWFtKX0gc291cmNlXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGFcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbW9kdWxlQXBwZW5kID0gZnVuY3Rpb24oc291cmNlLCBkYXRhLCBjYWxsYmFjaykge1xuICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIGNhbGxiYWNrKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlLmFwcGVuZChzb3VyY2UsIGRhdGEsIGZ1bmN0aW9uKGVycikge1xuICAgIHRoaXMuX3Rhc2sgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICAgIHRoaXMuX3NodXRkb3duKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGVycikge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIGVudHJ5J3MgaW5wdXQgaGFzIGJlZW4gcHJvY2Vzc2VkIGFuZCBhcHBlbmRlZCB0byB0aGUgYXJjaGl2ZS5cbiAgICAgKlxuICAgICAqIEBldmVudCBBcmNoaXZlciNlbnRyeVxuICAgICAqIEB0eXBlIHtFbnRyeURhdGF9XG4gICAgICovXG4gICAgdGhpcy5lbWl0KCdlbnRyeScsIGRhdGEpO1xuICAgIHRoaXMuX2VudHJpZXNQcm9jZXNzZWRDb3VudCsrO1xuXG4gICAgaWYgKGRhdGEuc3RhdHMgJiYgZGF0YS5zdGF0cy5zaXplKSB7XG4gICAgICB0aGlzLl9mc0VudHJpZXNQcm9jZXNzZWRCeXRlcyArPSBkYXRhLnN0YXRzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGV2ZW50IEFyY2hpdmVyI3Byb2dyZXNzXG4gICAgICogQHR5cGUge1Byb2dyZXNzRGF0YX1cbiAgICAgKi9cbiAgICB0aGlzLmVtaXQoJ3Byb2dyZXNzJywge1xuICAgICAgZW50cmllczoge1xuICAgICAgICB0b3RhbDogdGhpcy5fZW50cmllc0NvdW50LFxuICAgICAgICBwcm9jZXNzZWQ6IHRoaXMuX2VudHJpZXNQcm9jZXNzZWRDb3VudFxuICAgICAgfSxcbiAgICAgIGZzOiB7XG4gICAgICAgIHRvdGFsQnl0ZXM6IHRoaXMuX2ZzRW50cmllc1RvdGFsQnl0ZXMsXG4gICAgICAgIHByb2Nlc3NlZEJ5dGVzOiB0aGlzLl9mc0VudHJpZXNQcm9jZXNzZWRCeXRlc1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn07XG5cbi8qKlxuICogRmluYWxpemVzIHRoZSBtb2R1bGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX21vZHVsZUZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0eXBlb2YgdGhpcy5fbW9kdWxlLmZpbmFsaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fbW9kdWxlLmZpbmFsaXplKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX21vZHVsZS5lbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLl9tb2R1bGUuZW5kKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdOT0VORE1FVEhPRCcpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQaXBlcyB0aGUgbW9kdWxlIHRvIG91ciBpbnRlcm5hbCBzdHJlYW0gd2l0aCBlcnJvciBidWJibGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbW9kdWxlUGlwZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9tb2R1bGUub24oJ2Vycm9yJywgdGhpcy5fb25Nb2R1bGVFcnJvci5iaW5kKHRoaXMpKTtcbiAgdGhpcy5fbW9kdWxlLnBpcGUodGhpcyk7XG4gIHRoaXMuX3N0YXRlLm1vZHVsZVBpcGVkID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBtb2R1bGUgc3VwcG9ydHMgYSBkZWZpbmVkIGZlYXR1cmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX21vZHVsZVN1cHBvcnRzID0gZnVuY3Rpb24oa2V5KSB7XG4gIGlmICghdGhpcy5fbW9kdWxlLnN1cHBvcnRzIHx8ICF0aGlzLl9tb2R1bGUuc3VwcG9ydHNba2V5XSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9tb2R1bGUuc3VwcG9ydHNba2V5XTtcbn07XG5cbi8qKlxuICogVW5waXBlcyB0aGUgbW9kdWxlIGZyb20gb3VyIGludGVybmFsIHN0cmVhbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbW9kdWxlVW5waXBlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX21vZHVsZS51bnBpcGUodGhpcyk7XG4gIHRoaXMuX3N0YXRlLm1vZHVsZVBpcGVkID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgZW50cnkgZGF0YSB3aXRoIGZhbGxiYWNrcyBmb3Iga2V5IHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge09iamVjdH0gZGF0YVxuICogQHBhcmFtICB7ZnMuU3RhdHN9IHN0YXRzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbm9ybWFsaXplRW50cnlEYXRhID0gZnVuY3Rpb24oZGF0YSwgc3RhdHMpIHtcbiAgZGF0YSA9IHV0aWwuZGVmYXVsdHMoZGF0YSwge1xuICAgIHR5cGU6ICdmaWxlJyxcbiAgICBuYW1lOiBudWxsLFxuICAgIGRhdGU6IG51bGwsXG4gICAgbW9kZTogbnVsbCxcbiAgICBwcmVmaXg6IG51bGwsXG4gICAgc291cmNlUGF0aDogbnVsbCxcbiAgICBzdGF0czogZmFsc2VcbiAgfSk7XG5cbiAgaWYgKHN0YXRzICYmIGRhdGEuc3RhdHMgPT09IGZhbHNlKSB7XG4gICAgZGF0YS5zdGF0cyA9IHN0YXRzO1xuICB9XG5cbiAgdmFyIGlzRGlyID0gZGF0YS50eXBlID09PSAnZGlyZWN0b3J5JztcblxuICBpZiAoZGF0YS5uYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhLnByZWZpeCA9PT0gJ3N0cmluZycgJiYgJycgIT09IGRhdGEucHJlZml4KSB7XG4gICAgICBkYXRhLm5hbWUgPSBkYXRhLnByZWZpeCArICcvJyArIGRhdGEubmFtZTtcbiAgICAgIGRhdGEucHJlZml4ID0gbnVsbDtcbiAgICB9XG5cbiAgICBkYXRhLm5hbWUgPSB1dGlsLnNhbml0aXplUGF0aChkYXRhLm5hbWUpO1xuXG4gICAgaWYgKGRhdGEudHlwZSAhPT0gJ3N5bWxpbmsnICYmIGRhdGEubmFtZS5zbGljZSgtMSkgPT09ICcvJykge1xuICAgICAgaXNEaXIgPSB0cnVlO1xuICAgICAgZGF0YS50eXBlID0gJ2RpcmVjdG9yeSc7XG4gICAgfSBlbHNlIGlmIChpc0Rpcikge1xuICAgICAgZGF0YS5uYW1lICs9ICcvJztcbiAgICB9XG4gIH1cblxuICAvLyA1MTEgPT09IDA3Nzc7IDQ5MyA9PT0gMDc1NTsgNDM4ID09PSAwNjY2OyA0MjAgPT09IDA2NDRcbiAgaWYgKHR5cGVvZiBkYXRhLm1vZGUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHdpbjMyKSB7XG4gICAgICBkYXRhLm1vZGUgJj0gNTExO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLm1vZGUgJj0gNDA5NVxuICAgIH1cbiAgfSBlbHNlIGlmIChkYXRhLnN0YXRzICYmIGRhdGEubW9kZSA9PT0gbnVsbCkge1xuICAgIGlmICh3aW4zMikge1xuICAgICAgZGF0YS5tb2RlID0gZGF0YS5zdGF0cy5tb2RlICYgNTExO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLm1vZGUgPSBkYXRhLnN0YXRzLm1vZGUgJiA0MDk1O1xuICAgIH1cblxuICAgIC8vIHN0YXQgaXNuJ3QgcmVsaWFibGUgb24gd2luZG93czsgZm9yY2UgMDc1NSBmb3IgZGlyXG4gICAgaWYgKHdpbjMyICYmIGlzRGlyKSB7XG4gICAgICBkYXRhLm1vZGUgPSA0OTM7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRhdGEubW9kZSA9PT0gbnVsbCkge1xuICAgIGRhdGEubW9kZSA9IGlzRGlyID8gNDkzIDogNDIwO1xuICB9XG5cbiAgaWYgKGRhdGEuc3RhdHMgJiYgZGF0YS5kYXRlID09PSBudWxsKSB7XG4gICAgZGF0YS5kYXRlID0gZGF0YS5zdGF0cy5tdGltZTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhLmRhdGUgPSB1dGlsLmRhdGVpZnkoZGF0YS5kYXRlKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufTtcblxuLyoqXG4gKiBFcnJvciBsaXN0ZW5lciB0aGF0IHJlLWVtaXRzIGVycm9yIG9uIHRvIG91ciBpbnRlcm5hbCBzdHJlYW0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX29uTW9kdWxlRXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcbiAgLyoqXG4gICAqIEBldmVudCBBcmNoaXZlciNlcnJvclxuICAgKiBAdHlwZSB7RXJyb3JEYXRhfVxuICAgKi9cbiAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgdmFyaW91cyBzdGF0ZSB2YXJpYWJsZXMgYWZ0ZXIgcXVldWUgaGFzIGRyYWluZWQgdG8gZGV0ZXJtaW5lIGlmXG4gKiB3ZSBuZWVkIHRvIGBmaW5hbGl6ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX29uUXVldWVEcmFpbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemluZyB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6ZSAmJiB0aGlzLl9wZW5kaW5nID09PSAwICYmIHRoaXMuX3F1ZXVlLmlkbGUoKSAmJiB0aGlzLl9zdGF0UXVldWUuaWRsZSgpKSB7XG4gICAgdGhpcy5fZmluYWxpemUoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBcHBlbmRzIGVhY2ggcXVldWUgdGFzayB0byB0aGUgbW9kdWxlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhc2tcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fb25RdWV1ZVRhc2sgPSBmdW5jdGlvbih0YXNrLCBjYWxsYmFjaykge1xuICB2YXIgZnVsbENhbGxiYWNrID0gKCkgPT4ge1xuICAgIGlmKHRhc2suZGF0YS5jYWxsYmFjaykge1xuICAgICAgdGFzay5kYXRhLmNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemluZyB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIGZ1bGxDYWxsYmFjaygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX3Rhc2sgPSB0YXNrO1xuICB0aGlzLl9tb2R1bGVBcHBlbmQodGFzay5zb3VyY2UsIHRhc2suZGF0YSwgZnVsbENhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBmaWxlIHN0YXQgYW5kIHJlaW5qZWN0cyB0aGUgdGFzayBiYWNrIGludG8gdGhlIHF1ZXVlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhc2tcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fb25TdGF0UXVldWVUYXNrID0gZnVuY3Rpb24odGFzaywgY2FsbGJhY2spIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXppbmcgfHwgdGhpcy5fc3RhdGUuZmluYWxpemVkIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICBjYWxsYmFjaygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZzLmxzdGF0KHRhc2suZmlsZXBhdGgsIGZ1bmN0aW9uKGVyciwgc3RhdHMpIHtcbiAgICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzLl9lbnRyaWVzQ291bnQtLTtcblxuICAgICAgLyoqXG4gICAgICAgKiBAZXZlbnQgQXJjaGl2ZXIjd2FybmluZ1xuICAgICAgICogQHR5cGUge0Vycm9yRGF0YX1cbiAgICAgICAqL1xuICAgICAgdGhpcy5lbWl0KCd3YXJuaW5nJywgZXJyKTtcbiAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGFzayA9IHRoaXMuX3VwZGF0ZVF1ZXVlVGFza1dpdGhTdGF0cyh0YXNrLCBzdGF0cyk7XG5cbiAgICBpZiAodGFzaykge1xuICAgICAgaWYgKHN0YXRzLnNpemUpIHtcbiAgICAgICAgdGhpcy5fZnNFbnRyaWVzVG90YWxCeXRlcyArPSBzdGF0cy5zaXplO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9xdWV1ZS5wdXNoKHRhc2spO1xuICAgIH1cblxuICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gIH0uYmluZCh0aGlzKSk7XG59O1xuXG4vKipcbiAqIFVucGlwZXMgdGhlIG1vZHVsZSBhbmQgZW5kcyBvdXIgaW50ZXJuYWwgc3RyZWFtLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9zaHV0ZG93biA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9tb2R1bGVVbnBpcGUoKTtcbiAgdGhpcy5lbmQoKTtcbn07XG5cbi8qKlxuICogVHJhY2tzIHRoZSBieXRlcyBlbWl0dGVkIGJ5IG91ciBpbnRlcm5hbCBzdHJlYW0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0J1ZmZlcn0gY2h1bmtcbiAqIEBwYXJhbSAge1N0cmluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBpZiAoY2h1bmspIHtcbiAgICB0aGlzLl9wb2ludGVyICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuXG4gIGNhbGxiYWNrKG51bGwsIGNodW5rKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyBhbmQgbm9ybWFsaXplcyBhIHF1ZXVlIHRhc2sgdXNpbmcgc3RhdHMgZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7T2JqZWN0fSB0YXNrXG4gKiBAcGFyYW0gIHtmcy5TdGF0c30gc3RhdHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl91cGRhdGVRdWV1ZVRhc2tXaXRoU3RhdHMgPSBmdW5jdGlvbih0YXNrLCBzdGF0cykge1xuICBpZiAoc3RhdHMuaXNGaWxlKCkpIHtcbiAgICB0YXNrLmRhdGEudHlwZSA9ICdmaWxlJztcbiAgICB0YXNrLmRhdGEuc291cmNlVHlwZSA9ICdzdHJlYW0nO1xuICAgIHRhc2suc291cmNlID0gdXRpbC5sYXp5UmVhZFN0cmVhbSh0YXNrLmZpbGVwYXRoKTtcbiAgfSBlbHNlIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpICYmIHRoaXMuX21vZHVsZVN1cHBvcnRzKCdkaXJlY3RvcnknKSkge1xuICAgIHRhc2suZGF0YS5uYW1lID0gdXRpbC50cmFpbGluZ1NsYXNoSXQodGFzay5kYXRhLm5hbWUpO1xuICAgIHRhc2suZGF0YS50eXBlID0gJ2RpcmVjdG9yeSc7XG4gICAgdGFzay5kYXRhLnNvdXJjZVBhdGggPSB1dGlsLnRyYWlsaW5nU2xhc2hJdCh0YXNrLmZpbGVwYXRoKTtcbiAgICB0YXNrLmRhdGEuc291cmNlVHlwZSA9ICdidWZmZXInO1xuICAgIHRhc2suc291cmNlID0gQnVmZmVyLmNvbmNhdChbXSk7XG4gIH0gZWxzZSBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSAmJiB0aGlzLl9tb2R1bGVTdXBwb3J0cygnc3ltbGluaycpKSB7XG4gICAgdmFyIGxpbmtQYXRoID0gZnMucmVhZGxpbmtTeW5jKHRhc2suZmlsZXBhdGgpO1xuICAgIHZhciBkaXJOYW1lID0gcGF0aC5kaXJuYW1lKHRhc2suZmlsZXBhdGgpO1xuICAgIHRhc2suZGF0YS50eXBlID0gJ3N5bWxpbmsnO1xuICAgIHRhc2suZGF0YS5saW5rbmFtZSA9IHBhdGgucmVsYXRpdmUoZGlyTmFtZSwgcGF0aC5yZXNvbHZlKGRpck5hbWUsIGxpbmtQYXRoKSk7XG4gICAgdGFzay5kYXRhLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcbiAgICB0YXNrLnNvdXJjZSA9IEJ1ZmZlci5jb25jYXQoW10pO1xuICB9IGVsc2Uge1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aGlzLmVtaXQoJ3dhcm5pbmcnLCBuZXcgQXJjaGl2ZXJFcnJvcignRElSRUNUT1JZTk9UU1VQUE9SVEVEJywgdGFzay5kYXRhKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICB0aGlzLmVtaXQoJ3dhcm5pbmcnLCBuZXcgQXJjaGl2ZXJFcnJvcignU1lNTElOS05PVFNVUFBPUlRFRCcsIHRhc2suZGF0YSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoJ3dhcm5pbmcnLCBuZXcgQXJjaGl2ZXJFcnJvcignRU5UUllOT1RTVVBQT1JURUQnLCB0YXNrLmRhdGEpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRhc2suZGF0YSA9IHRoaXMuX25vcm1hbGl6ZUVudHJ5RGF0YSh0YXNrLmRhdGEsIHN0YXRzKTtcblxuICByZXR1cm4gdGFzaztcbn07XG5cbi8qKlxuICogQWJvcnRzIHRoZSBhcmNoaXZpbmcgcHJvY2VzcywgdGFraW5nIGEgYmVzdC1lZmZvcnQgYXBwcm9hY2gsIGJ5OlxuICpcbiAqIC0gcmVtb3ZpbmcgYW55IHBlbmRpbmcgcXVldWUgdGFza3NcbiAqIC0gYWxsb3dpbmcgYW55IGFjdGl2ZSBxdWV1ZSB3b3JrZXJzIHRvIGZpbmlzaFxuICogLSBkZXRhY2hpbmcgaW50ZXJuYWwgbW9kdWxlIHBpcGVzXG4gKiAtIGVuZGluZyBib3RoIHNpZGVzIG9mIHRoZSBUcmFuc2Zvcm0gc3RyZWFtXG4gKlxuICogSXQgd2lsbCBOT1QgZHJhaW4gYW55IHJlbWFpbmluZyBzb3VyY2VzLlxuICpcbiAqIEByZXR1cm4ge3RoaXN9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX2Fib3J0KCk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFwcGVuZHMgYW4gaW5wdXQgc291cmNlICh0ZXh0IHN0cmluZywgYnVmZmVyLCBvciBzdHJlYW0pIHRvIHRoZSBpbnN0YW5jZS5cbiAqXG4gKiBXaGVuIHRoZSBpbnN0YW5jZSBoYXMgcmVjZWl2ZWQsIHByb2Nlc3NlZCwgYW5kIGVtaXR0ZWQgdGhlIGlucHV0LCB0aGUgYGVudHJ5YFxuICogZXZlbnQgaXMgZmlyZWQuXG4gKlxuICogQGZpcmVzICBBcmNoaXZlciNlbnRyeVxuICogQHBhcmFtICB7KEJ1ZmZlcnxTdHJlYW18U3RyaW5nKX0gc291cmNlIFRoZSBpbnB1dCBzb3VyY2UuXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGEgU2VlIGFsc28ge0BsaW5rIFppcEVudHJ5RGF0YX0gYW5kIHtAbGluayBUYXJFbnRyeURhdGF9LlxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgZGF0YSkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemUgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignUVVFVUVDTE9TRUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkYXRhID0gdGhpcy5fbm9ybWFsaXplRW50cnlEYXRhKGRhdGEpO1xuXG4gIGlmICh0eXBlb2YgZGF0YS5uYW1lICE9PSAnc3RyaW5nJyB8fCBkYXRhLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdFTlRSWU5BTUVSRVFVSVJFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmIChkYXRhLnR5cGUgPT09ICdkaXJlY3RvcnknICYmICF0aGlzLl9tb2R1bGVTdXBwb3J0cygnZGlyZWN0b3J5JykpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0RJUkVDVE9SWU5PVFNVUFBPUlRFRCcsIHsgbmFtZTogZGF0YS5uYW1lIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNvdXJjZSA9IHV0aWwubm9ybWFsaXplSW5wdXRTb3VyY2Uoc291cmNlKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHtcbiAgICBkYXRhLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcbiAgfSBlbHNlIGlmICh1dGlsLmlzU3RyZWFtKHNvdXJjZSkpIHtcbiAgICBkYXRhLnNvdXJjZVR5cGUgPSAnc3RyZWFtJztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0lOUFVUU1RFQU1CVUZGRVJSRVFVSVJFRCcsIHsgbmFtZTogZGF0YS5uYW1lIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX2VudHJpZXNDb3VudCsrO1xuICB0aGlzLl9xdWV1ZS5wdXNoKHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIHNvdXJjZTogc291cmNlXG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGEgZGlyZWN0b3J5IGFuZCBpdHMgZmlsZXMsIHJlY3Vyc2l2ZWx5LCBnaXZlbiBpdHMgZGlycGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGRpcnBhdGggVGhlIHNvdXJjZSBkaXJlY3RvcnkgcGF0aC5cbiAqIEBwYXJhbSAge1N0cmluZ30gZGVzdHBhdGggVGhlIGRlc3RpbmF0aW9uIHBhdGggd2l0aGluIHRoZSBhcmNoaXZlLlxuICogQHBhcmFtICB7KEVudHJ5RGF0YXxGdW5jdGlvbil9IGRhdGEgU2VlIGFsc28gW1ppcEVudHJ5RGF0YV17QGxpbmsgWmlwRW50cnlEYXRhfSBhbmRcbiAqIFtUYXJFbnRyeURhdGFde0BsaW5rIFRhckVudHJ5RGF0YX0uXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuZGlyZWN0b3J5ID0gZnVuY3Rpb24oZGlycGF0aCwgZGVzdHBhdGgsIGRhdGEpIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXplIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1FVRVVFQ0xPU0VEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkaXJwYXRoICE9PSAnc3RyaW5nJyB8fCBkaXJwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignRElSRUNUT1JZRElSUEFUSFJFUVVJUkVEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5fcGVuZGluZysrO1xuXG4gIGlmIChkZXN0cGF0aCA9PT0gZmFsc2UpIHtcbiAgICBkZXN0cGF0aCA9ICcnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZXN0cGF0aCAhPT0gJ3N0cmluZycpe1xuICAgIGRlc3RwYXRoID0gZGlycGF0aDtcbiAgfVxuXG4gIHZhciBkYXRhRnVuY3Rpb24gPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGF0YUZ1bmN0aW9uID0gZGF0YTtcbiAgICBkYXRhID0ge307XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgZGF0YSA9IHt9O1xuICB9XG5cbiAgdmFyIGdsb2JPcHRpb25zID0ge1xuICAgIHN0YXQ6IHRydWUsXG4gICAgZG90OiB0cnVlXG4gIH07XG5cbiAgZnVuY3Rpb24gb25HbG9iRW5kKCkge1xuICAgIHRoaXMuX3BlbmRpbmctLTtcbiAgICB0aGlzLl9tYXliZUZpbmFsaXplKCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdsb2JFcnJvcihlcnIpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2xvYk1hdGNoKG1hdGNoKXtcbiAgICBnbG9iYmVyLnBhdXNlKCk7XG5cbiAgICB2YXIgaWdub3JlTWF0Y2ggPSBmYWxzZTtcbiAgICB2YXIgZW50cnlEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGF0YSk7XG4gICAgZW50cnlEYXRhLm5hbWUgPSBtYXRjaC5yZWxhdGl2ZTtcbiAgICBlbnRyeURhdGEucHJlZml4ID0gZGVzdHBhdGg7XG4gICAgZW50cnlEYXRhLnN0YXRzID0gbWF0Y2guc3RhdDtcbiAgICBlbnRyeURhdGEuY2FsbGJhY2sgPSBnbG9iYmVyLnJlc3VtZS5iaW5kKGdsb2JiZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChkYXRhRnVuY3Rpb24pIHtcbiAgICAgICAgZW50cnlEYXRhID0gZGF0YUZ1bmN0aW9uKGVudHJ5RGF0YSk7XG5cbiAgICAgICAgaWYgKGVudHJ5RGF0YSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBpZ25vcmVNYXRjaCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5RGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZXJFcnJvcignRElSRUNUT1JZRlVOQ1RJT05JTlZBTElEREFUQScsIHsgZGlycGF0aDogZGlycGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpZ25vcmVNYXRjaCkge1xuICAgICAgZ2xvYmJlci5yZXN1bWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmQobWF0Y2guYWJzb2x1dGUsIGVudHJ5RGF0YSk7XG4gIH1cblxuICB2YXIgZ2xvYmJlciA9IGdsb2IoZGlycGF0aCwgZ2xvYk9wdGlvbnMpO1xuICBnbG9iYmVyLm9uKCdlcnJvcicsIG9uR2xvYkVycm9yLmJpbmQodGhpcykpO1xuICBnbG9iYmVyLm9uKCdtYXRjaCcsIG9uR2xvYk1hdGNoLmJpbmQodGhpcykpO1xuICBnbG9iYmVyLm9uKCdlbmQnLCBvbkdsb2JFbmQuYmluZCh0aGlzKSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFwcGVuZHMgYSBmaWxlIGdpdmVuIGl0cyBmaWxlcGF0aCB1c2luZyBhXG4gKiBbbGF6eXN0cmVhbV17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2pwb21tZXJlbmluZy9ub2RlLWxhenlzdHJlYW19IHdyYXBwZXIgdG9cbiAqIHByZXZlbnQgaXNzdWVzIHdpdGggb3BlbiBmaWxlIGxpbWl0cy5cbiAqXG4gKiBXaGVuIHRoZSBpbnN0YW5jZSBoYXMgcmVjZWl2ZWQsIHByb2Nlc3NlZCwgYW5kIGVtaXR0ZWQgdGhlIGZpbGUsIHRoZSBgZW50cnlgXG4gKiBldmVudCBpcyBmaXJlZC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGZpbGVwYXRoIFRoZSBzb3VyY2UgZmlsZXBhdGguXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGEgU2VlIGFsc28gW1ppcEVudHJ5RGF0YV17QGxpbmsgWmlwRW50cnlEYXRhfSBhbmRcbiAqIFtUYXJFbnRyeURhdGFde0BsaW5rIFRhckVudHJ5RGF0YX0uXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuZmlsZSA9IGZ1bmN0aW9uKGZpbGVwYXRoLCBkYXRhKSB7XG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6ZSB8fCB0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdRVUVVRUNMT1NFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICh0eXBlb2YgZmlsZXBhdGggIT09ICdzdHJpbmcnIHx8IGZpbGVwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignRklMRUZJTEVQQVRIUkVRVUlSRUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9hcHBlbmQoZmlsZXBhdGgsIGRhdGEpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIG11bHRpcGxlIGZpbGVzIHRoYXQgbWF0Y2ggYSBnbG9iIHBhdHRlcm4uXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBwYXR0ZXJuIFRoZSBbZ2xvYiBwYXR0ZXJuXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL21pbmltYXRjaH0gdG8gbWF0Y2guXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgU2VlIFtub2RlLXJlYWRkaXItZ2xvYl17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3lxbm4vbm9kZS1yZWFkZGlyLWdsb2Ijb3B0aW9uc30uXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGEgU2VlIGFsc28gW1ppcEVudHJ5RGF0YV17QGxpbmsgWmlwRW50cnlEYXRhfSBhbmRcbiAqIFtUYXJFbnRyeURhdGFde0BsaW5rIFRhckVudHJ5RGF0YX0uXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuZ2xvYiA9IGZ1bmN0aW9uKHBhdHRlcm4sIG9wdGlvbnMsIGRhdGEpIHtcbiAgdGhpcy5fcGVuZGluZysrO1xuXG4gIG9wdGlvbnMgPSB1dGlsLmRlZmF1bHRzKG9wdGlvbnMsIHtcbiAgICBzdGF0OiB0cnVlLFxuICAgIHBhdHRlcm46IHBhdHRlcm5cbiAgfSk7XG5cbiAgZnVuY3Rpb24gb25HbG9iRW5kKCkge1xuICAgIHRoaXMuX3BlbmRpbmctLTtcbiAgICB0aGlzLl9tYXliZUZpbmFsaXplKCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdsb2JFcnJvcihlcnIpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2xvYk1hdGNoKG1hdGNoKXtcbiAgICBnbG9iYmVyLnBhdXNlKCk7XG4gICAgdmFyIGVudHJ5RGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpO1xuICAgIGVudHJ5RGF0YS5jYWxsYmFjayA9IGdsb2JiZXIucmVzdW1lLmJpbmQoZ2xvYmJlcik7XG4gICAgZW50cnlEYXRhLnN0YXRzID0gbWF0Y2guc3RhdDtcbiAgICBlbnRyeURhdGEubmFtZSA9IG1hdGNoLnJlbGF0aXZlO1xuXG4gICAgdGhpcy5fYXBwZW5kKG1hdGNoLmFic29sdXRlLCBlbnRyeURhdGEpO1xuICB9XG5cbiAgdmFyIGdsb2JiZXIgPSBnbG9iKG9wdGlvbnMuY3dkIHx8ICcuJywgb3B0aW9ucyk7XG4gIGdsb2JiZXIub24oJ2Vycm9yJywgb25HbG9iRXJyb3IuYmluZCh0aGlzKSk7XG4gIGdsb2JiZXIub24oJ21hdGNoJywgb25HbG9iTWF0Y2guYmluZCh0aGlzKSk7XG4gIGdsb2JiZXIub24oJ2VuZCcsIG9uR2xvYkVuZC5iaW5kKHRoaXMpKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRmluYWxpemVzIHRoZSBpbnN0YW5jZSBhbmQgcHJldmVudHMgZnVydGhlciBhcHBlbmRpbmcgdG8gdGhlIGFyY2hpdmVcbiAqIHN0cnVjdHVyZSAocXVldWUgd2lsbCBjb250aW51ZSB0aWwgZHJhaW5lZCkuXG4gKlxuICogVGhlIGBlbmRgLCBgY2xvc2VgIG9yIGBmaW5pc2hgIGV2ZW50cyBvbiB0aGUgZGVzdGluYXRpb24gc3RyZWFtIG1heSBmaXJlXG4gKiByaWdodCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIHNvIHlvdSBzaG91bGQgc2V0IGxpc3RlbmVycyBiZWZvcmVoYW5kIHRvXG4gKiBwcm9wZXJseSBkZXRlY3Qgc3RyZWFtIGNvbXBsZXRpb24uXG4gKlxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgdmFyIGFib3J0ZWRFcnJvciA9IG5ldyBBcmNoaXZlckVycm9yKCdBQk9SVEVEJyk7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGFib3J0ZWRFcnJvcik7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGFib3J0ZWRFcnJvcik7XG4gIH1cblxuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemUpIHtcbiAgICB2YXIgZmluYWxpemluZ0Vycm9yID0gbmV3IEFyY2hpdmVyRXJyb3IoJ0ZJTkFMSVpJTkcnKTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZmluYWxpemluZ0Vycm9yKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZmluYWxpemluZ0Vycm9yKTtcbiAgfVxuXG4gIHRoaXMuX3N0YXRlLmZpbmFsaXplID0gdHJ1ZTtcblxuICBpZiAodGhpcy5fcGVuZGluZyA9PT0gMCAmJiB0aGlzLl9xdWV1ZS5pZGxlKCkgJiYgdGhpcy5fc3RhdFF1ZXVlLmlkbGUoKSkge1xuICAgIHRoaXMuX2ZpbmFsaXplKCk7XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBlcnJvcmVkO1xuXG4gICAgc2VsZi5fbW9kdWxlLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghZXJyb3JlZCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSlcblxuICAgIHNlbGYuX21vZHVsZS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSlcbiAgfSlcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbW9kdWxlIGZvcm1hdCBuYW1lIHVzZWQgZm9yIGFyY2hpdmluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFRoZSBuYW1lIG9mIHRoZSBmb3JtYXQuXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuc2V0Rm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0KSB7XG4gIGlmICh0aGlzLl9mb3JtYXQpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0ZPUk1BVFNFVCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX2Zvcm1hdCA9IGZvcm1hdDtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbW9kdWxlIHVzZWQgZm9yIGFyY2hpdmluZy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2R1bGUgVGhlIGZ1bmN0aW9uIGZvciBhcmNoaXZlciB0byBpbnRlcmFjdCB3aXRoLlxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLnNldE1vZHVsZSA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignQUJPUlRFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICh0aGlzLl9zdGF0ZS5tb2R1bGUpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ01PRFVMRVNFVCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX21vZHVsZSA9IG1vZHVsZTtcbiAgdGhpcy5fbW9kdWxlUGlwZSgpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGEgc3ltbGluayB0byB0aGUgaW5zdGFuY2UuXG4gKlxuICogVGhpcyBkb2VzIE5PVCBpbnRlcmFjdCB3aXRoIGZpbGVzeXN0ZW0gYW5kIGlzIHVzZWQgZm9yIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRpbmcgc3ltbGlua3MuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBmaWxlcGF0aCBUaGUgc3ltbGluayBwYXRoICh3aXRoaW4gYXJjaGl2ZSkuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHRhcmdldCBUaGUgdGFyZ2V0IHBhdGggKHdpdGhpbiBhcmNoaXZlKS5cbiAqIEBwYXJhbSAge051bWJlcn0gbW9kZSBTZXRzIHRoZSBlbnRyeSBwZXJtaXNzaW9ucy5cbiAqIEByZXR1cm4ge3RoaXN9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5zeW1saW5rID0gZnVuY3Rpb24oZmlsZXBhdGgsIHRhcmdldCwgbW9kZSkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemUgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignUVVFVUVDTE9TRUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAodHlwZW9mIGZpbGVwYXRoICE9PSAnc3RyaW5nJyB8fCBmaWxlcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1NZTUxJTktGSUxFUEFUSFJFUVVJUkVEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdzdHJpbmcnIHx8IHRhcmdldC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1NZTUxJTktUQVJHRVRSRVFVSVJFRCcsIHsgZmlsZXBhdGg6IGZpbGVwYXRoIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghdGhpcy5fbW9kdWxlU3VwcG9ydHMoJ3N5bWxpbmsnKSkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignU1lNTElOS05PVFNVUFBPUlRFRCcsIHsgZmlsZXBhdGg6IGZpbGVwYXRoIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBkYXRhID0ge307XG4gIGRhdGEudHlwZSA9ICdzeW1saW5rJztcbiAgZGF0YS5uYW1lID0gZmlsZXBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBkYXRhLmxpbmtuYW1lID0gdGFyZ2V0LnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgZGF0YS5zb3VyY2VUeXBlID0gJ2J1ZmZlcic7XG5cbiAgaWYgKHR5cGVvZiBtb2RlID09PSBcIm51bWJlclwiKSB7XG4gICAgZGF0YS5tb2RlID0gbW9kZTtcbiAgfVxuXG4gIHRoaXMuX2VudHJpZXNDb3VudCsrO1xuICB0aGlzLl9xdWV1ZS5wdXNoKHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIHNvdXJjZTogQnVmZmVyLmNvbmNhdChbXSlcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGVuZ3RoIChpbiBieXRlcykgdGhhdCBoYXMgYmVlbiBlbWl0dGVkLlxuICpcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLnBvaW50ZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX3BvaW50ZXI7XG59O1xuXG4vKipcbiAqIE1pZGRsZXdhcmUtbGlrZSBoZWxwZXIgdGhhdCBoYXMgeWV0IHRvIGJlIGZ1bGx5IGltcGxlbWVudGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gcGx1Z2luXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24ocGx1Z2luKSB7XG4gIHRoaXMuX3N0cmVhbXMucHVzaChwbHVnaW4pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQXJjaGl2ZXI7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29yZU9wdGlvbnNcbiAqIEBnbG9iYWxcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbc3RhdENvbmN1cnJlbmN5PTRdIFNldHMgdGhlIG51bWJlciBvZiB3b3JrZXJzIHVzZWQgdG9cbiAqIHByb2Nlc3MgdGhlIGludGVybmFsIGZzIHN0YXQgcXVldWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUcmFuc2Zvcm1PcHRpb25zXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFthbGxvd0hhbGZPcGVuPXRydWVdIElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgc3RyZWFtXG4gKiB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSByZWFkYWJsZSBzaWRlIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZW5kcyBhbmQgdmljZVxuICogdmVyc2EuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtyZWFkYWJsZU9iamVjdE1vZGU9ZmFsc2VdIFNldHMgb2JqZWN0TW9kZSBmb3IgcmVhZGFibGVcbiAqIHNpZGUgb2YgdGhlIHN0cmVhbS4gSGFzIG5vIGVmZmVjdCBpZiBvYmplY3RNb2RlIGlzIHRydWUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFt3cml0YWJsZU9iamVjdE1vZGU9ZmFsc2VdIFNldHMgb2JqZWN0TW9kZSBmb3Igd3JpdGFibGVcbiAqIHNpZGUgb2YgdGhlIHN0cmVhbS4gSGFzIG5vIGVmZmVjdCBpZiBvYmplY3RNb2RlIGlzIHRydWUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkZWNvZGVTdHJpbmdzPXRydWVdIFdoZXRoZXIgb3Igbm90IHRvIGRlY29kZSBzdHJpbmdzXG4gKiBpbnRvIEJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byBfd3JpdGUoKS4gYFdyaXRhYmxlYFxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtlbmNvZGluZz1OVUxMXSBJZiBzcGVjaWZpZWQsIHRoZW4gYnVmZmVycyB3aWxsIGJlIGRlY29kZWRcbiAqIHRvIHN0cmluZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4gYFJlYWRhYmxlYFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFtoaWdoV2F0ZXJNYXJrPTE2a2JdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZVxuICogaW4gdGhlIGludGVybmFsIGJ1ZmZlciBiZWZvcmUgY2Vhc2luZyB0byByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuXG4gKiBgUmVhZGFibGVgIGBXcml0YWJsZWBcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW29iamVjdE1vZGU9ZmFsc2VdIFdoZXRoZXIgdGhpcyBzdHJlYW0gc2hvdWxkIGJlaGF2ZSBhcyBhXG4gKiBzdHJlYW0gb2Ygb2JqZWN0cy4gTWVhbmluZyB0aGF0IHN0cmVhbS5yZWFkKG4pIHJldHVybnMgYSBzaW5nbGUgdmFsdWUgaW5zdGVhZFxuICogb2YgYSBCdWZmZXIgb2Ygc2l6ZSBuLiBgUmVhZGFibGVgIGBXcml0YWJsZWBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEVudHJ5RGF0YVxuICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgU2V0cyB0aGUgZW50cnkgbmFtZSBpbmNsdWRpbmcgaW50ZXJuYWwgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7KFN0cmluZ3xEYXRlKX0gW2RhdGU9Tk9XKCldIFNldHMgdGhlIGVudHJ5IGRhdGUuXG4gKiBAcHJvcGVydHkge051bWJlcn0gW21vZGU9RDowNzU1L0Y6MDY0NF0gU2V0cyB0aGUgZW50cnkgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3ByZWZpeF0gU2V0cyBhIHBhdGggcHJlZml4IGZvciB0aGUgZW50cnkgbmFtZS4gVXNlZnVsXG4gKiB3aGVuIHdvcmtpbmcgd2l0aCBtZXRob2RzIGxpa2UgYGRpcmVjdG9yeWAgb3IgYGdsb2JgLlxuICogQHByb3BlcnR5IHtmcy5TdGF0c30gW3N0YXRzXSBTZXRzIHRoZSBmcyBzdGF0IGRhdGEgZm9yIHRoaXMgZW50cnkgYWxsb3dpbmdcbiAqIGZvciByZWR1Y3Rpb24gb2YgZnMgc3RhdCBjYWxscyB3aGVuIHN0YXQgZGF0YSBpcyBhbHJlYWR5IGtub3duLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRXJyb3JEYXRhXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY29kZSBUaGUgZXJyb3IgY29kZSBhc3NpZ25lZCB0byB0aGlzIGVycm9yLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRhdGEgQWRkaXRpb25hbCBkYXRhIHByb3ZpZGVkIGZvciByZXBvcnRpbmcgb3IgZGVidWdnaW5nICh3aGVyZSBhdmFpbGFibGUpLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHJvZ3Jlc3NEYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gZW50cmllc1xuICogQHByb3BlcnR5IHtOdW1iZXJ9IGVudHJpZXMudG90YWwgTnVtYmVyIG9mIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gYXBwZW5kZWQuXG4gKiBAcHJvcGVydHkge051bWJlcn0gZW50cmllcy5wcm9jZXNzZWQgTnVtYmVyIG9mIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGZzXG4gKiBAcHJvcGVydHkge051bWJlcn0gZnMudG90YWxCeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gYXBwZW5kZWQuIENhbGN1bGF0ZWQgYXN5bmNocm9ub3VzbHkgYW5kIG1pZ2h0IG5vdCBiZSBhY2N1cmF0ZTogaXQgZ3Jvd3RoIHdoaWxlIGVudHJpZXMgYXJlIGFkZGVkLiAoYmFzZWQgb24gZnMuU3RhdHMpXG4gKiBAcHJvcGVydHkge051bWJlcn0gZnMucHJvY2Vzc2VkQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gKGJhc2VkIG9uIGZzLlN0YXRzKVxuICovXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///10826\n")},82383:(module,exports,__webpack_require__)=>{eval("/**\n * Archiver Core\n *\n * @ignore\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\n\nvar util = __webpack_require__(39023);\n\nconst ERROR_CODES = {\n 'ABORTED': 'archive was aborted',\n 'DIRECTORYDIRPATHREQUIRED': 'diretory dirpath argument must be a non-empty string value',\n 'DIRECTORYFUNCTIONINVALIDDATA': 'invalid data returned by directory custom data function',\n 'ENTRYNAMEREQUIRED': 'entry name must be a non-empty string value',\n 'FILEFILEPATHREQUIRED': 'file filepath argument must be a non-empty string value',\n 'FINALIZING': 'archive already finalizing',\n 'QUEUECLOSED': 'queue closed',\n 'NOENDMETHOD': 'no suitable finalize/end method defined by module',\n 'DIRECTORYNOTSUPPORTED': 'support for directory entries not defined by module',\n 'FORMATSET': 'archive format already set',\n 'INPUTSTEAMBUFFERREQUIRED': 'input source must be valid Stream or Buffer instance',\n 'MODULESET': 'module already set',\n 'SYMLINKNOTSUPPORTED': 'support for symlink entries not defined by module',\n 'SYMLINKFILEPATHREQUIRED': 'symlink filepath argument must be a non-empty string value',\n 'SYMLINKTARGETREQUIRED': 'symlink target argument must be a non-empty string value',\n 'ENTRYNOTSUPPORTED': 'entry not supported'\n};\n\nfunction ArchiverError(code, data) {\n Error.captureStackTrace(this, this.constructor);\n //this.name = this.constructor.name;\n this.message = ERROR_CODES[code] || code;\n this.code = code;\n this.data = data;\n}\n\nutil.inherits(ArchiverError, Error);\n\nexports = module.exports = ArchiverError;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIzODMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQSxXQUFXLG1CQUFPLENBQUMsS0FBTTs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci9saWIvZXJyb3IuanM/NWY2YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFyY2hpdmVyIENvcmVcbiAqXG4gKiBAaWdub3JlXG4gKiBAbGljZW5zZSBbTUlUXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWFyY2hpdmVyL2Jsb2IvbWFzdGVyL0xJQ0VOU0V9XG4gKiBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5jb25zdCBFUlJPUl9DT0RFUyA9IHtcbiAgJ0FCT1JURUQnOiAnYXJjaGl2ZSB3YXMgYWJvcnRlZCcsXG4gICdESVJFQ1RPUllESVJQQVRIUkVRVUlSRUQnOiAnZGlyZXRvcnkgZGlycGF0aCBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZScsXG4gICdESVJFQ1RPUllGVU5DVElPTklOVkFMSUREQVRBJzogJ2ludmFsaWQgZGF0YSByZXR1cm5lZCBieSBkaXJlY3RvcnkgY3VzdG9tIGRhdGEgZnVuY3Rpb24nLFxuICAnRU5UUllOQU1FUkVRVUlSRUQnOiAnZW50cnkgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZScsXG4gICdGSUxFRklMRVBBVEhSRVFVSVJFRCc6ICdmaWxlIGZpbGVwYXRoIGFyZ3VtZW50IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIHZhbHVlJyxcbiAgJ0ZJTkFMSVpJTkcnOiAnYXJjaGl2ZSBhbHJlYWR5IGZpbmFsaXppbmcnLFxuICAnUVVFVUVDTE9TRUQnOiAncXVldWUgY2xvc2VkJyxcbiAgJ05PRU5ETUVUSE9EJzogJ25vIHN1aXRhYmxlIGZpbmFsaXplL2VuZCBtZXRob2QgZGVmaW5lZCBieSBtb2R1bGUnLFxuICAnRElSRUNUT1JZTk9UU1VQUE9SVEVEJzogJ3N1cHBvcnQgZm9yIGRpcmVjdG9yeSBlbnRyaWVzIG5vdCBkZWZpbmVkIGJ5IG1vZHVsZScsXG4gICdGT1JNQVRTRVQnOiAnYXJjaGl2ZSBmb3JtYXQgYWxyZWFkeSBzZXQnLFxuICAnSU5QVVRTVEVBTUJVRkZFUlJFUVVJUkVEJzogJ2lucHV0IHNvdXJjZSBtdXN0IGJlIHZhbGlkIFN0cmVhbSBvciBCdWZmZXIgaW5zdGFuY2UnLFxuICAnTU9EVUxFU0VUJzogJ21vZHVsZSBhbHJlYWR5IHNldCcsXG4gICdTWU1MSU5LTk9UU1VQUE9SVEVEJzogJ3N1cHBvcnQgZm9yIHN5bWxpbmsgZW50cmllcyBub3QgZGVmaW5lZCBieSBtb2R1bGUnLFxuICAnU1lNTElOS0ZJTEVQQVRIUkVRVUlSRUQnOiAnc3ltbGluayBmaWxlcGF0aCBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZScsXG4gICdTWU1MSU5LVEFSR0VUUkVRVUlSRUQnOiAnc3ltbGluayB0YXJnZXQgYXJndW1lbnQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgdmFsdWUnLFxuICAnRU5UUllOT1RTVVBQT1JURUQnOiAnZW50cnkgbm90IHN1cHBvcnRlZCdcbn07XG5cbmZ1bmN0aW9uIEFyY2hpdmVyRXJyb3IoY29kZSwgZGF0YSkge1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgLy90aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIHRoaXMubWVzc2FnZSA9IEVSUk9SX0NPREVTW2NvZGVdIHx8IGNvZGU7XG4gIHRoaXMuY29kZSA9IGNvZGU7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG59XG5cbnV0aWwuaW5oZXJpdHMoQXJjaGl2ZXJFcnJvciwgRXJyb3IpO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBBcmNoaXZlckVycm9yOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///82383\n")},76530:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * JSON Format Plugin\n *\n * @module plugins/json\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar inherits = (__webpack_require__(39023).inherits);\nvar Transform = (__webpack_require__(34478).Transform);\n\nvar crc32 = __webpack_require__(44132);\nvar util = __webpack_require__(91789);\n\n/**\n * @constructor\n * @param {(JsonOptions|TransformOptions)} options\n */\nvar Json = function(options) {\n if (!(this instanceof Json)) {\n return new Json(options);\n }\n\n options = this.options = util.defaults(options, {});\n\n Transform.call(this, options);\n\n this.supports = {\n directory: true,\n symlink: true\n };\n\n this.files = [];\n};\n\ninherits(Json, Transform);\n\n/**\n * [_transform description]\n *\n * @private\n * @param {Buffer} chunk\n * @param {String} encoding\n * @param {Function} callback\n * @return void\n */\nJson.prototype._transform = function(chunk, encoding, callback) {\n callback(null, chunk);\n};\n\n/**\n * [_writeStringified description]\n *\n * @private\n * @return void\n */\nJson.prototype._writeStringified = function() {\n var fileString = JSON.stringify(this.files);\n this.write(fileString);\n};\n\n/**\n * [append description]\n *\n * @param {(Buffer|Stream)} source\n * @param {EntryData} data\n * @param {Function} callback\n * @return void\n */\nJson.prototype.append = function(source, data, callback) {\n var self = this;\n\n data.crc32 = 0;\n\n function onend(err, sourceBuffer) {\n if (err) {\n callback(err);\n return;\n }\n\n data.size = sourceBuffer.length || 0;\n data.crc32 = crc32.unsigned(sourceBuffer);\n\n self.files.push(data);\n\n callback(null, data);\n }\n\n if (data.sourceType === 'buffer') {\n onend(null, source);\n } else if (data.sourceType === 'stream') {\n util.collectStream(source, onend);\n }\n};\n\n/**\n * [finalize description]\n *\n * @return void\n */\nJson.prototype.finalize = function() {\n this._writeStringified();\n this.end();\n};\n\nmodule.exports = Json;\n\n/**\n * @typedef {Object} JsonOptions\n * @global\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY1MzAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGVBQWUscUNBQXdCO0FBQ3ZDLGdCQUFnQixzQ0FBb0M7O0FBRXBELFlBQVksbUJBQU8sQ0FBQyxLQUFjO0FBQ2xDLFdBQVcsbUJBQU8sQ0FBQyxLQUFnQjs7QUFFbkM7QUFDQTtBQUNBLFdBQVcsZ0NBQWdDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0RBQW9EOztBQUVwRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxVQUFVO0FBQ3RCLFlBQVksVUFBVTtBQUN0QixZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1CQUFtQjtBQUMvQixZQUFZLGFBQWE7QUFDekIsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci9saWIvcGx1Z2lucy9qc29uLmpzP2U1ZmMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIEZvcm1hdCBQbHVnaW5cbiAqXG4gKiBAbW9kdWxlIHBsdWdpbnMvanNvblxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlRyYW5zZm9ybTtcblxudmFyIGNyYzMyID0gcmVxdWlyZSgnYnVmZmVyLWNyYzMyJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ2FyY2hpdmVyLXV0aWxzJyk7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0geyhKc29uT3B0aW9uc3xUcmFuc2Zvcm1PcHRpb25zKX0gb3B0aW9uc1xuICovXG52YXIgSnNvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEpzb24pKSB7XG4gICAgcmV0dXJuIG5ldyBKc29uKG9wdGlvbnMpO1xuICB9XG5cbiAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IHV0aWwuZGVmYXVsdHMob3B0aW9ucywge30pO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuc3VwcG9ydHMgPSB7XG4gICAgZGlyZWN0b3J5OiB0cnVlLFxuICAgIHN5bWxpbms6IHRydWVcbiAgfTtcblxuICB0aGlzLmZpbGVzID0gW107XG59O1xuXG5pbmhlcml0cyhKc29uLCBUcmFuc2Zvcm0pO1xuXG4vKipcbiAqIFtfdHJhbnNmb3JtIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtCdWZmZXJ9ICAgY2h1bmtcbiAqIEBwYXJhbSAge1N0cmluZ30gICBlbmNvZGluZ1xuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuSnNvbi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sobnVsbCwgY2h1bmspO1xufTtcblxuLyoqXG4gKiBbX3dyaXRlU3RyaW5naWZpZWQgZGVzY3JpcHRpb25dXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5Kc29uLnByb3RvdHlwZS5fd3JpdGVTdHJpbmdpZmllZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsZVN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsZXMpO1xuICB0aGlzLndyaXRlKGZpbGVTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBbYXBwZW5kIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwYXJhbSAgeyhCdWZmZXJ8U3RyZWFtKX0gICBzb3VyY2VcbiAqIEBwYXJhbSAge0VudHJ5RGF0YX0gICBkYXRhXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5Kc29uLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihzb3VyY2UsIGRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBkYXRhLmNyYzMyID0gMDtcblxuICBmdW5jdGlvbiBvbmVuZChlcnIsIHNvdXJjZUJ1ZmZlcikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGF0YS5zaXplID0gc291cmNlQnVmZmVyLmxlbmd0aCB8fCAwO1xuICAgIGRhdGEuY3JjMzIgPSBjcmMzMi51bnNpZ25lZChzb3VyY2VCdWZmZXIpO1xuXG4gICAgc2VsZi5maWxlcy5wdXNoKGRhdGEpO1xuXG4gICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gIH1cblxuICBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnYnVmZmVyJykge1xuICAgIG9uZW5kKG51bGwsIHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnc3RyZWFtJykge1xuICAgIHV0aWwuY29sbGVjdFN0cmVhbShzb3VyY2UsIG9uZW5kKTtcbiAgfVxufTtcblxuLyoqXG4gKiBbZmluYWxpemUgZGVzY3JpcHRpb25dXG4gKlxuICogQHJldHVybiB2b2lkXG4gKi9cbkpzb24ucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3dyaXRlU3RyaW5naWZpZWQoKTtcbiAgdGhpcy5lbmQoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSnNvbjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBKc29uT3B0aW9uc1xuICogQGdsb2JhbFxuICovXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///76530\n")},60741:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * TAR Format Plugin\n *\n * @module plugins/tar\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar zlib = __webpack_require__(43106);\n\nvar engine = __webpack_require__(44231);\nvar util = __webpack_require__(91789);\n\n/**\n * @constructor\n * @param {TarOptions} options\n */\nvar Tar = function(options) {\n if (!(this instanceof Tar)) {\n return new Tar(options);\n }\n\n options = this.options = util.defaults(options, {\n gzip: false\n });\n\n if (typeof options.gzipOptions !== 'object') {\n options.gzipOptions = {};\n }\n\n this.supports = {\n directory: true,\n symlink: true\n };\n\n this.engine = engine.pack(options);\n this.compressor = false;\n\n if (options.gzip) {\n this.compressor = zlib.createGzip(options.gzipOptions);\n this.compressor.on('error', this._onCompressorError.bind(this));\n }\n};\n\n/**\n * [_onCompressorError description]\n *\n * @private\n * @param {Error} err\n * @return void\n */\nTar.prototype._onCompressorError = function(err) {\n this.engine.emit('error', err);\n};\n\n/**\n * [append description]\n *\n * @param {(Buffer|Stream)} source\n * @param {TarEntryData} data\n * @param {Function} callback\n * @return void\n */\nTar.prototype.append = function(source, data, callback) {\n var self = this;\n\n data.mtime = data.date;\n\n function append(err, sourceBuffer) {\n if (err) {\n callback(err);\n return;\n }\n\n self.engine.entry(data, sourceBuffer, function(err) {\n callback(err, data);\n });\n }\n\n if (data.sourceType === 'buffer') {\n append(null, source);\n } else if (data.sourceType === 'stream' && data.stats) {\n data.size = data.stats.size;\n\n var entry = self.engine.entry(data, function(err) {\n callback(err, data);\n });\n\n source.pipe(entry);\n } else if (data.sourceType === 'stream') {\n util.collectStream(source, append);\n }\n};\n\n/**\n * [finalize description]\n *\n * @return void\n */\nTar.prototype.finalize = function() {\n this.engine.finalize();\n};\n\n/**\n * [on description]\n *\n * @return this.engine\n */\nTar.prototype.on = function() {\n return this.engine.on.apply(this.engine, arguments);\n};\n\n/**\n * [pipe description]\n *\n * @param {String} destination\n * @param {Object} options\n * @return this.engine\n */\nTar.prototype.pipe = function(destination, options) {\n if (this.compressor) {\n return this.engine.pipe.apply(this.engine, [this.compressor]).pipe(destination, options);\n } else {\n return this.engine.pipe.apply(this.engine, arguments);\n }\n};\n\n/**\n * [unpipe description]\n *\n * @return this.engine\n */\nTar.prototype.unpipe = function() {\n if (this.compressor) {\n return this.compressor.unpipe.apply(this.compressor, arguments);\n } else {\n return this.engine.unpipe.apply(this.engine, arguments);\n }\n};\n\nmodule.exports = Tar;\n\n/**\n * @typedef {Object} TarOptions\n * @global\n * @property {Boolean} [gzip=false] Compress the tar archive using gzip.\n * @property {Object} [gzipOptions] Passed to [zlib]{@link https://nodejs.org/api/zlib.html#zlib_class_options}\n * to control compression.\n * @property {*} [*] See [tar-stream]{@link https://github.com/mafintosh/tar-stream} documentation for additional properties.\n */\n\n/**\n * @typedef {Object} TarEntryData\n * @global\n * @property {String} name Sets the entry name including internal path.\n * @property {(String|Date)} [date=NOW()] Sets the entry date.\n * @property {Number} [mode=D:0755/F:0644] Sets the entry permissions.\n * @property {String} [prefix] Sets a path prefix for the entry name. Useful\n * when working with methods like `directory` or `glob`.\n * @property {fs.Stats} [stats] Sets the fs stat data for this entry allowing\n * for reduction of fs stat calls when stat data is already known.\n */\n\n/**\n * TarStream Module\n * @external TarStream\n * @see {@link https://github.com/mafintosh/tar-stream}\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA3NDEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLFdBQVcsbUJBQU8sQ0FBQyxLQUFNOztBQUV6QixhQUFhLG1CQUFPLENBQUMsS0FBWTtBQUNqQyxXQUFXLG1CQUFPLENBQUMsS0FBZ0I7O0FBRW5DO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxpQkFBaUI7QUFDN0IsWUFBWSxjQUFjO0FBQzFCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxjQUFjLFNBQVM7QUFDdkIsY0FBYyxRQUFRLCtCQUErQjtBQUNyRDtBQUNBLGNBQWMsR0FBRyxxQkFBcUIsK0NBQStDO0FBQ3JGOztBQUVBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsZUFBZTtBQUM3QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci9saWIvcGx1Z2lucy90YXIuanM/ZjRjMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRBUiBGb3JtYXQgUGx1Z2luXG4gKlxuICogQG1vZHVsZSBwbHVnaW5zL3RhclxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIHpsaWIgPSByZXF1aXJlKCd6bGliJyk7XG5cbnZhciBlbmdpbmUgPSByZXF1aXJlKCd0YXItc3RyZWFtJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ2FyY2hpdmVyLXV0aWxzJyk7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1Rhck9wdGlvbnN9IG9wdGlvbnNcbiAqL1xudmFyIFRhciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRhcikpIHtcbiAgICByZXR1cm4gbmV3IFRhcihvcHRpb25zKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSB1dGlsLmRlZmF1bHRzKG9wdGlvbnMsIHtcbiAgICBnemlwOiBmYWxzZVxuICB9KTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMuZ3ppcE9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucy5nemlwT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdGhpcy5zdXBwb3J0cyA9IHtcbiAgICBkaXJlY3Rvcnk6IHRydWUsXG4gICAgc3ltbGluazogdHJ1ZVxuICB9O1xuXG4gIHRoaXMuZW5naW5lID0gZW5naW5lLnBhY2sob3B0aW9ucyk7XG4gIHRoaXMuY29tcHJlc3NvciA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zLmd6aXApIHtcbiAgICB0aGlzLmNvbXByZXNzb3IgPSB6bGliLmNyZWF0ZUd6aXAob3B0aW9ucy5nemlwT3B0aW9ucyk7XG4gICAgdGhpcy5jb21wcmVzc29yLm9uKCdlcnJvcicsIHRoaXMuX29uQ29tcHJlc3NvckVycm9yLmJpbmQodGhpcykpO1xuICB9XG59O1xuXG4vKipcbiAqIFtfb25Db21wcmVzc29yRXJyb3IgZGVzY3JpcHRpb25dXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4gdm9pZFxuICovXG5UYXIucHJvdG90eXBlLl9vbkNvbXByZXNzb3JFcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICB0aGlzLmVuZ2luZS5lbWl0KCdlcnJvcicsIGVycik7XG59O1xuXG4vKipcbiAqIFthcHBlbmQgZGVzY3JpcHRpb25dXG4gKlxuICogQHBhcmFtICB7KEJ1ZmZlcnxTdHJlYW0pfSBzb3VyY2VcbiAqIEBwYXJhbSAge1RhckVudHJ5RGF0YX0gZGF0YVxuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuVGFyLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihzb3VyY2UsIGRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBkYXRhLm10aW1lID0gZGF0YS5kYXRlO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZChlcnIsIHNvdXJjZUJ1ZmZlcikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5lbmdpbmUuZW50cnkoZGF0YSwgc291cmNlQnVmZmVyLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnYnVmZmVyJykge1xuICAgIGFwcGVuZChudWxsLCBzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGRhdGEuc291cmNlVHlwZSA9PT0gJ3N0cmVhbScgJiYgZGF0YS5zdGF0cykge1xuICAgIGRhdGEuc2l6ZSA9IGRhdGEuc3RhdHMuc2l6ZTtcblxuICAgIHZhciBlbnRyeSA9IHNlbGYuZW5naW5lLmVudHJ5KGRhdGEsIGZ1bmN0aW9uKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyLCBkYXRhKTtcbiAgICB9KTtcblxuICAgIHNvdXJjZS5waXBlKGVudHJ5KTtcbiAgfSBlbHNlIGlmIChkYXRhLnNvdXJjZVR5cGUgPT09ICdzdHJlYW0nKSB7XG4gICAgdXRpbC5jb2xsZWN0U3RyZWFtKHNvdXJjZSwgYXBwZW5kKTtcbiAgfVxufTtcblxuLyoqXG4gKiBbZmluYWxpemUgZGVzY3JpcHRpb25dXG4gKlxuICogQHJldHVybiB2b2lkXG4gKi9cblRhci5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbmdpbmUuZmluYWxpemUoKTtcbn07XG5cbi8qKlxuICogW29uIGRlc2NyaXB0aW9uXVxuICpcbiAqIEByZXR1cm4gdGhpcy5lbmdpbmVcbiAqL1xuVGFyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lbmdpbmUub24uYXBwbHkodGhpcy5lbmdpbmUsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIFtwaXBlIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gZGVzdGluYXRpb25cbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB0aGlzLmVuZ2luZVxuICovXG5UYXIucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0aW5hdGlvbiwgb3B0aW9ucykge1xuICBpZiAodGhpcy5jb21wcmVzc29yKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLnBpcGUuYXBwbHkodGhpcy5lbmdpbmUsIFt0aGlzLmNvbXByZXNzb3JdKS5waXBlKGRlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUucGlwZS5hcHBseSh0aGlzLmVuZ2luZSwgYXJndW1lbnRzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBbdW5waXBlIGRlc2NyaXB0aW9uXVxuICpcbiAqIEByZXR1cm4gdGhpcy5lbmdpbmVcbiAqL1xuVGFyLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuY29tcHJlc3Nvcikge1xuICAgIHJldHVybiB0aGlzLmNvbXByZXNzb3IudW5waXBlLmFwcGx5KHRoaXMuY29tcHJlc3NvciwgYXJndW1lbnRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUudW5waXBlLmFwcGx5KHRoaXMuZW5naW5lLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRhcjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUYXJPcHRpb25zXG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtnemlwPWZhbHNlXSBDb21wcmVzcyB0aGUgdGFyIGFyY2hpdmUgdXNpbmcgZ3ppcC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbZ3ppcE9wdGlvbnNdIFBhc3NlZCB0byBbemxpYl17QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS96bGliLmh0bWwjemxpYl9jbGFzc19vcHRpb25zfVxuICogdG8gY29udHJvbCBjb21wcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7Kn0gWypdIFNlZSBbdGFyLXN0cmVhbV17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC90YXItc3RyZWFtfSBkb2N1bWVudGF0aW9uIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUYXJFbnRyeURhdGFcbiAqIEBnbG9iYWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFNldHMgdGhlIGVudHJ5IG5hbWUgaW5jbHVkaW5nIGludGVybmFsIHBhdGguXG4gKiBAcHJvcGVydHkgeyhTdHJpbmd8RGF0ZSl9IFtkYXRlPU5PVygpXSBTZXRzIHRoZSBlbnRyeSBkYXRlLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFttb2RlPUQ6MDc1NS9GOjA2NDRdIFNldHMgdGhlIGVudHJ5IHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtwcmVmaXhdIFNldHMgYSBwYXRoIHByZWZpeCBmb3IgdGhlIGVudHJ5IG5hbWUuIFVzZWZ1bFxuICogd2hlbiB3b3JraW5nIHdpdGggbWV0aG9kcyBsaWtlIGBkaXJlY3RvcnlgIG9yIGBnbG9iYC5cbiAqIEBwcm9wZXJ0eSB7ZnMuU3RhdHN9IFtzdGF0c10gU2V0cyB0aGUgZnMgc3RhdCBkYXRhIGZvciB0aGlzIGVudHJ5IGFsbG93aW5nXG4gKiBmb3IgcmVkdWN0aW9uIG9mIGZzIHN0YXQgY2FsbHMgd2hlbiBzdGF0IGRhdGEgaXMgYWxyZWFkeSBrbm93bi5cbiAqL1xuXG4vKipcbiAqIFRhclN0cmVhbSBNb2R1bGVcbiAqIEBleHRlcm5hbCBUYXJTdHJlYW1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvdGFyLXN0cmVhbX1cbiAqL1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///60741\n")},43541:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * ZIP Format Plugin\n *\n * @module plugins/zip\n * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}\n * @copyright (c) 2012-2014 Chris Talkington, contributors.\n */\nvar engine = __webpack_require__(48919);\nvar util = __webpack_require__(91789);\n\n/**\n * @constructor\n * @param {ZipOptions} [options]\n * @param {String} [options.comment] Sets the zip archive comment.\n * @param {Boolean} [options.forceLocalTime=false] Forces the archive to contain local file times instead of UTC.\n * @param {Boolean} [options.forceZip64=false] Forces the archive to contain ZIP64 headers.\n * @param {Boolean} [options.namePrependSlash=false] Prepends a forward slash to archive file paths.\n * @param {Boolean} [options.store=false] Sets the compression method to STORE.\n * @param {Object} [options.zlib] Passed to [zlib]{@link https://nodejs.org/api/zlib.html#zlib_class_options}\n */\nvar Zip = function(options) {\n if (!(this instanceof Zip)) {\n return new Zip(options);\n }\n\n options = this.options = util.defaults(options, {\n comment: '',\n forceUTC: false,\n namePrependSlash: false,\n store: false\n });\n\n this.supports = {\n directory: true,\n symlink: true\n };\n\n this.engine = new engine(options);\n};\n\n/**\n * @param {(Buffer|Stream)} source\n * @param {ZipEntryData} data\n * @param {String} data.name Sets the entry name including internal path.\n * @param {(String|Date)} [data.date=NOW()] Sets the entry date.\n * @param {Number} [data.mode=D:0755/F:0644] Sets the entry permissions.\n * @param {String} [data.prefix] Sets a path prefix for the entry name. Useful\n * when working with methods like `directory` or `glob`.\n * @param {fs.Stats} [data.stats] Sets the fs stat data for this entry allowing\n * for reduction of fs stat calls when stat data is already known.\n * @param {Boolean} [data.store=ZipOptions.store] Sets the compression method to STORE.\n * @param {Function} callback\n * @return void\n */\nZip.prototype.append = function(source, data, callback) {\n this.engine.entry(source, data, callback);\n};\n\n/**\n * @return void\n */\nZip.prototype.finalize = function() {\n this.engine.finalize();\n};\n\n/**\n * @return this.engine\n */\nZip.prototype.on = function() {\n return this.engine.on.apply(this.engine, arguments);\n};\n\n/**\n * @return this.engine\n */\nZip.prototype.pipe = function() {\n return this.engine.pipe.apply(this.engine, arguments);\n};\n\n/**\n * @return this.engine\n */\nZip.prototype.unpipe = function() {\n return this.engine.unpipe.apply(this.engine, arguments);\n};\n\nmodule.exports = Zip;\n\n/**\n * @typedef {Object} ZipOptions\n * @global\n * @property {String} [comment] Sets the zip archive comment.\n * @property {Boolean} [forceLocalTime=false] Forces the archive to contain local file times instead of UTC.\n * @property {Boolean} [forceZip64=false] Forces the archive to contain ZIP64 headers.\n * @prpperty {Boolean} [namePrependSlash=false] Prepends a forward slash to archive file paths.\n * @property {Boolean} [store=false] Sets the compression method to STORE.\n * @property {Object} [zlib] Passed to [zlib]{@link https://nodejs.org/api/zlib.html#zlib_class_options}\n * to control compression.\n * @property {*} [*] See [zip-stream]{@link https://archiverjs.com/zip-stream/ZipStream.html} documentation for current list of properties.\n */\n\n/**\n * @typedef {Object} ZipEntryData\n * @global\n * @property {String} name Sets the entry name including internal path.\n * @property {(String|Date)} [date=NOW()] Sets the entry date.\n * @property {Number} [mode=D:0755/F:0644] Sets the entry permissions.\n * @property {Boolean} [namePrependSlash=ZipOptions.namePrependSlash] Prepends a forward slash to archive file paths.\n * @property {String} [prefix] Sets a path prefix for the entry name. Useful\n * when working with methods like `directory` or `glob`.\n * @property {fs.Stats} [stats] Sets the fs stat data for this entry allowing\n * for reduction of fs stat calls when stat data is already known.\n * @property {Boolean} [store=ZipOptions.store] Sets the compression method to STORE.\n */\n\n/**\n * ZipStream Module\n * @external ZipStream\n * @see {@link https://www.archiverjs.com/zip-stream/ZipStream.html}\n */\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM1NDEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxLQUFZO0FBQ2pDLFdBQVcsbUJBQU8sQ0FBQyxLQUFnQjs7QUFFbkM7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsUUFBUSxnQ0FBZ0M7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSxpQkFBaUI7QUFDN0IsWUFBWSxjQUFjO0FBQzFCLFlBQVksUUFBUTtBQUNwQixZQUFZLGVBQWU7QUFDM0IsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQjtBQUNBLFlBQVksVUFBVTtBQUN0QjtBQUNBLFlBQVksU0FBUztBQUNyQixZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsU0FBUztBQUN2QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsUUFBUSx3QkFBd0I7QUFDOUM7QUFDQSxjQUFjLEdBQUcscUJBQXFCLHdEQUF3RDtBQUM5Rjs7QUFFQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGNBQWMsUUFBUTtBQUN0QixjQUFjLGVBQWU7QUFDN0IsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsU0FBUztBQUN2QixjQUFjLFFBQVE7QUFDdEI7QUFDQSxjQUFjLFVBQVU7QUFDeEI7QUFDQSxjQUFjLFNBQVM7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hcmNoaXZlci9saWIvcGx1Z2lucy96aXAuanM/NzIzZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFpJUCBGb3JtYXQgUGx1Z2luXG4gKlxuICogQG1vZHVsZSBwbHVnaW5zL3ppcFxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIGVuZ2luZSA9IHJlcXVpcmUoJ3ppcC1zdHJlYW0nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnYXJjaGl2ZXItdXRpbHMnKTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7WmlwT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29tbWVudF0gU2V0cyB0aGUgemlwIGFyY2hpdmUgY29tbWVudC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9yY2VMb2NhbFRpbWU9ZmFsc2VdIEZvcmNlcyB0aGUgYXJjaGl2ZSB0byBjb250YWluIGxvY2FsIGZpbGUgdGltZXMgaW5zdGVhZCBvZiBVVEMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvcmNlWmlwNjQ9ZmFsc2VdIEZvcmNlcyB0aGUgYXJjaGl2ZSB0byBjb250YWluIFpJUDY0IGhlYWRlcnMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5hbWVQcmVwZW5kU2xhc2g9ZmFsc2VdIFByZXBlbmRzIGEgZm9yd2FyZCBzbGFzaCB0byBhcmNoaXZlIGZpbGUgcGF0aHMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0b3JlPWZhbHNlXSBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gU1RPUkUuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuemxpYl0gUGFzc2VkIHRvIFt6bGliXXtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3psaWIuaHRtbCN6bGliX2NsYXNzX29wdGlvbnN9XG4gKi9cbnZhciBaaXAgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBaaXApKSB7XG4gICAgcmV0dXJuIG5ldyBaaXAob3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdXRpbC5kZWZhdWx0cyhvcHRpb25zLCB7XG4gICAgY29tbWVudDogJycsXG4gICAgZm9yY2VVVEM6IGZhbHNlLFxuICAgIG5hbWVQcmVwZW5kU2xhc2g6IGZhbHNlLFxuICAgIHN0b3JlOiBmYWxzZVxuICB9KTtcblxuICB0aGlzLnN1cHBvcnRzID0ge1xuICAgIGRpcmVjdG9yeTogdHJ1ZSxcbiAgICBzeW1saW5rOiB0cnVlXG4gIH07XG5cbiAgdGhpcy5lbmdpbmUgPSBuZXcgZW5naW5lKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHsoQnVmZmVyfFN0cmVhbSl9IHNvdXJjZVxuICogQHBhcmFtICB7WmlwRW50cnlEYXRhfSBkYXRhXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGRhdGEubmFtZSBTZXRzIHRoZSBlbnRyeSBuYW1lIGluY2x1ZGluZyBpbnRlcm5hbCBwYXRoLlxuICogQHBhcmFtICB7KFN0cmluZ3xEYXRlKX0gW2RhdGEuZGF0ZT1OT1coKV0gU2V0cyB0aGUgZW50cnkgZGF0ZS5cbiAqIEBwYXJhbSAge051bWJlcn0gW2RhdGEubW9kZT1EOjA3NTUvRjowNjQ0XSBTZXRzIHRoZSBlbnRyeSBwZXJtaXNzaW9ucy5cbiAqIEBwYXJhbSAge1N0cmluZ30gW2RhdGEucHJlZml4XSBTZXRzIGEgcGF0aCBwcmVmaXggZm9yIHRoZSBlbnRyeSBuYW1lLiBVc2VmdWxcbiAqIHdoZW4gd29ya2luZyB3aXRoIG1ldGhvZHMgbGlrZSBgZGlyZWN0b3J5YCBvciBgZ2xvYmAuXG4gKiBAcGFyYW0gIHtmcy5TdGF0c30gW2RhdGEuc3RhdHNdIFNldHMgdGhlIGZzIHN0YXQgZGF0YSBmb3IgdGhpcyBlbnRyeSBhbGxvd2luZ1xuICogZm9yIHJlZHVjdGlvbiBvZiBmcyBzdGF0IGNhbGxzIHdoZW4gc3RhdCBkYXRhIGlzIGFscmVhZHkga25vd24uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbZGF0YS5zdG9yZT1aaXBPcHRpb25zLnN0b3JlXSBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gU1RPUkUuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5aaXAucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgZGF0YSwgY2FsbGJhY2spIHtcbiAgdGhpcy5lbmdpbmUuZW50cnkoc291cmNlLCBkYXRhLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4gdm9pZFxuICovXG5aaXAucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZW5naW5lLmZpbmFsaXplKCk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4gdGhpcy5lbmdpbmVcbiAqL1xuWmlwLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lbmdpbmUub24uYXBwbHkodGhpcy5lbmdpbmUsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4gdGhpcy5lbmdpbmVcbiAqL1xuWmlwLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVuZ2luZS5waXBlLmFwcGx5KHRoaXMuZW5naW5lLCBhcmd1bWVudHMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHRoaXMuZW5naW5lXG4gKi9cblppcC5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVuZ2luZS51bnBpcGUuYXBwbHkodGhpcy5lbmdpbmUsIGFyZ3VtZW50cyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFppcDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBaaXBPcHRpb25zXG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW2NvbW1lbnRdIFNldHMgdGhlIHppcCBhcmNoaXZlIGNvbW1lbnQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtmb3JjZUxvY2FsVGltZT1mYWxzZV0gRm9yY2VzIHRoZSBhcmNoaXZlIHRvIGNvbnRhaW4gbG9jYWwgZmlsZSB0aW1lcyBpbnN0ZWFkIG9mIFVUQy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2ZvcmNlWmlwNjQ9ZmFsc2VdIEZvcmNlcyB0aGUgYXJjaGl2ZSB0byBjb250YWluIFpJUDY0IGhlYWRlcnMuXG4gKiBAcHJwcGVydHkge0Jvb2xlYW59IFtuYW1lUHJlcGVuZFNsYXNoPWZhbHNlXSBQcmVwZW5kcyBhIGZvcndhcmQgc2xhc2ggdG8gYXJjaGl2ZSBmaWxlIHBhdGhzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBbc3RvcmU9ZmFsc2VdIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byBTVE9SRS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbemxpYl0gUGFzc2VkIHRvIFt6bGliXXtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3psaWIuaHRtbCN6bGliX2NsYXNzX29wdGlvbnN9XG4gKiB0byBjb250cm9sIGNvbXByZXNzaW9uLlxuICogQHByb3BlcnR5IHsqfSBbKl0gU2VlIFt6aXAtc3RyZWFtXXtAbGluayBodHRwczovL2FyY2hpdmVyanMuY29tL3ppcC1zdHJlYW0vWmlwU3RyZWFtLmh0bWx9IGRvY3VtZW50YXRpb24gZm9yIGN1cnJlbnQgbGlzdCBvZiBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gWmlwRW50cnlEYXRhXG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBTZXRzIHRoZSBlbnRyeSBuYW1lIGluY2x1ZGluZyBpbnRlcm5hbCBwYXRoLlxuICogQHByb3BlcnR5IHsoU3RyaW5nfERhdGUpfSBbZGF0ZT1OT1coKV0gU2V0cyB0aGUgZW50cnkgZGF0ZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbW9kZT1EOjA3NTUvRjowNjQ0XSBTZXRzIHRoZSBlbnRyeSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW25hbWVQcmVwZW5kU2xhc2g9WmlwT3B0aW9ucy5uYW1lUHJlcGVuZFNsYXNoXSBQcmVwZW5kcyBhIGZvcndhcmQgc2xhc2ggdG8gYXJjaGl2ZSBmaWxlIHBhdGhzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtwcmVmaXhdIFNldHMgYSBwYXRoIHByZWZpeCBmb3IgdGhlIGVudHJ5IG5hbWUuIFVzZWZ1bFxuICogd2hlbiB3b3JraW5nIHdpdGggbWV0aG9kcyBsaWtlIGBkaXJlY3RvcnlgIG9yIGBnbG9iYC5cbiAqIEBwcm9wZXJ0eSB7ZnMuU3RhdHN9IFtzdGF0c10gU2V0cyB0aGUgZnMgc3RhdCBkYXRhIGZvciB0aGlzIGVudHJ5IGFsbG93aW5nXG4gKiBmb3IgcmVkdWN0aW9uIG9mIGZzIHN0YXQgY2FsbHMgd2hlbiBzdGF0IGRhdGEgaXMgYWxyZWFkeSBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3N0b3JlPVppcE9wdGlvbnMuc3RvcmVdIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byBTVE9SRS5cbiAqL1xuXG4vKipcbiAqIFppcFN0cmVhbSBNb2R1bGVcbiAqIEBleHRlcm5hbCBaaXBTdHJlYW1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LmFyY2hpdmVyanMuY29tL3ppcC1zdHJlYW0vWmlwU3RyZWFtLmh0bWx9XG4gKi9cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///43541\n")},21873:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports =\n{\n parallel : __webpack_require__(18798),\n serial : __webpack_require__(52081),\n serialOrdered : __webpack_require__(90028)\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE4NzMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBLGtCQUFrQixtQkFBTyxDQUFDLEtBQWU7QUFDekMsa0JBQWtCLG1CQUFPLENBQUMsS0FBYTtBQUN2QyxrQkFBa0IsbUJBQU8sQ0FBQyxLQUFvQjtBQUM5QyIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvYXN5bmNraXQvaW5kZXguanM/OTYyMSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG57XG4gIHBhcmFsbGVsICAgICAgOiByZXF1aXJlKCcuL3BhcmFsbGVsLmpzJyksXG4gIHNlcmlhbCAgICAgICAgOiByZXF1aXJlKCcuL3NlcmlhbC5qcycpLFxuICBzZXJpYWxPcmRlcmVkIDogcmVxdWlyZSgnLi9zZXJpYWxPcmRlcmVkLmpzJylcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///21873\n")},74555:module=>{eval("// API\nmodule.exports = abort;\n\n/**\n * Aborts leftover active jobs\n *\n * @param {object} state - current state object\n */\nfunction abort(state)\n{\n Object.keys(state.jobs).forEach(clean.bind(state));\n\n // reset leftover jobs\n state.jobs = {};\n}\n\n/**\n * Cleans up leftover job by invoking abort function for the provided job id\n *\n * @this state\n * @param {string|number} key - job id to abort\n */\nfunction clean(key)\n{\n if (typeof this.jobs[key] == 'function')\n {\n this.jobs[key]();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQ1NTUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2FzeW5ja2l0L2xpYi9hYm9ydC5qcz85NTZjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFQSVxubW9kdWxlLmV4cG9ydHMgPSBhYm9ydDtcblxuLyoqXG4gKiBBYm9ydHMgbGVmdG92ZXIgYWN0aXZlIGpvYnNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gc3RhdGUgLSBjdXJyZW50IHN0YXRlIG9iamVjdFxuICovXG5mdW5jdGlvbiBhYm9ydChzdGF0ZSlcbntcbiAgT2JqZWN0LmtleXMoc3RhdGUuam9icykuZm9yRWFjaChjbGVhbi5iaW5kKHN0YXRlKSk7XG5cbiAgLy8gcmVzZXQgbGVmdG92ZXIgam9ic1xuICBzdGF0ZS5qb2JzID0ge307XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIGxlZnRvdmVyIGpvYiBieSBpbnZva2luZyBhYm9ydCBmdW5jdGlvbiBmb3IgdGhlIHByb3ZpZGVkIGpvYiBpZFxuICpcbiAqIEB0aGlzICBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBrZXkgLSBqb2IgaWQgdG8gYWJvcnRcbiAqL1xuZnVuY3Rpb24gY2xlYW4oa2V5KVxue1xuICBpZiAodHlwZW9mIHRoaXMuam9ic1trZXldID09ICdmdW5jdGlvbicpXG4gIHtcbiAgICB0aGlzLmpvYnNba2V5XSgpO1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///74555\n")},72313:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var defer = __webpack_require__(70405);\n\n// API\nmodule.exports = async;\n\n/**\n * Runs provided callback asynchronously\n * even if callback itself is not\n *\n * @param {function} callback - callback to invoke\n * @returns {function} - augmented callback\n */\nfunction async(callback)\n{\n var isAsync = false;\n\n // check if async happened\n defer(function() { isAsync = true; });\n\n return function async_callback(err, result)\n {\n if (isAsync)\n {\n callback(err, result);\n }\n else\n {\n defer(function nextTick_callback()\n {\n callback(err, result);\n });\n }\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIzMTMuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxtQkFBTyxDQUFDLEtBQVk7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLGlCQUFpQjs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2FzeW5ja2l0L2xpYi9hc3luYy5qcz84ZWNmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWZlciA9IHJlcXVpcmUoJy4vZGVmZXIuanMnKTtcblxuLy8gQVBJXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jO1xuXG4vKipcbiAqIFJ1bnMgcHJvdmlkZWQgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHlcbiAqIGV2ZW4gaWYgY2FsbGJhY2sgaXRzZWxmIGlzIG5vdFxuICpcbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBjYWxsYmFjayB0byBpbnZva2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gLSBhdWdtZW50ZWQgY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gYXN5bmMoY2FsbGJhY2spXG57XG4gIHZhciBpc0FzeW5jID0gZmFsc2U7XG5cbiAgLy8gY2hlY2sgaWYgYXN5bmMgaGFwcGVuZWRcbiAgZGVmZXIoZnVuY3Rpb24oKSB7IGlzQXN5bmMgPSB0cnVlOyB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gYXN5bmNfY2FsbGJhY2soZXJyLCByZXN1bHQpXG4gIHtcbiAgICBpZiAoaXNBc3luYylcbiAgICB7XG4gICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBkZWZlcihmdW5jdGlvbiBuZXh0VGlja19jYWxsYmFjaygpXG4gICAgICB7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///72313\n")},70405:module=>{eval("module.exports = defer;\n\n/**\n * Runs provided function on next iteration of the event loop\n *\n * @param {function} fn - function to run\n */\nfunction defer(fn)\n{\n var nextTick = typeof setImmediate == 'function'\n ? setImmediate\n : (\n typeof process == 'object' && typeof process.nextTick == 'function'\n ? process.nextTick\n : null\n );\n\n if (nextTick)\n {\n nextTick(fn);\n }\n else\n {\n setTimeout(fn, 0);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA0MDUuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvYXN5bmNraXQvbGliL2RlZmVyLmpzPzkyYzEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBkZWZlcjtcblxuLyoqXG4gKiBSdW5zIHByb3ZpZGVkIGZ1bmN0aW9uIG9uIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBldmVudCBsb29wXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBmdW5jdGlvbiB0byBydW5cbiAqL1xuZnVuY3Rpb24gZGVmZXIoZm4pXG57XG4gIHZhciBuZXh0VGljayA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2V0SW1tZWRpYXRlXG4gICAgOiAoXG4gICAgICB0eXBlb2YgcHJvY2VzcyA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PSAnZnVuY3Rpb24nXG4gICAgICA/IHByb2Nlc3MubmV4dFRpY2tcbiAgICAgIDogbnVsbFxuICAgICk7XG5cbiAgaWYgKG5leHRUaWNrKVxuICB7XG4gICAgbmV4dFRpY2soZm4pO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///70405\n")},78051:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var async = __webpack_require__(72313)\n , abort = __webpack_require__(74555)\n ;\n\n// API\nmodule.exports = iterate;\n\n/**\n * Iterates over each job object\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {object} state - current job status\n * @param {function} callback - invoked when all elements processed\n */\nfunction iterate(list, iterator, state, callback)\n{\n // store current index\n var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;\n\n state.jobs[key] = runJob(iterator, key, list[key], function(error, output)\n {\n // don't repeat yourself\n // skip secondary callbacks\n if (!(key in state.jobs))\n {\n return;\n }\n\n // clean up jobs\n delete state.jobs[key];\n\n if (error)\n {\n // don't process rest of the results\n // stop still active jobs\n // and reset the list\n abort(state);\n }\n else\n {\n state.results[key] = output;\n }\n\n // return salvaged results\n callback(error, state.results);\n });\n}\n\n/**\n * Runs iterator over provided job element\n *\n * @param {function} iterator - iterator to invoke\n * @param {string|number} key - key/index of the element in the list of jobs\n * @param {mixed} item - job description\n * @param {function} callback - invoked after iterator is done with the job\n * @returns {function|mixed} - job abort function or something else\n */\nfunction runJob(iterator, key, item, callback)\n{\n var aborter;\n\n // allow shortcut if iterator expects only two arguments\n if (iterator.length == 2)\n {\n aborter = iterator(item, async(callback));\n }\n // otherwise go with full three arguments\n else\n {\n aborter = iterator(item, key, async(callback));\n }\n\n return aborter;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzgwNTEuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxtQkFBTyxDQUFDLEtBQVk7QUFDaEMsWUFBWSxtQkFBTyxDQUFDLEtBQVk7QUFDaEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QixhQUFhLGVBQWU7QUFDNUIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsVUFBVTtBQUN2QixhQUFhLGdCQUFnQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hc3luY2tpdC9saWIvaXRlcmF0ZS5qcz9iNTYxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhc3luYyA9IHJlcXVpcmUoJy4vYXN5bmMuanMnKVxuICAsIGFib3J0ID0gcmVxdWlyZSgnLi9hYm9ydC5qcycpXG4gIDtcblxuLy8gQVBJXG5tb2R1bGUuZXhwb3J0cyA9IGl0ZXJhdGU7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlYWNoIGpvYiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge2FycmF5fG9iamVjdH0gbGlzdCAtIGFycmF5IG9yIG9iamVjdCAobmFtZWQgbGlzdCkgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBpdGVyYXRvciAtIGl0ZXJhdG9yIHRvIHJ1blxuICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIC0gY3VycmVudCBqb2Igc3RhdHVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGludm9rZWQgd2hlbiBhbGwgZWxlbWVudHMgcHJvY2Vzc2VkXG4gKi9cbmZ1bmN0aW9uIGl0ZXJhdGUobGlzdCwgaXRlcmF0b3IsIHN0YXRlLCBjYWxsYmFjaylcbntcbiAgLy8gc3RvcmUgY3VycmVudCBpbmRleFxuICB2YXIga2V5ID0gc3RhdGVbJ2tleWVkTGlzdCddID8gc3RhdGVbJ2tleWVkTGlzdCddW3N0YXRlLmluZGV4XSA6IHN0YXRlLmluZGV4O1xuXG4gIHN0YXRlLmpvYnNba2V5XSA9IHJ1bkpvYihpdGVyYXRvciwga2V5LCBsaXN0W2tleV0sIGZ1bmN0aW9uKGVycm9yLCBvdXRwdXQpXG4gIHtcbiAgICAvLyBkb24ndCByZXBlYXQgeW91cnNlbGZcbiAgICAvLyBza2lwIHNlY29uZGFyeSBjYWxsYmFja3NcbiAgICBpZiAoIShrZXkgaW4gc3RhdGUuam9icykpXG4gICAge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNsZWFuIHVwIGpvYnNcbiAgICBkZWxldGUgc3RhdGUuam9ic1trZXldO1xuXG4gICAgaWYgKGVycm9yKVxuICAgIHtcbiAgICAgIC8vIGRvbid0IHByb2Nlc3MgcmVzdCBvZiB0aGUgcmVzdWx0c1xuICAgICAgLy8gc3RvcCBzdGlsbCBhY3RpdmUgam9ic1xuICAgICAgLy8gYW5kIHJlc2V0IHRoZSBsaXN0XG4gICAgICBhYm9ydChzdGF0ZSk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBzdGF0ZS5yZXN1bHRzW2tleV0gPSBvdXRwdXQ7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHNhbHZhZ2VkIHJlc3VsdHNcbiAgICBjYWxsYmFjayhlcnJvciwgc3RhdGUucmVzdWx0cyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1bnMgaXRlcmF0b3Igb3ZlciBwcm92aWRlZCBqb2IgZWxlbWVudFxuICpcbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gaXRlcmF0b3IgLSBpdGVyYXRvciB0byBpbnZva2VcbiAqIEBwYXJhbSAgIHtzdHJpbmd8bnVtYmVyfSBrZXkgLSBrZXkvaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpc3Qgb2Ygam9ic1xuICogQHBhcmFtICAge21peGVkfSBpdGVtIC0gam9iIGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0gICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gaW52b2tlZCBhZnRlciBpdGVyYXRvciBpcyBkb25lIHdpdGggdGhlIGpvYlxuICogQHJldHVybnMge2Z1bmN0aW9ufG1peGVkfSAtIGpvYiBhYm9ydCBmdW5jdGlvbiBvciBzb21ldGhpbmcgZWxzZVxuICovXG5mdW5jdGlvbiBydW5Kb2IoaXRlcmF0b3IsIGtleSwgaXRlbSwgY2FsbGJhY2spXG57XG4gIHZhciBhYm9ydGVyO1xuXG4gIC8vIGFsbG93IHNob3J0Y3V0IGlmIGl0ZXJhdG9yIGV4cGVjdHMgb25seSB0d28gYXJndW1lbnRzXG4gIGlmIChpdGVyYXRvci5sZW5ndGggPT0gMilcbiAge1xuICAgIGFib3J0ZXIgPSBpdGVyYXRvcihpdGVtLCBhc3luYyhjYWxsYmFjaykpO1xuICB9XG4gIC8vIG90aGVyd2lzZSBnbyB3aXRoIGZ1bGwgdGhyZWUgYXJndW1lbnRzXG4gIGVsc2VcbiAge1xuICAgIGFib3J0ZXIgPSBpdGVyYXRvcihpdGVtLCBrZXksIGFzeW5jKGNhbGxiYWNrKSk7XG4gIH1cblxuICByZXR1cm4gYWJvcnRlcjtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///78051\n")},19500:module=>{eval("// API\nmodule.exports = state;\n\n/**\n * Creates initial state object\n * for iteration over list\n *\n * @param {array|object} list - list to iterate over\n * @param {function|null} sortMethod - function to use for keys sort,\n * or `null` to keep them as is\n * @returns {object} - initial state object\n */\nfunction state(list, sortMethod)\n{\n var isNamedList = !Array.isArray(list)\n , initState =\n {\n index : 0,\n keyedList: isNamedList || sortMethod ? Object.keys(list) : null,\n jobs : {},\n results : isNamedList ? {} : [],\n size : isNamedList ? Object.keys(list).length : list.length\n }\n ;\n\n if (sortMethod)\n {\n // sort array keys based on it's values\n // sort object's keys just on own merit\n initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)\n {\n return sortMethod(list[a], list[b]);\n });\n }\n\n return initState;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk1MDAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsY0FBYztBQUMzQixhQUFhLGVBQWU7QUFDNUI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2FzeW5ja2l0L2xpYi9zdGF0ZS5qcz80MTA5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFQSVxubW9kdWxlLmV4cG9ydHMgPSBzdGF0ZTtcblxuLyoqXG4gKiBDcmVhdGVzIGluaXRpYWwgc3RhdGUgb2JqZWN0XG4gKiBmb3IgaXRlcmF0aW9uIG92ZXIgbGlzdFxuICpcbiAqIEBwYXJhbSAgIHthcnJheXxvYmplY3R9IGxpc3QgLSBsaXN0IHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtICAge2Z1bmN0aW9ufG51bGx9IHNvcnRNZXRob2QgLSBmdW5jdGlvbiB0byB1c2UgZm9yIGtleXMgc29ydCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGBudWxsYCB0byBrZWVwIHRoZW0gYXMgaXNcbiAqIEByZXR1cm5zIHtvYmplY3R9IC0gaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gc3RhdGUobGlzdCwgc29ydE1ldGhvZClcbntcbiAgdmFyIGlzTmFtZWRMaXN0ID0gIUFycmF5LmlzQXJyYXkobGlzdClcbiAgICAsIGluaXRTdGF0ZSA9XG4gICAge1xuICAgICAgaW5kZXggICAgOiAwLFxuICAgICAga2V5ZWRMaXN0OiBpc05hbWVkTGlzdCB8fCBzb3J0TWV0aG9kID8gT2JqZWN0LmtleXMobGlzdCkgOiBudWxsLFxuICAgICAgam9icyAgICAgOiB7fSxcbiAgICAgIHJlc3VsdHMgIDogaXNOYW1lZExpc3QgPyB7fSA6IFtdLFxuICAgICAgc2l6ZSAgICAgOiBpc05hbWVkTGlzdCA/IE9iamVjdC5rZXlzKGxpc3QpLmxlbmd0aCA6IGxpc3QubGVuZ3RoXG4gICAgfVxuICAgIDtcblxuICBpZiAoc29ydE1ldGhvZClcbiAge1xuICAgIC8vIHNvcnQgYXJyYXkga2V5cyBiYXNlZCBvbiBpdCdzIHZhbHVlc1xuICAgIC8vIHNvcnQgb2JqZWN0J3Mga2V5cyBqdXN0IG9uIG93biBtZXJpdFxuICAgIGluaXRTdGF0ZS5rZXllZExpc3Quc29ydChpc05hbWVkTGlzdCA/IHNvcnRNZXRob2QgOiBmdW5jdGlvbihhLCBiKVxuICAgIHtcbiAgICAgIHJldHVybiBzb3J0TWV0aG9kKGxpc3RbYV0sIGxpc3RbYl0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGluaXRTdGF0ZTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///19500\n")},26276:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var abort = __webpack_require__(74555)\n , async = __webpack_require__(72313)\n ;\n\n// API\nmodule.exports = terminator;\n\n/**\n * Terminates jobs in the attached state context\n *\n * @this AsyncKitState#\n * @param {function} callback - final callback to invoke after termination\n */\nfunction terminator(callback)\n{\n if (!Object.keys(this.jobs).length)\n {\n return;\n }\n\n // fast forward iteration index\n this.index = this.size;\n\n // abort jobs\n abort(this);\n\n // send back results we have so far\n async(callback)(null, this.results);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYyNzYuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxtQkFBTyxDQUFDLEtBQVk7QUFDaEMsWUFBWSxtQkFBTyxDQUFDLEtBQVk7QUFDaEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hc3luY2tpdC9saWIvdGVybWluYXRvci5qcz8xMjk1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhYm9ydCA9IHJlcXVpcmUoJy4vYWJvcnQuanMnKVxuICAsIGFzeW5jID0gcmVxdWlyZSgnLi9hc3luYy5qcycpXG4gIDtcblxuLy8gQVBJXG5tb2R1bGUuZXhwb3J0cyA9IHRlcm1pbmF0b3I7XG5cbi8qKlxuICogVGVybWluYXRlcyBqb2JzIGluIHRoZSBhdHRhY2hlZCBzdGF0ZSBjb250ZXh0XG4gKlxuICogQHRoaXMgIEFzeW5jS2l0U3RhdGUjXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGZpbmFsIGNhbGxiYWNrIHRvIGludm9rZSBhZnRlciB0ZXJtaW5hdGlvblxuICovXG5mdW5jdGlvbiB0ZXJtaW5hdG9yKGNhbGxiYWNrKVxue1xuICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuam9icykubGVuZ3RoKVxuICB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZmFzdCBmb3J3YXJkIGl0ZXJhdGlvbiBpbmRleFxuICB0aGlzLmluZGV4ID0gdGhpcy5zaXplO1xuXG4gIC8vIGFib3J0IGpvYnNcbiAgYWJvcnQodGhpcyk7XG5cbiAgLy8gc2VuZCBiYWNrIHJlc3VsdHMgd2UgaGF2ZSBzbyBmYXJcbiAgYXN5bmMoY2FsbGJhY2spKG51bGwsIHRoaXMucmVzdWx0cyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///26276\n")},18798:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var iterate = __webpack_require__(78051)\n , initState = __webpack_require__(19500)\n , terminator = __webpack_require__(26276)\n ;\n\n// Public API\nmodule.exports = parallel;\n\n/**\n * Runs iterator over provided array elements in parallel\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction parallel(list, iterator, callback)\n{\n var state = initState(list);\n\n while (state.index < (state['keyedList'] || list).length)\n {\n iterate(list, iterator, state, function(error, result)\n {\n if (error)\n {\n callback(error, result);\n return;\n }\n\n // looks like it's the last one\n if (Object.keys(state.jobs).length === 0)\n {\n callback(null, state.results);\n return;\n }\n });\n\n state.index++;\n }\n\n return terminator.bind(state, callback);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg3OTguanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsS0FBa0I7QUFDM0MsaUJBQWlCLG1CQUFPLENBQUMsS0FBZ0I7QUFDekMsaUJBQWlCLG1CQUFPLENBQUMsS0FBcUI7QUFDOUM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0IsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hc3luY2tpdC9wYXJhbGxlbC5qcz85MTVhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpdGVyYXRlICAgID0gcmVxdWlyZSgnLi9saWIvaXRlcmF0ZS5qcycpXG4gICwgaW5pdFN0YXRlICA9IHJlcXVpcmUoJy4vbGliL3N0YXRlLmpzJylcbiAgLCB0ZXJtaW5hdG9yID0gcmVxdWlyZSgnLi9saWIvdGVybWluYXRvci5qcycpXG4gIDtcblxuLy8gUHVibGljIEFQSVxubW9kdWxlLmV4cG9ydHMgPSBwYXJhbGxlbDtcblxuLyoqXG4gKiBSdW5zIGl0ZXJhdG9yIG92ZXIgcHJvdmlkZWQgYXJyYXkgZWxlbWVudHMgaW4gcGFyYWxsZWxcbiAqXG4gKiBAcGFyYW0gICB7YXJyYXl8b2JqZWN0fSBsaXN0IC0gYXJyYXkgb3Igb2JqZWN0IChuYW1lZCBsaXN0KSB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gaXRlcmF0b3IgLSBpdGVyYXRvciB0byBydW5cbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBpbnZva2VkIHdoZW4gYWxsIGVsZW1lbnRzIHByb2Nlc3NlZFxuICogQHJldHVybnMge2Z1bmN0aW9ufSAtIGpvYnMgdGVybWluYXRvclxuICovXG5mdW5jdGlvbiBwYXJhbGxlbChsaXN0LCBpdGVyYXRvciwgY2FsbGJhY2spXG57XG4gIHZhciBzdGF0ZSA9IGluaXRTdGF0ZShsaXN0KTtcblxuICB3aGlsZSAoc3RhdGUuaW5kZXggPCAoc3RhdGVbJ2tleWVkTGlzdCddIHx8IGxpc3QpLmxlbmd0aClcbiAge1xuICAgIGl0ZXJhdGUobGlzdCwgaXRlcmF0b3IsIHN0YXRlLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KVxuICAgIHtcbiAgICAgIGlmIChlcnJvcilcbiAgICAgIHtcbiAgICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gbG9va3MgbGlrZSBpdCdzIHRoZSBsYXN0IG9uZVxuICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlLmpvYnMpLmxlbmd0aCA9PT0gMClcbiAgICAgIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc3RhdGUucmVzdWx0cyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YXRlLmluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gdGVybWluYXRvci5iaW5kKHN0YXRlLCBjYWxsYmFjayk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///18798\n")},52081:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var serialOrdered = __webpack_require__(90028);\n\n// Public API\nmodule.exports = serial;\n\n/**\n * Runs iterator over provided array elements in series\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction serial(list, iterator, callback)\n{\n return serialOrdered(list, iterator, null, callback);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIwODEuanMiLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CLG1CQUFPLENBQUMsS0FBb0I7O0FBRWhEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCLGFBQWEsVUFBVTtBQUN2QixhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2FzeW5ja2l0L3NlcmlhbC5qcz82YzczIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBzZXJpYWxPcmRlcmVkID0gcmVxdWlyZSgnLi9zZXJpYWxPcmRlcmVkLmpzJyk7XG5cbi8vIFB1YmxpYyBBUElcbm1vZHVsZS5leHBvcnRzID0gc2VyaWFsO1xuXG4vKipcbiAqIFJ1bnMgaXRlcmF0b3Igb3ZlciBwcm92aWRlZCBhcnJheSBlbGVtZW50cyBpbiBzZXJpZXNcbiAqXG4gKiBAcGFyYW0gICB7YXJyYXl8b2JqZWN0fSBsaXN0IC0gYXJyYXkgb3Igb2JqZWN0IChuYW1lZCBsaXN0KSB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gaXRlcmF0b3IgLSBpdGVyYXRvciB0byBydW5cbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBpbnZva2VkIHdoZW4gYWxsIGVsZW1lbnRzIHByb2Nlc3NlZFxuICogQHJldHVybnMge2Z1bmN0aW9ufSAtIGpvYnMgdGVybWluYXRvclxuICovXG5mdW5jdGlvbiBzZXJpYWwobGlzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKVxue1xuICByZXR1cm4gc2VyaWFsT3JkZXJlZChsaXN0LCBpdGVyYXRvciwgbnVsbCwgY2FsbGJhY2spO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///52081\n")},90028:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var iterate = __webpack_require__(78051)\n , initState = __webpack_require__(19500)\n , terminator = __webpack_require__(26276)\n ;\n\n// Public API\nmodule.exports = serialOrdered;\n// sorting helpers\nmodule.exports.ascending = ascending;\nmodule.exports.descending = descending;\n\n/**\n * Runs iterator over provided sorted array elements in series\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {function} sortMethod - custom sort function\n * @param {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction serialOrdered(list, iterator, sortMethod, callback)\n{\n var state = initState(list, sortMethod);\n\n iterate(list, iterator, state, function iteratorHandler(error, result)\n {\n if (error)\n {\n callback(error, result);\n return;\n }\n\n state.index++;\n\n // are we there yet?\n if (state.index < (state['keyedList'] || list).length)\n {\n iterate(list, iterator, state, iteratorHandler);\n return;\n }\n\n // done here\n callback(null, state.results);\n });\n\n return terminator.bind(state, callback);\n}\n\n/*\n * -- Sort methods\n */\n\n/**\n * sort helper to sort array elements in ascending order\n *\n * @param {mixed} a - an item to compare\n * @param {mixed} b - an item to compare\n * @returns {number} - comparison result\n */\nfunction ascending(a, b)\n{\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * sort helper to sort array elements in descending order\n *\n * @param {mixed} a - an item to compare\n * @param {mixed} b - an item to compare\n * @returns {number} - comparison result\n */\nfunction descending(a, b)\n{\n return -1 * ascending(a, b);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAwMjguanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsS0FBa0I7QUFDM0MsaUJBQWlCLG1CQUFPLENBQUMsS0FBZ0I7QUFDekMsaUJBQWlCLG1CQUFPLENBQUMsS0FBcUI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCLGFBQWEsVUFBVTtBQUN2QixhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9hc3luY2tpdC9zZXJpYWxPcmRlcmVkLmpzP2ZlN2EiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGl0ZXJhdGUgICAgPSByZXF1aXJlKCcuL2xpYi9pdGVyYXRlLmpzJylcbiAgLCBpbml0U3RhdGUgID0gcmVxdWlyZSgnLi9saWIvc3RhdGUuanMnKVxuICAsIHRlcm1pbmF0b3IgPSByZXF1aXJlKCcuL2xpYi90ZXJtaW5hdG9yLmpzJylcbiAgO1xuXG4vLyBQdWJsaWMgQVBJXG5tb2R1bGUuZXhwb3J0cyA9IHNlcmlhbE9yZGVyZWQ7XG4vLyBzb3J0aW5nIGhlbHBlcnNcbm1vZHVsZS5leHBvcnRzLmFzY2VuZGluZyAgPSBhc2NlbmRpbmc7XG5tb2R1bGUuZXhwb3J0cy5kZXNjZW5kaW5nID0gZGVzY2VuZGluZztcblxuLyoqXG4gKiBSdW5zIGl0ZXJhdG9yIG92ZXIgcHJvdmlkZWQgc29ydGVkIGFycmF5IGVsZW1lbnRzIGluIHNlcmllc1xuICpcbiAqIEBwYXJhbSAgIHthcnJheXxvYmplY3R9IGxpc3QgLSBhcnJheSBvciBvYmplY3QgKG5hbWVkIGxpc3QpIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtICAge2Z1bmN0aW9ufSBpdGVyYXRvciAtIGl0ZXJhdG9yIHRvIHJ1blxuICogQHBhcmFtICAge2Z1bmN0aW9ufSBzb3J0TWV0aG9kIC0gY3VzdG9tIHNvcnQgZnVuY3Rpb25cbiAqIEBwYXJhbSAgIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBpbnZva2VkIHdoZW4gYWxsIGVsZW1lbnRzIHByb2Nlc3NlZFxuICogQHJldHVybnMge2Z1bmN0aW9ufSAtIGpvYnMgdGVybWluYXRvclxuICovXG5mdW5jdGlvbiBzZXJpYWxPcmRlcmVkKGxpc3QsIGl0ZXJhdG9yLCBzb3J0TWV0aG9kLCBjYWxsYmFjaylcbntcbiAgdmFyIHN0YXRlID0gaW5pdFN0YXRlKGxpc3QsIHNvcnRNZXRob2QpO1xuXG4gIGl0ZXJhdGUobGlzdCwgaXRlcmF0b3IsIHN0YXRlLCBmdW5jdGlvbiBpdGVyYXRvckhhbmRsZXIoZXJyb3IsIHJlc3VsdClcbiAge1xuICAgIGlmIChlcnJvcilcbiAgICB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdGF0ZS5pbmRleCsrO1xuXG4gICAgLy8gYXJlIHdlIHRoZXJlIHlldD9cbiAgICBpZiAoc3RhdGUuaW5kZXggPCAoc3RhdGVbJ2tleWVkTGlzdCddIHx8IGxpc3QpLmxlbmd0aClcbiAgICB7XG4gICAgICBpdGVyYXRlKGxpc3QsIGl0ZXJhdG9yLCBzdGF0ZSwgaXRlcmF0b3JIYW5kbGVyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkb25lIGhlcmVcbiAgICBjYWxsYmFjayhudWxsLCBzdGF0ZS5yZXN1bHRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRlcm1pbmF0b3IuYmluZChzdGF0ZSwgY2FsbGJhY2spO1xufVxuXG4vKlxuICogLS0gU29ydCBtZXRob2RzXG4gKi9cblxuLyoqXG4gKiBzb3J0IGhlbHBlciB0byBzb3J0IGFycmF5IGVsZW1lbnRzIGluIGFzY2VuZGluZyBvcmRlclxuICpcbiAqIEBwYXJhbSAgIHttaXhlZH0gYSAtIGFuIGl0ZW0gdG8gY29tcGFyZVxuICogQHBhcmFtICAge21peGVkfSBiIC0gYW4gaXRlbSB0byBjb21wYXJlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIGNvbXBhcmlzb24gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKVxue1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG5cbi8qKlxuICogc29ydCBoZWxwZXIgdG8gc29ydCBhcnJheSBlbGVtZW50cyBpbiBkZXNjZW5kaW5nIG9yZGVyXG4gKlxuICogQHBhcmFtICAge21peGVkfSBhIC0gYW4gaXRlbSB0byBjb21wYXJlXG4gKiBAcGFyYW0gICB7bWl4ZWR9IGIgLSBhbiBpdGVtIHRvIGNvbXBhcmVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gY29tcGFyaXNvbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKVxue1xuICByZXR1cm4gLTEgKiBhc2NlbmRpbmcoYSwgYik7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///90028\n")},7042:module=>{eval("function isBuffer (value) {\n return Buffer.isBuffer(value) || value instanceof Uint8Array\n}\n\nfunction isEncoding (encoding) {\n return Buffer.isEncoding(encoding)\n}\n\nfunction alloc (size, fill, encoding) {\n return Buffer.alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n return Buffer.allocUnsafe(size)\n}\n\nfunction allocUnsafeSlow (size) {\n return Buffer.allocUnsafeSlow(size)\n}\n\nfunction byteLength (string, encoding) {\n return Buffer.byteLength(string, encoding)\n}\n\nfunction compare (a, b) {\n return Buffer.compare(a, b)\n}\n\nfunction concat (buffers, totalLength) {\n return Buffer.concat(buffers, totalLength)\n}\n\nfunction copy (source, target, targetStart, start, end) {\n return toBuffer(source).copy(target, targetStart, start, end)\n}\n\nfunction equals (a, b) {\n return toBuffer(a).equals(b)\n}\n\nfunction fill (buffer, value, offset, end, encoding) {\n return toBuffer(buffer).fill(value, offset, end, encoding)\n}\n\nfunction from (value, encodingOrOffset, length) {\n return Buffer.from(value, encodingOrOffset, length)\n}\n\nfunction includes (buffer, value, byteOffset, encoding) {\n return toBuffer(buffer).includes(value, byteOffset, encoding)\n}\n\nfunction indexOf (buffer, value, byfeOffset, encoding) {\n return toBuffer(buffer).indexOf(value, byfeOffset, encoding)\n}\n\nfunction lastIndexOf (buffer, value, byteOffset, encoding) {\n return toBuffer(buffer).lastIndexOf(value, byteOffset, encoding)\n}\n\nfunction swap16 (buffer) {\n return toBuffer(buffer).swap16()\n}\n\nfunction swap32 (buffer) {\n return toBuffer(buffer).swap32()\n}\n\nfunction swap64 (buffer) {\n return toBuffer(buffer).swap64()\n}\n\nfunction toBuffer (buffer) {\n if (Buffer.isBuffer(buffer)) return buffer\n return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n}\n\nfunction toString (buffer, encoding, start, end) {\n return toBuffer(buffer).toString(encoding, start, end)\n}\n\nfunction write (buffer, string, offset, length, encoding) {\n return toBuffer(buffer).write(string, offset, length, encoding)\n}\n\nfunction writeDoubleLE (buffer, value, offset) {\n return toBuffer(buffer).writeDoubleLE(value, offset)\n}\n\nfunction writeFloatLE (buffer, value, offset) {\n return toBuffer(buffer).writeFloatLE(value, offset)\n}\n\nfunction writeUInt32LE (buffer, value, offset) {\n return toBuffer(buffer).writeUInt32LE(value, offset)\n}\n\nfunction writeInt32LE (buffer, value, offset) {\n return toBuffer(buffer).writeInt32LE(value, offset)\n}\n\nfunction readDoubleLE (buffer, offset) {\n return toBuffer(buffer).readDoubleLE(offset)\n}\n\nfunction readFloatLE (buffer, offset) {\n return toBuffer(buffer).readFloatLE(offset)\n}\n\nfunction readUInt32LE (buffer, offset) {\n return toBuffer(buffer).readUInt32LE(offset)\n}\n\nfunction readInt32LE (buffer, offset) {\n return toBuffer(buffer).readInt32LE(offset)\n}\n\nmodule.exports = {\n isBuffer,\n isEncoding,\n alloc,\n allocUnsafe,\n allocUnsafeSlow,\n byteLength,\n compare,\n concat,\n copy,\n equals,\n fill,\n from,\n includes,\n indexOf,\n lastIndexOf,\n swap16,\n swap32,\n swap64,\n toBuffer,\n toString,\n write,\n writeDoubleLE,\n writeFloatLE,\n writeUInt32LE,\n writeInt32LE,\n readDoubleLE,\n readFloatLE,\n readUInt32LE,\n readInt32LE\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA0Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2I0YS9pbmRleC5qcz83MWJkIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGlzQnVmZmVyICh2YWx1ZSkge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbn1cblxuZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZVNsb3cgKHNpemUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3coc2l6ZSlcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUoYSwgYilcbn1cblxuZnVuY3Rpb24gY29uY2F0IChidWZmZXJzLCB0b3RhbExlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzLCB0b3RhbExlbmd0aClcbn1cblxuZnVuY3Rpb24gY29weSAoc291cmNlLCB0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0b0J1ZmZlcihzb3VyY2UpLmNvcHkodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gZXF1YWxzIChhLCBiKSB7XG4gIHJldHVybiB0b0J1ZmZlcihhKS5lcXVhbHMoYilcbn1cblxuZnVuY3Rpb24gZmlsbCAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBlbmQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmZpbGwodmFsdWUsIG9mZnNldCwgZW5kLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXMgKGJ1ZmZlciwgdmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmluY2x1ZGVzKHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gaW5kZXhPZiAoYnVmZmVyLCB2YWx1ZSwgYnlmZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuaW5kZXhPZih2YWx1ZSwgYnlmZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGxhc3RJbmRleE9mIChidWZmZXIsIHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5sYXN0SW5kZXhPZih2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIHN3YXAxNiAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXAxNigpXG59XG5cbmZ1bmN0aW9uIHN3YXAzMiAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXAzMigpXG59XG5cbmZ1bmN0aW9uIHN3YXA2NCAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXA2NCgpXG59XG5cbmZ1bmN0aW9uIHRvQnVmZmVyIChidWZmZXIpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpKSByZXR1cm4gYnVmZmVyXG4gIHJldHVybiBCdWZmZXIuZnJvbShidWZmZXIuYnVmZmVyLCBidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nIChidWZmZXIsIGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnRvU3RyaW5nKGVuY29kaW5nLCBzdGFydCwgZW5kKVxufVxuXG5mdW5jdGlvbiB3cml0ZSAoYnVmZmVyLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZShzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlRG91YmxlTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdExFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVGbG9hdExFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlSW50MzJMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkRG91YmxlTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWREb3VibGVMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdExFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkRmxvYXRMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRVSW50MzJMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZFVJbnQzMkxFKG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZEludDMyTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRJbnQzMkxFKG9mZnNldClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQnVmZmVyLFxuICBpc0VuY29kaW5nLFxuICBhbGxvYyxcbiAgYWxsb2NVbnNhZmUsXG4gIGFsbG9jVW5zYWZlU2xvdyxcbiAgYnl0ZUxlbmd0aCxcbiAgY29tcGFyZSxcbiAgY29uY2F0LFxuICBjb3B5LFxuICBlcXVhbHMsXG4gIGZpbGwsXG4gIGZyb20sXG4gIGluY2x1ZGVzLFxuICBpbmRleE9mLFxuICBsYXN0SW5kZXhPZixcbiAgc3dhcDE2LFxuICBzd2FwMzIsXG4gIHN3YXA2NCxcbiAgdG9CdWZmZXIsXG4gIHRvU3RyaW5nLFxuICB3cml0ZSxcbiAgd3JpdGVEb3VibGVMRSxcbiAgd3JpdGVGbG9hdExFLFxuICB3cml0ZVVJbnQzMkxFLFxuICB3cml0ZUludDMyTEUsXG4gIHJlYWREb3VibGVMRSxcbiAgcmVhZEZsb2F0TEUsXG4gIHJlYWRVSW50MzJMRSxcbiAgcmVhZEludDMyTEVcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7042\n")},8505:module=>{"use strict";eval("\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n if (a instanceof RegExp) a = maybeMatch(a, str);\n if (b instanceof RegExp) b = maybeMatch(b, str);\n\n var r = range(a, b, str);\n\n return r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + a.length, r[1]),\n post: str.slice(r[1] + b.length)\n };\n}\n\nfunction maybeMatch(reg, str) {\n var m = str.match(reg);\n return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n var begs, beg, left, right, result;\n var ai = str.indexOf(a);\n var bi = str.indexOf(b, ai + 1);\n var i = ai;\n\n if (ai >= 0 && bi > 0) {\n if(a===b) {\n return [ai, bi];\n }\n begs = [];\n left = str.length;\n\n while (i >= 0 && !result) {\n if (i == ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n } else if (begs.length == 1) {\n result = [ begs.pop(), bi ];\n } else {\n beg = begs.pop();\n if (beg < left) {\n left = beg;\n right = bi;\n }\n\n bi = str.indexOf(b, i + 1);\n }\n\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n\n if (begs.length) {\n result = [ left, right ];\n }\n }\n\n return result;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUwNS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9iYWxhbmNlZC1tYXRjaC9pbmRleC5qcz85MWIwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gYmFsYW5jZWQ7XG5mdW5jdGlvbiBiYWxhbmNlZChhLCBiLCBzdHIpIHtcbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIGEgPSBtYXliZU1hdGNoKGEsIHN0cik7XG4gIGlmIChiIGluc3RhbmNlb2YgUmVnRXhwKSBiID0gbWF5YmVNYXRjaChiLCBzdHIpO1xuXG4gIHZhciByID0gcmFuZ2UoYSwgYiwgc3RyKTtcblxuICByZXR1cm4gciAmJiB7XG4gICAgc3RhcnQ6IHJbMF0sXG4gICAgZW5kOiByWzFdLFxuICAgIHByZTogc3RyLnNsaWNlKDAsIHJbMF0pLFxuICAgIGJvZHk6IHN0ci5zbGljZShyWzBdICsgYS5sZW5ndGgsIHJbMV0pLFxuICAgIHBvc3Q6IHN0ci5zbGljZShyWzFdICsgYi5sZW5ndGgpXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1heWJlTWF0Y2gocmVnLCBzdHIpIHtcbiAgdmFyIG0gPSBzdHIubWF0Y2gocmVnKTtcbiAgcmV0dXJuIG0gPyBtWzBdIDogbnVsbDtcbn1cblxuYmFsYW5jZWQucmFuZ2UgPSByYW5nZTtcbmZ1bmN0aW9uIHJhbmdlKGEsIGIsIHN0cikge1xuICB2YXIgYmVncywgYmVnLCBsZWZ0LCByaWdodCwgcmVzdWx0O1xuICB2YXIgYWkgPSBzdHIuaW5kZXhPZihhKTtcbiAgdmFyIGJpID0gc3RyLmluZGV4T2YoYiwgYWkgKyAxKTtcbiAgdmFyIGkgPSBhaTtcblxuICBpZiAoYWkgPj0gMCAmJiBiaSA+IDApIHtcbiAgICBpZihhPT09Yikge1xuICAgICAgcmV0dXJuIFthaSwgYmldO1xuICAgIH1cbiAgICBiZWdzID0gW107XG4gICAgbGVmdCA9IHN0ci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA+PSAwICYmICFyZXN1bHQpIHtcbiAgICAgIGlmIChpID09IGFpKSB7XG4gICAgICAgIGJlZ3MucHVzaChpKTtcbiAgICAgICAgYWkgPSBzdHIuaW5kZXhPZihhLCBpICsgMSk7XG4gICAgICB9IGVsc2UgaWYgKGJlZ3MubGVuZ3RoID09IDEpIHtcbiAgICAgICAgcmVzdWx0ID0gWyBiZWdzLnBvcCgpLCBiaSBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVnID0gYmVncy5wb3AoKTtcbiAgICAgICAgaWYgKGJlZyA8IGxlZnQpIHtcbiAgICAgICAgICBsZWZ0ID0gYmVnO1xuICAgICAgICAgIHJpZ2h0ID0gYmk7XG4gICAgICAgIH1cblxuICAgICAgICBiaSA9IHN0ci5pbmRleE9mKGIsIGkgKyAxKTtcbiAgICAgIH1cblxuICAgICAgaSA9IGFpIDwgYmkgJiYgYWkgPj0gMCA/IGFpIDogYmk7XG4gICAgfVxuXG4gICAgaWYgKGJlZ3MubGVuZ3RoKSB7XG4gICAgICByZXN1bHQgPSBbIGxlZnQsIHJpZ2h0IF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8505\n")},80811:(module,__unused_webpack_exports,__webpack_require__)=>{eval('var register = __webpack_require__(84346);\nvar addHook = __webpack_require__(21640);\nvar removeHook = __webpack_require__(25447);\n\n// bind with array of arguments: https://stackoverflow.com/a/21792913\nvar bind = Function.bind;\nvar bindable = bind.bind(bind);\n\nfunction bindApi(hook, state, name) {\n var removeHookRef = bindable(removeHook, null).apply(\n null,\n name ? [state, name] : [state]\n );\n hook.api = { remove: removeHookRef };\n hook.remove = removeHookRef;\n ["before", "error", "after", "wrap"].forEach(function (kind) {\n var args = name ? [state, kind, name] : [state, kind];\n hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);\n });\n}\n\nfunction HookSingular() {\n var singularHookName = "h";\n var singularHookState = {\n registry: {},\n };\n var singularHook = register.bind(null, singularHookState, singularHookName);\n bindApi(singularHook, singularHookState, singularHookName);\n return singularHook;\n}\n\nfunction HookCollection() {\n var state = {\n registry: {},\n };\n\n var hook = register.bind(null, state);\n bindApi(hook, state);\n\n return hook;\n}\n\nvar collectionHookDeprecationMessageDisplayed = false;\nfunction Hook() {\n if (!collectionHookDeprecationMessageDisplayed) {\n console.warn(\n \'[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4\'\n );\n collectionHookDeprecationMessageDisplayed = true;\n }\n return HookCollection();\n}\n\nHook.Singular = HookSingular.bind();\nHook.Collection = HookCollection.bind();\n\nmodule.exports = Hook;\n// expose constructors as a named property for TypeScript\nmodule.exports.Hook = Hook;\nmodule.exports.Singular = Hook.Singular;\nmodule.exports.Collection = Hook.Collection;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODA4MTEuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQWdCO0FBQ3ZDLGNBQWMsbUJBQU8sQ0FBQyxLQUFXO0FBQ2pDLGlCQUFpQixtQkFBTyxDQUFDLEtBQWM7O0FBRXZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQix1QkFBdUI7QUFDdkIseUJBQXlCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9iZWZvcmUtYWZ0ZXItaG9vay9pbmRleC5qcz82N2NhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZWdpc3RlciA9IHJlcXVpcmUoXCIuL2xpYi9yZWdpc3RlclwiKTtcbnZhciBhZGRIb29rID0gcmVxdWlyZShcIi4vbGliL2FkZFwiKTtcbnZhciByZW1vdmVIb29rID0gcmVxdWlyZShcIi4vbGliL3JlbW92ZVwiKTtcblxuLy8gYmluZCB3aXRoIGFycmF5IG9mIGFyZ3VtZW50czogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxNzkyOTEzXG52YXIgYmluZCA9IEZ1bmN0aW9uLmJpbmQ7XG52YXIgYmluZGFibGUgPSBiaW5kLmJpbmQoYmluZCk7XG5cbmZ1bmN0aW9uIGJpbmRBcGkoaG9vaywgc3RhdGUsIG5hbWUpIHtcbiAgdmFyIHJlbW92ZUhvb2tSZWYgPSBiaW5kYWJsZShyZW1vdmVIb29rLCBudWxsKS5hcHBseShcbiAgICBudWxsLFxuICAgIG5hbWUgPyBbc3RhdGUsIG5hbWVdIDogW3N0YXRlXVxuICApO1xuICBob29rLmFwaSA9IHsgcmVtb3ZlOiByZW1vdmVIb29rUmVmIH07XG4gIGhvb2sucmVtb3ZlID0gcmVtb3ZlSG9va1JlZjtcbiAgW1wiYmVmb3JlXCIsIFwiZXJyb3JcIiwgXCJhZnRlclwiLCBcIndyYXBcIl0uZm9yRWFjaChmdW5jdGlvbiAoa2luZCkge1xuICAgIHZhciBhcmdzID0gbmFtZSA/IFtzdGF0ZSwga2luZCwgbmFtZV0gOiBbc3RhdGUsIGtpbmRdO1xuICAgIGhvb2tba2luZF0gPSBob29rLmFwaVtraW5kXSA9IGJpbmRhYmxlKGFkZEhvb2ssIG51bGwpLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gSG9va1Npbmd1bGFyKCkge1xuICB2YXIgc2luZ3VsYXJIb29rTmFtZSA9IFwiaFwiO1xuICB2YXIgc2luZ3VsYXJIb29rU3RhdGUgPSB7XG4gICAgcmVnaXN0cnk6IHt9LFxuICB9O1xuICB2YXIgc2luZ3VsYXJIb29rID0gcmVnaXN0ZXIuYmluZChudWxsLCBzaW5ndWxhckhvb2tTdGF0ZSwgc2luZ3VsYXJIb29rTmFtZSk7XG4gIGJpbmRBcGkoc2luZ3VsYXJIb29rLCBzaW5ndWxhckhvb2tTdGF0ZSwgc2luZ3VsYXJIb29rTmFtZSk7XG4gIHJldHVybiBzaW5ndWxhckhvb2s7XG59XG5cbmZ1bmN0aW9uIEhvb2tDb2xsZWN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB7XG4gICAgcmVnaXN0cnk6IHt9LFxuICB9O1xuXG4gIHZhciBob29rID0gcmVnaXN0ZXIuYmluZChudWxsLCBzdGF0ZSk7XG4gIGJpbmRBcGkoaG9vaywgc3RhdGUpO1xuXG4gIHJldHVybiBob29rO1xufVxuXG52YXIgY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIEhvb2soKSB7XG4gIGlmICghY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW2JlZm9yZS1hZnRlci1ob29rXTogXCJIb29rKClcIiByZXB1cnBvc2luZyB3YXJuaW5nLCB1c2UgXCJIb29rLkNvbGxlY3Rpb24oKVwiLiBSZWFkIG1vcmU6IGh0dHBzOi8vZ2l0LmlvL3VwZ3JhZGUtYmVmb3JlLWFmdGVyLWhvb2stdG8tMS40J1xuICAgICk7XG4gICAgY29sbGVjdGlvbkhvb2tEZXByZWNhdGlvbk1lc3NhZ2VEaXNwbGF5ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiBIb29rQ29sbGVjdGlvbigpO1xufVxuXG5Ib29rLlNpbmd1bGFyID0gSG9va1Npbmd1bGFyLmJpbmQoKTtcbkhvb2suQ29sbGVjdGlvbiA9IEhvb2tDb2xsZWN0aW9uLmJpbmQoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBIb29rO1xuLy8gZXhwb3NlIGNvbnN0cnVjdG9ycyBhcyBhIG5hbWVkIHByb3BlcnR5IGZvciBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5Ib29rID0gSG9vaztcbm1vZHVsZS5leHBvcnRzLlNpbmd1bGFyID0gSG9vay5TaW5ndWxhcjtcbm1vZHVsZS5leHBvcnRzLkNvbGxlY3Rpb24gPSBIb29rLkNvbGxlY3Rpb247XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///80811\n')},21640:module=>{eval('module.exports = addHook;\n\nfunction addHook(state, kind, name, hook) {\n var orig = hook;\n if (!state.registry[name]) {\n state.registry[name] = [];\n }\n\n if (kind === "before") {\n hook = function (method, options) {\n return Promise.resolve()\n .then(orig.bind(null, options))\n .then(method.bind(null, options));\n };\n }\n\n if (kind === "after") {\n hook = function (method, options) {\n var result;\n return Promise.resolve()\n .then(method.bind(null, options))\n .then(function (result_) {\n result = result_;\n return orig(result, options);\n })\n .then(function () {\n return result;\n });\n };\n }\n\n if (kind === "error") {\n hook = function (method, options) {\n return Promise.resolve()\n .then(method.bind(null, options))\n .catch(function (error) {\n return orig(error, options);\n });\n };\n }\n\n state.registry[name].push({\n hook: hook,\n orig: orig,\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE2NDAuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2JlZm9yZS1hZnRlci1ob29rL2xpYi9hZGQuanM/MTE0YSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGFkZEhvb2s7XG5cbmZ1bmN0aW9uIGFkZEhvb2soc3RhdGUsIGtpbmQsIG5hbWUsIGhvb2spIHtcbiAgdmFyIG9yaWcgPSBob29rO1xuICBpZiAoIXN0YXRlLnJlZ2lzdHJ5W25hbWVdKSB7XG4gICAgc3RhdGUucmVnaXN0cnlbbmFtZV0gPSBbXTtcbiAgfVxuXG4gIGlmIChraW5kID09PSBcImJlZm9yZVwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbihvcmlnLmJpbmQobnVsbCwgb3B0aW9ucykpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKGtpbmQgPT09IFwiYWZ0ZXJcIikge1xuICAgIGhvb2sgPSBmdW5jdGlvbiAobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0Xykge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdF87XG4gICAgICAgICAgcmV0dXJuIG9yaWcocmVzdWx0LCBvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBpZiAoa2luZCA9PT0gXCJlcnJvclwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbihtZXRob2QuYmluZChudWxsLCBvcHRpb25zKSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBvcmlnKGVycm9yLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRlLnJlZ2lzdHJ5W25hbWVdLnB1c2goe1xuICAgIGhvb2s6IGhvb2ssXG4gICAgb3JpZzogb3JpZyxcbiAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///21640\n')},84346:module=>{eval('module.exports = register;\n\nfunction register(state, name, method, options) {\n if (typeof method !== "function") {\n throw new Error("method for before hook must be a function");\n }\n\n if (!options) {\n options = {};\n }\n\n if (Array.isArray(name)) {\n return name.reverse().reduce(function (callback, name) {\n return register.bind(null, state, name, callback, options);\n }, method)();\n }\n\n return Promise.resolve().then(function () {\n if (!state.registry[name]) {\n return method(options);\n }\n\n return state.registry[name].reduce(function (method, registered) {\n return registered.hook.bind(null, method, options);\n }, method)();\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQzNDYuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvYmVmb3JlLWFmdGVyLWhvb2svbGliL3JlZ2lzdGVyLmpzP2U2ZTEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuZnVuY3Rpb24gcmVnaXN0ZXIoc3RhdGUsIG5hbWUsIG1ldGhvZCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibWV0aG9kIGZvciBiZWZvcmUgaG9vayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgIHJldHVybiBuYW1lLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGNhbGxiYWNrLCBuYW1lKSB7XG4gICAgICByZXR1cm4gcmVnaXN0ZXIuYmluZChudWxsLCBzdGF0ZSwgbmFtZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgIH0sIG1ldGhvZCkoKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0YXRlLnJlZ2lzdHJ5W25hbWVdKSB7XG4gICAgICByZXR1cm4gbWV0aG9kKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZS5yZWdpc3RyeVtuYW1lXS5yZWR1Y2UoZnVuY3Rpb24gKG1ldGhvZCwgcmVnaXN0ZXJlZCkge1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyZWQuaG9vay5iaW5kKG51bGwsIG1ldGhvZCwgb3B0aW9ucyk7XG4gICAgfSwgbWV0aG9kKSgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///84346\n')},25447:module=>{eval("module.exports = removeHook;\n\nfunction removeHook(state, name, method) {\n if (!state.registry[name]) {\n return;\n }\n\n var index = state.registry[name]\n .map(function (registered) {\n return registered.orig;\n })\n .indexOf(method);\n\n if (index === -1) {\n return;\n }\n\n state.registry[name].splice(index, 1);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU0NDcuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9iZWZvcmUtYWZ0ZXItaG9vay9saWIvcmVtb3ZlLmpzPzQ3ZWQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZW1vdmVIb29rO1xuXG5mdW5jdGlvbiByZW1vdmVIb29rKHN0YXRlLCBuYW1lLCBtZXRob2QpIHtcbiAgaWYgKCFzdGF0ZS5yZWdpc3RyeVtuYW1lXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBpbmRleCA9IHN0YXRlLnJlZ2lzdHJ5W25hbWVdXG4gICAgLm1hcChmdW5jdGlvbiAocmVnaXN0ZXJlZCkge1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyZWQub3JpZztcbiAgICB9KVxuICAgIC5pbmRleE9mKG1ldGhvZCk7XG5cbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLnJlZ2lzdHJ5W25hbWVdLnNwbGljZShpbmRleCwgMSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///25447\n")},24511:(module,exports,__webpack_require__)=>{eval("var Chainsaw = __webpack_require__(54787);\nvar EventEmitter = (__webpack_require__(24434).EventEmitter);\nvar Buffers = __webpack_require__(86512);\nvar Vars = __webpack_require__(94644);\nvar Stream = (__webpack_require__(2203).Stream);\n\nexports = module.exports = function (bufOrEm, eventName) {\n if (Buffer.isBuffer(bufOrEm)) {\n return exports.parse(bufOrEm);\n }\n \n var s = exports.stream();\n if (bufOrEm && bufOrEm.pipe) {\n bufOrEm.pipe(s);\n }\n else if (bufOrEm) {\n bufOrEm.on(eventName || 'data', function (buf) {\n s.write(buf);\n });\n \n bufOrEm.on('end', function () {\n s.end();\n });\n }\n return s;\n};\n\nexports.stream = function (input) {\n if (input) return exports.apply(null, arguments);\n \n var pending = null;\n function getBytes (bytes, cb, skip) {\n pending = {\n bytes : bytes,\n skip : skip,\n cb : function (buf) {\n pending = null;\n cb(buf);\n },\n };\n dispatch();\n }\n \n var offset = null;\n function dispatch () {\n if (!pending) {\n if (caughtEnd) done = true;\n return;\n }\n if (typeof pending === 'function') {\n pending();\n }\n else {\n var bytes = offset + pending.bytes;\n \n if (buffers.length >= bytes) {\n var buf;\n if (offset == null) {\n buf = buffers.splice(0, bytes);\n if (!pending.skip) {\n buf = buf.slice();\n }\n }\n else {\n if (!pending.skip) {\n buf = buffers.slice(offset, bytes);\n }\n offset = bytes;\n }\n \n if (pending.skip) {\n pending.cb();\n }\n else {\n pending.cb(buf);\n }\n }\n }\n }\n \n function builder (saw) {\n function next () { if (!done) saw.next() }\n \n var self = words(function (bytes, cb) {\n return function (name) {\n getBytes(bytes, function (buf) {\n vars.set(name, cb(buf));\n next();\n });\n };\n });\n \n self.tap = function (cb) {\n saw.nest(cb, vars.store);\n };\n \n self.into = function (key, cb) {\n if (!vars.get(key)) vars.set(key, {});\n var parent = vars;\n vars = Vars(parent.get(key));\n \n saw.nest(function () {\n cb.apply(this, arguments);\n this.tap(function () {\n vars = parent;\n });\n }, vars.store);\n };\n \n self.flush = function () {\n vars.store = {};\n next();\n };\n \n self.loop = function (cb) {\n var end = false;\n \n saw.nest(false, function loop () {\n this.vars = vars.store;\n cb.call(this, function () {\n end = true;\n next();\n }, vars.store);\n this.tap(function () {\n if (end) saw.next()\n else loop.call(this)\n }.bind(this));\n }, vars.store);\n };\n \n self.buffer = function (name, bytes) {\n if (typeof bytes === 'string') {\n bytes = vars.get(bytes);\n }\n \n getBytes(bytes, function (buf) {\n vars.set(name, buf);\n next();\n });\n };\n \n self.skip = function (bytes) {\n if (typeof bytes === 'string') {\n bytes = vars.get(bytes);\n }\n \n getBytes(bytes, function () {\n next();\n });\n };\n \n self.scan = function find (name, search) {\n if (typeof search === 'string') {\n search = new Buffer(search);\n }\n else if (!Buffer.isBuffer(search)) {\n throw new Error('search must be a Buffer or a string');\n }\n \n var taken = 0;\n pending = function () {\n var pos = buffers.indexOf(search, offset + taken);\n var i = pos-offset-taken;\n if (pos !== -1) {\n pending = null;\n if (offset != null) {\n vars.set(\n name,\n buffers.slice(offset, offset + taken + i)\n );\n offset += taken + i + search.length;\n }\n else {\n vars.set(\n name,\n buffers.slice(0, taken + i)\n );\n buffers.splice(0, taken + i + search.length);\n }\n next();\n dispatch();\n } else {\n i = Math.max(buffers.length - search.length - offset - taken, 0);\n\t\t\t\t}\n taken += i;\n };\n dispatch();\n };\n \n self.peek = function (cb) {\n offset = 0;\n saw.nest(function () {\n cb.call(this, vars.store);\n this.tap(function () {\n offset = null;\n });\n });\n };\n \n return self;\n };\n \n var stream = Chainsaw.light(builder);\n stream.writable = true;\n \n var buffers = Buffers();\n \n stream.write = function (buf) {\n buffers.push(buf);\n dispatch();\n };\n \n var vars = Vars();\n \n var done = false, caughtEnd = false;\n stream.end = function () {\n caughtEnd = true;\n };\n \n stream.pipe = Stream.prototype.pipe;\n Object.getOwnPropertyNames(EventEmitter.prototype).forEach(function (name) {\n stream[name] = EventEmitter.prototype[name];\n });\n \n return stream;\n};\n\nexports.parse = function parse (buffer) {\n var self = words(function (bytes, cb) {\n return function (name) {\n if (offset + bytes <= buffer.length) {\n var buf = buffer.slice(offset, offset + bytes);\n offset += bytes;\n vars.set(name, cb(buf));\n }\n else {\n vars.set(name, null);\n }\n return self;\n };\n });\n \n var offset = 0;\n var vars = Vars();\n self.vars = vars.store;\n \n self.tap = function (cb) {\n cb.call(self, vars.store);\n return self;\n };\n \n self.into = function (key, cb) {\n if (!vars.get(key)) {\n vars.set(key, {});\n }\n var parent = vars;\n vars = Vars(parent.get(key));\n cb.call(self, vars.store);\n vars = parent;\n return self;\n };\n \n self.loop = function (cb) {\n var end = false;\n var ender = function () { end = true };\n while (end === false) {\n cb.call(self, ender, vars.store);\n }\n return self;\n };\n \n self.buffer = function (name, size) {\n if (typeof size === 'string') {\n size = vars.get(size);\n }\n var buf = buffer.slice(offset, Math.min(buffer.length, offset + size));\n offset += size;\n vars.set(name, buf);\n \n return self;\n };\n \n self.skip = function (bytes) {\n if (typeof bytes === 'string') {\n bytes = vars.get(bytes);\n }\n offset += bytes;\n \n return self;\n };\n \n self.scan = function (name, search) {\n if (typeof search === 'string') {\n search = new Buffer(search);\n }\n else if (!Buffer.isBuffer(search)) {\n throw new Error('search must be a Buffer or a string');\n }\n vars.set(name, null);\n \n // simple but slow string search\n for (var i = 0; i + offset <= buffer.length - search.length + 1; i++) {\n for (\n var j = 0;\n j < search.length && buffer[offset+i+j] === search[j];\n j++\n );\n if (j === search.length) break;\n }\n \n vars.set(name, buffer.slice(offset, offset + i));\n offset += i + search.length;\n return self;\n };\n \n self.peek = function (cb) {\n var was = offset;\n cb.call(self, vars.store);\n offset = was;\n return self;\n };\n \n self.flush = function () {\n vars.store = {};\n return self;\n };\n \n self.eof = function () {\n return offset >= buffer.length;\n };\n \n return self;\n};\n\n// convert byte strings to unsigned little endian numbers\nfunction decodeLEu (bytes) {\n var acc = 0;\n for (var i = 0; i < bytes.length; i++) {\n acc += Math.pow(256,i) * bytes[i];\n }\n return acc;\n}\n\n// convert byte strings to unsigned big endian numbers\nfunction decodeBEu (bytes) {\n var acc = 0;\n for (var i = 0; i < bytes.length; i++) {\n acc += Math.pow(256, bytes.length - i - 1) * bytes[i];\n }\n return acc;\n}\n\n// convert byte strings to signed big endian numbers\nfunction decodeBEs (bytes) {\n var val = decodeBEu(bytes);\n if ((bytes[0] & 0x80) == 0x80) {\n val -= Math.pow(256, bytes.length);\n }\n return val;\n}\n\n// convert byte strings to signed little endian numbers\nfunction decodeLEs (bytes) {\n var val = decodeLEu(bytes);\n if ((bytes[bytes.length - 1] & 0x80) == 0x80) {\n val -= Math.pow(256, bytes.length);\n }\n return val;\n}\n\nfunction words (decode) {\n var self = {};\n \n [ 1, 2, 4, 8 ].forEach(function (bytes) {\n var bits = bytes * 8;\n \n self['word' + bits + 'le']\n = self['word' + bits + 'lu']\n = decode(bytes, decodeLEu);\n \n self['word' + bits + 'ls']\n = decode(bytes, decodeLEs);\n \n self['word' + bits + 'be']\n = self['word' + bits + 'bu']\n = decode(bytes, decodeBEu);\n \n self['word' + bits + 'bs']\n = decode(bytes, decodeBEs);\n });\n \n // word8be(n) == word8le(n) for all n\n self.word8 = self.word8u = self.word8be;\n self.word8s = self.word8bs;\n \n return self;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ1MTEuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQVU7QUFDakMsbUJBQW1CLHlDQUE4QjtBQUNqRCxjQUFjLG1CQUFPLENBQUMsS0FBUztBQUMvQixXQUFXLG1CQUFPLENBQUMsS0FBZTtBQUNsQyxhQUFhLGtDQUF3Qjs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUEsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpREFBaUQ7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvYmluYXJ5L2luZGV4LmpzP2Y1MTQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIENoYWluc2F3ID0gcmVxdWlyZSgnY2hhaW5zYXcnKTtcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgQnVmZmVycyA9IHJlcXVpcmUoJ2J1ZmZlcnMnKTtcbnZhciBWYXJzID0gcmVxdWlyZSgnLi9saWIvdmFycy5qcycpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJ1Zk9yRW0sIGV2ZW50TmFtZSkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmT3JFbSkpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMucGFyc2UoYnVmT3JFbSk7XG4gICAgfVxuICAgIFxuICAgIHZhciBzID0gZXhwb3J0cy5zdHJlYW0oKTtcbiAgICBpZiAoYnVmT3JFbSAmJiBidWZPckVtLnBpcGUpIHtcbiAgICAgICAgYnVmT3JFbS5waXBlKHMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChidWZPckVtKSB7XG4gICAgICAgIGJ1Zk9yRW0ub24oZXZlbnROYW1lIHx8ICdkYXRhJywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgcy53cml0ZShidWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGJ1Zk9yRW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHMuZW5kKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn07XG5cbmV4cG9ydHMuc3RyZWFtID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgaWYgKGlucHV0KSByZXR1cm4gZXhwb3J0cy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIFxuICAgIHZhciBwZW5kaW5nID0gbnVsbDtcbiAgICBmdW5jdGlvbiBnZXRCeXRlcyAoYnl0ZXMsIGNiLCBza2lwKSB7XG4gICAgICAgIHBlbmRpbmcgPSB7XG4gICAgICAgICAgICBieXRlcyA6IGJ5dGVzLFxuICAgICAgICAgICAgc2tpcCA6IHNraXAsXG4gICAgICAgICAgICBjYiA6IGZ1bmN0aW9uIChidWYpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBjYihidWYpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgZGlzcGF0Y2goKTtcbiAgICB9XG4gICAgXG4gICAgdmFyIG9mZnNldCA9IG51bGw7XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2ggKCkge1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmIChjYXVnaHRFbmQpIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVuZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcGVuZGluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGJ5dGVzID0gb2Zmc2V0ICsgcGVuZGluZy5ieXRlcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID49IGJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZjtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmZmVycy5zcGxpY2UoMCwgYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmcuc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZy5za2lwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBidWZmZXJzLnNsaWNlKG9mZnNldCwgYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGJ5dGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5za2lwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuY2IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuY2IoYnVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgZnVuY3Rpb24gYnVpbGRlciAoc2F3KSB7XG4gICAgICAgIGZ1bmN0aW9uIG5leHQgKCkgeyBpZiAoIWRvbmUpIHNhdy5uZXh0KCkgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHNlbGYgPSB3b3JkcyhmdW5jdGlvbiAoYnl0ZXMsIGNiKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBnZXRCeXRlcyhieXRlcywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgICAgICAgICB2YXJzLnNldChuYW1lLCBjYihidWYpKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBzZWxmLnRhcCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgc2F3Lm5lc3QoY2IsIHZhcnMuc3RvcmUpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2VsZi5pbnRvID0gZnVuY3Rpb24gKGtleSwgY2IpIHtcbiAgICAgICAgICAgIGlmICghdmFycy5nZXQoa2V5KSkgdmFycy5zZXQoa2V5LCB7fSk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gdmFycztcbiAgICAgICAgICAgIHZhcnMgPSBWYXJzKHBhcmVudC5nZXQoa2V5KSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHNhdy5uZXN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFycyA9IHBhcmVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIHZhcnMuc3RvcmUpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2VsZi5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhcnMuc3RvcmUgPSB7fTtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYubG9vcCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgdmFyIGVuZCA9IGZhbHNlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBzYXcubmVzdChmYWxzZSwgZnVuY3Rpb24gbG9vcCAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YXJzID0gdmFycy5zdG9yZTtcbiAgICAgICAgICAgICAgICBjYi5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH0sIHZhcnMuc3RvcmUpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCkgc2F3Lm5leHQoKVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGxvb3AuY2FsbCh0aGlzKVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB9LCB2YXJzLnN0b3JlKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYuYnVmZmVyID0gZnVuY3Rpb24gKG5hbWUsIGJ5dGVzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJ5dGVzID0gdmFycy5nZXQoYnl0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBnZXRCeXRlcyhieXRlcywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgICAgIHZhcnMuc2V0KG5hbWUsIGJ1Zik7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzZWxmLnNraXAgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYnl0ZXMgPSB2YXJzLmdldChieXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGdldEJ5dGVzKGJ5dGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzZWxmLnNjYW4gPSBmdW5jdGlvbiBmaW5kIChuYW1lLCBzZWFyY2gpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHNlYXJjaCA9IG5ldyBCdWZmZXIoc2VhcmNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2VhcmNoIG11c3QgYmUgYSBCdWZmZXIgb3IgYSBzdHJpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRha2VuID0gMDtcbiAgICAgICAgICAgIHBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IGJ1ZmZlcnMuaW5kZXhPZihzZWFyY2gsIG9mZnNldCArIHRha2VuKTtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHBvcy1vZmZzZXQtdGFrZW47XG4gICAgICAgICAgICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFycy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdGFrZW4gKyBpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB0YWtlbiArIGkgKyBzZWFyY2gubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFycy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNsaWNlKDAsIHRha2VuICsgaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNwbGljZSgwLCB0YWtlbiArIGkgKyBzZWFyY2gubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IE1hdGgubWF4KGJ1ZmZlcnMubGVuZ3RoIC0gc2VhcmNoLmxlbmd0aCAtIG9mZnNldCAtIHRha2VuLCAwKTtcblx0XHRcdFx0fVxuICAgICAgICAgICAgICAgIHRha2VuICs9IGk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGlzcGF0Y2goKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYucGVlayA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIHNhdy5uZXN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjYi5jYWxsKHRoaXMsIHZhcnMuc3RvcmUpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICB2YXIgc3RyZWFtID0gQ2hhaW5zYXcubGlnaHQoYnVpbGRlcik7XG4gICAgc3RyZWFtLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBcbiAgICB2YXIgYnVmZmVycyA9IEJ1ZmZlcnMoKTtcbiAgICBcbiAgICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gICAgICAgIGJ1ZmZlcnMucHVzaChidWYpO1xuICAgICAgICBkaXNwYXRjaCgpO1xuICAgIH07XG4gICAgXG4gICAgdmFyIHZhcnMgPSBWYXJzKCk7XG4gICAgXG4gICAgdmFyIGRvbmUgPSBmYWxzZSwgY2F1Z2h0RW5kID0gZmFsc2U7XG4gICAgc3RyZWFtLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2F1Z2h0RW5kID0gdHJ1ZTtcbiAgICB9O1xuICAgIFxuICAgIHN0cmVhbS5waXBlID0gU3RyZWFtLnByb3RvdHlwZS5waXBlO1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEV2ZW50RW1pdHRlci5wcm90b3R5cGUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgc3RyZWFtW25hbWVdID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZVtuYW1lXTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gc3RyZWFtO1xufTtcblxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlIChidWZmZXIpIHtcbiAgICB2YXIgc2VsZiA9IHdvcmRzKGZ1bmN0aW9uIChieXRlcywgY2IpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICsgYnl0ZXMgPD0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBidWYgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlcyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzO1xuICAgICAgICAgICAgICAgIHZhcnMuc2V0KG5hbWUsIGNiKGJ1ZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFycy5zZXQobmFtZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgdmFycyA9IFZhcnMoKTtcbiAgICBzZWxmLnZhcnMgPSB2YXJzLnN0b3JlO1xuICAgIFxuICAgIHNlbGYudGFwID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIGNiLmNhbGwoc2VsZiwgdmFycy5zdG9yZSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5pbnRvID0gZnVuY3Rpb24gKGtleSwgY2IpIHtcbiAgICAgICAgaWYgKCF2YXJzLmdldChrZXkpKSB7XG4gICAgICAgICAgICB2YXJzLnNldChrZXksIHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50ID0gdmFycztcbiAgICAgICAgdmFycyA9IFZhcnMocGFyZW50LmdldChrZXkpKTtcbiAgICAgICAgY2IuY2FsbChzZWxmLCB2YXJzLnN0b3JlKTtcbiAgICAgICAgdmFycyA9IHBhcmVudDtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLmxvb3AgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIGVuZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZW5kZXIgPSBmdW5jdGlvbiAoKSB7IGVuZCA9IHRydWUgfTtcbiAgICAgICAgd2hpbGUgKGVuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNiLmNhbGwoc2VsZiwgZW5kZXIsIHZhcnMuc3RvcmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5idWZmZXIgPSBmdW5jdGlvbiAobmFtZSwgc2l6ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzaXplID0gdmFycy5nZXQoc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZiA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIE1hdGgubWluKGJ1ZmZlci5sZW5ndGgsIG9mZnNldCArIHNpemUpKTtcbiAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIHZhcnMuc2V0KG5hbWUsIGJ1Zik7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIFxuICAgIHNlbGYuc2tpcCA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgICAgICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnl0ZXMgPSB2YXJzLmdldChieXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLnNjYW4gPSBmdW5jdGlvbiAobmFtZSwgc2VhcmNoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc2VhcmNoID0gbmV3IEJ1ZmZlcihzZWFyY2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWFyY2ggbXVzdCBiZSBhIEJ1ZmZlciBvciBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHZhcnMuc2V0KG5hbWUsIG51bGwpO1xuICAgICAgICBcbiAgICAgICAgLy8gc2ltcGxlIGJ1dCBzbG93IHN0cmluZyBzZWFyY2hcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyBvZmZzZXQgPD0gYnVmZmVyLmxlbmd0aCAtIHNlYXJjaC5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgdmFyIGogPSAwO1xuICAgICAgICAgICAgICAgIGogPCBzZWFyY2gubGVuZ3RoICYmIGJ1ZmZlcltvZmZzZXQraStqXSA9PT0gc2VhcmNoW2pdO1xuICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChqID09PSBzZWFyY2gubGVuZ3RoKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFycy5zZXQobmFtZSwgYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgaSkpO1xuICAgICAgICBvZmZzZXQgKz0gaSArIHNlYXJjaC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5wZWVrID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHZhciB3YXMgPSBvZmZzZXQ7XG4gICAgICAgIGNiLmNhbGwoc2VsZiwgdmFycy5zdG9yZSk7XG4gICAgICAgIG9mZnNldCA9IHdhcztcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXJzLnN0b3JlID0ge307XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5lb2YgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPj0gYnVmZmVyLmxlbmd0aDtcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBzZWxmO1xufTtcblxuLy8gY29udmVydCBieXRlIHN0cmluZ3MgdG8gdW5zaWduZWQgbGl0dGxlIGVuZGlhbiBudW1iZXJzXG5mdW5jdGlvbiBkZWNvZGVMRXUgKGJ5dGVzKSB7XG4gICAgdmFyIGFjYyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY2MgKz0gTWF0aC5wb3coMjU2LGkpICogYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG59XG5cbi8vIGNvbnZlcnQgYnl0ZSBzdHJpbmdzIHRvIHVuc2lnbmVkIGJpZyBlbmRpYW4gbnVtYmVyc1xuZnVuY3Rpb24gZGVjb2RlQkV1IChieXRlcykge1xuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWNjICs9IE1hdGgucG93KDI1NiwgYnl0ZXMubGVuZ3RoIC0gaSAtIDEpICogYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG59XG5cbi8vIGNvbnZlcnQgYnl0ZSBzdHJpbmdzIHRvIHNpZ25lZCBiaWcgZW5kaWFuIG51bWJlcnNcbmZ1bmN0aW9uIGRlY29kZUJFcyAoYnl0ZXMpIHtcbiAgICB2YXIgdmFsID0gZGVjb2RlQkV1KGJ5dGVzKTtcbiAgICBpZiAoKGJ5dGVzWzBdICYgMHg4MCkgPT0gMHg4MCkge1xuICAgICAgICB2YWwgLT0gTWF0aC5wb3coMjU2LCBieXRlcy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufVxuXG4vLyBjb252ZXJ0IGJ5dGUgc3RyaW5ncyB0byBzaWduZWQgbGl0dGxlIGVuZGlhbiBudW1iZXJzXG5mdW5jdGlvbiBkZWNvZGVMRXMgKGJ5dGVzKSB7XG4gICAgdmFyIHZhbCA9IGRlY29kZUxFdShieXRlcyk7XG4gICAgaWYgKChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAmIDB4ODApID09IDB4ODApIHtcbiAgICAgICAgdmFsIC09IE1hdGgucG93KDI1NiwgYnl0ZXMubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gd29yZHMgKGRlY29kZSkge1xuICAgIHZhciBzZWxmID0ge307XG4gICAgXG4gICAgWyAxLCAyLCA0LCA4IF0uZm9yRWFjaChmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIGJpdHMgPSBieXRlcyAqIDg7XG4gICAgICAgIFxuICAgICAgICBzZWxmWyd3b3JkJyArIGJpdHMgKyAnbGUnXVxuICAgICAgICA9IHNlbGZbJ3dvcmQnICsgYml0cyArICdsdSddXG4gICAgICAgID0gZGVjb2RlKGJ5dGVzLCBkZWNvZGVMRXUpO1xuICAgICAgICBcbiAgICAgICAgc2VsZlsnd29yZCcgKyBiaXRzICsgJ2xzJ11cbiAgICAgICAgPSBkZWNvZGUoYnl0ZXMsIGRlY29kZUxFcyk7XG4gICAgICAgIFxuICAgICAgICBzZWxmWyd3b3JkJyArIGJpdHMgKyAnYmUnXVxuICAgICAgICA9IHNlbGZbJ3dvcmQnICsgYml0cyArICdidSddXG4gICAgICAgID0gZGVjb2RlKGJ5dGVzLCBkZWNvZGVCRXUpO1xuICAgICAgICBcbiAgICAgICAgc2VsZlsnd29yZCcgKyBiaXRzICsgJ2JzJ11cbiAgICAgICAgPSBkZWNvZGUoYnl0ZXMsIGRlY29kZUJFcyk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gd29yZDhiZShuKSA9PSB3b3JkOGxlKG4pIGZvciBhbGwgblxuICAgIHNlbGYud29yZDggPSBzZWxmLndvcmQ4dSA9IHNlbGYud29yZDhiZTtcbiAgICBzZWxmLndvcmQ4cyA9IHNlbGYud29yZDhicztcbiAgICBcbiAgICByZXR1cm4gc2VsZjtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///24511\n")},94644:module=>{eval("module.exports = function (store) {\n function getset (name, value) {\n var node = vars.store;\n var keys = name.split('.');\n keys.slice(0,-1).forEach(function (k) {\n if (node[k] === undefined) node[k] = {};\n node = node[k]\n });\n var key = keys[keys.length - 1];\n if (arguments.length == 1) {\n return node[key];\n }\n else {\n return node[key] = value;\n }\n }\n \n var vars = {\n get : function (name) {\n return getset(name);\n },\n set : function (name, value) {\n return getset(name, value);\n },\n store : store || {},\n };\n return vars;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQ2NDQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvYmluYXJ5L2xpYi92YXJzLmpzP2ExNzgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICBmdW5jdGlvbiBnZXRzZXQgKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHZhciBub2RlID0gdmFycy5zdG9yZTtcbiAgICAgICAgdmFyIGtleXMgPSBuYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgIGtleXMuc2xpY2UoMCwtMSkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgaWYgKG5vZGVba10gPT09IHVuZGVmaW5lZCkgbm9kZVtrXSA9IHt9O1xuICAgICAgICAgICAgbm9kZSA9IG5vZGVba11cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZVtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdmFyIHZhcnMgPSB7XG4gICAgICAgIGdldCA6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0c2V0KG5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRzZXQobmFtZSwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBzdG9yZSA6IHN0b3JlIHx8IHt9LFxuICAgIH07XG4gICAgcmV0dXJuIHZhcnM7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///94644\n")},68454:function(module){eval('/**\n * This file contains the Bottleneck library (MIT), compiled to ES2017, and without Clustering support.\n * https://github.com/SGrondin/bottleneck\n */\n(function (global, factory) {\n\t true ? module.exports = factory() :\n\t0;\n}(this, (function () { \'use strict\';\n\n\tvar commonjsGlobal = typeof globalThis !== \'undefined\' ? globalThis : typeof window !== \'undefined\' ? window : typeof global !== \'undefined\' ? global : typeof self !== \'undefined\' ? self : {};\n\n\tfunction getCjsExportFromNamespace (n) {\n\t\treturn n && n[\'default\'] || n;\n\t}\n\n\tvar load = function(received, defaults, onto = {}) {\n\t var k, ref, v;\n\t for (k in defaults) {\n\t v = defaults[k];\n\t onto[k] = (ref = received[k]) != null ? ref : v;\n\t }\n\t return onto;\n\t};\n\n\tvar overwrite = function(received, defaults, onto = {}) {\n\t var k, v;\n\t for (k in received) {\n\t v = received[k];\n\t if (defaults[k] !== void 0) {\n\t onto[k] = v;\n\t }\n\t }\n\t return onto;\n\t};\n\n\tvar parser = {\n\t\tload: load,\n\t\toverwrite: overwrite\n\t};\n\n\tvar DLList;\n\n\tDLList = class DLList {\n\t constructor(incr, decr) {\n\t this.incr = incr;\n\t this.decr = decr;\n\t this._first = null;\n\t this._last = null;\n\t this.length = 0;\n\t }\n\n\t push(value) {\n\t var node;\n\t this.length++;\n\t if (typeof this.incr === "function") {\n\t this.incr();\n\t }\n\t node = {\n\t value,\n\t prev: this._last,\n\t next: null\n\t };\n\t if (this._last != null) {\n\t this._last.next = node;\n\t this._last = node;\n\t } else {\n\t this._first = this._last = node;\n\t }\n\t return void 0;\n\t }\n\n\t shift() {\n\t var value;\n\t if (this._first == null) {\n\t return;\n\t } else {\n\t this.length--;\n\t if (typeof this.decr === "function") {\n\t this.decr();\n\t }\n\t }\n\t value = this._first.value;\n\t if ((this._first = this._first.next) != null) {\n\t this._first.prev = null;\n\t } else {\n\t this._last = null;\n\t }\n\t return value;\n\t }\n\n\t first() {\n\t if (this._first != null) {\n\t return this._first.value;\n\t }\n\t }\n\n\t getArray() {\n\t var node, ref, results;\n\t node = this._first;\n\t results = [];\n\t while (node != null) {\n\t results.push((ref = node, node = node.next, ref.value));\n\t }\n\t return results;\n\t }\n\n\t forEachShift(cb) {\n\t var node;\n\t node = this.shift();\n\t while (node != null) {\n\t (cb(node), node = this.shift());\n\t }\n\t return void 0;\n\t }\n\n\t debug() {\n\t var node, ref, ref1, ref2, results;\n\t node = this._first;\n\t results = [];\n\t while (node != null) {\n\t results.push((ref = node, node = node.next, {\n\t value: ref.value,\n\t prev: (ref1 = ref.prev) != null ? ref1.value : void 0,\n\t next: (ref2 = ref.next) != null ? ref2.value : void 0\n\t }));\n\t }\n\t return results;\n\t }\n\n\t};\n\n\tvar DLList_1 = DLList;\n\n\tvar Events;\n\n\tEvents = class Events {\n\t constructor(instance) {\n\t this.instance = instance;\n\t this._events = {};\n\t if ((this.instance.on != null) || (this.instance.once != null) || (this.instance.removeAllListeners != null)) {\n\t throw new Error("An Emitter already exists for this object");\n\t }\n\t this.instance.on = (name, cb) => {\n\t return this._addListener(name, "many", cb);\n\t };\n\t this.instance.once = (name, cb) => {\n\t return this._addListener(name, "once", cb);\n\t };\n\t this.instance.removeAllListeners = (name = null) => {\n\t if (name != null) {\n\t return delete this._events[name];\n\t } else {\n\t return this._events = {};\n\t }\n\t };\n\t }\n\n\t _addListener(name, status, cb) {\n\t var base;\n\t if ((base = this._events)[name] == null) {\n\t base[name] = [];\n\t }\n\t this._events[name].push({cb, status});\n\t return this.instance;\n\t }\n\n\t listenerCount(name) {\n\t if (this._events[name] != null) {\n\t return this._events[name].length;\n\t } else {\n\t return 0;\n\t }\n\t }\n\n\t async trigger(name, ...args) {\n\t var e, promises;\n\t try {\n\t if (name !== "debug") {\n\t this.trigger("debug", `Event triggered: ${name}`, args);\n\t }\n\t if (this._events[name] == null) {\n\t return;\n\t }\n\t this._events[name] = this._events[name].filter(function(listener) {\n\t return listener.status !== "none";\n\t });\n\t promises = this._events[name].map(async(listener) => {\n\t var e, returned;\n\t if (listener.status === "none") {\n\t return;\n\t }\n\t if (listener.status === "once") {\n\t listener.status = "none";\n\t }\n\t try {\n\t returned = typeof listener.cb === "function" ? listener.cb(...args) : void 0;\n\t if (typeof (returned != null ? returned.then : void 0) === "function") {\n\t return (await returned);\n\t } else {\n\t return returned;\n\t }\n\t } catch (error) {\n\t e = error;\n\t {\n\t this.trigger("error", e);\n\t }\n\t return null;\n\t }\n\t });\n\t return ((await Promise.all(promises))).find(function(x) {\n\t return x != null;\n\t });\n\t } catch (error) {\n\t e = error;\n\t {\n\t this.trigger("error", e);\n\t }\n\t return null;\n\t }\n\t }\n\n\t};\n\n\tvar Events_1 = Events;\n\n\tvar DLList$1, Events$1, Queues;\n\n\tDLList$1 = DLList_1;\n\n\tEvents$1 = Events_1;\n\n\tQueues = class Queues {\n\t constructor(num_priorities) {\n\t var i;\n\t this.Events = new Events$1(this);\n\t this._length = 0;\n\t this._lists = (function() {\n\t var j, ref, results;\n\t results = [];\n\t for (i = j = 1, ref = num_priorities; (1 <= ref ? j <= ref : j >= ref); i = 1 <= ref ? ++j : --j) {\n\t results.push(new DLList$1((() => {\n\t return this.incr();\n\t }), (() => {\n\t return this.decr();\n\t })));\n\t }\n\t return results;\n\t }).call(this);\n\t }\n\n\t incr() {\n\t if (this._length++ === 0) {\n\t return this.Events.trigger("leftzero");\n\t }\n\t }\n\n\t decr() {\n\t if (--this._length === 0) {\n\t return this.Events.trigger("zero");\n\t }\n\t }\n\n\t push(job) {\n\t return this._lists[job.options.priority].push(job);\n\t }\n\n\t queued(priority) {\n\t if (priority != null) {\n\t return this._lists[priority].length;\n\t } else {\n\t return this._length;\n\t }\n\t }\n\n\t shiftAll(fn) {\n\t return this._lists.forEach(function(list) {\n\t return list.forEachShift(fn);\n\t });\n\t }\n\n\t getFirst(arr = this._lists) {\n\t var j, len, list;\n\t for (j = 0, len = arr.length; j < len; j++) {\n\t list = arr[j];\n\t if (list.length > 0) {\n\t return list;\n\t }\n\t }\n\t return [];\n\t }\n\n\t shiftLastFrom(priority) {\n\t return this.getFirst(this._lists.slice(priority).reverse()).shift();\n\t }\n\n\t};\n\n\tvar Queues_1 = Queues;\n\n\tvar BottleneckError;\n\n\tBottleneckError = class BottleneckError extends Error {};\n\n\tvar BottleneckError_1 = BottleneckError;\n\n\tvar BottleneckError$1, DEFAULT_PRIORITY, Job, NUM_PRIORITIES, parser$1;\n\n\tNUM_PRIORITIES = 10;\n\n\tDEFAULT_PRIORITY = 5;\n\n\tparser$1 = parser;\n\n\tBottleneckError$1 = BottleneckError_1;\n\n\tJob = class Job {\n\t constructor(task, args, options, jobDefaults, rejectOnDrop, Events, _states, Promise) {\n\t this.task = task;\n\t this.args = args;\n\t this.rejectOnDrop = rejectOnDrop;\n\t this.Events = Events;\n\t this._states = _states;\n\t this.Promise = Promise;\n\t this.options = parser$1.load(options, jobDefaults);\n\t this.options.priority = this._sanitizePriority(this.options.priority);\n\t if (this.options.id === jobDefaults.id) {\n\t this.options.id = `${this.options.id}-${this._randomIndex()}`;\n\t }\n\t this.promise = new this.Promise((_resolve, _reject) => {\n\t this._resolve = _resolve;\n\t this._reject = _reject;\n\t });\n\t this.retryCount = 0;\n\t }\n\n\t _sanitizePriority(priority) {\n\t var sProperty;\n\t sProperty = ~~priority !== priority ? DEFAULT_PRIORITY : priority;\n\t if (sProperty < 0) {\n\t return 0;\n\t } else if (sProperty > NUM_PRIORITIES - 1) {\n\t return NUM_PRIORITIES - 1;\n\t } else {\n\t return sProperty;\n\t }\n\t }\n\n\t _randomIndex() {\n\t return Math.random().toString(36).slice(2);\n\t }\n\n\t doDrop({error, message = "This job has been dropped by Bottleneck"} = {}) {\n\t if (this._states.remove(this.options.id)) {\n\t if (this.rejectOnDrop) {\n\t this._reject(error != null ? error : new BottleneckError$1(message));\n\t }\n\t this.Events.trigger("dropped", {args: this.args, options: this.options, task: this.task, promise: this.promise});\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t }\n\n\t _assertStatus(expected) {\n\t var status;\n\t status = this._states.jobStatus(this.options.id);\n\t if (!(status === expected || (expected === "DONE" && status === null))) {\n\t throw new BottleneckError$1(`Invalid job status ${status}, expected ${expected}. Please open an issue at https://github.com/SGrondin/bottleneck/issues`);\n\t }\n\t }\n\n\t doReceive() {\n\t this._states.start(this.options.id);\n\t return this.Events.trigger("received", {args: this.args, options: this.options});\n\t }\n\n\t doQueue(reachedHWM, blocked) {\n\t this._assertStatus("RECEIVED");\n\t this._states.next(this.options.id);\n\t return this.Events.trigger("queued", {args: this.args, options: this.options, reachedHWM, blocked});\n\t }\n\n\t doRun() {\n\t if (this.retryCount === 0) {\n\t this._assertStatus("QUEUED");\n\t this._states.next(this.options.id);\n\t } else {\n\t this._assertStatus("EXECUTING");\n\t }\n\t return this.Events.trigger("scheduled", {args: this.args, options: this.options});\n\t }\n\n\t async doExecute(chained, clearGlobalState, run, free) {\n\t var error, eventInfo, passed;\n\t if (this.retryCount === 0) {\n\t this._assertStatus("RUNNING");\n\t this._states.next(this.options.id);\n\t } else {\n\t this._assertStatus("EXECUTING");\n\t }\n\t eventInfo = {args: this.args, options: this.options, retryCount: this.retryCount};\n\t this.Events.trigger("executing", eventInfo);\n\t try {\n\t passed = (await (chained != null ? chained.schedule(this.options, this.task, ...this.args) : this.task(...this.args)));\n\t if (clearGlobalState()) {\n\t this.doDone(eventInfo);\n\t await free(this.options, eventInfo);\n\t this._assertStatus("DONE");\n\t return this._resolve(passed);\n\t }\n\t } catch (error1) {\n\t error = error1;\n\t return this._onFailure(error, eventInfo, clearGlobalState, run, free);\n\t }\n\t }\n\n\t doExpire(clearGlobalState, run, free) {\n\t var error, eventInfo;\n\t if (this._states.jobStatus(this.options.id === "RUNNING")) {\n\t this._states.next(this.options.id);\n\t }\n\t this._assertStatus("EXECUTING");\n\t eventInfo = {args: this.args, options: this.options, retryCount: this.retryCount};\n\t error = new BottleneckError$1(`This job timed out after ${this.options.expiration} ms.`);\n\t return this._onFailure(error, eventInfo, clearGlobalState, run, free);\n\t }\n\n\t async _onFailure(error, eventInfo, clearGlobalState, run, free) {\n\t var retry, retryAfter;\n\t if (clearGlobalState()) {\n\t retry = (await this.Events.trigger("failed", error, eventInfo));\n\t if (retry != null) {\n\t retryAfter = ~~retry;\n\t this.Events.trigger("retry", `Retrying ${this.options.id} after ${retryAfter} ms`, eventInfo);\n\t this.retryCount++;\n\t return run(retryAfter);\n\t } else {\n\t this.doDone(eventInfo);\n\t await free(this.options, eventInfo);\n\t this._assertStatus("DONE");\n\t return this._reject(error);\n\t }\n\t }\n\t }\n\n\t doDone(eventInfo) {\n\t this._assertStatus("EXECUTING");\n\t this._states.next(this.options.id);\n\t return this.Events.trigger("done", eventInfo);\n\t }\n\n\t};\n\n\tvar Job_1 = Job;\n\n\tvar BottleneckError$2, LocalDatastore, parser$2;\n\n\tparser$2 = parser;\n\n\tBottleneckError$2 = BottleneckError_1;\n\n\tLocalDatastore = class LocalDatastore {\n\t constructor(instance, storeOptions, storeInstanceOptions) {\n\t this.instance = instance;\n\t this.storeOptions = storeOptions;\n\t this.clientId = this.instance._randomIndex();\n\t parser$2.load(storeInstanceOptions, storeInstanceOptions, this);\n\t this._nextRequest = this._lastReservoirRefresh = this._lastReservoirIncrease = Date.now();\n\t this._running = 0;\n\t this._done = 0;\n\t this._unblockTime = 0;\n\t this.ready = this.Promise.resolve();\n\t this.clients = {};\n\t this._startHeartbeat();\n\t }\n\n\t _startHeartbeat() {\n\t var base;\n\t if ((this.heartbeat == null) && (((this.storeOptions.reservoirRefreshInterval != null) && (this.storeOptions.reservoirRefreshAmount != null)) || ((this.storeOptions.reservoirIncreaseInterval != null) && (this.storeOptions.reservoirIncreaseAmount != null)))) {\n\t return typeof (base = (this.heartbeat = setInterval(() => {\n\t var amount, incr, maximum, now, reservoir;\n\t now = Date.now();\n\t if ((this.storeOptions.reservoirRefreshInterval != null) && now >= this._lastReservoirRefresh + this.storeOptions.reservoirRefreshInterval) {\n\t this._lastReservoirRefresh = now;\n\t this.storeOptions.reservoir = this.storeOptions.reservoirRefreshAmount;\n\t this.instance._drainAll(this.computeCapacity());\n\t }\n\t if ((this.storeOptions.reservoirIncreaseInterval != null) && now >= this._lastReservoirIncrease + this.storeOptions.reservoirIncreaseInterval) {\n\t ({\n\t reservoirIncreaseAmount: amount,\n\t reservoirIncreaseMaximum: maximum,\n\t reservoir\n\t } = this.storeOptions);\n\t this._lastReservoirIncrease = now;\n\t incr = maximum != null ? Math.min(amount, maximum - reservoir) : amount;\n\t if (incr > 0) {\n\t this.storeOptions.reservoir += incr;\n\t return this.instance._drainAll(this.computeCapacity());\n\t }\n\t }\n\t }, this.heartbeatInterval))).unref === "function" ? base.unref() : void 0;\n\t } else {\n\t return clearInterval(this.heartbeat);\n\t }\n\t }\n\n\t async __publish__(message) {\n\t await this.yieldLoop();\n\t return this.instance.Events.trigger("message", message.toString());\n\t }\n\n\t async __disconnect__(flush) {\n\t await this.yieldLoop();\n\t clearInterval(this.heartbeat);\n\t return this.Promise.resolve();\n\t }\n\n\t yieldLoop(t = 0) {\n\t return new this.Promise(function(resolve, reject) {\n\t return setTimeout(resolve, t);\n\t });\n\t }\n\n\t computePenalty() {\n\t var ref;\n\t return (ref = this.storeOptions.penalty) != null ? ref : (15 * this.storeOptions.minTime) || 5000;\n\t }\n\n\t async __updateSettings__(options) {\n\t await this.yieldLoop();\n\t parser$2.overwrite(options, options, this.storeOptions);\n\t this._startHeartbeat();\n\t this.instance._drainAll(this.computeCapacity());\n\t return true;\n\t }\n\n\t async __running__() {\n\t await this.yieldLoop();\n\t return this._running;\n\t }\n\n\t async __queued__() {\n\t await this.yieldLoop();\n\t return this.instance.queued();\n\t }\n\n\t async __done__() {\n\t await this.yieldLoop();\n\t return this._done;\n\t }\n\n\t async __groupCheck__(time) {\n\t await this.yieldLoop();\n\t return (this._nextRequest + this.timeout) < time;\n\t }\n\n\t computeCapacity() {\n\t var maxConcurrent, reservoir;\n\t ({maxConcurrent, reservoir} = this.storeOptions);\n\t if ((maxConcurrent != null) && (reservoir != null)) {\n\t return Math.min(maxConcurrent - this._running, reservoir);\n\t } else if (maxConcurrent != null) {\n\t return maxConcurrent - this._running;\n\t } else if (reservoir != null) {\n\t return reservoir;\n\t } else {\n\t return null;\n\t }\n\t }\n\n\t conditionsCheck(weight) {\n\t var capacity;\n\t capacity = this.computeCapacity();\n\t return (capacity == null) || weight <= capacity;\n\t }\n\n\t async __incrementReservoir__(incr) {\n\t var reservoir;\n\t await this.yieldLoop();\n\t reservoir = this.storeOptions.reservoir += incr;\n\t this.instance._drainAll(this.computeCapacity());\n\t return reservoir;\n\t }\n\n\t async __currentReservoir__() {\n\t await this.yieldLoop();\n\t return this.storeOptions.reservoir;\n\t }\n\n\t isBlocked(now) {\n\t return this._unblockTime >= now;\n\t }\n\n\t check(weight, now) {\n\t return this.conditionsCheck(weight) && (this._nextRequest - now) <= 0;\n\t }\n\n\t async __check__(weight) {\n\t var now;\n\t await this.yieldLoop();\n\t now = Date.now();\n\t return this.check(weight, now);\n\t }\n\n\t async __register__(index, weight, expiration) {\n\t var now, wait;\n\t await this.yieldLoop();\n\t now = Date.now();\n\t if (this.conditionsCheck(weight)) {\n\t this._running += weight;\n\t if (this.storeOptions.reservoir != null) {\n\t this.storeOptions.reservoir -= weight;\n\t }\n\t wait = Math.max(this._nextRequest - now, 0);\n\t this._nextRequest = now + wait + this.storeOptions.minTime;\n\t return {\n\t success: true,\n\t wait,\n\t reservoir: this.storeOptions.reservoir\n\t };\n\t } else {\n\t return {\n\t success: false\n\t };\n\t }\n\t }\n\n\t strategyIsBlock() {\n\t return this.storeOptions.strategy === 3;\n\t }\n\n\t async __submit__(queueLength, weight) {\n\t var blocked, now, reachedHWM;\n\t await this.yieldLoop();\n\t if ((this.storeOptions.maxConcurrent != null) && weight > this.storeOptions.maxConcurrent) {\n\t throw new BottleneckError$2(`Impossible to add a job having a weight of ${weight} to a limiter having a maxConcurrent setting of ${this.storeOptions.maxConcurrent}`);\n\t }\n\t now = Date.now();\n\t reachedHWM = (this.storeOptions.highWater != null) && queueLength === this.storeOptions.highWater && !this.check(weight, now);\n\t blocked = this.strategyIsBlock() && (reachedHWM || this.isBlocked(now));\n\t if (blocked) {\n\t this._unblockTime = now + this.computePenalty();\n\t this._nextRequest = this._unblockTime + this.storeOptions.minTime;\n\t this.instance._dropAllQueued();\n\t }\n\t return {\n\t reachedHWM,\n\t blocked,\n\t strategy: this.storeOptions.strategy\n\t };\n\t }\n\n\t async __free__(index, weight) {\n\t await this.yieldLoop();\n\t this._running -= weight;\n\t this._done += weight;\n\t this.instance._drainAll(this.computeCapacity());\n\t return {\n\t running: this._running\n\t };\n\t }\n\n\t};\n\n\tvar LocalDatastore_1 = LocalDatastore;\n\n\tvar BottleneckError$3, States;\n\n\tBottleneckError$3 = BottleneckError_1;\n\n\tStates = class States {\n\t constructor(status1) {\n\t this.status = status1;\n\t this._jobs = {};\n\t this.counts = this.status.map(function() {\n\t return 0;\n\t });\n\t }\n\n\t next(id) {\n\t var current, next;\n\t current = this._jobs[id];\n\t next = current + 1;\n\t if ((current != null) && next < this.status.length) {\n\t this.counts[current]--;\n\t this.counts[next]++;\n\t return this._jobs[id]++;\n\t } else if (current != null) {\n\t this.counts[current]--;\n\t return delete this._jobs[id];\n\t }\n\t }\n\n\t start(id) {\n\t var initial;\n\t initial = 0;\n\t this._jobs[id] = initial;\n\t return this.counts[initial]++;\n\t }\n\n\t remove(id) {\n\t var current;\n\t current = this._jobs[id];\n\t if (current != null) {\n\t this.counts[current]--;\n\t delete this._jobs[id];\n\t }\n\t return current != null;\n\t }\n\n\t jobStatus(id) {\n\t var ref;\n\t return (ref = this.status[this._jobs[id]]) != null ? ref : null;\n\t }\n\n\t statusJobs(status) {\n\t var k, pos, ref, results, v;\n\t if (status != null) {\n\t pos = this.status.indexOf(status);\n\t if (pos < 0) {\n\t throw new BottleneckError$3(`status must be one of ${this.status.join(\', \')}`);\n\t }\n\t ref = this._jobs;\n\t results = [];\n\t for (k in ref) {\n\t v = ref[k];\n\t if (v === pos) {\n\t results.push(k);\n\t }\n\t }\n\t return results;\n\t } else {\n\t return Object.keys(this._jobs);\n\t }\n\t }\n\n\t statusCounts() {\n\t return this.counts.reduce(((acc, v, i) => {\n\t acc[this.status[i]] = v;\n\t return acc;\n\t }), {});\n\t }\n\n\t};\n\n\tvar States_1 = States;\n\n\tvar DLList$2, Sync;\n\n\tDLList$2 = DLList_1;\n\n\tSync = class Sync {\n\t constructor(name, Promise) {\n\t this.schedule = this.schedule.bind(this);\n\t this.name = name;\n\t this.Promise = Promise;\n\t this._running = 0;\n\t this._queue = new DLList$2();\n\t }\n\n\t isEmpty() {\n\t return this._queue.length === 0;\n\t }\n\n\t async _tryToRun() {\n\t var args, cb, error, reject, resolve, returned, task;\n\t if ((this._running < 1) && this._queue.length > 0) {\n\t this._running++;\n\t ({task, args, resolve, reject} = this._queue.shift());\n\t cb = (await (async function() {\n\t try {\n\t returned = (await task(...args));\n\t return function() {\n\t return resolve(returned);\n\t };\n\t } catch (error1) {\n\t error = error1;\n\t return function() {\n\t return reject(error);\n\t };\n\t }\n\t })());\n\t this._running--;\n\t this._tryToRun();\n\t return cb();\n\t }\n\t }\n\n\t schedule(task, ...args) {\n\t var promise, reject, resolve;\n\t resolve = reject = null;\n\t promise = new this.Promise(function(_resolve, _reject) {\n\t resolve = _resolve;\n\t return reject = _reject;\n\t });\n\t this._queue.push({task, args, resolve, reject});\n\t this._tryToRun();\n\t return promise;\n\t }\n\n\t};\n\n\tvar Sync_1 = Sync;\n\n\tvar version = "2.19.5";\n\tvar version$1 = {\n\t\tversion: version\n\t};\n\n\tvar version$2 = /*#__PURE__*/Object.freeze({\n\t\tversion: version,\n\t\tdefault: version$1\n\t});\n\n\tvar require$$2 = () => console.log(\'You must import the full version of Bottleneck in order to use this feature.\');\n\n\tvar require$$3 = () => console.log(\'You must import the full version of Bottleneck in order to use this feature.\');\n\n\tvar require$$4 = () => console.log(\'You must import the full version of Bottleneck in order to use this feature.\');\n\n\tvar Events$2, Group, IORedisConnection$1, RedisConnection$1, Scripts$1, parser$3;\n\n\tparser$3 = parser;\n\n\tEvents$2 = Events_1;\n\n\tRedisConnection$1 = require$$2;\n\n\tIORedisConnection$1 = require$$3;\n\n\tScripts$1 = require$$4;\n\n\tGroup = (function() {\n\t class Group {\n\t constructor(limiterOptions = {}) {\n\t this.deleteKey = this.deleteKey.bind(this);\n\t this.limiterOptions = limiterOptions;\n\t parser$3.load(this.limiterOptions, this.defaults, this);\n\t this.Events = new Events$2(this);\n\t this.instances = {};\n\t this.Bottleneck = Bottleneck_1;\n\t this._startAutoCleanup();\n\t this.sharedConnection = this.connection != null;\n\t if (this.connection == null) {\n\t if (this.limiterOptions.datastore === "redis") {\n\t this.connection = new RedisConnection$1(Object.assign({}, this.limiterOptions, {Events: this.Events}));\n\t } else if (this.limiterOptions.datastore === "ioredis") {\n\t this.connection = new IORedisConnection$1(Object.assign({}, this.limiterOptions, {Events: this.Events}));\n\t }\n\t }\n\t }\n\n\t key(key = "") {\n\t var ref;\n\t return (ref = this.instances[key]) != null ? ref : (() => {\n\t var limiter;\n\t limiter = this.instances[key] = new this.Bottleneck(Object.assign(this.limiterOptions, {\n\t id: `${this.id}-${key}`,\n\t timeout: this.timeout,\n\t connection: this.connection\n\t }));\n\t this.Events.trigger("created", limiter, key);\n\t return limiter;\n\t })();\n\t }\n\n\t async deleteKey(key = "") {\n\t var deleted, instance;\n\t instance = this.instances[key];\n\t if (this.connection) {\n\t deleted = (await this.connection.__runCommand__([\'del\', ...Scripts$1.allKeys(`${this.id}-${key}`)]));\n\t }\n\t if (instance != null) {\n\t delete this.instances[key];\n\t await instance.disconnect();\n\t }\n\t return (instance != null) || deleted > 0;\n\t }\n\n\t limiters() {\n\t var k, ref, results, v;\n\t ref = this.instances;\n\t results = [];\n\t for (k in ref) {\n\t v = ref[k];\n\t results.push({\n\t key: k,\n\t limiter: v\n\t });\n\t }\n\t return results;\n\t }\n\n\t keys() {\n\t return Object.keys(this.instances);\n\t }\n\n\t async clusterKeys() {\n\t var cursor, end, found, i, k, keys, len, next, start;\n\t if (this.connection == null) {\n\t return this.Promise.resolve(this.keys());\n\t }\n\t keys = [];\n\t cursor = null;\n\t start = `b_${this.id}-`.length;\n\t end = "_settings".length;\n\t while (cursor !== 0) {\n\t [next, found] = (await this.connection.__runCommand__(["scan", cursor != null ? cursor : 0, "match", `b_${this.id}-*_settings`, "count", 10000]));\n\t cursor = ~~next;\n\t for (i = 0, len = found.length; i < len; i++) {\n\t k = found[i];\n\t keys.push(k.slice(start, -end));\n\t }\n\t }\n\t return keys;\n\t }\n\n\t _startAutoCleanup() {\n\t var base;\n\t clearInterval(this.interval);\n\t return typeof (base = (this.interval = setInterval(async() => {\n\t var e, k, ref, results, time, v;\n\t time = Date.now();\n\t ref = this.instances;\n\t results = [];\n\t for (k in ref) {\n\t v = ref[k];\n\t try {\n\t if ((await v._store.__groupCheck__(time))) {\n\t results.push(this.deleteKey(k));\n\t } else {\n\t results.push(void 0);\n\t }\n\t } catch (error) {\n\t e = error;\n\t results.push(v.Events.trigger("error", e));\n\t }\n\t }\n\t return results;\n\t }, this.timeout / 2))).unref === "function" ? base.unref() : void 0;\n\t }\n\n\t updateSettings(options = {}) {\n\t parser$3.overwrite(options, this.defaults, this);\n\t parser$3.overwrite(options, options, this.limiterOptions);\n\t if (options.timeout != null) {\n\t return this._startAutoCleanup();\n\t }\n\t }\n\n\t disconnect(flush = true) {\n\t var ref;\n\t if (!this.sharedConnection) {\n\t return (ref = this.connection) != null ? ref.disconnect(flush) : void 0;\n\t }\n\t }\n\n\t }\n\t Group.prototype.defaults = {\n\t timeout: 1000 * 60 * 5,\n\t connection: null,\n\t Promise: Promise,\n\t id: "group-key"\n\t };\n\n\t return Group;\n\n\t}).call(commonjsGlobal);\n\n\tvar Group_1 = Group;\n\n\tvar Batcher, Events$3, parser$4;\n\n\tparser$4 = parser;\n\n\tEvents$3 = Events_1;\n\n\tBatcher = (function() {\n\t class Batcher {\n\t constructor(options = {}) {\n\t this.options = options;\n\t parser$4.load(this.options, this.defaults, this);\n\t this.Events = new Events$3(this);\n\t this._arr = [];\n\t this._resetPromise();\n\t this._lastFlush = Date.now();\n\t }\n\n\t _resetPromise() {\n\t return this._promise = new this.Promise((res, rej) => {\n\t return this._resolve = res;\n\t });\n\t }\n\n\t _flush() {\n\t clearTimeout(this._timeout);\n\t this._lastFlush = Date.now();\n\t this._resolve();\n\t this.Events.trigger("batch", this._arr);\n\t this._arr = [];\n\t return this._resetPromise();\n\t }\n\n\t add(data) {\n\t var ret;\n\t this._arr.push(data);\n\t ret = this._promise;\n\t if (this._arr.length === this.maxSize) {\n\t this._flush();\n\t } else if ((this.maxTime != null) && this._arr.length === 1) {\n\t this._timeout = setTimeout(() => {\n\t return this._flush();\n\t }, this.maxTime);\n\t }\n\t return ret;\n\t }\n\n\t }\n\t Batcher.prototype.defaults = {\n\t maxTime: null,\n\t maxSize: null,\n\t Promise: Promise\n\t };\n\n\t return Batcher;\n\n\t}).call(commonjsGlobal);\n\n\tvar Batcher_1 = Batcher;\n\n\tvar require$$4$1 = () => console.log(\'You must import the full version of Bottleneck in order to use this feature.\');\n\n\tvar require$$8 = getCjsExportFromNamespace(version$2);\n\n\tvar Bottleneck, DEFAULT_PRIORITY$1, Events$4, Job$1, LocalDatastore$1, NUM_PRIORITIES$1, Queues$1, RedisDatastore$1, States$1, Sync$1, parser$5,\n\t splice = [].splice;\n\n\tNUM_PRIORITIES$1 = 10;\n\n\tDEFAULT_PRIORITY$1 = 5;\n\n\tparser$5 = parser;\n\n\tQueues$1 = Queues_1;\n\n\tJob$1 = Job_1;\n\n\tLocalDatastore$1 = LocalDatastore_1;\n\n\tRedisDatastore$1 = require$$4$1;\n\n\tEvents$4 = Events_1;\n\n\tStates$1 = States_1;\n\n\tSync$1 = Sync_1;\n\n\tBottleneck = (function() {\n\t class Bottleneck {\n\t constructor(options = {}, ...invalid) {\n\t var storeInstanceOptions, storeOptions;\n\t this._addToQueue = this._addToQueue.bind(this);\n\t this._validateOptions(options, invalid);\n\t parser$5.load(options, this.instanceDefaults, this);\n\t this._queues = new Queues$1(NUM_PRIORITIES$1);\n\t this._scheduled = {};\n\t this._states = new States$1(["RECEIVED", "QUEUED", "RUNNING", "EXECUTING"].concat(this.trackDoneStatus ? ["DONE"] : []));\n\t this._limiter = null;\n\t this.Events = new Events$4(this);\n\t this._submitLock = new Sync$1("submit", this.Promise);\n\t this._registerLock = new Sync$1("register", this.Promise);\n\t storeOptions = parser$5.load(options, this.storeDefaults, {});\n\t this._store = (function() {\n\t if (this.datastore === "redis" || this.datastore === "ioredis" || (this.connection != null)) {\n\t storeInstanceOptions = parser$5.load(options, this.redisStoreDefaults, {});\n\t return new RedisDatastore$1(this, storeOptions, storeInstanceOptions);\n\t } else if (this.datastore === "local") {\n\t storeInstanceOptions = parser$5.load(options, this.localStoreDefaults, {});\n\t return new LocalDatastore$1(this, storeOptions, storeInstanceOptions);\n\t } else {\n\t throw new Bottleneck.prototype.BottleneckError(`Invalid datastore type: ${this.datastore}`);\n\t }\n\t }).call(this);\n\t this._queues.on("leftzero", () => {\n\t var ref;\n\t return (ref = this._store.heartbeat) != null ? typeof ref.ref === "function" ? ref.ref() : void 0 : void 0;\n\t });\n\t this._queues.on("zero", () => {\n\t var ref;\n\t return (ref = this._store.heartbeat) != null ? typeof ref.unref === "function" ? ref.unref() : void 0 : void 0;\n\t });\n\t }\n\n\t _validateOptions(options, invalid) {\n\t if (!((options != null) && typeof options === "object" && invalid.length === 0)) {\n\t throw new Bottleneck.prototype.BottleneckError("Bottleneck v2 takes a single object argument. Refer to https://github.com/SGrondin/bottleneck#upgrading-to-v2 if you\'re upgrading from Bottleneck v1.");\n\t }\n\t }\n\n\t ready() {\n\t return this._store.ready;\n\t }\n\n\t clients() {\n\t return this._store.clients;\n\t }\n\n\t channel() {\n\t return `b_${this.id}`;\n\t }\n\n\t channel_client() {\n\t return `b_${this.id}_${this._store.clientId}`;\n\t }\n\n\t publish(message) {\n\t return this._store.__publish__(message);\n\t }\n\n\t disconnect(flush = true) {\n\t return this._store.__disconnect__(flush);\n\t }\n\n\t chain(_limiter) {\n\t this._limiter = _limiter;\n\t return this;\n\t }\n\n\t queued(priority) {\n\t return this._queues.queued(priority);\n\t }\n\n\t clusterQueued() {\n\t return this._store.__queued__();\n\t }\n\n\t empty() {\n\t return this.queued() === 0 && this._submitLock.isEmpty();\n\t }\n\n\t running() {\n\t return this._store.__running__();\n\t }\n\n\t done() {\n\t return this._store.__done__();\n\t }\n\n\t jobStatus(id) {\n\t return this._states.jobStatus(id);\n\t }\n\n\t jobs(status) {\n\t return this._states.statusJobs(status);\n\t }\n\n\t counts() {\n\t return this._states.statusCounts();\n\t }\n\n\t _randomIndex() {\n\t return Math.random().toString(36).slice(2);\n\t }\n\n\t check(weight = 1) {\n\t return this._store.__check__(weight);\n\t }\n\n\t _clearGlobalState(index) {\n\t if (this._scheduled[index] != null) {\n\t clearTimeout(this._scheduled[index].expiration);\n\t delete this._scheduled[index];\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t }\n\n\t async _free(index, job, options, eventInfo) {\n\t var e, running;\n\t try {\n\t ({running} = (await this._store.__free__(index, options.weight)));\n\t this.Events.trigger("debug", `Freed ${options.id}`, eventInfo);\n\t if (running === 0 && this.empty()) {\n\t return this.Events.trigger("idle");\n\t }\n\t } catch (error1) {\n\t e = error1;\n\t return this.Events.trigger("error", e);\n\t }\n\t }\n\n\t _run(index, job, wait) {\n\t var clearGlobalState, free, run;\n\t job.doRun();\n\t clearGlobalState = this._clearGlobalState.bind(this, index);\n\t run = this._run.bind(this, index, job);\n\t free = this._free.bind(this, index, job);\n\t return this._scheduled[index] = {\n\t timeout: setTimeout(() => {\n\t return job.doExecute(this._limiter, clearGlobalState, run, free);\n\t }, wait),\n\t expiration: job.options.expiration != null ? setTimeout(function() {\n\t return job.doExpire(clearGlobalState, run, free);\n\t }, wait + job.options.expiration) : void 0,\n\t job: job\n\t };\n\t }\n\n\t _drainOne(capacity) {\n\t return this._registerLock.schedule(() => {\n\t var args, index, next, options, queue;\n\t if (this.queued() === 0) {\n\t return this.Promise.resolve(null);\n\t }\n\t queue = this._queues.getFirst();\n\t ({options, args} = next = queue.first());\n\t if ((capacity != null) && options.weight > capacity) {\n\t return this.Promise.resolve(null);\n\t }\n\t this.Events.trigger("debug", `Draining ${options.id}`, {args, options});\n\t index = this._randomIndex();\n\t return this._store.__register__(index, options.weight, options.expiration).then(({success, wait, reservoir}) => {\n\t var empty;\n\t this.Events.trigger("debug", `Drained ${options.id}`, {success, args, options});\n\t if (success) {\n\t queue.shift();\n\t empty = this.empty();\n\t if (empty) {\n\t this.Events.trigger("empty");\n\t }\n\t if (reservoir === 0) {\n\t this.Events.trigger("depleted", empty);\n\t }\n\t this._run(index, next, wait);\n\t return this.Promise.resolve(options.weight);\n\t } else {\n\t return this.Promise.resolve(null);\n\t }\n\t });\n\t });\n\t }\n\n\t _drainAll(capacity, total = 0) {\n\t return this._drainOne(capacity).then((drained) => {\n\t var newCapacity;\n\t if (drained != null) {\n\t newCapacity = capacity != null ? capacity - drained : capacity;\n\t return this._drainAll(newCapacity, total + drained);\n\t } else {\n\t return this.Promise.resolve(total);\n\t }\n\t }).catch((e) => {\n\t return this.Events.trigger("error", e);\n\t });\n\t }\n\n\t _dropAllQueued(message) {\n\t return this._queues.shiftAll(function(job) {\n\t return job.doDrop({message});\n\t });\n\t }\n\n\t stop(options = {}) {\n\t var done, waitForExecuting;\n\t options = parser$5.load(options, this.stopDefaults);\n\t waitForExecuting = (at) => {\n\t var finished;\n\t finished = () => {\n\t var counts;\n\t counts = this._states.counts;\n\t return (counts[0] + counts[1] + counts[2] + counts[3]) === at;\n\t };\n\t return new this.Promise((resolve, reject) => {\n\t if (finished()) {\n\t return resolve();\n\t } else {\n\t return this.on("done", () => {\n\t if (finished()) {\n\t this.removeAllListeners("done");\n\t return resolve();\n\t }\n\t });\n\t }\n\t });\n\t };\n\t done = options.dropWaitingJobs ? (this._run = function(index, next) {\n\t return next.doDrop({\n\t message: options.dropErrorMessage\n\t });\n\t }, this._drainOne = () => {\n\t return this.Promise.resolve(null);\n\t }, this._registerLock.schedule(() => {\n\t return this._submitLock.schedule(() => {\n\t var k, ref, v;\n\t ref = this._scheduled;\n\t for (k in ref) {\n\t v = ref[k];\n\t if (this.jobStatus(v.job.options.id) === "RUNNING") {\n\t clearTimeout(v.timeout);\n\t clearTimeout(v.expiration);\n\t v.job.doDrop({\n\t message: options.dropErrorMessage\n\t });\n\t }\n\t }\n\t this._dropAllQueued(options.dropErrorMessage);\n\t return waitForExecuting(0);\n\t });\n\t })) : this.schedule({\n\t priority: NUM_PRIORITIES$1 - 1,\n\t weight: 0\n\t }, () => {\n\t return waitForExecuting(1);\n\t });\n\t this._receive = function(job) {\n\t return job._reject(new Bottleneck.prototype.BottleneckError(options.enqueueErrorMessage));\n\t };\n\t this.stop = () => {\n\t return this.Promise.reject(new Bottleneck.prototype.BottleneckError("stop() has already been called"));\n\t };\n\t return done;\n\t }\n\n\t async _addToQueue(job) {\n\t var args, blocked, error, options, reachedHWM, shifted, strategy;\n\t ({args, options} = job);\n\t try {\n\t ({reachedHWM, blocked, strategy} = (await this._store.__submit__(this.queued(), options.weight)));\n\t } catch (error1) {\n\t error = error1;\n\t this.Events.trigger("debug", `Could not queue ${options.id}`, {args, options, error});\n\t job.doDrop({error});\n\t return false;\n\t }\n\t if (blocked) {\n\t job.doDrop();\n\t return true;\n\t } else if (reachedHWM) {\n\t shifted = strategy === Bottleneck.prototype.strategy.LEAK ? this._queues.shiftLastFrom(options.priority) : strategy === Bottleneck.prototype.strategy.OVERFLOW_PRIORITY ? this._queues.shiftLastFrom(options.priority + 1) : strategy === Bottleneck.prototype.strategy.OVERFLOW ? job : void 0;\n\t if (shifted != null) {\n\t shifted.doDrop();\n\t }\n\t if ((shifted == null) || strategy === Bottleneck.prototype.strategy.OVERFLOW) {\n\t if (shifted == null) {\n\t job.doDrop();\n\t }\n\t return reachedHWM;\n\t }\n\t }\n\t job.doQueue(reachedHWM, blocked);\n\t this._queues.push(job);\n\t await this._drainAll();\n\t return reachedHWM;\n\t }\n\n\t _receive(job) {\n\t if (this._states.jobStatus(job.options.id) != null) {\n\t job._reject(new Bottleneck.prototype.BottleneckError(`A job with the same id already exists (id=${job.options.id})`));\n\t return false;\n\t } else {\n\t job.doReceive();\n\t return this._submitLock.schedule(this._addToQueue, job);\n\t }\n\t }\n\n\t submit(...args) {\n\t var cb, fn, job, options, ref, ref1, task;\n\t if (typeof args[0] === "function") {\n\t ref = args, [fn, ...args] = ref, [cb] = splice.call(args, -1);\n\t options = parser$5.load({}, this.jobDefaults);\n\t } else {\n\t ref1 = args, [options, fn, ...args] = ref1, [cb] = splice.call(args, -1);\n\t options = parser$5.load(options, this.jobDefaults);\n\t }\n\t task = (...args) => {\n\t return new this.Promise(function(resolve, reject) {\n\t return fn(...args, function(...args) {\n\t return (args[0] != null ? reject : resolve)(args);\n\t });\n\t });\n\t };\n\t job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);\n\t job.promise.then(function(args) {\n\t return typeof cb === "function" ? cb(...args) : void 0;\n\t }).catch(function(args) {\n\t if (Array.isArray(args)) {\n\t return typeof cb === "function" ? cb(...args) : void 0;\n\t } else {\n\t return typeof cb === "function" ? cb(args) : void 0;\n\t }\n\t });\n\t return this._receive(job);\n\t }\n\n\t schedule(...args) {\n\t var job, options, task;\n\t if (typeof args[0] === "function") {\n\t [task, ...args] = args;\n\t options = {};\n\t } else {\n\t [options, task, ...args] = args;\n\t }\n\t job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);\n\t this._receive(job);\n\t return job.promise;\n\t }\n\n\t wrap(fn) {\n\t var schedule, wrapped;\n\t schedule = this.schedule.bind(this);\n\t wrapped = function(...args) {\n\t return schedule(fn.bind(this), ...args);\n\t };\n\t wrapped.withOptions = function(options, ...args) {\n\t return schedule(options, fn, ...args);\n\t };\n\t return wrapped;\n\t }\n\n\t async updateSettings(options = {}) {\n\t await this._store.__updateSettings__(parser$5.overwrite(options, this.storeDefaults));\n\t parser$5.overwrite(options, this.instanceDefaults, this);\n\t return this;\n\t }\n\n\t currentReservoir() {\n\t return this._store.__currentReservoir__();\n\t }\n\n\t incrementReservoir(incr = 0) {\n\t return this._store.__incrementReservoir__(incr);\n\t }\n\n\t }\n\t Bottleneck.default = Bottleneck;\n\n\t Bottleneck.Events = Events$4;\n\n\t Bottleneck.version = Bottleneck.prototype.version = require$$8.version;\n\n\t Bottleneck.strategy = Bottleneck.prototype.strategy = {\n\t LEAK: 1,\n\t OVERFLOW: 2,\n\t OVERFLOW_PRIORITY: 4,\n\t BLOCK: 3\n\t };\n\n\t Bottleneck.BottleneckError = Bottleneck.prototype.BottleneckError = BottleneckError_1;\n\n\t Bottleneck.Group = Bottleneck.prototype.Group = Group_1;\n\n\t Bottleneck.RedisConnection = Bottleneck.prototype.RedisConnection = require$$2;\n\n\t Bottleneck.IORedisConnection = Bottleneck.prototype.IORedisConnection = require$$3;\n\n\t Bottleneck.Batcher = Bottleneck.prototype.Batcher = Batcher_1;\n\n\t Bottleneck.prototype.jobDefaults = {\n\t priority: DEFAULT_PRIORITY$1,\n\t weight: 1,\n\t expiration: null,\n\t id: ""\n\t };\n\n\t Bottleneck.prototype.storeDefaults = {\n\t maxConcurrent: null,\n\t minTime: 0,\n\t highWater: null,\n\t strategy: Bottleneck.prototype.strategy.LEAK,\n\t penalty: null,\n\t reservoir: null,\n\t reservoirRefreshInterval: null,\n\t reservoirRefreshAmount: null,\n\t reservoirIncreaseInterval: null,\n\t reservoirIncreaseAmount: null,\n\t reservoirIncreaseMaximum: null\n\t };\n\n\t Bottleneck.prototype.localStoreDefaults = {\n\t Promise: Promise,\n\t timeout: null,\n\t heartbeatInterval: 250\n\t };\n\n\t Bottleneck.prototype.redisStoreDefaults = {\n\t Promise: Promise,\n\t timeout: null,\n\t heartbeatInterval: 5000,\n\t clientTimeout: 10000,\n\t Redis: null,\n\t clientOptions: {},\n\t clusterNodes: null,\n\t clearDatastore: false,\n\t connection: null\n\t };\n\n\t Bottleneck.prototype.instanceDefaults = {\n\t datastore: "local",\n\t connection: null,\n\t id: "",\n\t rejectOnDrop: true,\n\t trackDoneStatus: false,\n\t Promise: Promise\n\t };\n\n\t Bottleneck.prototype.stopDefaults = {\n\t enqueueErrorMessage: "This limiter has been stopped and cannot accept new jobs.",\n\t dropWaitingJobs: true,\n\t dropErrorMessage: "This limiter has been stopped."\n\t };\n\n\t return Bottleneck;\n\n\t}).call(commonjsGlobal);\n\n\tvar Bottleneck_1 = Bottleneck;\n\n\tvar lib = Bottleneck_1;\n\n\treturn lib;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU8sMEJBQTBCO0FBQ2pDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRkFBaUYsUUFBUSxpREFBaUQsZ0NBQWdDO0FBQzFLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFD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QUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyR0FBMkcsZUFBZTtBQUMxSDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxFQUFFOztBQUVGOztBQUVBOztBQUVBOztBQUVBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2JvdHRsZW5lY2svbGlnaHQuanM/NjYzZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEJvdHRsZW5lY2sgbGlicmFyeSAoTUlUKSwgY29tcGlsZWQgdG8gRVMyMDE3LCBhbmQgd2l0aG91dCBDbHVzdGVyaW5nIHN1cHBvcnQuXG4gICogaHR0cHM6Ly9naXRodWIuY29tL1NHcm9uZGluL2JvdHRsZW5lY2tcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Cb3R0bGVuZWNrID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cdHZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5cdGZ1bmN0aW9uIGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UgKG4pIHtcblx0XHRyZXR1cm4gbiAmJiBuWydkZWZhdWx0J10gfHwgbjtcblx0fVxuXG5cdHZhciBsb2FkID0gZnVuY3Rpb24ocmVjZWl2ZWQsIGRlZmF1bHRzLCBvbnRvID0ge30pIHtcblx0ICB2YXIgaywgcmVmLCB2O1xuXHQgIGZvciAoayBpbiBkZWZhdWx0cykge1xuXHQgICAgdiA9IGRlZmF1bHRzW2tdO1xuXHQgICAgb250b1trXSA9IChyZWYgPSByZWNlaXZlZFtrXSkgIT0gbnVsbCA/IHJlZiA6IHY7XG5cdCAgfVxuXHQgIHJldHVybiBvbnRvO1xuXHR9O1xuXG5cdHZhciBvdmVyd3JpdGUgPSBmdW5jdGlvbihyZWNlaXZlZCwgZGVmYXVsdHMsIG9udG8gPSB7fSkge1xuXHQgIHZhciBrLCB2O1xuXHQgIGZvciAoayBpbiByZWNlaXZlZCkge1xuXHQgICAgdiA9IHJlY2VpdmVkW2tdO1xuXHQgICAgaWYgKGRlZmF1bHRzW2tdICE9PSB2b2lkIDApIHtcblx0ICAgICAgb250b1trXSA9IHY7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiBvbnRvO1xuXHR9O1xuXG5cdHZhciBwYXJzZXIgPSB7XG5cdFx0bG9hZDogbG9hZCxcblx0XHRvdmVyd3JpdGU6IG92ZXJ3cml0ZVxuXHR9O1xuXG5cdHZhciBETExpc3Q7XG5cblx0RExMaXN0ID0gY2xhc3MgRExMaXN0IHtcblx0ICBjb25zdHJ1Y3RvcihpbmNyLCBkZWNyKSB7XG5cdCAgICB0aGlzLmluY3IgPSBpbmNyO1xuXHQgICAgdGhpcy5kZWNyID0gZGVjcjtcblx0ICAgIHRoaXMuX2ZpcnN0ID0gbnVsbDtcblx0ICAgIHRoaXMuX2xhc3QgPSBudWxsO1xuXHQgICAgdGhpcy5sZW5ndGggPSAwO1xuXHQgIH1cblxuXHQgIHB1c2godmFsdWUpIHtcblx0ICAgIHZhciBub2RlO1xuXHQgICAgdGhpcy5sZW5ndGgrKztcblx0ICAgIGlmICh0eXBlb2YgdGhpcy5pbmNyID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgdGhpcy5pbmNyKCk7XG5cdCAgICB9XG5cdCAgICBub2RlID0ge1xuXHQgICAgICB2YWx1ZSxcblx0ICAgICAgcHJldjogdGhpcy5fbGFzdCxcblx0ICAgICAgbmV4dDogbnVsbFxuXHQgICAgfTtcblx0ICAgIGlmICh0aGlzLl9sYXN0ICE9IG51bGwpIHtcblx0ICAgICAgdGhpcy5fbGFzdC5uZXh0ID0gbm9kZTtcblx0ICAgICAgdGhpcy5fbGFzdCA9IG5vZGU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLl9maXJzdCA9IHRoaXMuX2xhc3QgPSBub2RlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHZvaWQgMDtcblx0ICB9XG5cblx0ICBzaGlmdCgpIHtcblx0ICAgIHZhciB2YWx1ZTtcblx0ICAgIGlmICh0aGlzLl9maXJzdCA9PSBudWxsKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMubGVuZ3RoLS07XG5cdCAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWNyID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgICB0aGlzLmRlY3IoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgdmFsdWUgPSB0aGlzLl9maXJzdC52YWx1ZTtcblx0ICAgIGlmICgodGhpcy5fZmlyc3QgPSB0aGlzLl9maXJzdC5uZXh0KSAhPSBudWxsKSB7XG5cdCAgICAgIHRoaXMuX2ZpcnN0LnByZXYgPSBudWxsO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fbGFzdCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXG5cdCAgZmlyc3QoKSB7XG5cdCAgICBpZiAodGhpcy5fZmlyc3QgIT0gbnVsbCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fZmlyc3QudmFsdWU7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZ2V0QXJyYXkoKSB7XG5cdCAgICB2YXIgbm9kZSwgcmVmLCByZXN1bHRzO1xuXHQgICAgbm9kZSA9IHRoaXMuX2ZpcnN0O1xuXHQgICAgcmVzdWx0cyA9IFtdO1xuXHQgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuXHQgICAgICByZXN1bHRzLnB1c2goKHJlZiA9IG5vZGUsIG5vZGUgPSBub2RlLm5leHQsIHJlZi52YWx1ZSkpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdHM7XG5cdCAgfVxuXG5cdCAgZm9yRWFjaFNoaWZ0KGNiKSB7XG5cdCAgICB2YXIgbm9kZTtcblx0ICAgIG5vZGUgPSB0aGlzLnNoaWZ0KCk7XG5cdCAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG5cdCAgICAgIChjYihub2RlKSwgbm9kZSA9IHRoaXMuc2hpZnQoKSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdm9pZCAwO1xuXHQgIH1cblxuXHQgIGRlYnVnKCkge1xuXHQgICAgdmFyIG5vZGUsIHJlZiwgcmVmMSwgcmVmMiwgcmVzdWx0cztcblx0ICAgIG5vZGUgPSB0aGlzLl9maXJzdDtcblx0ICAgIHJlc3VsdHMgPSBbXTtcblx0ICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcblx0ICAgICAgcmVzdWx0cy5wdXNoKChyZWYgPSBub2RlLCBub2RlID0gbm9kZS5uZXh0LCB7XG5cdCAgICAgICAgdmFsdWU6IHJlZi52YWx1ZSxcblx0ICAgICAgICBwcmV2OiAocmVmMSA9IHJlZi5wcmV2KSAhPSBudWxsID8gcmVmMS52YWx1ZSA6IHZvaWQgMCxcblx0ICAgICAgICBuZXh0OiAocmVmMiA9IHJlZi5uZXh0KSAhPSBudWxsID8gcmVmMi52YWx1ZSA6IHZvaWQgMFxuXHQgICAgICB9KSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0cztcblx0ICB9XG5cblx0fTtcblxuXHR2YXIgRExMaXN0XzEgPSBETExpc3Q7XG5cblx0dmFyIEV2ZW50cztcblxuXHRFdmVudHMgPSBjbGFzcyBFdmVudHMge1xuXHQgIGNvbnN0cnVjdG9yKGluc3RhbmNlKSB7XG5cdCAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG5cdCAgICB0aGlzLl9ldmVudHMgPSB7fTtcblx0ICAgIGlmICgodGhpcy5pbnN0YW5jZS5vbiAhPSBudWxsKSB8fCAodGhpcy5pbnN0YW5jZS5vbmNlICE9IG51bGwpIHx8ICh0aGlzLmluc3RhbmNlLnJlbW92ZUFsbExpc3RlbmVycyAhPSBudWxsKSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBFbWl0dGVyIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIG9iamVjdFwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuaW5zdGFuY2Uub24gPSAobmFtZSwgY2IpID0+IHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2FkZExpc3RlbmVyKG5hbWUsIFwibWFueVwiLCBjYik7XG5cdCAgICB9O1xuXHQgICAgdGhpcy5pbnN0YW5jZS5vbmNlID0gKG5hbWUsIGNiKSA9PiB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9hZGRMaXN0ZW5lcihuYW1lLCBcIm9uY2VcIiwgY2IpO1xuXHQgICAgfTtcblx0ICAgIHRoaXMuaW5zdGFuY2UucmVtb3ZlQWxsTGlzdGVuZXJzID0gKG5hbWUgPSBudWxsKSA9PiB7XG5cdCAgICAgIGlmIChuYW1lICE9IG51bGwpIHtcblx0ICAgICAgICByZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1tuYW1lXTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzID0ge307XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfVxuXG5cdCAgX2FkZExpc3RlbmVyKG5hbWUsIHN0YXR1cywgY2IpIHtcblx0ICAgIHZhciBiYXNlO1xuXHQgICAgaWYgKChiYXNlID0gdGhpcy5fZXZlbnRzKVtuYW1lXSA9PSBudWxsKSB7XG5cdCAgICAgIGJhc2VbbmFtZV0gPSBbXTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2V2ZW50c1tuYW1lXS5wdXNoKHtjYiwgc3RhdHVzfSk7XG5cdCAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcblx0ICB9XG5cblx0ICBsaXN0ZW5lckNvdW50KG5hbWUpIHtcblx0ICAgIGlmICh0aGlzLl9ldmVudHNbbmFtZV0gIT0gbnVsbCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzW25hbWVdLmxlbmd0aDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiAwO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGFzeW5jIHRyaWdnZXIobmFtZSwgLi4uYXJncykge1xuXHQgICAgdmFyIGUsIHByb21pc2VzO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgaWYgKG5hbWUgIT09IFwiZGVidWdcIikge1xuXHQgICAgICAgIHRoaXMudHJpZ2dlcihcImRlYnVnXCIsIGBFdmVudCB0cmlnZ2VyZWQ6ICR7bmFtZX1gLCBhcmdzKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdID09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fZXZlbnRzW25hbWVdID0gdGhpcy5fZXZlbnRzW25hbWVdLmZpbHRlcihmdW5jdGlvbihsaXN0ZW5lcikge1xuXHQgICAgICAgIHJldHVybiBsaXN0ZW5lci5zdGF0dXMgIT09IFwibm9uZVwiO1xuXHQgICAgICB9KTtcblx0ICAgICAgcHJvbWlzZXMgPSB0aGlzLl9ldmVudHNbbmFtZV0ubWFwKGFzeW5jKGxpc3RlbmVyKSA9PiB7XG5cdCAgICAgICAgdmFyIGUsIHJldHVybmVkO1xuXHQgICAgICAgIGlmIChsaXN0ZW5lci5zdGF0dXMgPT09IFwibm9uZVwiKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChsaXN0ZW5lci5zdGF0dXMgPT09IFwib25jZVwiKSB7XG5cdCAgICAgICAgICBsaXN0ZW5lci5zdGF0dXMgPSBcIm5vbmVcIjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIHJldHVybmVkID0gdHlwZW9mIGxpc3RlbmVyLmNiID09PSBcImZ1bmN0aW9uXCIgPyBsaXN0ZW5lci5jYiguLi5hcmdzKSA6IHZvaWQgMDtcblx0ICAgICAgICAgIGlmICh0eXBlb2YgKHJldHVybmVkICE9IG51bGwgPyByZXR1cm5lZC50aGVuIDogdm9pZCAwKSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoYXdhaXQgcmV0dXJuZWQpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHJldHVybmVkO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICBlID0gZXJyb3I7XG5cdCAgICAgICAgICB7XG5cdCAgICAgICAgICAgIHRoaXMudHJpZ2dlcihcImVycm9yXCIsIGUpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuICgoYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKSkuZmluZChmdW5jdGlvbih4KSB7XG5cdCAgICAgICAgcmV0dXJuIHggIT0gbnVsbDtcblx0ICAgICAgfSk7XG5cdCAgICB9IGNhdGNoIChlcnJvcikge1xuXHQgICAgICBlID0gZXJyb3I7XG5cdCAgICAgIHtcblx0ICAgICAgICB0aGlzLnRyaWdnZXIoXCJlcnJvclwiLCBlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cblx0fTtcblxuXHR2YXIgRXZlbnRzXzEgPSBFdmVudHM7XG5cblx0dmFyIERMTGlzdCQxLCBFdmVudHMkMSwgUXVldWVzO1xuXG5cdERMTGlzdCQxID0gRExMaXN0XzE7XG5cblx0RXZlbnRzJDEgPSBFdmVudHNfMTtcblxuXHRRdWV1ZXMgPSBjbGFzcyBRdWV1ZXMge1xuXHQgIGNvbnN0cnVjdG9yKG51bV9wcmlvcml0aWVzKSB7XG5cdCAgICB2YXIgaTtcblx0ICAgIHRoaXMuRXZlbnRzID0gbmV3IEV2ZW50cyQxKHRoaXMpO1xuXHQgICAgdGhpcy5fbGVuZ3RoID0gMDtcblx0ICAgIHRoaXMuX2xpc3RzID0gKGZ1bmN0aW9uKCkge1xuXHQgICAgICB2YXIgaiwgcmVmLCByZXN1bHRzO1xuXHQgICAgICByZXN1bHRzID0gW107XG5cdCAgICAgIGZvciAoaSA9IGogPSAxLCByZWYgPSBudW1fcHJpb3JpdGllczsgKDEgPD0gcmVmID8gaiA8PSByZWYgOiBqID49IHJlZik7IGkgPSAxIDw9IHJlZiA/ICsraiA6IC0taikge1xuXHQgICAgICAgIHJlc3VsdHMucHVzaChuZXcgRExMaXN0JDEoKCgpID0+IHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLmluY3IoKTtcblx0ICAgICAgICB9KSwgKCgpID0+IHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLmRlY3IoKTtcblx0ICAgICAgICB9KSkpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiByZXN1bHRzO1xuXHQgICAgfSkuY2FsbCh0aGlzKTtcblx0ICB9XG5cblx0ICBpbmNyKCkge1xuXHQgICAgaWYgKHRoaXMuX2xlbmd0aCsrID09PSAwKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwibGVmdHplcm9cIik7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZGVjcigpIHtcblx0ICAgIGlmICgtLXRoaXMuX2xlbmd0aCA9PT0gMCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcInplcm9cIik7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcHVzaChqb2IpIHtcblx0ICAgIHJldHVybiB0aGlzLl9saXN0c1tqb2Iub3B0aW9ucy5wcmlvcml0eV0ucHVzaChqb2IpO1xuXHQgIH1cblxuXHQgIHF1ZXVlZChwcmlvcml0eSkge1xuXHQgICAgaWYgKHByaW9yaXR5ICE9IG51bGwpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2xpc3RzW3ByaW9yaXR5XS5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHNoaWZ0QWxsKGZuKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fbGlzdHMuZm9yRWFjaChmdW5jdGlvbihsaXN0KSB7XG5cdCAgICAgIHJldHVybiBsaXN0LmZvckVhY2hTaGlmdChmbik7XG5cdCAgICB9KTtcblx0ICB9XG5cblx0ICBnZXRGaXJzdChhcnIgPSB0aGlzLl9saXN0cykge1xuXHQgICAgdmFyIGosIGxlbiwgbGlzdDtcblx0ICAgIGZvciAoaiA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGogPCBsZW47IGorKykge1xuXHQgICAgICBsaXN0ID0gYXJyW2pdO1xuXHQgICAgICBpZiAobGlzdC5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgcmV0dXJuIGxpc3Q7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBbXTtcblx0ICB9XG5cblx0ICBzaGlmdExhc3RGcm9tKHByaW9yaXR5KSB7XG5cdCAgICByZXR1cm4gdGhpcy5nZXRGaXJzdCh0aGlzLl9saXN0cy5zbGljZShwcmlvcml0eSkucmV2ZXJzZSgpKS5zaGlmdCgpO1xuXHQgIH1cblxuXHR9O1xuXG5cdHZhciBRdWV1ZXNfMSA9IFF1ZXVlcztcblxuXHR2YXIgQm90dGxlbmVja0Vycm9yO1xuXG5cdEJvdHRsZW5lY2tFcnJvciA9IGNsYXNzIEJvdHRsZW5lY2tFcnJvciBleHRlbmRzIEVycm9yIHt9O1xuXG5cdHZhciBCb3R0bGVuZWNrRXJyb3JfMSA9IEJvdHRsZW5lY2tFcnJvcjtcblxuXHR2YXIgQm90dGxlbmVja0Vycm9yJDEsIERFRkFVTFRfUFJJT1JJVFksIEpvYiwgTlVNX1BSSU9SSVRJRVMsIHBhcnNlciQxO1xuXG5cdE5VTV9QUklPUklUSUVTID0gMTA7XG5cblx0REVGQVVMVF9QUklPUklUWSA9IDU7XG5cblx0cGFyc2VyJDEgPSBwYXJzZXI7XG5cblx0Qm90dGxlbmVja0Vycm9yJDEgPSBCb3R0bGVuZWNrRXJyb3JfMTtcblxuXHRKb2IgPSBjbGFzcyBKb2Ige1xuXHQgIGNvbnN0cnVjdG9yKHRhc2ssIGFyZ3MsIG9wdGlvbnMsIGpvYkRlZmF1bHRzLCByZWplY3RPbkRyb3AsIEV2ZW50cywgX3N0YXRlcywgUHJvbWlzZSkge1xuXHQgICAgdGhpcy50YXNrID0gdGFzaztcblx0ICAgIHRoaXMuYXJncyA9IGFyZ3M7XG5cdCAgICB0aGlzLnJlamVjdE9uRHJvcCA9IHJlamVjdE9uRHJvcDtcblx0ICAgIHRoaXMuRXZlbnRzID0gRXZlbnRzO1xuXHQgICAgdGhpcy5fc3RhdGVzID0gX3N0YXRlcztcblx0ICAgIHRoaXMuUHJvbWlzZSA9IFByb21pc2U7XG5cdCAgICB0aGlzLm9wdGlvbnMgPSBwYXJzZXIkMS5sb2FkKG9wdGlvbnMsIGpvYkRlZmF1bHRzKTtcblx0ICAgIHRoaXMub3B0aW9ucy5wcmlvcml0eSA9IHRoaXMuX3Nhbml0aXplUHJpb3JpdHkodGhpcy5vcHRpb25zLnByaW9yaXR5KTtcblx0ICAgIGlmICh0aGlzLm9wdGlvbnMuaWQgPT09IGpvYkRlZmF1bHRzLmlkKSB7XG5cdCAgICAgIHRoaXMub3B0aW9ucy5pZCA9IGAke3RoaXMub3B0aW9ucy5pZH0tJHt0aGlzLl9yYW5kb21JbmRleCgpfWA7XG5cdCAgICB9XG5cdCAgICB0aGlzLnByb21pc2UgPSBuZXcgdGhpcy5Qcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuXHQgICAgICB0aGlzLl9yZXNvbHZlID0gX3Jlc29sdmU7XG5cdCAgICAgIHRoaXMuX3JlamVjdCA9IF9yZWplY3Q7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XG5cdCAgfVxuXG5cdCAgX3Nhbml0aXplUHJpb3JpdHkocHJpb3JpdHkpIHtcblx0ICAgIHZhciBzUHJvcGVydHk7XG5cdCAgICBzUHJvcGVydHkgPSB+fnByaW9yaXR5ICE9PSBwcmlvcml0eSA/IERFRkFVTFRfUFJJT1JJVFkgOiBwcmlvcml0eTtcblx0ICAgIGlmIChzUHJvcGVydHkgPCAwKSB7XG5cdCAgICAgIHJldHVybiAwO1xuXHQgICAgfSBlbHNlIGlmIChzUHJvcGVydHkgPiBOVU1fUFJJT1JJVElFUyAtIDEpIHtcblx0ICAgICAgcmV0dXJuIE5VTV9QUklPUklUSUVTIC0gMTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBzUHJvcGVydHk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgX3JhbmRvbUluZGV4KCkge1xuXHQgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuXHQgIH1cblxuXHQgIGRvRHJvcCh7ZXJyb3IsIG1lc3NhZ2UgPSBcIlRoaXMgam9iIGhhcyBiZWVuIGRyb3BwZWQgYnkgQm90dGxlbmVja1wifSA9IHt9KSB7XG5cdCAgICBpZiAodGhpcy5fc3RhdGVzLnJlbW92ZSh0aGlzLm9wdGlvbnMuaWQpKSB7XG5cdCAgICAgIGlmICh0aGlzLnJlamVjdE9uRHJvcCkge1xuXHQgICAgICAgIHRoaXMuX3JlamVjdChlcnJvciAhPSBudWxsID8gZXJyb3IgOiBuZXcgQm90dGxlbmVja0Vycm9yJDEobWVzc2FnZSkpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJkcm9wcGVkXCIsIHthcmdzOiB0aGlzLmFyZ3MsIG9wdGlvbnM6IHRoaXMub3B0aW9ucywgdGFzazogdGhpcy50YXNrLCBwcm9taXNlOiB0aGlzLnByb21pc2V9KTtcblx0ICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgX2Fzc2VydFN0YXR1cyhleHBlY3RlZCkge1xuXHQgICAgdmFyIHN0YXR1cztcblx0ICAgIHN0YXR1cyA9IHRoaXMuX3N0YXRlcy5qb2JTdGF0dXModGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIGlmICghKHN0YXR1cyA9PT0gZXhwZWN0ZWQgfHwgKGV4cGVjdGVkID09PSBcIkRPTkVcIiAmJiBzdGF0dXMgPT09IG51bGwpKSkge1xuXHQgICAgICB0aHJvdyBuZXcgQm90dGxlbmVja0Vycm9yJDEoYEludmFsaWQgam9iIHN0YXR1cyAke3N0YXR1c30sIGV4cGVjdGVkICR7ZXhwZWN0ZWR9LiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vU0dyb25kaW4vYm90dGxlbmVjay9pc3N1ZXNgKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBkb1JlY2VpdmUoKSB7XG5cdCAgICB0aGlzLl9zdGF0ZXMuc3RhcnQodGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwicmVjZWl2ZWRcIiwge2FyZ3M6IHRoaXMuYXJncywgb3B0aW9uczogdGhpcy5vcHRpb25zfSk7XG5cdCAgfVxuXG5cdCAgZG9RdWV1ZShyZWFjaGVkSFdNLCBibG9ja2VkKSB7XG5cdCAgICB0aGlzLl9hc3NlcnRTdGF0dXMoXCJSRUNFSVZFRFwiKTtcblx0ICAgIHRoaXMuX3N0YXRlcy5uZXh0KHRoaXMub3B0aW9ucy5pZCk7XG5cdCAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcInF1ZXVlZFwiLCB7YXJnczogdGhpcy5hcmdzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIHJlYWNoZWRIV00sIGJsb2NrZWR9KTtcblx0ICB9XG5cblx0ICBkb1J1bigpIHtcblx0ICAgIGlmICh0aGlzLnJldHJ5Q291bnQgPT09IDApIHtcblx0ICAgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiUVVFVUVEXCIpO1xuXHQgICAgICB0aGlzLl9zdGF0ZXMubmV4dCh0aGlzLm9wdGlvbnMuaWQpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiRVhFQ1VUSU5HXCIpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJzY2hlZHVsZWRcIiwge2FyZ3M6IHRoaXMuYXJncywgb3B0aW9uczogdGhpcy5vcHRpb25zfSk7XG5cdCAgfVxuXG5cdCAgYXN5bmMgZG9FeGVjdXRlKGNoYWluZWQsIGNsZWFyR2xvYmFsU3RhdGUsIHJ1biwgZnJlZSkge1xuXHQgICAgdmFyIGVycm9yLCBldmVudEluZm8sIHBhc3NlZDtcblx0ICAgIGlmICh0aGlzLnJldHJ5Q291bnQgPT09IDApIHtcblx0ICAgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiUlVOTklOR1wiKTtcblx0ICAgICAgdGhpcy5fc3RhdGVzLm5leHQodGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuX2Fzc2VydFN0YXR1cyhcIkVYRUNVVElOR1wiKTtcblx0ICAgIH1cblx0ICAgIGV2ZW50SW5mbyA9IHthcmdzOiB0aGlzLmFyZ3MsIG9wdGlvbnM6IHRoaXMub3B0aW9ucywgcmV0cnlDb3VudDogdGhpcy5yZXRyeUNvdW50fTtcblx0ICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJleGVjdXRpbmdcIiwgZXZlbnRJbmZvKTtcblx0ICAgIHRyeSB7XG5cdCAgICAgIHBhc3NlZCA9IChhd2FpdCAoY2hhaW5lZCAhPSBudWxsID8gY2hhaW5lZC5zY2hlZHVsZSh0aGlzLm9wdGlvbnMsIHRoaXMudGFzaywgLi4udGhpcy5hcmdzKSA6IHRoaXMudGFzayguLi50aGlzLmFyZ3MpKSk7XG5cdCAgICAgIGlmIChjbGVhckdsb2JhbFN0YXRlKCkpIHtcblx0ICAgICAgICB0aGlzLmRvRG9uZShldmVudEluZm8pO1xuXHQgICAgICAgIGF3YWl0IGZyZWUodGhpcy5vcHRpb25zLCBldmVudEluZm8pO1xuXHQgICAgICAgIHRoaXMuX2Fzc2VydFN0YXR1cyhcIkRPTkVcIik7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmUocGFzc2VkKTtcblx0ICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG5cdCAgICAgIGVycm9yID0gZXJyb3IxO1xuXHQgICAgICByZXR1cm4gdGhpcy5fb25GYWlsdXJlKGVycm9yLCBldmVudEluZm8sIGNsZWFyR2xvYmFsU3RhdGUsIHJ1biwgZnJlZSk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZG9FeHBpcmUoY2xlYXJHbG9iYWxTdGF0ZSwgcnVuLCBmcmVlKSB7XG5cdCAgICB2YXIgZXJyb3IsIGV2ZW50SW5mbztcblx0ICAgIGlmICh0aGlzLl9zdGF0ZXMuam9iU3RhdHVzKHRoaXMub3B0aW9ucy5pZCA9PT0gXCJSVU5OSU5HXCIpKSB7XG5cdCAgICAgIHRoaXMuX3N0YXRlcy5uZXh0KHRoaXMub3B0aW9ucy5pZCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9hc3NlcnRTdGF0dXMoXCJFWEVDVVRJTkdcIik7XG5cdCAgICBldmVudEluZm8gPSB7YXJnczogdGhpcy5hcmdzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIHJldHJ5Q291bnQ6IHRoaXMucmV0cnlDb3VudH07XG5cdCAgICBlcnJvciA9IG5ldyBCb3R0bGVuZWNrRXJyb3IkMShgVGhpcyBqb2IgdGltZWQgb3V0IGFmdGVyICR7dGhpcy5vcHRpb25zLmV4cGlyYXRpb259IG1zLmApO1xuXHQgICAgcmV0dXJuIHRoaXMuX29uRmFpbHVyZShlcnJvciwgZXZlbnRJbmZvLCBjbGVhckdsb2JhbFN0YXRlLCBydW4sIGZyZWUpO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9vbkZhaWx1cmUoZXJyb3IsIGV2ZW50SW5mbywgY2xlYXJHbG9iYWxTdGF0ZSwgcnVuLCBmcmVlKSB7XG5cdCAgICB2YXIgcmV0cnksIHJldHJ5QWZ0ZXI7XG5cdCAgICBpZiAoY2xlYXJHbG9iYWxTdGF0ZSgpKSB7XG5cdCAgICAgIHJldHJ5ID0gKGF3YWl0IHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJmYWlsZWRcIiwgZXJyb3IsIGV2ZW50SW5mbykpO1xuXHQgICAgICBpZiAocmV0cnkgIT0gbnVsbCkge1xuXHQgICAgICAgIHJldHJ5QWZ0ZXIgPSB+fnJldHJ5O1xuXHQgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJyZXRyeVwiLCBgUmV0cnlpbmcgJHt0aGlzLm9wdGlvbnMuaWR9IGFmdGVyICR7cmV0cnlBZnRlcn0gbXNgLCBldmVudEluZm8pO1xuXHQgICAgICAgIHRoaXMucmV0cnlDb3VudCsrO1xuXHQgICAgICAgIHJldHVybiBydW4ocmV0cnlBZnRlcik7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5kb0RvbmUoZXZlbnRJbmZvKTtcblx0ICAgICAgICBhd2FpdCBmcmVlKHRoaXMub3B0aW9ucywgZXZlbnRJbmZvKTtcblx0ICAgICAgICB0aGlzLl9hc3NlcnRTdGF0dXMoXCJET05FXCIpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9yZWplY3QoZXJyb3IpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZG9Eb25lKGV2ZW50SW5mbykge1xuXHQgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiRVhFQ1VUSU5HXCIpO1xuXHQgICAgdGhpcy5fc3RhdGVzLm5leHQodGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZG9uZVwiLCBldmVudEluZm8pO1xuXHQgIH1cblxuXHR9O1xuXG5cdHZhciBKb2JfMSA9IEpvYjtcblxuXHR2YXIgQm90dGxlbmVja0Vycm9yJDIsIExvY2FsRGF0YXN0b3JlLCBwYXJzZXIkMjtcblxuXHRwYXJzZXIkMiA9IHBhcnNlcjtcblxuXHRCb3R0bGVuZWNrRXJyb3IkMiA9IEJvdHRsZW5lY2tFcnJvcl8xO1xuXG5cdExvY2FsRGF0YXN0b3JlID0gY2xhc3MgTG9jYWxEYXRhc3RvcmUge1xuXHQgIGNvbnN0cnVjdG9yKGluc3RhbmNlLCBzdG9yZU9wdGlvbnMsIHN0b3JlSW5zdGFuY2VPcHRpb25zKSB7XG5cdCAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG5cdCAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IHN0b3JlT3B0aW9ucztcblx0ICAgIHRoaXMuY2xpZW50SWQgPSB0aGlzLmluc3RhbmNlLl9yYW5kb21JbmRleCgpO1xuXHQgICAgcGFyc2VyJDIubG9hZChzdG9yZUluc3RhbmNlT3B0aW9ucywgc3RvcmVJbnN0YW5jZU9wdGlvbnMsIHRoaXMpO1xuXHQgICAgdGhpcy5fbmV4dFJlcXVlc3QgPSB0aGlzLl9sYXN0UmVzZXJ2b2lyUmVmcmVzaCA9IHRoaXMuX2xhc3RSZXNlcnZvaXJJbmNyZWFzZSA9IERhdGUubm93KCk7XG5cdCAgICB0aGlzLl9ydW5uaW5nID0gMDtcblx0ICAgIHRoaXMuX2RvbmUgPSAwO1xuXHQgICAgdGhpcy5fdW5ibG9ja1RpbWUgPSAwO1xuXHQgICAgdGhpcy5yZWFkeSA9IHRoaXMuUHJvbWlzZS5yZXNvbHZlKCk7XG5cdCAgICB0aGlzLmNsaWVudHMgPSB7fTtcblx0ICAgIHRoaXMuX3N0YXJ0SGVhcnRiZWF0KCk7XG5cdCAgfVxuXG5cdCAgX3N0YXJ0SGVhcnRiZWF0KCkge1xuXHQgICAgdmFyIGJhc2U7XG5cdCAgICBpZiAoKHRoaXMuaGVhcnRiZWF0ID09IG51bGwpICYmICgoKHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pclJlZnJlc2hJbnRlcnZhbCAhPSBudWxsKSAmJiAodGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyUmVmcmVzaEFtb3VudCAhPSBudWxsKSkgfHwgKCh0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJJbmNyZWFzZUludGVydmFsICE9IG51bGwpICYmICh0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJJbmNyZWFzZUFtb3VudCAhPSBudWxsKSkpKSB7XG5cdCAgICAgIHJldHVybiB0eXBlb2YgKGJhc2UgPSAodGhpcy5oZWFydGJlYXQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG5cdCAgICAgICAgdmFyIGFtb3VudCwgaW5jciwgbWF4aW11bSwgbm93LCByZXNlcnZvaXI7XG5cdCAgICAgICAgbm93ID0gRGF0ZS5ub3coKTtcblx0ICAgICAgICBpZiAoKHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pclJlZnJlc2hJbnRlcnZhbCAhPSBudWxsKSAmJiBub3cgPj0gdGhpcy5fbGFzdFJlc2Vydm9pclJlZnJlc2ggKyB0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJSZWZyZXNoSW50ZXJ2YWwpIHtcblx0ICAgICAgICAgIHRoaXMuX2xhc3RSZXNlcnZvaXJSZWZyZXNoID0gbm93O1xuXHQgICAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyID0gdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyUmVmcmVzaEFtb3VudDtcblx0ICAgICAgICAgIHRoaXMuaW5zdGFuY2UuX2RyYWluQWxsKHRoaXMuY29tcHV0ZUNhcGFjaXR5KCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoKHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pckluY3JlYXNlSW50ZXJ2YWwgIT0gbnVsbCkgJiYgbm93ID49IHRoaXMuX2xhc3RSZXNlcnZvaXJJbmNyZWFzZSArIHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pckluY3JlYXNlSW50ZXJ2YWwpIHtcblx0ICAgICAgICAgICh7XG5cdCAgICAgICAgICAgIHJlc2Vydm9pckluY3JlYXNlQW1vdW50OiBhbW91bnQsXG5cdCAgICAgICAgICAgIHJlc2Vydm9pckluY3JlYXNlTWF4aW11bTogbWF4aW11bSxcblx0ICAgICAgICAgICAgcmVzZXJ2b2lyXG5cdCAgICAgICAgICB9ID0gdGhpcy5zdG9yZU9wdGlvbnMpO1xuXHQgICAgICAgICAgdGhpcy5fbGFzdFJlc2Vydm9pckluY3JlYXNlID0gbm93O1xuXHQgICAgICAgICAgaW5jciA9IG1heGltdW0gIT0gbnVsbCA/IE1hdGgubWluKGFtb3VudCwgbWF4aW11bSAtIHJlc2Vydm9pcikgOiBhbW91bnQ7XG5cdCAgICAgICAgICBpZiAoaW5jciA+IDApIHtcblx0ICAgICAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyICs9IGluY3I7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLl9kcmFpbkFsbCh0aGlzLmNvbXB1dGVDYXBhY2l0eSgpKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWwpKSkudW5yZWYgPT09IFwiZnVuY3Rpb25cIiA/IGJhc2UudW5yZWYoKSA6IHZvaWQgMDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0KTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBhc3luYyBfX3B1Ymxpc2hfXyhtZXNzYWdlKSB7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UuRXZlbnRzLnRyaWdnZXIoXCJtZXNzYWdlXCIsIG1lc3NhZ2UudG9TdHJpbmcoKSk7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19kaXNjb25uZWN0X18oZmx1c2gpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0KTtcblx0ICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZSgpO1xuXHQgIH1cblxuXHQgIHlpZWxkTG9vcCh0ID0gMCkge1xuXHQgICAgcmV0dXJuIG5ldyB0aGlzLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdCAgICAgIHJldHVybiBzZXRUaW1lb3V0KHJlc29sdmUsIHQpO1xuXHQgICAgfSk7XG5cdCAgfVxuXG5cdCAgY29tcHV0ZVBlbmFsdHkoKSB7XG5cdCAgICB2YXIgcmVmO1xuXHQgICAgcmV0dXJuIChyZWYgPSB0aGlzLnN0b3JlT3B0aW9ucy5wZW5hbHR5KSAhPSBudWxsID8gcmVmIDogKDE1ICogdGhpcy5zdG9yZU9wdGlvbnMubWluVGltZSkgfHwgNTAwMDtcblx0ICB9XG5cblx0ICBhc3luYyBfX3VwZGF0ZVNldHRpbmdzX18ob3B0aW9ucykge1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIHBhcnNlciQyLm92ZXJ3cml0ZShvcHRpb25zLCBvcHRpb25zLCB0aGlzLnN0b3JlT3B0aW9ucyk7XG5cdCAgICB0aGlzLl9zdGFydEhlYXJ0YmVhdCgpO1xuXHQgICAgdGhpcy5pbnN0YW5jZS5fZHJhaW5BbGwodGhpcy5jb21wdXRlQ2FwYWNpdHkoKSk7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cblx0ICBhc3luYyBfX3J1bm5pbmdfXygpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXR1cm4gdGhpcy5fcnVubmluZztcblx0ICB9XG5cblx0ICBhc3luYyBfX3F1ZXVlZF9fKCkge1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnF1ZXVlZCgpO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fZG9uZV9fKCkge1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIHJldHVybiB0aGlzLl9kb25lO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fZ3JvdXBDaGVja19fKHRpbWUpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXR1cm4gKHRoaXMuX25leHRSZXF1ZXN0ICsgdGhpcy50aW1lb3V0KSA8IHRpbWU7XG5cdCAgfVxuXG5cdCAgY29tcHV0ZUNhcGFjaXR5KCkge1xuXHQgICAgdmFyIG1heENvbmN1cnJlbnQsIHJlc2Vydm9pcjtcblx0ICAgICh7bWF4Q29uY3VycmVudCwgcmVzZXJ2b2lyfSA9IHRoaXMuc3RvcmVPcHRpb25zKTtcblx0ICAgIGlmICgobWF4Q29uY3VycmVudCAhPSBudWxsKSAmJiAocmVzZXJ2b2lyICE9IG51bGwpKSB7XG5cdCAgICAgIHJldHVybiBNYXRoLm1pbihtYXhDb25jdXJyZW50IC0gdGhpcy5fcnVubmluZywgcmVzZXJ2b2lyKTtcblx0ICAgIH0gZWxzZSBpZiAobWF4Q29uY3VycmVudCAhPSBudWxsKSB7XG5cdCAgICAgIHJldHVybiBtYXhDb25jdXJyZW50IC0gdGhpcy5fcnVubmluZztcblx0ICAgIH0gZWxzZSBpZiAocmVzZXJ2b2lyICE9IG51bGwpIHtcblx0ICAgICAgcmV0dXJuIHJlc2Vydm9pcjtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGNvbmRpdGlvbnNDaGVjayh3ZWlnaHQpIHtcblx0ICAgIHZhciBjYXBhY2l0eTtcblx0ICAgIGNhcGFjaXR5ID0gdGhpcy5jb21wdXRlQ2FwYWNpdHkoKTtcblx0ICAgIHJldHVybiAoY2FwYWNpdHkgPT0gbnVsbCkgfHwgd2VpZ2h0IDw9IGNhcGFjaXR5O1xuXHQgIH1cblxuXHQgIGFzeW5jIF9faW5jcmVtZW50UmVzZXJ2b2lyX18oaW5jcikge1xuXHQgICAgdmFyIHJlc2Vydm9pcjtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXNlcnZvaXIgPSB0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXIgKz0gaW5jcjtcblx0ICAgIHRoaXMuaW5zdGFuY2UuX2RyYWluQWxsKHRoaXMuY29tcHV0ZUNhcGFjaXR5KCkpO1xuXHQgICAgcmV0dXJuIHJlc2Vydm9pcjtcblx0ICB9XG5cblx0ICBhc3luYyBfX2N1cnJlbnRSZXNlcnZvaXJfXygpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXR1cm4gdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyO1xuXHQgIH1cblxuXHQgIGlzQmxvY2tlZChub3cpIHtcblx0ICAgIHJldHVybiB0aGlzLl91bmJsb2NrVGltZSA+PSBub3c7XG5cdCAgfVxuXG5cdCAgY2hlY2sod2VpZ2h0LCBub3cpIHtcblx0ICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNDaGVjayh3ZWlnaHQpICYmICh0aGlzLl9uZXh0UmVxdWVzdCAtIG5vdykgPD0gMDtcblx0ICB9XG5cblx0ICBhc3luYyBfX2NoZWNrX18od2VpZ2h0KSB7XG5cdCAgICB2YXIgbm93O1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIG5vdyA9IERhdGUubm93KCk7XG5cdCAgICByZXR1cm4gdGhpcy5jaGVjayh3ZWlnaHQsIG5vdyk7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19yZWdpc3Rlcl9fKGluZGV4LCB3ZWlnaHQsIGV4cGlyYXRpb24pIHtcblx0ICAgIHZhciBub3csIHdhaXQ7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgbm93ID0gRGF0ZS5ub3coKTtcblx0ICAgIGlmICh0aGlzLmNvbmRpdGlvbnNDaGVjayh3ZWlnaHQpKSB7XG5cdCAgICAgIHRoaXMuX3J1bm5pbmcgKz0gd2VpZ2h0O1xuXHQgICAgICBpZiAodGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyICE9IG51bGwpIHtcblx0ICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXIgLT0gd2VpZ2h0O1xuXHQgICAgICB9XG5cdCAgICAgIHdhaXQgPSBNYXRoLm1heCh0aGlzLl9uZXh0UmVxdWVzdCAtIG5vdywgMCk7XG5cdCAgICAgIHRoaXMuX25leHRSZXF1ZXN0ID0gbm93ICsgd2FpdCArIHRoaXMuc3RvcmVPcHRpb25zLm1pblRpbWU7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgc3VjY2VzczogdHJ1ZSxcblx0ICAgICAgICB3YWl0LFxuXHQgICAgICAgIHJlc2Vydm9pcjogdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyXG5cdCAgICAgIH07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHN1Y2Nlc3M6IGZhbHNlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgc3RyYXRlZ3lJc0Jsb2NrKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuc3RvcmVPcHRpb25zLnN0cmF0ZWd5ID09PSAzO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fc3VibWl0X18ocXVldWVMZW5ndGgsIHdlaWdodCkge1xuXHQgICAgdmFyIGJsb2NrZWQsIG5vdywgcmVhY2hlZEhXTTtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICBpZiAoKHRoaXMuc3RvcmVPcHRpb25zLm1heENvbmN1cnJlbnQgIT0gbnVsbCkgJiYgd2VpZ2h0ID4gdGhpcy5zdG9yZU9wdGlvbnMubWF4Q29uY3VycmVudCkge1xuXHQgICAgICB0aHJvdyBuZXcgQm90dGxlbmVja0Vycm9yJDIoYEltcG9zc2libGUgdG8gYWRkIGEgam9iIGhhdmluZyBhIHdlaWdodCBvZiAke3dlaWdodH0gdG8gYSBsaW1pdGVyIGhhdmluZyBhIG1heENvbmN1cnJlbnQgc2V0dGluZyBvZiAke3RoaXMuc3RvcmVPcHRpb25zLm1heENvbmN1cnJlbnR9YCk7XG5cdCAgICB9XG5cdCAgICBub3cgPSBEYXRlLm5vdygpO1xuXHQgICAgcmVhY2hlZEhXTSA9ICh0aGlzLnN0b3JlT3B0aW9ucy5oaWdoV2F0ZXIgIT0gbnVsbCkgJiYgcXVldWVMZW5ndGggPT09IHRoaXMuc3RvcmVPcHRpb25zLmhpZ2hXYXRlciAmJiAhdGhpcy5jaGVjayh3ZWlnaHQsIG5vdyk7XG5cdCAgICBibG9ja2VkID0gdGhpcy5zdHJhdGVneUlzQmxvY2soKSAmJiAocmVhY2hlZEhXTSB8fCB0aGlzLmlzQmxvY2tlZChub3cpKTtcblx0ICAgIGlmIChibG9ja2VkKSB7XG5cdCAgICAgIHRoaXMuX3VuYmxvY2tUaW1lID0gbm93ICsgdGhpcy5jb21wdXRlUGVuYWx0eSgpO1xuXHQgICAgICB0aGlzLl9uZXh0UmVxdWVzdCA9IHRoaXMuX3VuYmxvY2tUaW1lICsgdGhpcy5zdG9yZU9wdGlvbnMubWluVGltZTtcblx0ICAgICAgdGhpcy5pbnN0YW5jZS5fZHJvcEFsbFF1ZXVlZCgpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgcmVhY2hlZEhXTSxcblx0ICAgICAgYmxvY2tlZCxcblx0ICAgICAgc3RyYXRlZ3k6IHRoaXMuc3RvcmVPcHRpb25zLnN0cmF0ZWd5XG5cdCAgICB9O1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fZnJlZV9fKGluZGV4LCB3ZWlnaHQpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICB0aGlzLl9ydW5uaW5nIC09IHdlaWdodDtcblx0ICAgIHRoaXMuX2RvbmUgKz0gd2VpZ2h0O1xuXHQgICAgdGhpcy5pbnN0YW5jZS5fZHJhaW5BbGwodGhpcy5jb21wdXRlQ2FwYWNpdHkoKSk7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBydW5uaW5nOiB0aGlzLl9ydW5uaW5nXG5cdCAgICB9O1xuXHQgIH1cblxuXHR9O1xuXG5cdHZhciBMb2NhbERhdGFzdG9yZV8xID0gTG9jYWxEYXRhc3RvcmU7XG5cblx0dmFyIEJvdHRsZW5lY2tFcnJvciQzLCBTdGF0ZXM7XG5cblx0Qm90dGxlbmVja0Vycm9yJDMgPSBCb3R0bGVuZWNrRXJyb3JfMTtcblxuXHRTdGF0ZXMgPSBjbGFzcyBTdGF0ZXMge1xuXHQgIGNvbnN0cnVjdG9yKHN0YXR1czEpIHtcblx0ICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzMTtcblx0ICAgIHRoaXMuX2pvYnMgPSB7fTtcblx0ICAgIHRoaXMuY291bnRzID0gdGhpcy5zdGF0dXMubWFwKGZ1bmN0aW9uKCkge1xuXHQgICAgICByZXR1cm4gMDtcblx0ICAgIH0pO1xuXHQgIH1cblxuXHQgIG5leHQoaWQpIHtcblx0ICAgIHZhciBjdXJyZW50LCBuZXh0O1xuXHQgICAgY3VycmVudCA9IHRoaXMuX2pvYnNbaWRdO1xuXHQgICAgbmV4dCA9IGN1cnJlbnQgKyAxO1xuXHQgICAgaWYgKChjdXJyZW50ICE9IG51bGwpICYmIG5leHQgPCB0aGlzLnN0YXR1cy5sZW5ndGgpIHtcblx0ICAgICAgdGhpcy5jb3VudHNbY3VycmVudF0tLTtcblx0ICAgICAgdGhpcy5jb3VudHNbbmV4dF0rKztcblx0ICAgICAgcmV0dXJuIHRoaXMuX2pvYnNbaWRdKys7XG5cdCAgICB9IGVsc2UgaWYgKGN1cnJlbnQgIT0gbnVsbCkge1xuXHQgICAgICB0aGlzLmNvdW50c1tjdXJyZW50XS0tO1xuXHQgICAgICByZXR1cm4gZGVsZXRlIHRoaXMuX2pvYnNbaWRdO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHN0YXJ0KGlkKSB7XG5cdCAgICB2YXIgaW5pdGlhbDtcblx0ICAgIGluaXRpYWwgPSAwO1xuXHQgICAgdGhpcy5fam9ic1tpZF0gPSBpbml0aWFsO1xuXHQgICAgcmV0dXJuIHRoaXMuY291bnRzW2luaXRpYWxdKys7XG5cdCAgfVxuXG5cdCAgcmVtb3ZlKGlkKSB7XG5cdCAgICB2YXIgY3VycmVudDtcblx0ICAgIGN1cnJlbnQgPSB0aGlzLl9qb2JzW2lkXTtcblx0ICAgIGlmIChjdXJyZW50ICE9IG51bGwpIHtcblx0ICAgICAgdGhpcy5jb3VudHNbY3VycmVudF0tLTtcblx0ICAgICAgZGVsZXRlIHRoaXMuX2pvYnNbaWRdO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGN1cnJlbnQgIT0gbnVsbDtcblx0ICB9XG5cblx0ICBqb2JTdGF0dXMoaWQpIHtcblx0ICAgIHZhciByZWY7XG5cdCAgICByZXR1cm4gKHJlZiA9IHRoaXMuc3RhdHVzW3RoaXMuX2pvYnNbaWRdXSkgIT0gbnVsbCA/IHJlZiA6IG51bGw7XG5cdCAgfVxuXG5cdCAgc3RhdHVzSm9icyhzdGF0dXMpIHtcblx0ICAgIHZhciBrLCBwb3MsIHJlZiwgcmVzdWx0cywgdjtcblx0ICAgIGlmIChzdGF0dXMgIT0gbnVsbCkge1xuXHQgICAgICBwb3MgPSB0aGlzLnN0YXR1cy5pbmRleE9mKHN0YXR1cyk7XG5cdCAgICAgIGlmIChwb3MgPCAwKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEJvdHRsZW5lY2tFcnJvciQzKGBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgJHt0aGlzLnN0YXR1cy5qb2luKCcsICcpfWApO1xuXHQgICAgICB9XG5cdCAgICAgIHJlZiA9IHRoaXMuX2pvYnM7XG5cdCAgICAgIHJlc3VsdHMgPSBbXTtcblx0ICAgICAgZm9yIChrIGluIHJlZikge1xuXHQgICAgICAgIHYgPSByZWZba107XG5cdCAgICAgICAgaWYgKHYgPT09IHBvcykge1xuXHQgICAgICAgICAgcmVzdWx0cy5wdXNoKGspO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmVzdWx0cztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9qb2JzKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBzdGF0dXNDb3VudHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5jb3VudHMucmVkdWNlKCgoYWNjLCB2LCBpKSA9PiB7XG5cdCAgICAgIGFjY1t0aGlzLnN0YXR1c1tpXV0gPSB2O1xuXHQgICAgICByZXR1cm4gYWNjO1xuXHQgICAgfSksIHt9KTtcblx0ICB9XG5cblx0fTtcblxuXHR2YXIgU3RhdGVzXzEgPSBTdGF0ZXM7XG5cblx0dmFyIERMTGlzdCQyLCBTeW5jO1xuXG5cdERMTGlzdCQyID0gRExMaXN0XzE7XG5cblx0U3luYyA9IGNsYXNzIFN5bmMge1xuXHQgIGNvbnN0cnVjdG9yKG5hbWUsIFByb21pc2UpIHtcblx0ICAgIHRoaXMuc2NoZWR1bGUgPSB0aGlzLnNjaGVkdWxlLmJpbmQodGhpcyk7XG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgdGhpcy5Qcm9taXNlID0gUHJvbWlzZTtcblx0ICAgIHRoaXMuX3J1bm5pbmcgPSAwO1xuXHQgICAgdGhpcy5fcXVldWUgPSBuZXcgRExMaXN0JDIoKTtcblx0ICB9XG5cblx0ICBpc0VtcHR5KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3F1ZXVlLmxlbmd0aCA9PT0gMDtcblx0ICB9XG5cblx0ICBhc3luYyBfdHJ5VG9SdW4oKSB7XG5cdCAgICB2YXIgYXJncywgY2IsIGVycm9yLCByZWplY3QsIHJlc29sdmUsIHJldHVybmVkLCB0YXNrO1xuXHQgICAgaWYgKCh0aGlzLl9ydW5uaW5nIDwgMSkgJiYgdGhpcy5fcXVldWUubGVuZ3RoID4gMCkge1xuXHQgICAgICB0aGlzLl9ydW5uaW5nKys7XG5cdCAgICAgICh7dGFzaywgYXJncywgcmVzb2x2ZSwgcmVqZWN0fSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCkpO1xuXHQgICAgICBjYiA9IChhd2FpdCAoYXN5bmMgZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIHJldHVybmVkID0gKGF3YWl0IHRhc2soLi4uYXJncykpO1xuXHQgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXR1cm5lZCk7XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuXHQgICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG5cdCAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuXHQgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pKCkpO1xuXHQgICAgICB0aGlzLl9ydW5uaW5nLS07XG5cdCAgICAgIHRoaXMuX3RyeVRvUnVuKCk7XG5cdCAgICAgIHJldHVybiBjYigpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHNjaGVkdWxlKHRhc2ssIC4uLmFyZ3MpIHtcblx0ICAgIHZhciBwcm9taXNlLCByZWplY3QsIHJlc29sdmU7XG5cdCAgICByZXNvbHZlID0gcmVqZWN0ID0gbnVsbDtcblx0ICAgIHByb21pc2UgPSBuZXcgdGhpcy5Qcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG5cdCAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcblx0ICAgICAgcmV0dXJuIHJlamVjdCA9IF9yZWplY3Q7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3F1ZXVlLnB1c2goe3Rhc2ssIGFyZ3MsIHJlc29sdmUsIHJlamVjdH0pO1xuXHQgICAgdGhpcy5fdHJ5VG9SdW4oKTtcblx0ICAgIHJldHVybiBwcm9taXNlO1xuXHQgIH1cblxuXHR9O1xuXG5cdHZhciBTeW5jXzEgPSBTeW5jO1xuXG5cdHZhciB2ZXJzaW9uID0gXCIyLjE5LjVcIjtcblx0dmFyIHZlcnNpb24kMSA9IHtcblx0XHR2ZXJzaW9uOiB2ZXJzaW9uXG5cdH07XG5cblx0dmFyIHZlcnNpb24kMiA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0XHR2ZXJzaW9uOiB2ZXJzaW9uLFxuXHRcdGRlZmF1bHQ6IHZlcnNpb24kMVxuXHR9KTtcblxuXHR2YXIgcmVxdWlyZSQkMiA9ICgpID0+IGNvbnNvbGUubG9nKCdZb3UgbXVzdCBpbXBvcnQgdGhlIGZ1bGwgdmVyc2lvbiBvZiBCb3R0bGVuZWNrIGluIG9yZGVyIHRvIHVzZSB0aGlzIGZlYXR1cmUuJyk7XG5cblx0dmFyIHJlcXVpcmUkJDMgPSAoKSA9PiBjb25zb2xlLmxvZygnWW91IG11c3QgaW1wb3J0IHRoZSBmdWxsIHZlcnNpb24gb2YgQm90dGxlbmVjayBpbiBvcmRlciB0byB1c2UgdGhpcyBmZWF0dXJlLicpO1xuXG5cdHZhciByZXF1aXJlJCQ0ID0gKCkgPT4gY29uc29sZS5sb2coJ1lvdSBtdXN0IGltcG9ydCB0aGUgZnVsbCB2ZXJzaW9uIG9mIEJvdHRsZW5lY2sgaW4gb3JkZXIgdG8gdXNlIHRoaXMgZmVhdHVyZS4nKTtcblxuXHR2YXIgRXZlbnRzJDIsIEdyb3VwLCBJT1JlZGlzQ29ubmVjdGlvbiQxLCBSZWRpc0Nvbm5lY3Rpb24kMSwgU2NyaXB0cyQxLCBwYXJzZXIkMztcblxuXHRwYXJzZXIkMyA9IHBhcnNlcjtcblxuXHRFdmVudHMkMiA9IEV2ZW50c18xO1xuXG5cdFJlZGlzQ29ubmVjdGlvbiQxID0gcmVxdWlyZSQkMjtcblxuXHRJT1JlZGlzQ29ubmVjdGlvbiQxID0gcmVxdWlyZSQkMztcblxuXHRTY3JpcHRzJDEgPSByZXF1aXJlJCQ0O1xuXG5cdEdyb3VwID0gKGZ1bmN0aW9uKCkge1xuXHQgIGNsYXNzIEdyb3VwIHtcblx0ICAgIGNvbnN0cnVjdG9yKGxpbWl0ZXJPcHRpb25zID0ge30pIHtcblx0ICAgICAgdGhpcy5kZWxldGVLZXkgPSB0aGlzLmRlbGV0ZUtleS5iaW5kKHRoaXMpO1xuXHQgICAgICB0aGlzLmxpbWl0ZXJPcHRpb25zID0gbGltaXRlck9wdGlvbnM7XG5cdCAgICAgIHBhcnNlciQzLmxvYWQodGhpcy5saW1pdGVyT3B0aW9ucywgdGhpcy5kZWZhdWx0cywgdGhpcyk7XG5cdCAgICAgIHRoaXMuRXZlbnRzID0gbmV3IEV2ZW50cyQyKHRoaXMpO1xuXHQgICAgICB0aGlzLmluc3RhbmNlcyA9IHt9O1xuXHQgICAgICB0aGlzLkJvdHRsZW5lY2sgPSBCb3R0bGVuZWNrXzE7XG5cdCAgICAgIHRoaXMuX3N0YXJ0QXV0b0NsZWFudXAoKTtcblx0ICAgICAgdGhpcy5zaGFyZWRDb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uICE9IG51bGw7XG5cdCAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24gPT0gbnVsbCkge1xuXHQgICAgICAgIGlmICh0aGlzLmxpbWl0ZXJPcHRpb25zLmRhdGFzdG9yZSA9PT0gXCJyZWRpc1wiKSB7XG5cdCAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBuZXcgUmVkaXNDb25uZWN0aW9uJDEoT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5saW1pdGVyT3B0aW9ucywge0V2ZW50czogdGhpcy5FdmVudHN9KSk7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbWl0ZXJPcHRpb25zLmRhdGFzdG9yZSA9PT0gXCJpb3JlZGlzXCIpIHtcblx0ICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG5ldyBJT1JlZGlzQ29ubmVjdGlvbiQxKE9iamVjdC5hc3NpZ24oe30sIHRoaXMubGltaXRlck9wdGlvbnMsIHtFdmVudHM6IHRoaXMuRXZlbnRzfSkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBrZXkoa2V5ID0gXCJcIikge1xuXHQgICAgICB2YXIgcmVmO1xuXHQgICAgICByZXR1cm4gKHJlZiA9IHRoaXMuaW5zdGFuY2VzW2tleV0pICE9IG51bGwgPyByZWYgOiAoKCkgPT4ge1xuXHQgICAgICAgIHZhciBsaW1pdGVyO1xuXHQgICAgICAgIGxpbWl0ZXIgPSB0aGlzLmluc3RhbmNlc1trZXldID0gbmV3IHRoaXMuQm90dGxlbmVjayhPYmplY3QuYXNzaWduKHRoaXMubGltaXRlck9wdGlvbnMsIHtcblx0ICAgICAgICAgIGlkOiBgJHt0aGlzLmlkfS0ke2tleX1gLFxuXHQgICAgICAgICAgdGltZW91dDogdGhpcy50aW1lb3V0LFxuXHQgICAgICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uXG5cdCAgICAgICAgfSkpO1xuXHQgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJjcmVhdGVkXCIsIGxpbWl0ZXIsIGtleSk7XG5cdCAgICAgICAgcmV0dXJuIGxpbWl0ZXI7XG5cdCAgICAgIH0pKCk7XG5cdCAgICB9XG5cblx0ICAgIGFzeW5jIGRlbGV0ZUtleShrZXkgPSBcIlwiKSB7XG5cdCAgICAgIHZhciBkZWxldGVkLCBpbnN0YW5jZTtcblx0ICAgICAgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlc1trZXldO1xuXHQgICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG5cdCAgICAgICAgZGVsZXRlZCA9IChhd2FpdCB0aGlzLmNvbm5lY3Rpb24uX19ydW5Db21tYW5kX18oWydkZWwnLCAuLi5TY3JpcHRzJDEuYWxsS2V5cyhgJHt0aGlzLmlkfS0ke2tleX1gKV0pKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCkge1xuXHQgICAgICAgIGRlbGV0ZSB0aGlzLmluc3RhbmNlc1trZXldO1xuXHQgICAgICAgIGF3YWl0IGluc3RhbmNlLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gKGluc3RhbmNlICE9IG51bGwpIHx8IGRlbGV0ZWQgPiAwO1xuXHQgICAgfVxuXG5cdCAgICBsaW1pdGVycygpIHtcblx0ICAgICAgdmFyIGssIHJlZiwgcmVzdWx0cywgdjtcblx0ICAgICAgcmVmID0gdGhpcy5pbnN0YW5jZXM7XG5cdCAgICAgIHJlc3VsdHMgPSBbXTtcblx0ICAgICAgZm9yIChrIGluIHJlZikge1xuXHQgICAgICAgIHYgPSByZWZba107XG5cdCAgICAgICAgcmVzdWx0cy5wdXNoKHtcblx0ICAgICAgICAgIGtleTogayxcblx0ICAgICAgICAgIGxpbWl0ZXI6IHZcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmVzdWx0cztcblx0ICAgIH1cblxuXHQgICAga2V5cygpIHtcblx0ICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaW5zdGFuY2VzKTtcblx0ICAgIH1cblxuXHQgICAgYXN5bmMgY2x1c3RlcktleXMoKSB7XG5cdCAgICAgIHZhciBjdXJzb3IsIGVuZCwgZm91bmQsIGksIGssIGtleXMsIGxlbiwgbmV4dCwgc3RhcnQ7XG5cdCAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24gPT0gbnVsbCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZSh0aGlzLmtleXMoKSk7XG5cdCAgICAgIH1cblx0ICAgICAga2V5cyA9IFtdO1xuXHQgICAgICBjdXJzb3IgPSBudWxsO1xuXHQgICAgICBzdGFydCA9IGBiXyR7dGhpcy5pZH0tYC5sZW5ndGg7XG5cdCAgICAgIGVuZCA9IFwiX3NldHRpbmdzXCIubGVuZ3RoO1xuXHQgICAgICB3aGlsZSAoY3Vyc29yICE9PSAwKSB7XG5cdCAgICAgICAgW25leHQsIGZvdW5kXSA9IChhd2FpdCB0aGlzLmNvbm5lY3Rpb24uX19ydW5Db21tYW5kX18oW1wic2NhblwiLCBjdXJzb3IgIT0gbnVsbCA/IGN1cnNvciA6IDAsIFwibWF0Y2hcIiwgYGJfJHt0aGlzLmlkfS0qX3NldHRpbmdzYCwgXCJjb3VudFwiLCAxMDAwMF0pKTtcblx0ICAgICAgICBjdXJzb3IgPSB+fm5leHQ7XG5cdCAgICAgICAgZm9yIChpID0gMCwgbGVuID0gZm91bmQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgIGsgPSBmb3VuZFtpXTtcblx0ICAgICAgICAgIGtleXMucHVzaChrLnNsaWNlKHN0YXJ0LCAtZW5kKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBrZXlzO1xuXHQgICAgfVxuXG5cdCAgICBfc3RhcnRBdXRvQ2xlYW51cCgpIHtcblx0ICAgICAgdmFyIGJhc2U7XG5cdCAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XG5cdCAgICAgIHJldHVybiB0eXBlb2YgKGJhc2UgPSAodGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jKCkgPT4ge1xuXHQgICAgICAgIHZhciBlLCBrLCByZWYsIHJlc3VsdHMsIHRpbWUsIHY7XG5cdCAgICAgICAgdGltZSA9IERhdGUubm93KCk7XG5cdCAgICAgICAgcmVmID0gdGhpcy5pbnN0YW5jZXM7XG5cdCAgICAgICAgcmVzdWx0cyA9IFtdO1xuXHQgICAgICAgIGZvciAoayBpbiByZWYpIHtcblx0ICAgICAgICAgIHYgPSByZWZba107XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBpZiAoKGF3YWl0IHYuX3N0b3JlLl9fZ3JvdXBDaGVja19fKHRpbWUpKSkge1xuXHQgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmRlbGV0ZUtleShrKSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHZvaWQgMCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgIGUgPSBlcnJvcjtcblx0ICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHYuRXZlbnRzLnRyaWdnZXIoXCJlcnJvclwiLCBlKSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHRzO1xuXHQgICAgICB9LCB0aGlzLnRpbWVvdXQgLyAyKSkpLnVucmVmID09PSBcImZ1bmN0aW9uXCIgPyBiYXNlLnVucmVmKCkgOiB2b2lkIDA7XG5cdCAgICB9XG5cblx0ICAgIHVwZGF0ZVNldHRpbmdzKG9wdGlvbnMgPSB7fSkge1xuXHQgICAgICBwYXJzZXIkMy5vdmVyd3JpdGUob3B0aW9ucywgdGhpcy5kZWZhdWx0cywgdGhpcyk7XG5cdCAgICAgIHBhcnNlciQzLm92ZXJ3cml0ZShvcHRpb25zLCBvcHRpb25zLCB0aGlzLmxpbWl0ZXJPcHRpb25zKTtcblx0ICAgICAgaWYgKG9wdGlvbnMudGltZW91dCAhPSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0QXV0b0NsZWFudXAoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBkaXNjb25uZWN0KGZsdXNoID0gdHJ1ZSkge1xuXHQgICAgICB2YXIgcmVmO1xuXHQgICAgICBpZiAoIXRoaXMuc2hhcmVkQ29ubmVjdGlvbikge1xuXHQgICAgICAgIHJldHVybiAocmVmID0gdGhpcy5jb25uZWN0aW9uKSAhPSBudWxsID8gcmVmLmRpc2Nvbm5lY3QoZmx1c2gpIDogdm9pZCAwO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICB9XG5cdCAgR3JvdXAucHJvdG90eXBlLmRlZmF1bHRzID0ge1xuXHQgICAgdGltZW91dDogMTAwMCAqIDYwICogNSxcblx0ICAgIGNvbm5lY3Rpb246IG51bGwsXG5cdCAgICBQcm9taXNlOiBQcm9taXNlLFxuXHQgICAgaWQ6IFwiZ3JvdXAta2V5XCJcblx0ICB9O1xuXG5cdCAgcmV0dXJuIEdyb3VwO1xuXG5cdH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xuXG5cdHZhciBHcm91cF8xID0gR3JvdXA7XG5cblx0dmFyIEJhdGNoZXIsIEV2ZW50cyQzLCBwYXJzZXIkNDtcblxuXHRwYXJzZXIkNCA9IHBhcnNlcjtcblxuXHRFdmVudHMkMyA9IEV2ZW50c18xO1xuXG5cdEJhdGNoZXIgPSAoZnVuY3Rpb24oKSB7XG5cdCAgY2xhc3MgQmF0Y2hlciB7XG5cdCAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcblx0ICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0ICAgICAgcGFyc2VyJDQubG9hZCh0aGlzLm9wdGlvbnMsIHRoaXMuZGVmYXVsdHMsIHRoaXMpO1xuXHQgICAgICB0aGlzLkV2ZW50cyA9IG5ldyBFdmVudHMkMyh0aGlzKTtcblx0ICAgICAgdGhpcy5fYXJyID0gW107XG5cdCAgICAgIHRoaXMuX3Jlc2V0UHJvbWlzZSgpO1xuXHQgICAgICB0aGlzLl9sYXN0Rmx1c2ggPSBEYXRlLm5vdygpO1xuXHQgICAgfVxuXG5cdCAgICBfcmVzZXRQcm9taXNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZSA9IG5ldyB0aGlzLlByb21pc2UoKHJlcywgcmVqKSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmUgPSByZXM7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBfZmx1c2goKSB7XG5cdCAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcblx0ICAgICAgdGhpcy5fbGFzdEZsdXNoID0gRGF0ZS5ub3coKTtcblx0ICAgICAgdGhpcy5fcmVzb2x2ZSgpO1xuXHQgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiYmF0Y2hcIiwgdGhpcy5fYXJyKTtcblx0ICAgICAgdGhpcy5fYXJyID0gW107XG5cdCAgICAgIHJldHVybiB0aGlzLl9yZXNldFByb21pc2UoKTtcblx0ICAgIH1cblxuXHQgICAgYWRkKGRhdGEpIHtcblx0ICAgICAgdmFyIHJldDtcblx0ICAgICAgdGhpcy5fYXJyLnB1c2goZGF0YSk7XG5cdCAgICAgIHJldCA9IHRoaXMuX3Byb21pc2U7XG5cdCAgICAgIGlmICh0aGlzLl9hcnIubGVuZ3RoID09PSB0aGlzLm1heFNpemUpIHtcblx0ICAgICAgICB0aGlzLl9mbHVzaCgpO1xuXHQgICAgICB9IGVsc2UgaWYgKCh0aGlzLm1heFRpbWUgIT0gbnVsbCkgJiYgdGhpcy5fYXJyLmxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLl9mbHVzaCgpO1xuXHQgICAgICAgIH0sIHRoaXMubWF4VGltZSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHJldDtcblx0ICAgIH1cblxuXHQgIH1cblx0ICBCYXRjaGVyLnByb3RvdHlwZS5kZWZhdWx0cyA9IHtcblx0ICAgIG1heFRpbWU6IG51bGwsXG5cdCAgICBtYXhTaXplOiBudWxsLFxuXHQgICAgUHJvbWlzZTogUHJvbWlzZVxuXHQgIH07XG5cblx0ICByZXR1cm4gQmF0Y2hlcjtcblxuXHR9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcblxuXHR2YXIgQmF0Y2hlcl8xID0gQmF0Y2hlcjtcblxuXHR2YXIgcmVxdWlyZSQkNCQxID0gKCkgPT4gY29uc29sZS5sb2coJ1lvdSBtdXN0IGltcG9ydCB0aGUgZnVsbCB2ZXJzaW9uIG9mIEJvdHRsZW5lY2sgaW4gb3JkZXIgdG8gdXNlIHRoaXMgZmVhdHVyZS4nKTtcblxuXHR2YXIgcmVxdWlyZSQkOCA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UodmVyc2lvbiQyKTtcblxuXHR2YXIgQm90dGxlbmVjaywgREVGQVVMVF9QUklPUklUWSQxLCBFdmVudHMkNCwgSm9iJDEsIExvY2FsRGF0YXN0b3JlJDEsIE5VTV9QUklPUklUSUVTJDEsIFF1ZXVlcyQxLCBSZWRpc0RhdGFzdG9yZSQxLCBTdGF0ZXMkMSwgU3luYyQxLCBwYXJzZXIkNSxcblx0ICBzcGxpY2UgPSBbXS5zcGxpY2U7XG5cblx0TlVNX1BSSU9SSVRJRVMkMSA9IDEwO1xuXG5cdERFRkFVTFRfUFJJT1JJVFkkMSA9IDU7XG5cblx0cGFyc2VyJDUgPSBwYXJzZXI7XG5cblx0UXVldWVzJDEgPSBRdWV1ZXNfMTtcblxuXHRKb2IkMSA9IEpvYl8xO1xuXG5cdExvY2FsRGF0YXN0b3JlJDEgPSBMb2NhbERhdGFzdG9yZV8xO1xuXG5cdFJlZGlzRGF0YXN0b3JlJDEgPSByZXF1aXJlJCQ0JDE7XG5cblx0RXZlbnRzJDQgPSBFdmVudHNfMTtcblxuXHRTdGF0ZXMkMSA9IFN0YXRlc18xO1xuXG5cdFN5bmMkMSA9IFN5bmNfMTtcblxuXHRCb3R0bGVuZWNrID0gKGZ1bmN0aW9uKCkge1xuXHQgIGNsYXNzIEJvdHRsZW5lY2sge1xuXHQgICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9LCAuLi5pbnZhbGlkKSB7XG5cdCAgICAgIHZhciBzdG9yZUluc3RhbmNlT3B0aW9ucywgc3RvcmVPcHRpb25zO1xuXHQgICAgICB0aGlzLl9hZGRUb1F1ZXVlID0gdGhpcy5fYWRkVG9RdWV1ZS5iaW5kKHRoaXMpO1xuXHQgICAgICB0aGlzLl92YWxpZGF0ZU9wdGlvbnMob3B0aW9ucywgaW52YWxpZCk7XG5cdCAgICAgIHBhcnNlciQ1LmxvYWQob3B0aW9ucywgdGhpcy5pbnN0YW5jZURlZmF1bHRzLCB0aGlzKTtcblx0ICAgICAgdGhpcy5fcXVldWVzID0gbmV3IFF1ZXVlcyQxKE5VTV9QUklPUklUSUVTJDEpO1xuXHQgICAgICB0aGlzLl9zY2hlZHVsZWQgPSB7fTtcblx0ICAgICAgdGhpcy5fc3RhdGVzID0gbmV3IFN0YXRlcyQxKFtcIlJFQ0VJVkVEXCIsIFwiUVVFVUVEXCIsIFwiUlVOTklOR1wiLCBcIkVYRUNVVElOR1wiXS5jb25jYXQodGhpcy50cmFja0RvbmVTdGF0dXMgPyBbXCJET05FXCJdIDogW10pKTtcblx0ICAgICAgdGhpcy5fbGltaXRlciA9IG51bGw7XG5cdCAgICAgIHRoaXMuRXZlbnRzID0gbmV3IEV2ZW50cyQ0KHRoaXMpO1xuXHQgICAgICB0aGlzLl9zdWJtaXRMb2NrID0gbmV3IFN5bmMkMShcInN1Ym1pdFwiLCB0aGlzLlByb21pc2UpO1xuXHQgICAgICB0aGlzLl9yZWdpc3RlckxvY2sgPSBuZXcgU3luYyQxKFwicmVnaXN0ZXJcIiwgdGhpcy5Qcm9taXNlKTtcblx0ICAgICAgc3RvcmVPcHRpb25zID0gcGFyc2VyJDUubG9hZChvcHRpb25zLCB0aGlzLnN0b3JlRGVmYXVsdHMsIHt9KTtcblx0ICAgICAgdGhpcy5fc3RvcmUgPSAoZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuZGF0YXN0b3JlID09PSBcInJlZGlzXCIgfHwgdGhpcy5kYXRhc3RvcmUgPT09IFwiaW9yZWRpc1wiIHx8ICh0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbCkpIHtcblx0ICAgICAgICAgIHN0b3JlSW5zdGFuY2VPcHRpb25zID0gcGFyc2VyJDUubG9hZChvcHRpb25zLCB0aGlzLnJlZGlzU3RvcmVEZWZhdWx0cywge30pO1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBSZWRpc0RhdGFzdG9yZSQxKHRoaXMsIHN0b3JlT3B0aW9ucywgc3RvcmVJbnN0YW5jZU9wdGlvbnMpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhc3RvcmUgPT09IFwibG9jYWxcIikge1xuXHQgICAgICAgICAgc3RvcmVJbnN0YW5jZU9wdGlvbnMgPSBwYXJzZXIkNS5sb2FkKG9wdGlvbnMsIHRoaXMubG9jYWxTdG9yZURlZmF1bHRzLCB7fSk7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IExvY2FsRGF0YXN0b3JlJDEodGhpcywgc3RvcmVPcHRpb25zLCBzdG9yZUluc3RhbmNlT3B0aW9ucyk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBCb3R0bGVuZWNrLnByb3RvdHlwZS5Cb3R0bGVuZWNrRXJyb3IoYEludmFsaWQgZGF0YXN0b3JlIHR5cGU6ICR7dGhpcy5kYXRhc3RvcmV9YCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KS5jYWxsKHRoaXMpO1xuXHQgICAgICB0aGlzLl9xdWV1ZXMub24oXCJsZWZ0emVyb1wiLCAoKSA9PiB7XG5cdCAgICAgICAgdmFyIHJlZjtcblx0ICAgICAgICByZXR1cm4gKHJlZiA9IHRoaXMuX3N0b3JlLmhlYXJ0YmVhdCkgIT0gbnVsbCA/IHR5cGVvZiByZWYucmVmID09PSBcImZ1bmN0aW9uXCIgPyByZWYucmVmKCkgOiB2b2lkIDAgOiB2b2lkIDA7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9xdWV1ZXMub24oXCJ6ZXJvXCIsICgpID0+IHtcblx0ICAgICAgICB2YXIgcmVmO1xuXHQgICAgICAgIHJldHVybiAocmVmID0gdGhpcy5fc3RvcmUuaGVhcnRiZWF0KSAhPSBudWxsID8gdHlwZW9mIHJlZi51bnJlZiA9PT0gXCJmdW5jdGlvblwiID8gcmVmLnVucmVmKCkgOiB2b2lkIDAgOiB2b2lkIDA7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBfdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMsIGludmFsaWQpIHtcblx0ICAgICAgaWYgKCEoKG9wdGlvbnMgIT0gbnVsbCkgJiYgdHlwZW9mIG9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiYgaW52YWxpZC5sZW5ndGggPT09IDApKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEJvdHRsZW5lY2sucHJvdG90eXBlLkJvdHRsZW5lY2tFcnJvcihcIkJvdHRsZW5lY2sgdjIgdGFrZXMgYSBzaW5nbGUgb2JqZWN0IGFyZ3VtZW50LiBSZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vU0dyb25kaW4vYm90dGxlbmVjayN1cGdyYWRpbmctdG8tdjIgaWYgeW91J3JlIHVwZ3JhZGluZyBmcm9tIEJvdHRsZW5lY2sgdjEuXCIpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJlYWR5KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUucmVhZHk7XG5cdCAgICB9XG5cblx0ICAgIGNsaWVudHMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5jbGllbnRzO1xuXHQgICAgfVxuXG5cdCAgICBjaGFubmVsKCkge1xuXHQgICAgICByZXR1cm4gYGJfJHt0aGlzLmlkfWA7XG5cdCAgICB9XG5cblx0ICAgIGNoYW5uZWxfY2xpZW50KCkge1xuXHQgICAgICByZXR1cm4gYGJfJHt0aGlzLmlkfV8ke3RoaXMuX3N0b3JlLmNsaWVudElkfWA7XG5cdCAgICB9XG5cblx0ICAgIHB1Ymxpc2gobWVzc2FnZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19wdWJsaXNoX18obWVzc2FnZSk7XG5cdCAgICB9XG5cblx0ICAgIGRpc2Nvbm5lY3QoZmx1c2ggPSB0cnVlKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX2Rpc2Nvbm5lY3RfXyhmbHVzaCk7XG5cdCAgICB9XG5cblx0ICAgIGNoYWluKF9saW1pdGVyKSB7XG5cdCAgICAgIHRoaXMuX2xpbWl0ZXIgPSBfbGltaXRlcjtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cblx0ICAgIHF1ZXVlZChwcmlvcml0eSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcXVldWVzLnF1ZXVlZChwcmlvcml0eSk7XG5cdCAgICB9XG5cblx0ICAgIGNsdXN0ZXJRdWV1ZWQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX3F1ZXVlZF9fKCk7XG5cdCAgICB9XG5cblx0ICAgIGVtcHR5KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5xdWV1ZWQoKSA9PT0gMCAmJiB0aGlzLl9zdWJtaXRMb2NrLmlzRW1wdHkoKTtcblx0ICAgIH1cblxuXHQgICAgcnVubmluZygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLl9fcnVubmluZ19fKCk7XG5cdCAgICB9XG5cblx0ICAgIGRvbmUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX2RvbmVfXygpO1xuXHQgICAgfVxuXG5cdCAgICBqb2JTdGF0dXMoaWQpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5qb2JTdGF0dXMoaWQpO1xuXHQgICAgfVxuXG5cdCAgICBqb2JzKHN0YXR1cykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnN0YXR1c0pvYnMoc3RhdHVzKTtcblx0ICAgIH1cblxuXHQgICAgY291bnRzKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnN0YXR1c0NvdW50cygpO1xuXHQgICAgfVxuXG5cdCAgICBfcmFuZG9tSW5kZXgoKSB7XG5cdCAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcblx0ICAgIH1cblxuXHQgICAgY2hlY2sod2VpZ2h0ID0gMSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19jaGVja19fKHdlaWdodCk7XG5cdCAgICB9XG5cblx0ICAgIF9jbGVhckdsb2JhbFN0YXRlKGluZGV4KSB7XG5cdCAgICAgIGlmICh0aGlzLl9zY2hlZHVsZWRbaW5kZXhdICE9IG51bGwpIHtcblx0ICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2NoZWR1bGVkW2luZGV4XS5leHBpcmF0aW9uKTtcblx0ICAgICAgICBkZWxldGUgdGhpcy5fc2NoZWR1bGVkW2luZGV4XTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgYXN5bmMgX2ZyZWUoaW5kZXgsIGpvYiwgb3B0aW9ucywgZXZlbnRJbmZvKSB7XG5cdCAgICAgIHZhciBlLCBydW5uaW5nO1xuXHQgICAgICB0cnkge1xuXHQgICAgICAgICh7cnVubmluZ30gPSAoYXdhaXQgdGhpcy5fc3RvcmUuX19mcmVlX18oaW5kZXgsIG9wdGlvbnMud2VpZ2h0KSkpO1xuXHQgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJkZWJ1Z1wiLCBgRnJlZWQgJHtvcHRpb25zLmlkfWAsIGV2ZW50SW5mbyk7XG5cdCAgICAgICAgaWYgKHJ1bm5pbmcgPT09IDAgJiYgdGhpcy5lbXB0eSgpKSB7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcImlkbGVcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcblx0ICAgICAgICBlID0gZXJyb3IxO1xuXHQgICAgICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZXJyb3JcIiwgZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgX3J1bihpbmRleCwgam9iLCB3YWl0KSB7XG5cdCAgICAgIHZhciBjbGVhckdsb2JhbFN0YXRlLCBmcmVlLCBydW47XG5cdCAgICAgIGpvYi5kb1J1bigpO1xuXHQgICAgICBjbGVhckdsb2JhbFN0YXRlID0gdGhpcy5fY2xlYXJHbG9iYWxTdGF0ZS5iaW5kKHRoaXMsIGluZGV4KTtcblx0ICAgICAgcnVuID0gdGhpcy5fcnVuLmJpbmQodGhpcywgaW5kZXgsIGpvYik7XG5cdCAgICAgIGZyZWUgPSB0aGlzLl9mcmVlLmJpbmQodGhpcywgaW5kZXgsIGpvYik7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zY2hlZHVsZWRbaW5kZXhdID0ge1xuXHQgICAgICAgIHRpbWVvdXQ6IHNldFRpbWVvdXQoKCkgPT4ge1xuXHQgICAgICAgICAgcmV0dXJuIGpvYi5kb0V4ZWN1dGUodGhpcy5fbGltaXRlciwgY2xlYXJHbG9iYWxTdGF0ZSwgcnVuLCBmcmVlKTtcblx0ICAgICAgICB9LCB3YWl0KSxcblx0ICAgICAgICBleHBpcmF0aW9uOiBqb2Iub3B0aW9ucy5leHBpcmF0aW9uICE9IG51bGwgPyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgcmV0dXJuIGpvYi5kb0V4cGlyZShjbGVhckdsb2JhbFN0YXRlLCBydW4sIGZyZWUpO1xuXHQgICAgICAgIH0sIHdhaXQgKyBqb2Iub3B0aW9ucy5leHBpcmF0aW9uKSA6IHZvaWQgMCxcblx0ICAgICAgICBqb2I6IGpvYlxuXHQgICAgICB9O1xuXHQgICAgfVxuXG5cdCAgICBfZHJhaW5PbmUoY2FwYWNpdHkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyTG9jay5zY2hlZHVsZSgoKSA9PiB7XG5cdCAgICAgICAgdmFyIGFyZ3MsIGluZGV4LCBuZXh0LCBvcHRpb25zLCBxdWV1ZTtcblx0ICAgICAgICBpZiAodGhpcy5xdWV1ZWQoKSA9PT0gMCkge1xuXHQgICAgICAgICAgcmV0dXJuIHRoaXMuUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBxdWV1ZSA9IHRoaXMuX3F1ZXVlcy5nZXRGaXJzdCgpO1xuXHQgICAgICAgICh7b3B0aW9ucywgYXJnc30gPSBuZXh0ID0gcXVldWUuZmlyc3QoKSk7XG5cdCAgICAgICAgaWYgKChjYXBhY2l0eSAhPSBudWxsKSAmJiBvcHRpb25zLndlaWdodCA+IGNhcGFjaXR5KSB7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJkZWJ1Z1wiLCBgRHJhaW5pbmcgJHtvcHRpb25zLmlkfWAsIHthcmdzLCBvcHRpb25zfSk7XG5cdCAgICAgICAgaW5kZXggPSB0aGlzLl9yYW5kb21JbmRleCgpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX3JlZ2lzdGVyX18oaW5kZXgsIG9wdGlvbnMud2VpZ2h0LCBvcHRpb25zLmV4cGlyYXRpb24pLnRoZW4oKHtzdWNjZXNzLCB3YWl0LCByZXNlcnZvaXJ9KSA9PiB7XG5cdCAgICAgICAgICB2YXIgZW1wdHk7XG5cdCAgICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZGVidWdcIiwgYERyYWluZWQgJHtvcHRpb25zLmlkfWAsIHtzdWNjZXNzLCBhcmdzLCBvcHRpb25zfSk7XG5cdCAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuXHQgICAgICAgICAgICBxdWV1ZS5zaGlmdCgpO1xuXHQgICAgICAgICAgICBlbXB0eSA9IHRoaXMuZW1wdHkoKTtcblx0ICAgICAgICAgICAgaWYgKGVtcHR5KSB7XG5cdCAgICAgICAgICAgICAgdGhpcy5FdmVudHMudHJpZ2dlcihcImVtcHR5XCIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChyZXNlcnZvaXIgPT09IDApIHtcblx0ICAgICAgICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZGVwbGV0ZWRcIiwgZW1wdHkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX3J1bihpbmRleCwgbmV4dCwgd2FpdCk7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZShvcHRpb25zLndlaWdodCk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBfZHJhaW5BbGwoY2FwYWNpdHksIHRvdGFsID0gMCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fZHJhaW5PbmUoY2FwYWNpdHkpLnRoZW4oKGRyYWluZWQpID0+IHtcblx0ICAgICAgICB2YXIgbmV3Q2FwYWNpdHk7XG5cdCAgICAgICAgaWYgKGRyYWluZWQgIT0gbnVsbCkge1xuXHQgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBjYXBhY2l0eSAhPSBudWxsID8gY2FwYWNpdHkgLSBkcmFpbmVkIDogY2FwYWNpdHk7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5fZHJhaW5BbGwobmV3Q2FwYWNpdHksIHRvdGFsICsgZHJhaW5lZCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZSh0b3RhbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuXHQgICAgICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZXJyb3JcIiwgZSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBfZHJvcEFsbFF1ZXVlZChtZXNzYWdlKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9xdWV1ZXMuc2hpZnRBbGwoZnVuY3Rpb24oam9iKSB7XG5cdCAgICAgICAgcmV0dXJuIGpvYi5kb0Ryb3Aoe21lc3NhZ2V9KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cblx0ICAgIHN0b3Aob3B0aW9ucyA9IHt9KSB7XG5cdCAgICAgIHZhciBkb25lLCB3YWl0Rm9yRXhlY3V0aW5nO1xuXHQgICAgICBvcHRpb25zID0gcGFyc2VyJDUubG9hZChvcHRpb25zLCB0aGlzLnN0b3BEZWZhdWx0cyk7XG5cdCAgICAgIHdhaXRGb3JFeGVjdXRpbmcgPSAoYXQpID0+IHtcblx0ICAgICAgICB2YXIgZmluaXNoZWQ7XG5cdCAgICAgICAgZmluaXNoZWQgPSAoKSA9PiB7XG5cdCAgICAgICAgICB2YXIgY291bnRzO1xuXHQgICAgICAgICAgY291bnRzID0gdGhpcy5fc3RhdGVzLmNvdW50cztcblx0ICAgICAgICAgIHJldHVybiAoY291bnRzWzBdICsgY291bnRzWzFdICsgY291bnRzWzJdICsgY291bnRzWzNdKSA9PT0gYXQ7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICByZXR1cm4gbmV3IHRoaXMuUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdCAgICAgICAgICBpZiAoZmluaXNoZWQoKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMub24oXCJkb25lXCIsICgpID0+IHtcblx0ICAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJkb25lXCIpO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9O1xuXHQgICAgICBkb25lID0gb3B0aW9ucy5kcm9wV2FpdGluZ0pvYnMgPyAodGhpcy5fcnVuID0gZnVuY3Rpb24oaW5kZXgsIG5leHQpIHtcblx0ICAgICAgICByZXR1cm4gbmV4dC5kb0Ryb3Aoe1xuXHQgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5kcm9wRXJyb3JNZXNzYWdlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0sIHRoaXMuX2RyYWluT25lID0gKCkgPT4ge1xuXHQgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZShudWxsKTtcblx0ICAgICAgfSwgdGhpcy5fcmVnaXN0ZXJMb2NrLnNjaGVkdWxlKCgpID0+IHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fc3VibWl0TG9jay5zY2hlZHVsZSgoKSA9PiB7XG5cdCAgICAgICAgICB2YXIgaywgcmVmLCB2O1xuXHQgICAgICAgICAgcmVmID0gdGhpcy5fc2NoZWR1bGVkO1xuXHQgICAgICAgICAgZm9yIChrIGluIHJlZikge1xuXHQgICAgICAgICAgICB2ID0gcmVmW2tdO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5qb2JTdGF0dXModi5qb2Iub3B0aW9ucy5pZCkgPT09IFwiUlVOTklOR1wiKSB7XG5cdCAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHYudGltZW91dCk7XG5cdCAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHYuZXhwaXJhdGlvbik7XG5cdCAgICAgICAgICAgICAgdi5qb2IuZG9Ecm9wKHtcblx0ICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMuZHJvcEVycm9yTWVzc2FnZVxuXHQgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLl9kcm9wQWxsUXVldWVkKG9wdGlvbnMuZHJvcEVycm9yTWVzc2FnZSk7XG5cdCAgICAgICAgICByZXR1cm4gd2FpdEZvckV4ZWN1dGluZygwKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSkpIDogdGhpcy5zY2hlZHVsZSh7XG5cdCAgICAgICAgcHJpb3JpdHk6IE5VTV9QUklPUklUSUVTJDEgLSAxLFxuXHQgICAgICAgIHdlaWdodDogMFxuXHQgICAgICB9LCAoKSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIHdhaXRGb3JFeGVjdXRpbmcoMSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9yZWNlaXZlID0gZnVuY3Rpb24oam9iKSB7XG5cdCAgICAgICAgcmV0dXJuIGpvYi5fcmVqZWN0KG5ldyBCb3R0bGVuZWNrLnByb3RvdHlwZS5Cb3R0bGVuZWNrRXJyb3Iob3B0aW9ucy5lbnF1ZXVlRXJyb3JNZXNzYWdlKSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuc3RvcCA9ICgpID0+IHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlamVjdChuZXcgQm90dGxlbmVjay5wcm90b3R5cGUuQm90dGxlbmVja0Vycm9yKFwic3RvcCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkXCIpKTtcblx0ICAgICAgfTtcblx0ICAgICAgcmV0dXJuIGRvbmU7XG5cdCAgICB9XG5cblx0ICAgIGFzeW5jIF9hZGRUb1F1ZXVlKGpvYikge1xuXHQgICAgICB2YXIgYXJncywgYmxvY2tlZCwgZXJyb3IsIG9wdGlvbnMsIHJlYWNoZWRIV00sIHNoaWZ0ZWQsIHN0cmF0ZWd5O1xuXHQgICAgICAoe2FyZ3MsIG9wdGlvbnN9ID0gam9iKTtcblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICAoe3JlYWNoZWRIV00sIGJsb2NrZWQsIHN0cmF0ZWd5fSA9IChhd2FpdCB0aGlzLl9zdG9yZS5fX3N1Ym1pdF9fKHRoaXMucXVldWVkKCksIG9wdGlvbnMud2VpZ2h0KSkpO1xuXHQgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcblx0ICAgICAgICBlcnJvciA9IGVycm9yMTtcblx0ICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZGVidWdcIiwgYENvdWxkIG5vdCBxdWV1ZSAke29wdGlvbnMuaWR9YCwge2FyZ3MsIG9wdGlvbnMsIGVycm9yfSk7XG5cdCAgICAgICAgam9iLmRvRHJvcCh7ZXJyb3J9KTtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGJsb2NrZWQpIHtcblx0ICAgICAgICBqb2IuZG9Ecm9wKCk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH0gZWxzZSBpZiAocmVhY2hlZEhXTSkge1xuXHQgICAgICAgIHNoaWZ0ZWQgPSBzdHJhdGVneSA9PT0gQm90dGxlbmVjay5wcm90b3R5cGUuc3RyYXRlZ3kuTEVBSyA/IHRoaXMuX3F1ZXVlcy5zaGlmdExhc3RGcm9tKG9wdGlvbnMucHJpb3JpdHkpIDogc3RyYXRlZ3kgPT09IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5Lk9WRVJGTE9XX1BSSU9SSVRZID8gdGhpcy5fcXVldWVzLnNoaWZ0TGFzdEZyb20ob3B0aW9ucy5wcmlvcml0eSArIDEpIDogc3RyYXRlZ3kgPT09IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5Lk9WRVJGTE9XID8gam9iIDogdm9pZCAwO1xuXHQgICAgICAgIGlmIChzaGlmdGVkICE9IG51bGwpIHtcblx0ICAgICAgICAgIHNoaWZ0ZWQuZG9Ecm9wKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICgoc2hpZnRlZCA9PSBudWxsKSB8fCBzdHJhdGVneSA9PT0gQm90dGxlbmVjay5wcm90b3R5cGUuc3RyYXRlZ3kuT1ZFUkZMT1cpIHtcblx0ICAgICAgICAgIGlmIChzaGlmdGVkID09IG51bGwpIHtcblx0ICAgICAgICAgICAgam9iLmRvRHJvcCgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIHJlYWNoZWRIV007XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIGpvYi5kb1F1ZXVlKHJlYWNoZWRIV00sIGJsb2NrZWQpO1xuXHQgICAgICB0aGlzLl9xdWV1ZXMucHVzaChqb2IpO1xuXHQgICAgICBhd2FpdCB0aGlzLl9kcmFpbkFsbCgpO1xuXHQgICAgICByZXR1cm4gcmVhY2hlZEhXTTtcblx0ICAgIH1cblxuXHQgICAgX3JlY2VpdmUoam9iKSB7XG5cdCAgICAgIGlmICh0aGlzLl9zdGF0ZXMuam9iU3RhdHVzKGpvYi5vcHRpb25zLmlkKSAhPSBudWxsKSB7XG5cdCAgICAgICAgam9iLl9yZWplY3QobmV3IEJvdHRsZW5lY2sucHJvdG90eXBlLkJvdHRsZW5lY2tFcnJvcihgQSBqb2Igd2l0aCB0aGUgc2FtZSBpZCBhbHJlYWR5IGV4aXN0cyAoaWQ9JHtqb2Iub3B0aW9ucy5pZH0pYCkpO1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBqb2IuZG9SZWNlaXZlKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdExvY2suc2NoZWR1bGUodGhpcy5fYWRkVG9RdWV1ZSwgam9iKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBzdWJtaXQoLi4uYXJncykge1xuXHQgICAgICB2YXIgY2IsIGZuLCBqb2IsIG9wdGlvbnMsIHJlZiwgcmVmMSwgdGFzaztcblx0ICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgICByZWYgPSBhcmdzLCBbZm4sIC4uLmFyZ3NdID0gcmVmLCBbY2JdID0gc3BsaWNlLmNhbGwoYXJncywgLTEpO1xuXHQgICAgICAgIG9wdGlvbnMgPSBwYXJzZXIkNS5sb2FkKHt9LCB0aGlzLmpvYkRlZmF1bHRzKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZWYxID0gYXJncywgW29wdGlvbnMsIGZuLCAuLi5hcmdzXSA9IHJlZjEsIFtjYl0gPSBzcGxpY2UuY2FsbChhcmdzLCAtMSk7XG5cdCAgICAgICAgb3B0aW9ucyA9IHBhcnNlciQ1LmxvYWQob3B0aW9ucywgdGhpcy5qb2JEZWZhdWx0cyk7XG5cdCAgICAgIH1cblx0ICAgICAgdGFzayA9ICguLi5hcmdzKSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyB0aGlzLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdCAgICAgICAgICByZXR1cm4gZm4oLi4uYXJncywgZnVuY3Rpb24oLi4uYXJncykge1xuXHQgICAgICAgICAgICByZXR1cm4gKGFyZ3NbMF0gIT0gbnVsbCA/IHJlamVjdCA6IHJlc29sdmUpKGFyZ3MpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH07XG5cdCAgICAgIGpvYiA9IG5ldyBKb2IkMSh0YXNrLCBhcmdzLCBvcHRpb25zLCB0aGlzLmpvYkRlZmF1bHRzLCB0aGlzLnJlamVjdE9uRHJvcCwgdGhpcy5FdmVudHMsIHRoaXMuX3N0YXRlcywgdGhpcy5Qcm9taXNlKTtcblx0ICAgICAgam9iLnByb21pc2UudGhlbihmdW5jdGlvbihhcmdzKSB7XG5cdCAgICAgICAgcmV0dXJuIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiID8gY2IoLi4uYXJncykgOiB2b2lkIDA7XG5cdCAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGFyZ3MpIHtcblx0ICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSkge1xuXHQgICAgICAgICAgcmV0dXJuIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiID8gY2IoLi4uYXJncykgOiB2b2lkIDA7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiB0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIiA/IGNiKGFyZ3MpIDogdm9pZCAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzLl9yZWNlaXZlKGpvYik7XG5cdCAgICB9XG5cblx0ICAgIHNjaGVkdWxlKC4uLmFyZ3MpIHtcblx0ICAgICAgdmFyIGpvYiwgb3B0aW9ucywgdGFzaztcblx0ICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgICBbdGFzaywgLi4uYXJnc10gPSBhcmdzO1xuXHQgICAgICAgIG9wdGlvbnMgPSB7fTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBbb3B0aW9ucywgdGFzaywgLi4uYXJnc10gPSBhcmdzO1xuXHQgICAgICB9XG5cdCAgICAgIGpvYiA9IG5ldyBKb2IkMSh0YXNrLCBhcmdzLCBvcHRpb25zLCB0aGlzLmpvYkRlZmF1bHRzLCB0aGlzLnJlamVjdE9uRHJvcCwgdGhpcy5FdmVudHMsIHRoaXMuX3N0YXRlcywgdGhpcy5Qcm9taXNlKTtcblx0ICAgICAgdGhpcy5fcmVjZWl2ZShqb2IpO1xuXHQgICAgICByZXR1cm4gam9iLnByb21pc2U7XG5cdCAgICB9XG5cblx0ICAgIHdyYXAoZm4pIHtcblx0ICAgICAgdmFyIHNjaGVkdWxlLCB3cmFwcGVkO1xuXHQgICAgICBzY2hlZHVsZSA9IHRoaXMuc2NoZWR1bGUuYmluZCh0aGlzKTtcblx0ICAgICAgd3JhcHBlZCA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0ICAgICAgICByZXR1cm4gc2NoZWR1bGUoZm4uYmluZCh0aGlzKSwgLi4uYXJncyk7XG5cdCAgICAgIH07XG5cdCAgICAgIHdyYXBwZWQud2l0aE9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zLCAuLi5hcmdzKSB7XG5cdCAgICAgICAgcmV0dXJuIHNjaGVkdWxlKG9wdGlvbnMsIGZuLCAuLi5hcmdzKTtcblx0ICAgICAgfTtcblx0ICAgICAgcmV0dXJuIHdyYXBwZWQ7XG5cdCAgICB9XG5cblx0ICAgIGFzeW5jIHVwZGF0ZVNldHRpbmdzKG9wdGlvbnMgPSB7fSkge1xuXHQgICAgICBhd2FpdCB0aGlzLl9zdG9yZS5fX3VwZGF0ZVNldHRpbmdzX18ocGFyc2VyJDUub3ZlcndyaXRlKG9wdGlvbnMsIHRoaXMuc3RvcmVEZWZhdWx0cykpO1xuXHQgICAgICBwYXJzZXIkNS5vdmVyd3JpdGUob3B0aW9ucywgdGhpcy5pbnN0YW5jZURlZmF1bHRzLCB0aGlzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cblx0ICAgIGN1cnJlbnRSZXNlcnZvaXIoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX2N1cnJlbnRSZXNlcnZvaXJfXygpO1xuXHQgICAgfVxuXG5cdCAgICBpbmNyZW1lbnRSZXNlcnZvaXIoaW5jciA9IDApIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLl9faW5jcmVtZW50UmVzZXJ2b2lyX18oaW5jcik7XG5cdCAgICB9XG5cblx0ICB9XG5cdCAgQm90dGxlbmVjay5kZWZhdWx0ID0gQm90dGxlbmVjaztcblxuXHQgIEJvdHRsZW5lY2suRXZlbnRzID0gRXZlbnRzJDQ7XG5cblx0ICBCb3R0bGVuZWNrLnZlcnNpb24gPSBCb3R0bGVuZWNrLnByb3RvdHlwZS52ZXJzaW9uID0gcmVxdWlyZSQkOC52ZXJzaW9uO1xuXG5cdCAgQm90dGxlbmVjay5zdHJhdGVneSA9IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5ID0ge1xuXHQgICAgTEVBSzogMSxcblx0ICAgIE9WRVJGTE9XOiAyLFxuXHQgICAgT1ZFUkZMT1dfUFJJT1JJVFk6IDQsXG5cdCAgICBCTE9DSzogM1xuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLkJvdHRsZW5lY2tFcnJvciA9IEJvdHRsZW5lY2sucHJvdG90eXBlLkJvdHRsZW5lY2tFcnJvciA9IEJvdHRsZW5lY2tFcnJvcl8xO1xuXG5cdCAgQm90dGxlbmVjay5Hcm91cCA9IEJvdHRsZW5lY2sucHJvdG90eXBlLkdyb3VwID0gR3JvdXBfMTtcblxuXHQgIEJvdHRsZW5lY2suUmVkaXNDb25uZWN0aW9uID0gQm90dGxlbmVjay5wcm90b3R5cGUuUmVkaXNDb25uZWN0aW9uID0gcmVxdWlyZSQkMjtcblxuXHQgIEJvdHRsZW5lY2suSU9SZWRpc0Nvbm5lY3Rpb24gPSBCb3R0bGVuZWNrLnByb3RvdHlwZS5JT1JlZGlzQ29ubmVjdGlvbiA9IHJlcXVpcmUkJDM7XG5cblx0ICBCb3R0bGVuZWNrLkJhdGNoZXIgPSBCb3R0bGVuZWNrLnByb3RvdHlwZS5CYXRjaGVyID0gQmF0Y2hlcl8xO1xuXG5cdCAgQm90dGxlbmVjay5wcm90b3R5cGUuam9iRGVmYXVsdHMgPSB7XG5cdCAgICBwcmlvcml0eTogREVGQVVMVF9QUklPUklUWSQxLFxuXHQgICAgd2VpZ2h0OiAxLFxuXHQgICAgZXhwaXJhdGlvbjogbnVsbCxcblx0ICAgIGlkOiBcIjxuby1pZD5cIlxuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLnByb3RvdHlwZS5zdG9yZURlZmF1bHRzID0ge1xuXHQgICAgbWF4Q29uY3VycmVudDogbnVsbCxcblx0ICAgIG1pblRpbWU6IDAsXG5cdCAgICBoaWdoV2F0ZXI6IG51bGwsXG5cdCAgICBzdHJhdGVneTogQm90dGxlbmVjay5wcm90b3R5cGUuc3RyYXRlZ3kuTEVBSyxcblx0ICAgIHBlbmFsdHk6IG51bGwsXG5cdCAgICByZXNlcnZvaXI6IG51bGwsXG5cdCAgICByZXNlcnZvaXJSZWZyZXNoSW50ZXJ2YWw6IG51bGwsXG5cdCAgICByZXNlcnZvaXJSZWZyZXNoQW1vdW50OiBudWxsLFxuXHQgICAgcmVzZXJ2b2lySW5jcmVhc2VJbnRlcnZhbDogbnVsbCxcblx0ICAgIHJlc2Vydm9pckluY3JlYXNlQW1vdW50OiBudWxsLFxuXHQgICAgcmVzZXJ2b2lySW5jcmVhc2VNYXhpbXVtOiBudWxsXG5cdCAgfTtcblxuXHQgIEJvdHRsZW5lY2sucHJvdG90eXBlLmxvY2FsU3RvcmVEZWZhdWx0cyA9IHtcblx0ICAgIFByb21pc2U6IFByb21pc2UsXG5cdCAgICB0aW1lb3V0OiBudWxsLFxuXHQgICAgaGVhcnRiZWF0SW50ZXJ2YWw6IDI1MFxuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLnByb3RvdHlwZS5yZWRpc1N0b3JlRGVmYXVsdHMgPSB7XG5cdCAgICBQcm9taXNlOiBQcm9taXNlLFxuXHQgICAgdGltZW91dDogbnVsbCxcblx0ICAgIGhlYXJ0YmVhdEludGVydmFsOiA1MDAwLFxuXHQgICAgY2xpZW50VGltZW91dDogMTAwMDAsXG5cdCAgICBSZWRpczogbnVsbCxcblx0ICAgIGNsaWVudE9wdGlvbnM6IHt9LFxuXHQgICAgY2x1c3Rlck5vZGVzOiBudWxsLFxuXHQgICAgY2xlYXJEYXRhc3RvcmU6IGZhbHNlLFxuXHQgICAgY29ubmVjdGlvbjogbnVsbFxuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLnByb3RvdHlwZS5pbnN0YW5jZURlZmF1bHRzID0ge1xuXHQgICAgZGF0YXN0b3JlOiBcImxvY2FsXCIsXG5cdCAgICBjb25uZWN0aW9uOiBudWxsLFxuXHQgICAgaWQ6IFwiPG5vLWlkPlwiLFxuXHQgICAgcmVqZWN0T25Ecm9wOiB0cnVlLFxuXHQgICAgdHJhY2tEb25lU3RhdHVzOiBmYWxzZSxcblx0ICAgIFByb21pc2U6IFByb21pc2Vcblx0ICB9O1xuXG5cdCAgQm90dGxlbmVjay5wcm90b3R5cGUuc3RvcERlZmF1bHRzID0ge1xuXHQgICAgZW5xdWV1ZUVycm9yTWVzc2FnZTogXCJUaGlzIGxpbWl0ZXIgaGFzIGJlZW4gc3RvcHBlZCBhbmQgY2Fubm90IGFjY2VwdCBuZXcgam9icy5cIixcblx0ICAgIGRyb3BXYWl0aW5nSm9iczogdHJ1ZSxcblx0ICAgIGRyb3BFcnJvck1lc3NhZ2U6IFwiVGhpcyBsaW1pdGVyIGhhcyBiZWVuIHN0b3BwZWQuXCJcblx0ICB9O1xuXG5cdCAgcmV0dXJuIEJvdHRsZW5lY2s7XG5cblx0fSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG5cblx0dmFyIEJvdHRsZW5lY2tfMSA9IEJvdHRsZW5lY2s7XG5cblx0dmFyIGxpYiA9IEJvdHRsZW5lY2tfMTtcblxuXHRyZXR1cm4gbGliO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///68454\n')},86512:module=>{eval("module.exports = Buffers;\n\nfunction Buffers (bufs) {\n if (!(this instanceof Buffers)) return new Buffers(bufs);\n this.buffers = bufs || [];\n this.length = this.buffers.reduce(function (size, buf) {\n return size + buf.length\n }, 0);\n}\n\nBuffers.prototype.push = function () {\n for (var i = 0; i < arguments.length; i++) {\n if (!Buffer.isBuffer(arguments[i])) {\n throw new TypeError('Tried to push a non-buffer');\n }\n }\n \n for (var i = 0; i < arguments.length; i++) {\n var buf = arguments[i];\n this.buffers.push(buf);\n this.length += buf.length;\n }\n return this.length;\n};\n\nBuffers.prototype.unshift = function () {\n for (var i = 0; i < arguments.length; i++) {\n if (!Buffer.isBuffer(arguments[i])) {\n throw new TypeError('Tried to unshift a non-buffer');\n }\n }\n \n for (var i = 0; i < arguments.length; i++) {\n var buf = arguments[i];\n this.buffers.unshift(buf);\n this.length += buf.length;\n }\n return this.length;\n};\n\nBuffers.prototype.copy = function (dst, dStart, start, end) {\n return this.slice(start, end).copy(dst, dStart, 0, end - start);\n};\n\nBuffers.prototype.splice = function (i, howMany) {\n var buffers = this.buffers;\n var index = i >= 0 ? i : this.length - i;\n var reps = [].slice.call(arguments, 2);\n \n if (howMany === undefined) {\n howMany = this.length - index;\n }\n else if (howMany > this.length - index) {\n howMany = this.length - index;\n }\n \n for (var i = 0; i < reps.length; i++) {\n this.length += reps[i].length;\n }\n \n var removed = new Buffers();\n var bytes = 0;\n \n var startBytes = 0;\n for (\n var ii = 0;\n ii < buffers.length && startBytes + buffers[ii].length < index;\n ii ++\n ) { startBytes += buffers[ii].length }\n \n if (index - startBytes > 0) {\n var start = index - startBytes;\n \n if (start + howMany < buffers[ii].length) {\n removed.push(buffers[ii].slice(start, start + howMany));\n \n var orig = buffers[ii];\n //var buf = new Buffer(orig.length - howMany);\n var buf0 = new Buffer(start);\n for (var i = 0; i < start; i++) {\n buf0[i] = orig[i];\n }\n \n var buf1 = new Buffer(orig.length - start - howMany);\n for (var i = start + howMany; i < orig.length; i++) {\n buf1[ i - howMany - start ] = orig[i]\n }\n \n if (reps.length > 0) {\n var reps_ = reps.slice();\n reps_.unshift(buf0);\n reps_.push(buf1);\n buffers.splice.apply(buffers, [ ii, 1 ].concat(reps_));\n ii += reps_.length;\n reps = [];\n }\n else {\n buffers.splice(ii, 1, buf0, buf1);\n //buffers[ii] = buf;\n ii += 2;\n }\n }\n else {\n removed.push(buffers[ii].slice(start));\n buffers[ii] = buffers[ii].slice(0, start);\n ii ++;\n }\n }\n \n if (reps.length > 0) {\n buffers.splice.apply(buffers, [ ii, 0 ].concat(reps));\n ii += reps.length;\n }\n \n while (removed.length < howMany) {\n var buf = buffers[ii];\n var len = buf.length;\n var take = Math.min(len, howMany - removed.length);\n \n if (take === len) {\n removed.push(buf);\n buffers.splice(ii, 1);\n }\n else {\n removed.push(buf.slice(0, take));\n buffers[ii] = buffers[ii].slice(take);\n }\n }\n \n this.length -= removed.length;\n \n return removed;\n};\n \nBuffers.prototype.slice = function (i, j) {\n var buffers = this.buffers;\n if (j === undefined) j = this.length;\n if (i === undefined) i = 0;\n \n if (j > this.length) j = this.length;\n \n var startBytes = 0;\n for (\n var si = 0;\n si < buffers.length && startBytes + buffers[si].length <= i;\n si ++\n ) { startBytes += buffers[si].length }\n \n var target = new Buffer(j - i);\n \n var ti = 0;\n for (var ii = si; ti < j - i && ii < buffers.length; ii++) {\n var len = buffers[ii].length;\n \n var start = ti === 0 ? i - startBytes : 0;\n var end = ti + len >= j - i\n ? Math.min(start + (j - i) - ti, len)\n : len\n ;\n \n buffers[ii].copy(target, ti, start, end);\n ti += end - start;\n }\n \n return target;\n};\n\nBuffers.prototype.pos = function (i) {\n if (i < 0 || i >= this.length) throw new Error('oob');\n var l = i, bi = 0, bu = null;\n for (;;) {\n bu = this.buffers[bi];\n if (l < bu.length) {\n return {buf: bi, offset: l};\n } else {\n l -= bu.length;\n }\n bi++;\n }\n};\n\nBuffers.prototype.get = function get (i) {\n var pos = this.pos(i);\n\n return this.buffers[pos.buf].get(pos.offset);\n};\n\nBuffers.prototype.set = function set (i, b) {\n var pos = this.pos(i);\n\n return this.buffers[pos.buf].set(pos.offset, b);\n};\n\nBuffers.prototype.indexOf = function (needle, offset) {\n if (\"string\" === typeof needle) {\n needle = new Buffer(needle);\n } else if (needle instanceof Buffer) {\n // already a buffer\n } else {\n throw new Error('Invalid type for a search string');\n }\n\n if (!needle.length) {\n return 0;\n }\n\n if (!this.length) {\n return -1;\n }\n\n var i = 0, j = 0, match = 0, mstart, pos = 0;\n\n // start search from a particular point in the virtual buffer\n if (offset) {\n var p = this.pos(offset);\n i = p.buf;\n j = p.offset;\n pos = offset;\n }\n\n // for each character in virtual buffer\n for (;;) {\n while (j >= this.buffers[i].length) {\n j = 0;\n i++;\n\n if (i >= this.buffers.length) {\n // search string not found\n return -1;\n }\n }\n\n var char = this.buffers[i][j];\n\n if (char == needle[match]) {\n // keep track where match started\n if (match == 0) {\n mstart = {\n i: i,\n j: j,\n pos: pos\n };\n }\n match++;\n if (match == needle.length) {\n // full match\n return mstart.pos;\n }\n } else if (match != 0) {\n // a partial match ended, go back to match starting position\n // this will continue the search at the next character\n i = mstart.i;\n j = mstart.j;\n pos = mstart.pos;\n match = 0;\n }\n\n j++;\n pos++;\n }\n};\n\nBuffers.prototype.toBuffer = function() {\n return this.slice();\n}\n\nBuffers.prototype.toString = function(encoding, start, end) {\n return this.slice(start, end).toString(encoding);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODY1MTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLGlCQUFpQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixtQ0FBbUM7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9idWZmZXJzL2luZGV4LmpzPzE3ZDkiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBCdWZmZXJzO1xuXG5mdW5jdGlvbiBCdWZmZXJzIChidWZzKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcnMpKSByZXR1cm4gbmV3IEJ1ZmZlcnMoYnVmcyk7XG4gICAgdGhpcy5idWZmZXJzID0gYnVmcyB8fCBbXTtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmZmVycy5yZWR1Y2UoZnVuY3Rpb24gKHNpemUsIGJ1Zikge1xuICAgICAgICByZXR1cm4gc2l6ZSArIGJ1Zi5sZW5ndGhcbiAgICB9LCAwKTtcbn1cblxuQnVmZmVycy5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhcmd1bWVudHNbaV0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBwdXNoIGEgbm9uLWJ1ZmZlcicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBidWYgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIHRoaXMuYnVmZmVycy5wdXNoKGJ1Zik7XG4gICAgICAgIHRoaXMubGVuZ3RoICs9IGJ1Zi5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYXJndW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gdW5zaGlmdCBhIG5vbi1idWZmZXInKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMudW5zaGlmdChidWYpO1xuICAgICAgICB0aGlzLmxlbmd0aCArPSBidWYubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKGRzdCwgZFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2Uoc3RhcnQsIGVuZCkuY29weShkc3QsIGRTdGFydCwgMCwgZW5kIC0gc3RhcnQpO1xufTtcblxuQnVmZmVycy5wcm90b3R5cGUuc3BsaWNlID0gZnVuY3Rpb24gKGksIGhvd01hbnkpIHtcbiAgICB2YXIgYnVmZmVycyA9IHRoaXMuYnVmZmVycztcbiAgICB2YXIgaW5kZXggPSBpID49IDAgPyBpIDogdGhpcy5sZW5ndGggLSBpO1xuICAgIHZhciByZXBzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIFxuICAgIGlmIChob3dNYW55ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaG93TWFueSA9IHRoaXMubGVuZ3RoIC0gaW5kZXg7XG4gICAgfVxuICAgIGVsc2UgaWYgKGhvd01hbnkgPiB0aGlzLmxlbmd0aCAtIGluZGV4KSB7XG4gICAgICAgIGhvd01hbnkgPSB0aGlzLmxlbmd0aCAtIGluZGV4O1xuICAgIH1cbiAgICBcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5sZW5ndGggKz0gcmVwc1tpXS5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHZhciByZW1vdmVkID0gbmV3IEJ1ZmZlcnMoKTtcbiAgICB2YXIgYnl0ZXMgPSAwO1xuICAgIFxuICAgIHZhciBzdGFydEJ5dGVzID0gMDtcbiAgICBmb3IgKFxuICAgICAgICB2YXIgaWkgPSAwO1xuICAgICAgICBpaSA8IGJ1ZmZlcnMubGVuZ3RoICYmIHN0YXJ0Qnl0ZXMgKyBidWZmZXJzW2lpXS5sZW5ndGggPCBpbmRleDtcbiAgICAgICAgaWkgKytcbiAgICApIHsgc3RhcnRCeXRlcyArPSBidWZmZXJzW2lpXS5sZW5ndGggfVxuICAgIFxuICAgIGlmIChpbmRleCAtIHN0YXJ0Qnl0ZXMgPiAwKSB7XG4gICAgICAgIHZhciBzdGFydCA9IGluZGV4IC0gc3RhcnRCeXRlcztcbiAgICAgICAgXG4gICAgICAgIGlmIChzdGFydCArIGhvd01hbnkgPCBidWZmZXJzW2lpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChidWZmZXJzW2lpXS5zbGljZShzdGFydCwgc3RhcnQgKyBob3dNYW55KSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBvcmlnID0gYnVmZmVyc1tpaV07XG4gICAgICAgICAgICAvL3ZhciBidWYgPSBuZXcgQnVmZmVyKG9yaWcubGVuZ3RoIC0gaG93TWFueSk7XG4gICAgICAgICAgICB2YXIgYnVmMCA9IG5ldyBCdWZmZXIoc3RhcnQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVmMFtpXSA9IG9yaWdbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBidWYxID0gbmV3IEJ1ZmZlcihvcmlnLmxlbmd0aCAtIHN0YXJ0IC0gaG93TWFueSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQgKyBob3dNYW55OyBpIDwgb3JpZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGJ1ZjFbIGkgLSBob3dNYW55IC0gc3RhcnQgXSA9IG9yaWdbaV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciByZXBzXyA9IHJlcHMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICByZXBzXy51bnNoaWZ0KGJ1ZjApO1xuICAgICAgICAgICAgICAgIHJlcHNfLnB1c2goYnVmMSk7XG4gICAgICAgICAgICAgICAgYnVmZmVycy5zcGxpY2UuYXBwbHkoYnVmZmVycywgWyBpaSwgMSBdLmNvbmNhdChyZXBzXykpO1xuICAgICAgICAgICAgICAgIGlpICs9IHJlcHNfLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXBzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZmZXJzLnNwbGljZShpaSwgMSwgYnVmMCwgYnVmMSk7XG4gICAgICAgICAgICAgICAgLy9idWZmZXJzW2lpXSA9IGJ1ZjtcbiAgICAgICAgICAgICAgICBpaSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGJ1ZmZlcnNbaWldLnNsaWNlKHN0YXJ0KSk7XG4gICAgICAgICAgICBidWZmZXJzW2lpXSA9IGJ1ZmZlcnNbaWldLnNsaWNlKDAsIHN0YXJ0KTtcbiAgICAgICAgICAgIGlpICsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChyZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYnVmZmVycy5zcGxpY2UuYXBwbHkoYnVmZmVycywgWyBpaSwgMCBdLmNvbmNhdChyZXBzKSk7XG4gICAgICAgIGlpICs9IHJlcHMubGVuZ3RoO1xuICAgIH1cbiAgICBcbiAgICB3aGlsZSAocmVtb3ZlZC5sZW5ndGggPCBob3dNYW55KSB7XG4gICAgICAgIHZhciBidWYgPSBidWZmZXJzW2lpXTtcbiAgICAgICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIHZhciB0YWtlID0gTWF0aC5taW4obGVuLCBob3dNYW55IC0gcmVtb3ZlZC5sZW5ndGgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHRha2UgPT09IGxlbikge1xuICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGJ1Zik7XG4gICAgICAgICAgICBidWZmZXJzLnNwbGljZShpaSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVkLnB1c2goYnVmLnNsaWNlKDAsIHRha2UpKTtcbiAgICAgICAgICAgIGJ1ZmZlcnNbaWldID0gYnVmZmVyc1tpaV0uc2xpY2UodGFrZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5sZW5ndGggLT0gcmVtb3ZlZC5sZW5ndGg7XG4gICAgXG4gICAgcmV0dXJuIHJlbW92ZWQ7XG59O1xuIFxuQnVmZmVycy5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiAoaSwgaikge1xuICAgIHZhciBidWZmZXJzID0gdGhpcy5idWZmZXJzO1xuICAgIGlmIChqID09PSB1bmRlZmluZWQpIGogPSB0aGlzLmxlbmd0aDtcbiAgICBpZiAoaSA9PT0gdW5kZWZpbmVkKSBpID0gMDtcbiAgICBcbiAgICBpZiAoaiA+IHRoaXMubGVuZ3RoKSBqID0gdGhpcy5sZW5ndGg7XG4gICAgXG4gICAgdmFyIHN0YXJ0Qnl0ZXMgPSAwO1xuICAgIGZvciAoXG4gICAgICAgIHZhciBzaSA9IDA7XG4gICAgICAgIHNpIDwgYnVmZmVycy5sZW5ndGggJiYgc3RhcnRCeXRlcyArIGJ1ZmZlcnNbc2ldLmxlbmd0aCA8PSBpO1xuICAgICAgICBzaSArK1xuICAgICkgeyBzdGFydEJ5dGVzICs9IGJ1ZmZlcnNbc2ldLmxlbmd0aCB9XG4gICAgXG4gICAgdmFyIHRhcmdldCA9IG5ldyBCdWZmZXIoaiAtIGkpO1xuICAgIFxuICAgIHZhciB0aSA9IDA7XG4gICAgZm9yICh2YXIgaWkgPSBzaTsgdGkgPCBqIC0gaSAmJiBpaSA8IGJ1ZmZlcnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXJzW2lpXS5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICB2YXIgc3RhcnQgPSB0aSA9PT0gMCA/IGkgLSBzdGFydEJ5dGVzIDogMDtcbiAgICAgICAgdmFyIGVuZCA9IHRpICsgbGVuID49IGogLSBpXG4gICAgICAgICAgICA/IE1hdGgubWluKHN0YXJ0ICsgKGogLSBpKSAtIHRpLCBsZW4pXG4gICAgICAgICAgICA6IGxlblxuICAgICAgICA7XG4gICAgICAgIFxuICAgICAgICBidWZmZXJzW2lpXS5jb3B5KHRhcmdldCwgdGksIHN0YXJ0LCBlbmQpO1xuICAgICAgICB0aSArPSBlbmQgLSBzdGFydDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uIChpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignb29iJyk7XG4gICAgdmFyIGwgPSBpLCBiaSA9IDAsIGJ1ID0gbnVsbDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGJ1ID0gdGhpcy5idWZmZXJzW2JpXTtcbiAgICAgICAgaWYgKGwgPCBidS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7YnVmOiBiaSwgb2Zmc2V0OiBsfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgLT0gYnUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGJpKys7XG4gICAgfVxufTtcblxuQnVmZmVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpKSB7XG4gICAgdmFyIHBvcyA9IHRoaXMucG9zKGkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyc1twb3MuYnVmXS5nZXQocG9zLm9mZnNldCk7XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKGksIGIpIHtcbiAgICB2YXIgcG9zID0gdGhpcy5wb3MoaSk7XG5cbiAgICByZXR1cm4gdGhpcy5idWZmZXJzW3Bvcy5idWZdLnNldChwb3Mub2Zmc2V0LCBiKTtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAobmVlZGxlLCBvZmZzZXQpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5lZWRsZSkge1xuICAgICAgICBuZWVkbGUgPSBuZXcgQnVmZmVyKG5lZWRsZSk7XG4gICAgfSBlbHNlIGlmIChuZWVkbGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgLy8gYWxyZWFkeSBhIGJ1ZmZlclxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0eXBlIGZvciBhIHNlYXJjaCBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIW5lZWRsZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgdmFyIGkgPSAwLCBqID0gMCwgbWF0Y2ggPSAwLCBtc3RhcnQsIHBvcyA9IDA7XG5cbiAgICAvLyBzdGFydCBzZWFyY2ggZnJvbSBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlIHZpcnR1YWwgYnVmZmVyXG4gICAgaWYgKG9mZnNldCkge1xuICAgICAgICB2YXIgcCA9IHRoaXMucG9zKG9mZnNldCk7XG4gICAgICAgIGkgPSBwLmJ1ZjtcbiAgICAgICAgaiA9IHAub2Zmc2V0O1xuICAgICAgICBwb3MgPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgLy8gZm9yIGVhY2ggY2hhcmFjdGVyIGluIHZpcnR1YWwgYnVmZmVyXG4gICAgZm9yICg7Oykge1xuICAgICAgICB3aGlsZSAoaiA+PSB0aGlzLmJ1ZmZlcnNbaV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgaWYgKGkgPj0gdGhpcy5idWZmZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBzdHJpbmcgbm90IGZvdW5kXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYXIgPSB0aGlzLmJ1ZmZlcnNbaV1bal07XG5cbiAgICAgICAgaWYgKGNoYXIgPT0gbmVlZGxlW21hdGNoXSkge1xuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayB3aGVyZSBtYXRjaCBzdGFydGVkXG4gICAgICAgICAgICBpZiAobWF0Y2ggPT0gMCkge1xuICAgICAgICAgICAgICAgIG1zdGFydCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaTogaSxcbiAgICAgICAgICAgICAgICAgICAgajogaixcbiAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3NcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWF0Y2grKztcbiAgICAgICAgICAgIGlmIChtYXRjaCA9PSBuZWVkbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gZnVsbCBtYXRjaFxuICAgICAgICAgICAgICAgIHJldHVybiBtc3RhcnQucG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoICE9IDApIHtcbiAgICAgICAgICAgIC8vIGEgcGFydGlhbCBtYXRjaCBlbmRlZCwgZ28gYmFjayB0byBtYXRjaCBzdGFydGluZyBwb3NpdGlvblxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGNvbnRpbnVlIHRoZSBzZWFyY2ggYXQgdGhlIG5leHQgY2hhcmFjdGVyXG4gICAgICAgICAgICBpID0gbXN0YXJ0Lmk7XG4gICAgICAgICAgICBqID0gbXN0YXJ0Lmo7XG4gICAgICAgICAgICBwb3MgPSBtc3RhcnQucG9zO1xuICAgICAgICAgICAgbWF0Y2ggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaisrO1xuICAgICAgICBwb3MrKztcbiAgICB9XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNsaWNlKCk7XG59XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///86512\n")},54787:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Traverse = __webpack_require__(36623);\nvar EventEmitter = (__webpack_require__(24434).EventEmitter);\n\nmodule.exports = Chainsaw;\nfunction Chainsaw (builder) {\n var saw = Chainsaw.saw(builder, {});\n var r = builder.call(saw.handlers, saw);\n if (r !== undefined) saw.handlers = r;\n saw.record();\n return saw.chain();\n};\n\nChainsaw.light = function ChainsawLight (builder) {\n var saw = Chainsaw.saw(builder, {});\n var r = builder.call(saw.handlers, saw);\n if (r !== undefined) saw.handlers = r;\n return saw.chain();\n};\n\nChainsaw.saw = function (builder, handlers) {\n var saw = new EventEmitter;\n saw.handlers = handlers;\n saw.actions = [];\n\n saw.chain = function () {\n var ch = Traverse(saw.handlers).map(function (node) {\n if (this.isRoot) return node;\n var ps = this.path;\n\n if (typeof node === 'function') {\n this.update(function () {\n saw.actions.push({\n path : ps,\n args : [].slice.call(arguments)\n });\n return ch;\n });\n }\n });\n\n process.nextTick(function () {\n saw.emit('begin');\n saw.next();\n });\n\n return ch;\n };\n\n saw.pop = function () {\n return saw.actions.shift();\n };\n\n saw.next = function () {\n var action = saw.pop();\n\n if (!action) {\n saw.emit('end');\n }\n else if (!action.trap) {\n var node = saw.handlers;\n action.path.forEach(function (key) { node = node[key] });\n node.apply(saw.handlers, action.args);\n }\n };\n\n saw.nest = function (cb) {\n var args = [].slice.call(arguments, 1);\n var autonext = true;\n\n if (typeof cb === 'boolean') {\n var autonext = cb;\n cb = args.shift();\n }\n\n var s = Chainsaw.saw(builder, {});\n var r = builder.call(s.handlers, s);\n\n if (r !== undefined) s.handlers = r;\n\n // If we are recording...\n if (\"undefined\" !== typeof saw.step) {\n // ... our children should, too\n s.record();\n }\n\n cb.apply(s.chain(), args);\n if (autonext !== false) s.on('end', saw.next);\n };\n\n saw.record = function () {\n upgradeChainsaw(saw);\n };\n\n ['trap', 'down', 'jump'].forEach(function (method) {\n saw[method] = function () {\n throw new Error(\"To use the trap, down and jump features, please \"+\n \"call record() first to start recording actions.\");\n };\n });\n\n return saw;\n};\n\nfunction upgradeChainsaw(saw) {\n saw.step = 0;\n\n // override pop\n saw.pop = function () {\n return saw.actions[saw.step++];\n };\n\n saw.trap = function (name, cb) {\n var ps = Array.isArray(name) ? name : [name];\n saw.actions.push({\n path : ps,\n step : saw.step,\n cb : cb,\n trap : true\n });\n };\n\n saw.down = function (name) {\n var ps = (Array.isArray(name) ? name : [name]).join('/');\n var i = saw.actions.slice(saw.step).map(function (x) {\n if (x.trap && x.step <= saw.step) return false;\n return x.path.join('/') == ps;\n }).indexOf(true);\n\n if (i >= 0) saw.step += i;\n else saw.step = saw.actions.length;\n\n var act = saw.actions[saw.step - 1];\n if (act && act.trap) {\n // It's a trap!\n saw.step = act.step;\n act.cb();\n }\n else saw.next();\n };\n\n saw.jump = function (step) {\n saw.step = step;\n saw.next();\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ3ODcuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQVU7QUFDakMsbUJBQW1CLHlDQUE4Qjs7QUFFakQ7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGtCQUFrQjtBQUNuRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9jaGFpbnNhdy9pbmRleC5qcz82MzAyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBUcmF2ZXJzZSA9IHJlcXVpcmUoJ3RyYXZlcnNlJyk7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENoYWluc2F3O1xuZnVuY3Rpb24gQ2hhaW5zYXcgKGJ1aWxkZXIpIHtcbiAgICB2YXIgc2F3ID0gQ2hhaW5zYXcuc2F3KGJ1aWxkZXIsIHt9KTtcbiAgICB2YXIgciA9IGJ1aWxkZXIuY2FsbChzYXcuaGFuZGxlcnMsIHNhdyk7XG4gICAgaWYgKHIgIT09IHVuZGVmaW5lZCkgc2F3LmhhbmRsZXJzID0gcjtcbiAgICBzYXcucmVjb3JkKCk7XG4gICAgcmV0dXJuIHNhdy5jaGFpbigpO1xufTtcblxuQ2hhaW5zYXcubGlnaHQgPSBmdW5jdGlvbiBDaGFpbnNhd0xpZ2h0IChidWlsZGVyKSB7XG4gICAgdmFyIHNhdyA9IENoYWluc2F3LnNhdyhidWlsZGVyLCB7fSk7XG4gICAgdmFyIHIgPSBidWlsZGVyLmNhbGwoc2F3LmhhbmRsZXJzLCBzYXcpO1xuICAgIGlmIChyICE9PSB1bmRlZmluZWQpIHNhdy5oYW5kbGVycyA9IHI7XG4gICAgcmV0dXJuIHNhdy5jaGFpbigpO1xufTtcblxuQ2hhaW5zYXcuc2F3ID0gZnVuY3Rpb24gKGJ1aWxkZXIsIGhhbmRsZXJzKSB7XG4gICAgdmFyIHNhdyA9IG5ldyBFdmVudEVtaXR0ZXI7XG4gICAgc2F3LmhhbmRsZXJzID0gaGFuZGxlcnM7XG4gICAgc2F3LmFjdGlvbnMgPSBbXTtcblxuICAgIHNhdy5jaGFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoID0gVHJhdmVyc2Uoc2F3LmhhbmRsZXJzKS5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUm9vdCkgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB2YXIgcHMgPSB0aGlzLnBhdGg7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2F3LmFjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoIDogcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzIDogW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2F3LmVtaXQoJ2JlZ2luJyk7XG4gICAgICAgICAgICBzYXcubmV4dCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2g7XG4gICAgfTtcblxuICAgIHNhdy5wb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzYXcuYWN0aW9ucy5zaGlmdCgpO1xuICAgIH07XG5cbiAgICBzYXcubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFjdGlvbiA9IHNhdy5wb3AoKTtcblxuICAgICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICAgICAgc2F3LmVtaXQoJ2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFhY3Rpb24udHJhcCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBzYXcuaGFuZGxlcnM7XG4gICAgICAgICAgICBhY3Rpb24ucGF0aC5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgbm9kZSA9IG5vZGVba2V5XSB9KTtcbiAgICAgICAgICAgIG5vZGUuYXBwbHkoc2F3LmhhbmRsZXJzLCBhY3Rpb24uYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc2F3Lm5lc3QgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHZhciBhdXRvbmV4dCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YXIgYXV0b25leHQgPSBjYjtcbiAgICAgICAgICAgIGNiID0gYXJncy5zaGlmdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHMgPSBDaGFpbnNhdy5zYXcoYnVpbGRlciwge30pO1xuICAgICAgICB2YXIgciA9IGJ1aWxkZXIuY2FsbChzLmhhbmRsZXJzLCBzKTtcblxuICAgICAgICBpZiAociAhPT0gdW5kZWZpbmVkKSBzLmhhbmRsZXJzID0gcjtcblxuICAgICAgICAvLyBJZiB3ZSBhcmUgcmVjb3JkaW5nLi4uXG4gICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2Ygc2F3LnN0ZXApIHtcbiAgICAgICAgICAgIC8vIC4uLiBvdXIgY2hpbGRyZW4gc2hvdWxkLCB0b29cbiAgICAgICAgICAgIHMucmVjb3JkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYi5hcHBseShzLmNoYWluKCksIGFyZ3MpO1xuICAgICAgICBpZiAoYXV0b25leHQgIT09IGZhbHNlKSBzLm9uKCdlbmQnLCBzYXcubmV4dCk7XG4gICAgfTtcblxuICAgIHNhdy5yZWNvcmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHVwZ3JhZGVDaGFpbnNhdyhzYXcpO1xuICAgIH07XG5cbiAgICBbJ3RyYXAnLCAnZG93bicsICdqdW1wJ10uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHNhd1ttZXRob2RdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG8gdXNlIHRoZSB0cmFwLCBkb3duIGFuZCBqdW1wIGZlYXR1cmVzLCBwbGVhc2UgXCIrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjYWxsIHJlY29yZCgpIGZpcnN0IHRvIHN0YXJ0IHJlY29yZGluZyBhY3Rpb25zLlwiKTtcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzYXc7XG59O1xuXG5mdW5jdGlvbiB1cGdyYWRlQ2hhaW5zYXcoc2F3KSB7XG4gICAgc2F3LnN0ZXAgPSAwO1xuXG4gICAgLy8gb3ZlcnJpZGUgcG9wXG4gICAgc2F3LnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNhdy5hY3Rpb25zW3Nhdy5zdGVwKytdO1xuICAgIH07XG5cbiAgICBzYXcudHJhcCA9IGZ1bmN0aW9uIChuYW1lLCBjYikge1xuICAgICAgICB2YXIgcHMgPSBBcnJheS5pc0FycmF5KG5hbWUpID8gbmFtZSA6IFtuYW1lXTtcbiAgICAgICAgc2F3LmFjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBwYXRoIDogcHMsXG4gICAgICAgICAgICBzdGVwIDogc2F3LnN0ZXAsXG4gICAgICAgICAgICBjYiA6IGNiLFxuICAgICAgICAgICAgdHJhcCA6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNhdy5kb3duID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIHBzID0gKEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lIDogW25hbWVdKS5qb2luKCcvJyk7XG4gICAgICAgIHZhciBpID0gc2F3LmFjdGlvbnMuc2xpY2Uoc2F3LnN0ZXApLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgaWYgKHgudHJhcCAmJiB4LnN0ZXAgPD0gc2F3LnN0ZXApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB4LnBhdGguam9pbignLycpID09IHBzO1xuICAgICAgICB9KS5pbmRleE9mKHRydWUpO1xuXG4gICAgICAgIGlmIChpID49IDApIHNhdy5zdGVwICs9IGk7XG4gICAgICAgIGVsc2Ugc2F3LnN0ZXAgPSBzYXcuYWN0aW9ucy5sZW5ndGg7XG5cbiAgICAgICAgdmFyIGFjdCA9IHNhdy5hY3Rpb25zW3Nhdy5zdGVwIC0gMV07XG4gICAgICAgIGlmIChhY3QgJiYgYWN0LnRyYXApIHtcbiAgICAgICAgICAgIC8vIEl0J3MgYSB0cmFwIVxuICAgICAgICAgICAgc2F3LnN0ZXAgPSBhY3Quc3RlcDtcbiAgICAgICAgICAgIGFjdC5jYigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Ugc2F3Lm5leHQoKTtcbiAgICB9O1xuXG4gICAgc2F3Lmp1bXAgPSBmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgICBzYXcuc3RlcCA9IHN0ZXA7XG4gICAgICAgIHNhdy5uZXh0KCk7XG4gICAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///54787\n")},80801:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var util = __webpack_require__(39023);\nvar Stream = (__webpack_require__(2203).Stream);\nvar DelayedStream = __webpack_require__(78069);\n\nmodule.exports = CombinedStream;\nfunction CombinedStream() {\n this.writable = false;\n this.readable = true;\n this.dataSize = 0;\n this.maxDataSize = 2 * 1024 * 1024;\n this.pauseStreams = true;\n\n this._released = false;\n this._streams = [];\n this._currentStream = null;\n this._insideLoop = false;\n this._pendingNext = false;\n}\nutil.inherits(CombinedStream, Stream);\n\nCombinedStream.create = function(options) {\n var combinedStream = new this();\n\n options = options || {};\n for (var option in options) {\n combinedStream[option] = options[option];\n }\n\n return combinedStream;\n};\n\nCombinedStream.isStreamLike = function(stream) {\n return (typeof stream !== 'function')\n && (typeof stream !== 'string')\n && (typeof stream !== 'boolean')\n && (typeof stream !== 'number')\n && (!Buffer.isBuffer(stream));\n};\n\nCombinedStream.prototype.append = function(stream) {\n var isStreamLike = CombinedStream.isStreamLike(stream);\n\n if (isStreamLike) {\n if (!(stream instanceof DelayedStream)) {\n var newStream = DelayedStream.create(stream, {\n maxDataSize: Infinity,\n pauseStream: this.pauseStreams,\n });\n stream.on('data', this._checkDataSize.bind(this));\n stream = newStream;\n }\n\n this._handleErrors(stream);\n\n if (this.pauseStreams) {\n stream.pause();\n }\n }\n\n this._streams.push(stream);\n return this;\n};\n\nCombinedStream.prototype.pipe = function(dest, options) {\n Stream.prototype.pipe.call(this, dest, options);\n this.resume();\n return dest;\n};\n\nCombinedStream.prototype._getNext = function() {\n this._currentStream = null;\n\n if (this._insideLoop) {\n this._pendingNext = true;\n return; // defer call\n }\n\n this._insideLoop = true;\n try {\n do {\n this._pendingNext = false;\n this._realGetNext();\n } while (this._pendingNext);\n } finally {\n this._insideLoop = false;\n }\n};\n\nCombinedStream.prototype._realGetNext = function() {\n var stream = this._streams.shift();\n\n\n if (typeof stream == 'undefined') {\n this.end();\n return;\n }\n\n if (typeof stream !== 'function') {\n this._pipeNext(stream);\n return;\n }\n\n var getStream = stream;\n getStream(function(stream) {\n var isStreamLike = CombinedStream.isStreamLike(stream);\n if (isStreamLike) {\n stream.on('data', this._checkDataSize.bind(this));\n this._handleErrors(stream);\n }\n\n this._pipeNext(stream);\n }.bind(this));\n};\n\nCombinedStream.prototype._pipeNext = function(stream) {\n this._currentStream = stream;\n\n var isStreamLike = CombinedStream.isStreamLike(stream);\n if (isStreamLike) {\n stream.on('end', this._getNext.bind(this));\n stream.pipe(this, {end: false});\n return;\n }\n\n var value = stream;\n this.write(value);\n this._getNext();\n};\n\nCombinedStream.prototype._handleErrors = function(stream) {\n var self = this;\n stream.on('error', function(err) {\n self._emitError(err);\n });\n};\n\nCombinedStream.prototype.write = function(data) {\n this.emit('data', data);\n};\n\nCombinedStream.prototype.pause = function() {\n if (!this.pauseStreams) {\n return;\n }\n\n if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();\n this.emit('pause');\n};\n\nCombinedStream.prototype.resume = function() {\n if (!this._released) {\n this._released = true;\n this.writable = true;\n this._getNext();\n }\n\n if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();\n this.emit('resume');\n};\n\nCombinedStream.prototype.end = function() {\n this._reset();\n this.emit('end');\n};\n\nCombinedStream.prototype.destroy = function() {\n this._reset();\n this.emit('close');\n};\n\nCombinedStream.prototype._reset = function() {\n this.writable = false;\n this._streams = [];\n this._currentStream = null;\n};\n\nCombinedStream.prototype._checkDataSize = function() {\n this._updateDataSize();\n if (this.dataSize <= this.maxDataSize) {\n return;\n }\n\n var message =\n 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';\n this._emitError(new Error(message));\n};\n\nCombinedStream.prototype._updateDataSize = function() {\n this.dataSize = 0;\n\n var self = this;\n this._streams.forEach(function(stream) {\n if (!stream.dataSize) {\n return;\n }\n\n self.dataSize += stream.dataSize;\n });\n\n if (this._currentStream && this._currentStream.dataSize) {\n this.dataSize += this._currentStream.dataSize;\n }\n};\n\nCombinedStream.prototype._emitError = function(err) {\n this._reset();\n this.emit('error', err);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODA4MDEuanMiLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxtQkFBTyxDQUFDLEtBQU07QUFDekIsYUFBYSxrQ0FBd0I7QUFDckMsb0JBQW9CLG1CQUFPLENBQUMsS0FBZ0I7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvY29tYmluZWQtc3RyZWFtL2xpYi9jb21iaW5lZF9zdHJlYW0uanM/NWZkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW07XG52YXIgRGVsYXllZFN0cmVhbSA9IHJlcXVpcmUoJ2RlbGF5ZWQtc3RyZWFtJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tYmluZWRTdHJlYW07XG5mdW5jdGlvbiBDb21iaW5lZFN0cmVhbSgpIHtcbiAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgdGhpcy5kYXRhU2l6ZSA9IDA7XG4gIHRoaXMubWF4RGF0YVNpemUgPSAyICogMTAyNCAqIDEwMjQ7XG4gIHRoaXMucGF1c2VTdHJlYW1zID0gdHJ1ZTtcblxuICB0aGlzLl9yZWxlYXNlZCA9IGZhbHNlO1xuICB0aGlzLl9zdHJlYW1zID0gW107XG4gIHRoaXMuX2N1cnJlbnRTdHJlYW0gPSBudWxsO1xuICB0aGlzLl9pbnNpZGVMb29wID0gZmFsc2U7XG4gIHRoaXMuX3BlbmRpbmdOZXh0ID0gZmFsc2U7XG59XG51dGlsLmluaGVyaXRzKENvbWJpbmVkU3RyZWFtLCBTdHJlYW0pO1xuXG5Db21iaW5lZFN0cmVhbS5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBjb21iaW5lZFN0cmVhbSA9IG5ldyB0aGlzKCk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGZvciAodmFyIG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgY29tYmluZWRTdHJlYW1bb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgfVxuXG4gIHJldHVybiBjb21iaW5lZFN0cmVhbTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLmlzU3RyZWFtTGlrZSA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICByZXR1cm4gKHR5cGVvZiBzdHJlYW0gIT09ICdmdW5jdGlvbicpXG4gICAgJiYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKVxuICAgICYmICh0eXBlb2Ygc3RyZWFtICE9PSAnYm9vbGVhbicpXG4gICAgJiYgKHR5cGVvZiBzdHJlYW0gIT09ICdudW1iZXInKVxuICAgICYmICghQnVmZmVyLmlzQnVmZmVyKHN0cmVhbSkpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgaXNTdHJlYW1MaWtlID0gQ29tYmluZWRTdHJlYW0uaXNTdHJlYW1MaWtlKHN0cmVhbSk7XG5cbiAgaWYgKGlzU3RyZWFtTGlrZSkge1xuICAgIGlmICghKHN0cmVhbSBpbnN0YW5jZW9mIERlbGF5ZWRTdHJlYW0pKSB7XG4gICAgICB2YXIgbmV3U3RyZWFtID0gRGVsYXllZFN0cmVhbS5jcmVhdGUoc3RyZWFtLCB7XG4gICAgICAgIG1heERhdGFTaXplOiBJbmZpbml0eSxcbiAgICAgICAgcGF1c2VTdHJlYW06IHRoaXMucGF1c2VTdHJlYW1zLFxuICAgICAgfSk7XG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCB0aGlzLl9jaGVja0RhdGFTaXplLmJpbmQodGhpcykpO1xuICAgICAgc3RyZWFtID0gbmV3U3RyZWFtO1xuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZUVycm9ycyhzdHJlYW0pO1xuXG4gICAgaWYgKHRoaXMucGF1c2VTdHJlYW1zKSB7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9zdHJlYW1zLnB1c2goc3RyZWFtKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIG9wdGlvbnMpIHtcbiAgU3RyZWFtLnByb3RvdHlwZS5waXBlLmNhbGwodGhpcywgZGVzdCwgb3B0aW9ucyk7XG4gIHRoaXMucmVzdW1lKCk7XG4gIHJldHVybiBkZXN0O1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9nZXROZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2N1cnJlbnRTdHJlYW0gPSBudWxsO1xuXG4gIGlmICh0aGlzLl9pbnNpZGVMb29wKSB7XG4gICAgdGhpcy5fcGVuZGluZ05leHQgPSB0cnVlO1xuICAgIHJldHVybjsgLy8gZGVmZXIgY2FsbFxuICB9XG5cbiAgdGhpcy5faW5zaWRlTG9vcCA9IHRydWU7XG4gIHRyeSB7XG4gICAgZG8ge1xuICAgICAgdGhpcy5fcGVuZGluZ05leHQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlYWxHZXROZXh0KCk7XG4gICAgfSB3aGlsZSAodGhpcy5fcGVuZGluZ05leHQpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMuX2luc2lkZUxvb3AgPSBmYWxzZTtcbiAgfVxufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9yZWFsR2V0TmV4dCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RyZWFtID0gdGhpcy5fc3RyZWFtcy5zaGlmdCgpO1xuXG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fcGlwZU5leHQoc3RyZWFtKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ2V0U3RyZWFtID0gc3RyZWFtO1xuICBnZXRTdHJlYW0oZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgdmFyIGlzU3RyZWFtTGlrZSA9IENvbWJpbmVkU3RyZWFtLmlzU3RyZWFtTGlrZShzdHJlYW0pO1xuICAgIGlmIChpc1N0cmVhbUxpa2UpIHtcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIHRoaXMuX2NoZWNrRGF0YVNpemUuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLl9oYW5kbGVFcnJvcnMoc3RyZWFtKTtcbiAgICB9XG5cbiAgICB0aGlzLl9waXBlTmV4dChzdHJlYW0pO1xuICB9LmJpbmQodGhpcykpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9waXBlTmV4dCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB0aGlzLl9jdXJyZW50U3RyZWFtID0gc3RyZWFtO1xuXG4gIHZhciBpc1N0cmVhbUxpa2UgPSBDb21iaW5lZFN0cmVhbS5pc1N0cmVhbUxpa2Uoc3RyZWFtKTtcbiAgaWYgKGlzU3RyZWFtTGlrZSkge1xuICAgIHN0cmVhbS5vbignZW5kJywgdGhpcy5fZ2V0TmV4dC5iaW5kKHRoaXMpKTtcbiAgICBzdHJlYW0ucGlwZSh0aGlzLCB7ZW5kOiBmYWxzZX0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IHN0cmVhbTtcbiAgdGhpcy53cml0ZSh2YWx1ZSk7XG4gIHRoaXMuX2dldE5leHQoKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5faGFuZGxlRXJyb3JzID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuICAgIHNlbGYuX2VtaXRFcnJvcihlcnIpO1xuICB9KTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSk7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLnBhdXNlU3RyZWFtcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmKHRoaXMucGF1c2VTdHJlYW1zICYmIHRoaXMuX2N1cnJlbnRTdHJlYW0gJiYgdHlwZW9mKHRoaXMuX2N1cnJlbnRTdHJlYW0ucGF1c2UpID09ICdmdW5jdGlvbicpIHRoaXMuX2N1cnJlbnRTdHJlYW0ucGF1c2UoKTtcbiAgdGhpcy5lbWl0KCdwYXVzZScpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuX3JlbGVhc2VkKSB7XG4gICAgdGhpcy5fcmVsZWFzZWQgPSB0cnVlO1xuICAgIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICAgIHRoaXMuX2dldE5leHQoKTtcbiAgfVxuXG4gIGlmKHRoaXMucGF1c2VTdHJlYW1zICYmIHRoaXMuX2N1cnJlbnRTdHJlYW0gJiYgdHlwZW9mKHRoaXMuX2N1cnJlbnRTdHJlYW0ucmVzdW1lKSA9PSAnZnVuY3Rpb24nKSB0aGlzLl9jdXJyZW50U3RyZWFtLnJlc3VtZSgpO1xuICB0aGlzLmVtaXQoJ3Jlc3VtZScpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLmVtaXQoJ2VuZCcpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVzZXQoKTtcbiAgdGhpcy5lbWl0KCdjbG9zZScpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gIHRoaXMuX3N0cmVhbXMgPSBbXTtcbiAgdGhpcy5fY3VycmVudFN0cmVhbSA9IG51bGw7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUuX2NoZWNrRGF0YVNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fdXBkYXRlRGF0YVNpemUoKTtcbiAgaWYgKHRoaXMuZGF0YVNpemUgPD0gdGhpcy5tYXhEYXRhU2l6ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtZXNzYWdlID1cbiAgICAnRGVsYXllZFN0cmVhbSNtYXhEYXRhU2l6ZSBvZiAnICsgdGhpcy5tYXhEYXRhU2l6ZSArICcgYnl0ZXMgZXhjZWVkZWQuJztcbiAgdGhpcy5fZW1pdEVycm9yKG5ldyBFcnJvcihtZXNzYWdlKSk7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUuX3VwZGF0ZURhdGFTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGF0YVNpemUgPSAwO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fc3RyZWFtcy5mb3JFYWNoKGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIGlmICghc3RyZWFtLmRhdGFTaXplKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5kYXRhU2l6ZSArPSBzdHJlYW0uZGF0YVNpemU7XG4gIH0pO1xuXG4gIGlmICh0aGlzLl9jdXJyZW50U3RyZWFtICYmIHRoaXMuX2N1cnJlbnRTdHJlYW0uZGF0YVNpemUpIHtcbiAgICB0aGlzLmRhdGFTaXplICs9IHRoaXMuX2N1cnJlbnRTdHJlYW0uZGF0YVNpemU7XG4gIH1cbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fZW1pdEVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///80801\n")},53543:module=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar ArchiveEntry = module.exports = function() {};\n\nArchiveEntry.prototype.getName = function() {};\n\nArchiveEntry.prototype.getSize = function() {};\n\nArchiveEntry.prototype.getLastModifiedDate = function() {};\n\nArchiveEntry.prototype.isDirectory = function() {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM1NDMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvY29tcHJlc3MtY29tbW9ucy9saWIvYXJjaGl2ZXJzL2FyY2hpdmUtZW50cnkuanM/OWIyOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIEFyY2hpdmVFbnRyeSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRMYXN0TW9kaWZpZWREYXRlID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5pc0RpcmVjdG9yeSA9IGZ1bmN0aW9uKCkge307Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///53543\n")},10587:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar inherits = (__webpack_require__(39023).inherits);\nvar isStream = __webpack_require__(31232);\nvar Transform = (__webpack_require__(34478).Transform);\n\nvar ArchiveEntry = __webpack_require__(53543);\nvar util = __webpack_require__(78575);\n\nvar ArchiveOutputStream = module.exports = function(options) {\n if (!(this instanceof ArchiveOutputStream)) {\n return new ArchiveOutputStream(options);\n }\n\n Transform.call(this, options);\n\n this.offset = 0;\n this._archive = {\n finish: false,\n finished: false,\n processing: false\n };\n};\n\ninherits(ArchiveOutputStream, Transform);\n\nArchiveOutputStream.prototype._appendBuffer = function(zae, source, callback) {\n // scaffold only\n};\n\nArchiveOutputStream.prototype._appendStream = function(zae, source, callback) {\n // scaffold only\n};\n\nArchiveOutputStream.prototype._emitErrorCallback = function(err) {\n if (err) {\n this.emit('error', err);\n }\n};\n\nArchiveOutputStream.prototype._finish = function(ae) {\n // scaffold only\n};\n\nArchiveOutputStream.prototype._normalizeEntry = function(ae) {\n // scaffold only\n};\n\nArchiveOutputStream.prototype._transform = function(chunk, encoding, callback) {\n callback(null, chunk);\n};\n\nArchiveOutputStream.prototype.entry = function(ae, source, callback) {\n source = source || null;\n\n if (typeof callback !== 'function') {\n callback = this._emitErrorCallback.bind(this);\n }\n\n if (!(ae instanceof ArchiveEntry)) {\n callback(new Error('not a valid instance of ArchiveEntry'));\n return;\n }\n\n if (this._archive.finish || this._archive.finished) {\n callback(new Error('unacceptable entry after finish'));\n return;\n }\n\n if (this._archive.processing) {\n callback(new Error('already processing an entry'));\n return;\n }\n\n this._archive.processing = true;\n this._normalizeEntry(ae);\n this._entry = ae;\n\n source = util.normalizeInputSource(source);\n\n if (Buffer.isBuffer(source)) {\n this._appendBuffer(ae, source, callback);\n } else if (isStream(source)) {\n this._appendStream(ae, source, callback);\n } else {\n this._archive.processing = false;\n callback(new Error('input source must be valid Stream or Buffer instance'));\n return;\n }\n\n return this;\n};\n\nArchiveOutputStream.prototype.finish = function() {\n if (this._archive.processing) {\n this._archive.finish = true;\n return;\n }\n\n this._finish();\n};\n\nArchiveOutputStream.prototype.getBytesWritten = function() {\n return this.offset;\n};\n\nArchiveOutputStream.prototype.write = function(chunk, cb) {\n if (chunk) {\n this.offset += chunk.length;\n }\n\n return Transform.prototype.write.call(this, chunk, cb);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1ODcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFDQUF3QjtBQUN2QyxlQUFlLG1CQUFPLENBQUMsS0FBVztBQUNsQyxnQkFBZ0Isc0NBQW9DOztBQUVwRCxtQkFBbUIsbUJBQU8sQ0FBQyxLQUFpQjtBQUM1QyxXQUFXLG1CQUFPLENBQUMsS0FBUzs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvYXJjaGl2ZS1vdXRwdXQtc3RyZWFtLmpzPzEwYzIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0cztcbnZhciBpc1N0cmVhbSA9IHJlcXVpcmUoJ2lzLXN0cmVhbScpO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlRyYW5zZm9ybTtcblxudmFyIEFyY2hpdmVFbnRyeSA9IHJlcXVpcmUoJy4vYXJjaGl2ZS1lbnRyeScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyk7XG5cbnZhciBBcmNoaXZlT3V0cHV0U3RyZWFtID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBcmNoaXZlT3V0cHV0U3RyZWFtKSkge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZU91dHB1dFN0cmVhbShvcHRpb25zKTtcbiAgfVxuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMub2Zmc2V0ID0gMDtcbiAgdGhpcy5fYXJjaGl2ZSA9IHtcbiAgICBmaW5pc2g6IGZhbHNlLFxuICAgIGZpbmlzaGVkOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZVxuICB9O1xufTtcblxuaW5oZXJpdHMoQXJjaGl2ZU91dHB1dFN0cmVhbSwgVHJhbnNmb3JtKTtcblxuQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX2FwcGVuZEJ1ZmZlciA9IGZ1bmN0aW9uKHphZSwgc291cmNlLCBjYWxsYmFjaykge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fYXBwZW5kU3RyZWFtID0gZnVuY3Rpb24oemFlLCBzb3VyY2UsIGNhbGxiYWNrKSB7XG4gIC8vIHNjYWZmb2xkIG9ubHlcbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9lbWl0RXJyb3JDYWxsYmFjayA9IGZ1bmN0aW9uKGVycikge1xuICBpZiAoZXJyKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbihhZSkge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fbm9ybWFsaXplRW50cnkgPSBmdW5jdGlvbihhZSkge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayhudWxsLCBjaHVuayk7XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5lbnRyeSA9IGZ1bmN0aW9uKGFlLCBzb3VyY2UsIGNhbGxiYWNrKSB7XG4gIHNvdXJjZSA9IHNvdXJjZSB8fCBudWxsO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IHRoaXMuX2VtaXRFcnJvckNhbGxiYWNrLmJpbmQodGhpcyk7XG4gIH1cblxuICBpZiAoIShhZSBpbnN0YW5jZW9mIEFyY2hpdmVFbnRyeSkpIHtcbiAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ25vdCBhIHZhbGlkIGluc3RhbmNlIG9mIEFyY2hpdmVFbnRyeScpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5fYXJjaGl2ZS5maW5pc2ggfHwgdGhpcy5fYXJjaGl2ZS5maW5pc2hlZCkge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcigndW5hY2NlcHRhYmxlIGVudHJ5IGFmdGVyIGZpbmlzaCcpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nKSB7XG4gICAgY2FsbGJhY2sobmV3IEVycm9yKCdhbHJlYWR5IHByb2Nlc3NpbmcgYW4gZW50cnknKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdGhpcy5fbm9ybWFsaXplRW50cnkoYWUpO1xuICB0aGlzLl9lbnRyeSA9IGFlO1xuXG4gIHNvdXJjZSA9IHV0aWwubm9ybWFsaXplSW5wdXRTb3VyY2Uoc291cmNlKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHtcbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoYWUsIHNvdXJjZSwgY2FsbGJhY2spO1xuICB9IGVsc2UgaWYgKGlzU3RyZWFtKHNvdXJjZSkpIHtcbiAgICB0aGlzLl9hcHBlbmRTdHJlYW0oYWUsIHNvdXJjZSwgY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2FyY2hpdmUucHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcignaW5wdXQgc291cmNlIG11c3QgYmUgdmFsaWQgU3RyZWFtIG9yIEJ1ZmZlciBpbnN0YW5jZScpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nKSB7XG4gICAgdGhpcy5fYXJjaGl2ZS5maW5pc2ggPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX2ZpbmlzaCgpO1xufTtcblxuQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZXNXcml0dGVuID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm9mZnNldDtcbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oY2h1bmssIGNiKSB7XG4gIGlmIChjaHVuaykge1xuICAgIHRoaXMub2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBUcmFuc2Zvcm0ucHJvdG90eXBlLndyaXRlLmNhbGwodGhpcywgY2h1bmssIGNiKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10587\n")},14909:module=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nmodule.exports = {\n WORD: 4,\n DWORD: 8,\n EMPTY: Buffer.alloc(0),\n\n SHORT: 2,\n SHORT_MASK: 0xffff,\n SHORT_SHIFT: 16,\n SHORT_ZERO: Buffer.from(Array(2)),\n LONG: 4,\n LONG_ZERO: Buffer.from(Array(4)),\n\n MIN_VERSION_INITIAL: 10,\n MIN_VERSION_DATA_DESCRIPTOR: 20,\n MIN_VERSION_ZIP64: 45,\n VERSION_MADEBY: 45,\n\n METHOD_STORED: 0,\n METHOD_DEFLATED: 8,\n\n PLATFORM_UNIX: 3,\n PLATFORM_FAT: 0,\n\n SIG_LFH: 0x04034b50,\n SIG_DD: 0x08074b50,\n SIG_CFH: 0x02014b50,\n SIG_EOCD: 0x06054b50,\n SIG_ZIP64_EOCD: 0x06064B50,\n SIG_ZIP64_EOCD_LOC: 0x07064B50,\n\n ZIP64_MAGIC_SHORT: 0xffff,\n ZIP64_MAGIC: 0xffffffff,\n ZIP64_EXTRA_ID: 0x0001,\n\n ZLIB_NO_COMPRESSION: 0,\n ZLIB_BEST_SPEED: 1,\n ZLIB_BEST_COMPRESSION: 9,\n ZLIB_DEFAULT_COMPRESSION: -1,\n\n MODE_MASK: 0xFFF,\n DEFAULT_FILE_MODE: 33188, // 010644 = -rw-r--r-- = S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH\n DEFAULT_DIR_MODE: 16877, // 040755 = drwxr-xr-x = S_IFDIR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH\n\n EXT_FILE_ATTR_DIR: 1106051088, // 010173200020 = drwxr-xr-x = (((S_IFDIR | 0755) << 16) | S_DOS_D)\n EXT_FILE_ATTR_FILE: 2175008800, // 020151000040 = -rw-r--r-- = (((S_IFREG | 0644) << 16) | S_DOS_A) >>> 0\n\n // Unix file types\n S_IFMT: 61440, // 0170000 type of file mask\n S_IFIFO: 4096, // 010000 named pipe (fifo)\n S_IFCHR: 8192, // 020000 character special\n S_IFDIR: 16384, // 040000 directory\n S_IFBLK: 24576, // 060000 block special\n S_IFREG: 32768, // 0100000 regular\n S_IFLNK: 40960, // 0120000 symbolic link\n S_IFSOCK: 49152, // 0140000 socket\n\n // DOS file type flags\n S_DOS_A: 32, // 040 Archive\n S_DOS_D: 16, // 020 Directory\n S_DOS_V: 8, // 010 Volume\n S_DOS_S: 4, // 04 System\n S_DOS_H: 2, // 02 Hidden\n S_DOS_R: 1 // 01 Read Only\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5MDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy96aXAvY29uc3RhbnRzLmpzPzY1NTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBXT1JEOiA0LFxuICBEV09SRDogOCxcbiAgRU1QVFk6IEJ1ZmZlci5hbGxvYygwKSxcblxuICBTSE9SVDogMixcbiAgU0hPUlRfTUFTSzogMHhmZmZmLFxuICBTSE9SVF9TSElGVDogMTYsXG4gIFNIT1JUX1pFUk86IEJ1ZmZlci5mcm9tKEFycmF5KDIpKSxcbiAgTE9ORzogNCxcbiAgTE9OR19aRVJPOiBCdWZmZXIuZnJvbShBcnJheSg0KSksXG5cbiAgTUlOX1ZFUlNJT05fSU5JVElBTDogMTAsXG4gIE1JTl9WRVJTSU9OX0RBVEFfREVTQ1JJUFRPUjogMjAsXG4gIE1JTl9WRVJTSU9OX1pJUDY0OiA0NSxcbiAgVkVSU0lPTl9NQURFQlk6IDQ1LFxuXG4gIE1FVEhPRF9TVE9SRUQ6IDAsXG4gIE1FVEhPRF9ERUZMQVRFRDogOCxcblxuICBQTEFURk9STV9VTklYOiAzLFxuICBQTEFURk9STV9GQVQ6IDAsXG5cbiAgU0lHX0xGSDogMHgwNDAzNGI1MCxcbiAgU0lHX0REOiAweDA4MDc0YjUwLFxuICBTSUdfQ0ZIOiAweDAyMDE0YjUwLFxuICBTSUdfRU9DRDogMHgwNjA1NGI1MCxcbiAgU0lHX1pJUDY0X0VPQ0Q6IDB4MDYwNjRCNTAsXG4gIFNJR19aSVA2NF9FT0NEX0xPQzogMHgwNzA2NEI1MCxcblxuICBaSVA2NF9NQUdJQ19TSE9SVDogMHhmZmZmLFxuICBaSVA2NF9NQUdJQzogMHhmZmZmZmZmZixcbiAgWklQNjRfRVhUUkFfSUQ6IDB4MDAwMSxcblxuICBaTElCX05PX0NPTVBSRVNTSU9OOiAwLFxuICBaTElCX0JFU1RfU1BFRUQ6IDEsXG4gIFpMSUJfQkVTVF9DT01QUkVTU0lPTjogOSxcbiAgWkxJQl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAtMSxcblxuICBNT0RFX01BU0s6IDB4RkZGLFxuICBERUZBVUxUX0ZJTEVfTU9ERTogMzMxODgsIC8vIDAxMDY0NCA9IC1ydy1yLS1yLS0gPSBTX0lGUkVHIHwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USFxuICBERUZBVUxUX0RJUl9NT0RFOiAxNjg3NywgIC8vIDA0MDc1NSA9IGRyd3hyLXhyLXggPSBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJHUlAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEhcblxuICBFWFRfRklMRV9BVFRSX0RJUjogMTEwNjA1MTA4OCwgIC8vIDAxMDE3MzIwMDAyMCA9IGRyd3hyLXhyLXggPSAoKChTX0lGRElSIHwgMDc1NSkgPDwgMTYpIHwgU19ET1NfRClcbiAgRVhUX0ZJTEVfQVRUUl9GSUxFOiAyMTc1MDA4ODAwLCAvLyAwMjAxNTEwMDAwNDAgPSAtcnctci0tci0tID0gKCgoU19JRlJFRyB8IDA2NDQpIDw8IDE2KSB8IFNfRE9TX0EpID4+PiAwXG5cbiAgLy8gVW5peCBmaWxlIHR5cGVzXG4gIFNfSUZNVDogNjE0NDAsICAgLy8gMDE3MDAwMCB0eXBlIG9mIGZpbGUgbWFza1xuICBTX0lGSUZPOiA0MDk2LCAgIC8vIDAxMDAwMCBuYW1lZCBwaXBlIChmaWZvKVxuICBTX0lGQ0hSOiA4MTkyLCAgIC8vIDAyMDAwMCBjaGFyYWN0ZXIgc3BlY2lhbFxuICBTX0lGRElSOiAxNjM4NCwgIC8vIDA0MDAwMCBkaXJlY3RvcnlcbiAgU19JRkJMSzogMjQ1NzYsICAvLyAwNjAwMDAgYmxvY2sgc3BlY2lhbFxuICBTX0lGUkVHOiAzMjc2OCwgIC8vIDAxMDAwMDAgcmVndWxhclxuICBTX0lGTE5LOiA0MDk2MCwgIC8vIDAxMjAwMDAgc3ltYm9saWMgbGlua1xuICBTX0lGU09DSzogNDkxNTIsIC8vIDAxNDAwMDAgc29ja2V0XG5cbiAgLy8gRE9TIGZpbGUgdHlwZSBmbGFnc1xuICBTX0RPU19BOiAzMiwgLy8gMDQwIEFyY2hpdmVcbiAgU19ET1NfRDogMTYsIC8vIDAyMCBEaXJlY3RvcnlcbiAgU19ET1NfVjogOCwgIC8vIDAxMCBWb2x1bWVcbiAgU19ET1NfUzogNCwgIC8vIDA0IFN5c3RlbVxuICBTX0RPU19IOiAyLCAgLy8gMDIgSGlkZGVuXG4gIFNfRE9TX1I6IDEgICAvLyAwMSBSZWFkIE9ubHlcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14909\n")},49933:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar zipUtil = __webpack_require__(95026);\n\nvar DATA_DESCRIPTOR_FLAG = 1 << 3;\nvar ENCRYPTION_FLAG = 1 << 0;\nvar NUMBER_OF_SHANNON_FANO_TREES_FLAG = 1 << 2;\nvar SLIDING_DICTIONARY_SIZE_FLAG = 1 << 1;\nvar STRONG_ENCRYPTION_FLAG = 1 << 6;\nvar UFT8_NAMES_FLAG = 1 << 11;\n\nvar GeneralPurposeBit = module.exports = function() {\n if (!(this instanceof GeneralPurposeBit)) {\n return new GeneralPurposeBit();\n }\n\n this.descriptor = false;\n this.encryption = false;\n this.utf8 = false;\n this.numberOfShannonFanoTrees = 0;\n this.strongEncryption = false;\n this.slidingDictionarySize = 0;\n\n return this;\n};\n\nGeneralPurposeBit.prototype.encode = function() {\n return zipUtil.getShortBytes(\n (this.descriptor ? DATA_DESCRIPTOR_FLAG : 0) |\n (this.utf8 ? UFT8_NAMES_FLAG : 0) |\n (this.encryption ? ENCRYPTION_FLAG : 0) |\n (this.strongEncryption ? STRONG_ENCRYPTION_FLAG : 0)\n );\n};\n\nGeneralPurposeBit.prototype.parse = function(buf, offset) {\n var flag = zipUtil.getShortBytesValue(buf, offset);\n var gbp = new GeneralPurposeBit();\n\n gbp.useDataDescriptor((flag & DATA_DESCRIPTOR_FLAG) !== 0);\n gbp.useUTF8ForNames((flag & UFT8_NAMES_FLAG) !== 0);\n gbp.useStrongEncryption((flag & STRONG_ENCRYPTION_FLAG) !== 0);\n gbp.useEncryption((flag & ENCRYPTION_FLAG) !== 0);\n gbp.setSlidingDictionarySize((flag & SLIDING_DICTIONARY_SIZE_FLAG) !== 0 ? 8192 : 4096);\n gbp.setNumberOfShannonFanoTrees((flag & NUMBER_OF_SHANNON_FANO_TREES_FLAG) !== 0 ? 3 : 2);\n\n return gbp;\n};\n\nGeneralPurposeBit.prototype.setNumberOfShannonFanoTrees = function(n) {\n this.numberOfShannonFanoTrees = n;\n};\n\nGeneralPurposeBit.prototype.getNumberOfShannonFanoTrees = function() {\n return this.numberOfShannonFanoTrees;\n};\n\nGeneralPurposeBit.prototype.setSlidingDictionarySize = function(n) {\n this.slidingDictionarySize = n;\n};\n\nGeneralPurposeBit.prototype.getSlidingDictionarySize = function() {\n return this.slidingDictionarySize;\n};\n\nGeneralPurposeBit.prototype.useDataDescriptor = function(b) {\n this.descriptor = b;\n};\n\nGeneralPurposeBit.prototype.usesDataDescriptor = function() {\n return this.descriptor;\n};\n\nGeneralPurposeBit.prototype.useEncryption = function(b) {\n this.encryption = b;\n};\n\nGeneralPurposeBit.prototype.usesEncryption = function() {\n return this.encryption;\n};\n\nGeneralPurposeBit.prototype.useStrongEncryption = function(b) {\n this.strongEncryption = b;\n};\n\nGeneralPurposeBit.prototype.usesStrongEncryption = function() {\n return this.strongEncryption;\n};\n\nGeneralPurposeBit.prototype.useUTF8ForNames = function(b) {\n this.utf8 = b;\n};\n\nGeneralPurposeBit.prototype.usesUTF8ForNames = function() {\n return this.utf8;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk5MzMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLG1CQUFPLENBQUMsS0FBUTs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvemlwL2dlbmVyYWwtcHVycG9zZS1iaXQuanM/M2Q1YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIHppcFV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIERBVEFfREVTQ1JJUFRPUl9GTEFHID0gMSA8PCAzO1xudmFyIEVOQ1JZUFRJT05fRkxBRyA9IDEgPDwgMDtcbnZhciBOVU1CRVJfT0ZfU0hBTk5PTl9GQU5PX1RSRUVTX0ZMQUcgPSAxIDw8IDI7XG52YXIgU0xJRElOR19ESUNUSU9OQVJZX1NJWkVfRkxBRyA9IDEgPDwgMTtcbnZhciBTVFJPTkdfRU5DUllQVElPTl9GTEFHID0gMSA8PCA2O1xudmFyIFVGVDhfTkFNRVNfRkxBRyA9IDEgPDwgMTE7XG5cbnZhciBHZW5lcmFsUHVycG9zZUJpdCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBHZW5lcmFsUHVycG9zZUJpdCkpIHtcbiAgICByZXR1cm4gbmV3IEdlbmVyYWxQdXJwb3NlQml0KCk7XG4gIH1cblxuICB0aGlzLmRlc2NyaXB0b3IgPSBmYWxzZTtcbiAgdGhpcy5lbmNyeXB0aW9uID0gZmFsc2U7XG4gIHRoaXMudXRmOCA9IGZhbHNlO1xuICB0aGlzLm51bWJlck9mU2hhbm5vbkZhbm9UcmVlcyA9IDA7XG4gIHRoaXMuc3Ryb25nRW5jcnlwdGlvbiA9IGZhbHNlO1xuICB0aGlzLnNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IDA7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB6aXBVdGlsLmdldFNob3J0Qnl0ZXMoXG4gICAgKHRoaXMuZGVzY3JpcHRvciA/IERBVEFfREVTQ1JJUFRPUl9GTEFHIDogMCkgfFxuICAgICh0aGlzLnV0ZjggPyBVRlQ4X05BTUVTX0ZMQUcgOiAwKSB8XG4gICAgKHRoaXMuZW5jcnlwdGlvbiA/IEVOQ1JZUFRJT05fRkxBRyA6IDApIHxcbiAgICAodGhpcy5zdHJvbmdFbmNyeXB0aW9uID8gU1RST05HX0VOQ1JZUFRJT05fRkxBRyA6IDApXG4gICk7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihidWYsIG9mZnNldCkge1xuICB2YXIgZmxhZyA9IHppcFV0aWwuZ2V0U2hvcnRCeXRlc1ZhbHVlKGJ1Ziwgb2Zmc2V0KTtcbiAgdmFyIGdicCA9IG5ldyBHZW5lcmFsUHVycG9zZUJpdCgpO1xuXG4gIGdicC51c2VEYXRhRGVzY3JpcHRvcigoZmxhZyAmIERBVEFfREVTQ1JJUFRPUl9GTEFHKSAhPT0gMCk7XG4gIGdicC51c2VVVEY4Rm9yTmFtZXMoKGZsYWcgJiBVRlQ4X05BTUVTX0ZMQUcpICE9PSAwKTtcbiAgZ2JwLnVzZVN0cm9uZ0VuY3J5cHRpb24oKGZsYWcgJiBTVFJPTkdfRU5DUllQVElPTl9GTEFHKSAhPT0gMCk7XG4gIGdicC51c2VFbmNyeXB0aW9uKChmbGFnICYgRU5DUllQVElPTl9GTEFHKSAhPT0gMCk7XG4gIGdicC5zZXRTbGlkaW5nRGljdGlvbmFyeVNpemUoKGZsYWcgJiBTTElESU5HX0RJQ1RJT05BUllfU0laRV9GTEFHKSAhPT0gMCA/IDgxOTIgOiA0MDk2KTtcbiAgZ2JwLnNldE51bWJlck9mU2hhbm5vbkZhbm9UcmVlcygoZmxhZyAmIE5VTUJFUl9PRl9TSEFOTk9OX0ZBTk9fVFJFRVNfRkxBRykgIT09IDAgPyAzIDogMik7XG5cbiAgcmV0dXJuIGdicDtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS5zZXROdW1iZXJPZlNoYW5ub25GYW5vVHJlZXMgPSBmdW5jdGlvbihuKSB7XG4gIHRoaXMubnVtYmVyT2ZTaGFubm9uRmFub1RyZWVzID0gbjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS5nZXROdW1iZXJPZlNoYW5ub25GYW5vVHJlZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubnVtYmVyT2ZTaGFubm9uRmFub1RyZWVzO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLnNldFNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5zbGlkaW5nRGljdGlvbmFyeVNpemUgPSBuO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLmdldFNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zbGlkaW5nRGljdGlvbmFyeVNpemU7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlRGF0YURlc2NyaXB0b3IgPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMuZGVzY3JpcHRvciA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc0RhdGFEZXNjcmlwdG9yID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlRW5jcnlwdGlvbiA9IGZ1bmN0aW9uKGIpIHtcbiAgdGhpcy5lbmNyeXB0aW9uID0gYjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS51c2VzRW5jcnlwdGlvbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lbmNyeXB0aW9uO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLnVzZVN0cm9uZ0VuY3J5cHRpb24gPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMuc3Ryb25nRW5jcnlwdGlvbiA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc1N0cm9uZ0VuY3J5cHRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc3Ryb25nRW5jcnlwdGlvbjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS51c2VVVEY4Rm9yTmFtZXMgPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMudXRmOCA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc1VURjhGb3JOYW1lcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy51dGY4O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///49933\n")},86247:module=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nmodule.exports = {\n /**\n * Bits used for permissions (and sticky bit)\n */\n PERM_MASK: 4095, // 07777\n\n /**\n * Bits used to indicate the filesystem object type.\n */\n FILE_TYPE_FLAG: 61440, // 0170000\n\n /**\n * Indicates symbolic links.\n */\n LINK_FLAG: 40960, // 0120000\n\n /**\n * Indicates plain files.\n */\n FILE_FLAG: 32768, // 0100000\n\n /**\n * Indicates directories.\n */\n DIR_FLAG: 16384, // 040000\n\n // ----------------------------------------------------------\n // somewhat arbitrary choices that are quite common for shared\n // installations\n // -----------------------------------------------------------\n\n /**\n * Default permissions for symbolic links.\n */\n DEFAULT_LINK_PERM: 511, // 0777\n\n /**\n * Default permissions for directories.\n */\n DEFAULT_DIR_PERM: 493, // 0755\n\n /**\n * Default permissions for plain files.\n */\n DEFAULT_FILE_PERM: 420 // 0644\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYyNDcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy96aXAvdW5peC1zdGF0LmpzP2I4OWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qKlxuICAgICAqIEJpdHMgdXNlZCBmb3IgcGVybWlzc2lvbnMgKGFuZCBzdGlja3kgYml0KVxuICAgICAqL1xuICAgIFBFUk1fTUFTSzogNDA5NSwgLy8gMDc3NzdcblxuICAgIC8qKlxuICAgICAqIEJpdHMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZmlsZXN5c3RlbSBvYmplY3QgdHlwZS5cbiAgICAgKi9cbiAgICBGSUxFX1RZUEVfRkxBRzogNjE0NDAsIC8vIDAxNzAwMDBcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBzeW1ib2xpYyBsaW5rcy5cbiAgICAgKi9cbiAgICBMSU5LX0ZMQUc6IDQwOTYwLCAvLyAwMTIwMDAwXG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgcGxhaW4gZmlsZXMuXG4gICAgICovXG4gICAgRklMRV9GTEFHOiAzMjc2OCwgLy8gMDEwMDAwMFxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGRpcmVjdG9yaWVzLlxuICAgICAqL1xuICAgIERJUl9GTEFHOiAxNjM4NCwgLy8gMDQwMDAwXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gc29tZXdoYXQgYXJiaXRyYXJ5IGNob2ljZXMgdGhhdCBhcmUgcXVpdGUgY29tbW9uIGZvciBzaGFyZWRcbiAgICAvLyBpbnN0YWxsYXRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgcGVybWlzc2lvbnMgZm9yIHN5bWJvbGljIGxpbmtzLlxuICAgICAqL1xuICAgIERFRkFVTFRfTElOS19QRVJNOiA1MTEsIC8vIDA3NzdcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgcGVybWlzc2lvbnMgZm9yIGRpcmVjdG9yaWVzLlxuICAgICAqL1xuICAgIERFRkFVTFRfRElSX1BFUk06IDQ5MywgLy8gMDc1NVxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBwZXJtaXNzaW9ucyBmb3IgcGxhaW4gZmlsZXMuXG4gICAgICovXG4gICAgREVGQVVMVF9GSUxFX1BFUk06IDQyMCAvLyAwNjQ0XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///86247\n")},95026:module=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar util = module.exports = {};\n\nutil.dateToDos = function(d, forceLocalTime) {\n forceLocalTime = forceLocalTime || false;\n\n var year = forceLocalTime ? d.getFullYear() : d.getUTCFullYear();\n\n if (year < 1980) {\n return 2162688; // 1980-1-1 00:00:00\n } else if (year >= 2044) {\n return 2141175677; // 2043-12-31 23:59:58\n }\n\n var val = {\n year: year,\n month: forceLocalTime ? d.getMonth() : d.getUTCMonth(),\n date: forceLocalTime ? d.getDate() : d.getUTCDate(),\n hours: forceLocalTime ? d.getHours() : d.getUTCHours(),\n minutes: forceLocalTime ? d.getMinutes() : d.getUTCMinutes(),\n seconds: forceLocalTime ? d.getSeconds() : d.getUTCSeconds()\n };\n\n return ((val.year - 1980) << 25) | ((val.month + 1) << 21) | (val.date << 16) |\n (val.hours << 11) | (val.minutes << 5) | (val.seconds / 2);\n};\n\nutil.dosToDate = function(dos) {\n return new Date(((dos >> 25) & 0x7f) + 1980, ((dos >> 21) & 0x0f) - 1, (dos >> 16) & 0x1f, (dos >> 11) & 0x1f, (dos >> 5) & 0x3f, (dos & 0x1f) << 1);\n};\n\nutil.fromDosTime = function(buf) {\n return util.dosToDate(buf.readUInt32LE(0));\n};\n\nutil.getEightBytes = function(v) {\n var buf = Buffer.alloc(8);\n buf.writeUInt32LE(v % 0x0100000000, 0);\n buf.writeUInt32LE((v / 0x0100000000) | 0, 4);\n\n return buf;\n};\n\nutil.getShortBytes = function(v) {\n var buf = Buffer.alloc(2);\n buf.writeUInt16LE((v & 0xFFFF) >>> 0, 0);\n\n return buf;\n};\n\nutil.getShortBytesValue = function(buf, offset) {\n return buf.readUInt16LE(offset);\n};\n\nutil.getLongBytes = function(v) {\n var buf = Buffer.alloc(4);\n buf.writeUInt32LE((v & 0xFFFFFFFF) >>> 0, 0);\n\n return buf;\n};\n\nutil.getLongBytesValue = function(buf, offset) {\n return buf.readUInt32LE(offset);\n};\n\nutil.toDosTime = function(d) {\n return util.getLongBytes(util.dateToDos(d));\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUwMjYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0JBQW9CO0FBQ3BCLElBQUk7QUFDSix1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvemlwL3V0aWwuanM/M2Y2MSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIHV0aWwgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG51dGlsLmRhdGVUb0RvcyA9IGZ1bmN0aW9uKGQsIGZvcmNlTG9jYWxUaW1lKSB7XG4gIGZvcmNlTG9jYWxUaW1lID0gZm9yY2VMb2NhbFRpbWUgfHwgZmFsc2U7XG5cbiAgdmFyIHllYXIgPSBmb3JjZUxvY2FsVGltZSA/IGQuZ2V0RnVsbFllYXIoKSA6IGQuZ2V0VVRDRnVsbFllYXIoKTtcblxuICBpZiAoeWVhciA8IDE5ODApIHtcbiAgICByZXR1cm4gMjE2MjY4ODsgLy8gMTk4MC0xLTEgMDA6MDA6MDBcbiAgfSBlbHNlIGlmICh5ZWFyID49IDIwNDQpIHtcbiAgICByZXR1cm4gMjE0MTE3NTY3NzsgLy8gMjA0My0xMi0zMSAyMzo1OTo1OFxuICB9XG5cbiAgdmFyIHZhbCA9IHtcbiAgICB5ZWFyOiB5ZWFyLFxuICAgIG1vbnRoOiBmb3JjZUxvY2FsVGltZSA/IGQuZ2V0TW9udGgoKSA6IGQuZ2V0VVRDTW9udGgoKSxcbiAgICBkYXRlOiBmb3JjZUxvY2FsVGltZSA/IGQuZ2V0RGF0ZSgpIDogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cnM6IGZvcmNlTG9jYWxUaW1lID8gZC5nZXRIb3VycygpIDogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZXM6IGZvcmNlTG9jYWxUaW1lID8gZC5nZXRNaW51dGVzKCkgOiBkLmdldFVUQ01pbnV0ZXMoKSxcbiAgICBzZWNvbmRzOiBmb3JjZUxvY2FsVGltZSA/IGQuZ2V0U2Vjb25kcygpIDogZC5nZXRVVENTZWNvbmRzKClcbiAgfTtcblxuICByZXR1cm4gKCh2YWwueWVhciAtIDE5ODApIDw8IDI1KSB8ICgodmFsLm1vbnRoICsgMSkgPDwgMjEpIHwgKHZhbC5kYXRlIDw8IDE2KSB8XG4gICAgKHZhbC5ob3VycyA8PCAxMSkgfCAodmFsLm1pbnV0ZXMgPDwgNSkgfCAodmFsLnNlY29uZHMgLyAyKTtcbn07XG5cbnV0aWwuZG9zVG9EYXRlID0gZnVuY3Rpb24oZG9zKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgoKGRvcyA+PiAyNSkgJiAweDdmKSArIDE5ODAsICgoZG9zID4+IDIxKSAmIDB4MGYpIC0gMSwgKGRvcyA+PiAxNikgJiAweDFmLCAoZG9zID4+IDExKSAmIDB4MWYsIChkb3MgPj4gNSkgJiAweDNmLCAoZG9zICYgMHgxZikgPDwgMSk7XG59O1xuXG51dGlsLmZyb21Eb3NUaW1lID0gZnVuY3Rpb24oYnVmKSB7XG4gIHJldHVybiB1dGlsLmRvc1RvRGF0ZShidWYucmVhZFVJbnQzMkxFKDApKTtcbn07XG5cbnV0aWwuZ2V0RWlnaHRCeXRlcyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgYnVmLndyaXRlVUludDMyTEUodiAlIDB4MDEwMDAwMDAwMCwgMCk7XG4gIGJ1Zi53cml0ZVVJbnQzMkxFKCh2IC8gMHgwMTAwMDAwMDAwKSB8IDAsIDQpO1xuXG4gIHJldHVybiBidWY7XG59O1xuXG51dGlsLmdldFNob3J0Qnl0ZXMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBidWYgPSBCdWZmZXIuYWxsb2MoMik7XG4gIGJ1Zi53cml0ZVVJbnQxNkxFKCh2ICYgMHhGRkZGKSA+Pj4gMCwgMCk7XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbnV0aWwuZ2V0U2hvcnRCeXRlc1ZhbHVlID0gZnVuY3Rpb24oYnVmLCBvZmZzZXQpIHtcbiAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2TEUob2Zmc2V0KTtcbn07XG5cbnV0aWwuZ2V0TG9uZ0J5dGVzID0gZnVuY3Rpb24odikge1xuICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKDQpO1xuICBidWYud3JpdGVVSW50MzJMRSgodiAmIDB4RkZGRkZGRkYpID4+PiAwLCAwKTtcblxuICByZXR1cm4gYnVmO1xufTtcblxudXRpbC5nZXRMb25nQnl0ZXNWYWx1ZSA9IGZ1bmN0aW9uKGJ1Ziwgb2Zmc2V0KSB7XG4gIHJldHVybiBidWYucmVhZFVJbnQzMkxFKG9mZnNldCk7XG59O1xuXG51dGlsLnRvRG9zVGltZSA9IGZ1bmN0aW9uKGQpIHtcbiAgcmV0dXJuIHV0aWwuZ2V0TG9uZ0J5dGVzKHV0aWwuZGF0ZVRvRG9zKGQpKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///95026\n")},57149:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar inherits = (__webpack_require__(39023).inherits);\nvar normalizePath = __webpack_require__(14100);\n\nvar ArchiveEntry = __webpack_require__(53543);\nvar GeneralPurposeBit = __webpack_require__(49933);\nvar UnixStat = __webpack_require__(86247);\n\nvar constants = __webpack_require__(14909);\nvar zipUtil = __webpack_require__(95026);\n\nvar ZipArchiveEntry = module.exports = function(name) {\n if (!(this instanceof ZipArchiveEntry)) {\n return new ZipArchiveEntry(name);\n }\n\n ArchiveEntry.call(this);\n\n this.platform = constants.PLATFORM_FAT;\n this.method = -1;\n\n this.name = null;\n this.size = 0;\n this.csize = 0;\n this.gpb = new GeneralPurposeBit();\n this.crc = 0;\n this.time = -1;\n\n this.minver = constants.MIN_VERSION_INITIAL;\n this.mode = -1;\n this.extra = null;\n this.exattr = 0;\n this.inattr = 0;\n this.comment = null;\n\n if (name) {\n this.setName(name);\n }\n};\n\ninherits(ZipArchiveEntry, ArchiveEntry);\n\n/**\n * Returns the extra fields related to the entry.\n *\n * @returns {Buffer}\n */\nZipArchiveEntry.prototype.getCentralDirectoryExtra = function() {\n return this.getExtra();\n};\n\n/**\n * Returns the comment set for the entry.\n *\n * @returns {string}\n */\nZipArchiveEntry.prototype.getComment = function() {\n return this.comment !== null ? this.comment : '';\n};\n\n/**\n * Returns the compressed size of the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getCompressedSize = function() {\n return this.csize;\n};\n\n/**\n * Returns the CRC32 digest for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getCrc = function() {\n return this.crc;\n};\n\n/**\n * Returns the external file attributes for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getExternalAttributes = function() {\n return this.exattr;\n};\n\n/**\n * Returns the extra fields related to the entry.\n *\n * @returns {Buffer}\n */\nZipArchiveEntry.prototype.getExtra = function() {\n return this.extra !== null ? this.extra : constants.EMPTY;\n};\n\n/**\n * Returns the general purpose bits related to the entry.\n *\n * @returns {GeneralPurposeBit}\n */\nZipArchiveEntry.prototype.getGeneralPurposeBit = function() {\n return this.gpb;\n};\n\n/**\n * Returns the internal file attributes for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getInternalAttributes = function() {\n return this.inattr;\n};\n\n/**\n * Returns the last modified date of the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getLastModifiedDate = function() {\n return this.getTime();\n};\n\n/**\n * Returns the extra fields related to the entry.\n *\n * @returns {Buffer}\n */\nZipArchiveEntry.prototype.getLocalFileDataExtra = function() {\n return this.getExtra();\n};\n\n/**\n * Returns the compression method used on the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getMethod = function() {\n return this.method;\n};\n\n/**\n * Returns the filename of the entry.\n *\n * @returns {string}\n */\nZipArchiveEntry.prototype.getName = function() {\n return this.name;\n};\n\n/**\n * Returns the platform on which the entry was made.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getPlatform = function() {\n return this.platform;\n};\n\n/**\n * Returns the size of the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getSize = function() {\n return this.size;\n};\n\n/**\n * Returns a date object representing the last modified date of the entry.\n *\n * @returns {number|Date}\n */\nZipArchiveEntry.prototype.getTime = function() {\n return this.time !== -1 ? zipUtil.dosToDate(this.time) : -1;\n};\n\n/**\n * Returns the DOS timestamp for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getTimeDos = function() {\n return this.time !== -1 ? this.time : 0;\n};\n\n/**\n * Returns the UNIX file permissions for the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getUnixMode = function() {\n return this.platform !== constants.PLATFORM_UNIX ? 0 : ((this.getExternalAttributes() >> constants.SHORT_SHIFT) & constants.SHORT_MASK);\n};\n\n/**\n * Returns the version of ZIP needed to extract the entry.\n *\n * @returns {number}\n */\nZipArchiveEntry.prototype.getVersionNeededToExtract = function() {\n return this.minver;\n};\n\n/**\n * Sets the comment of the entry.\n *\n * @param comment\n */\nZipArchiveEntry.prototype.setComment = function(comment) {\n if (Buffer.byteLength(comment) !== comment.length) {\n this.getGeneralPurposeBit().useUTF8ForNames(true);\n }\n\n this.comment = comment;\n};\n\n/**\n * Sets the compressed size of the entry.\n *\n * @param size\n */\nZipArchiveEntry.prototype.setCompressedSize = function(size) {\n if (size < 0) {\n throw new Error('invalid entry compressed size');\n }\n\n this.csize = size;\n};\n\n/**\n * Sets the checksum of the entry.\n *\n * @param crc\n */\nZipArchiveEntry.prototype.setCrc = function(crc) {\n if (crc < 0) {\n throw new Error('invalid entry crc32');\n }\n\n this.crc = crc;\n};\n\n/**\n * Sets the external file attributes of the entry.\n *\n * @param attr\n */\nZipArchiveEntry.prototype.setExternalAttributes = function(attr) {\n this.exattr = attr >>> 0;\n};\n\n/**\n * Sets the extra fields related to the entry.\n *\n * @param extra\n */\nZipArchiveEntry.prototype.setExtra = function(extra) {\n this.extra = extra;\n};\n\n/**\n * Sets the general purpose bits related to the entry.\n *\n * @param gpb\n */\nZipArchiveEntry.prototype.setGeneralPurposeBit = function(gpb) {\n if (!(gpb instanceof GeneralPurposeBit)) {\n throw new Error('invalid entry GeneralPurposeBit');\n }\n\n this.gpb = gpb;\n};\n\n/**\n * Sets the internal file attributes of the entry.\n *\n * @param attr\n */\nZipArchiveEntry.prototype.setInternalAttributes = function(attr) {\n this.inattr = attr;\n};\n\n/**\n * Sets the compression method of the entry.\n *\n * @param method\n */\nZipArchiveEntry.prototype.setMethod = function(method) {\n if (method < 0) {\n throw new Error('invalid entry compression method');\n }\n\n this.method = method;\n};\n\n/**\n * Sets the name of the entry.\n *\n * @param name\n * @param prependSlash\n */\nZipArchiveEntry.prototype.setName = function(name, prependSlash = false) {\n name = normalizePath(name, false)\n .replace(/^\\w+:/, '')\n .replace(/^(\\.\\.\\/|\\/)+/, '');\n\n if (prependSlash) {\n name = `/${name}`;\n }\n\n if (Buffer.byteLength(name) !== name.length) {\n this.getGeneralPurposeBit().useUTF8ForNames(true);\n }\n\n this.name = name;\n};\n\n/**\n * Sets the platform on which the entry was made.\n *\n * @param platform\n */\nZipArchiveEntry.prototype.setPlatform = function(platform) {\n this.platform = platform;\n};\n\n/**\n * Sets the size of the entry.\n *\n * @param size\n */\nZipArchiveEntry.prototype.setSize = function(size) {\n if (size < 0) {\n throw new Error('invalid entry size');\n }\n\n this.size = size;\n};\n\n/**\n * Sets the time of the entry.\n *\n * @param time\n * @param forceLocalTime\n */\nZipArchiveEntry.prototype.setTime = function(time, forceLocalTime) {\n if (!(time instanceof Date)) {\n throw new Error('invalid entry time');\n }\n\n this.time = zipUtil.dateToDos(time, forceLocalTime);\n};\n\n/**\n * Sets the UNIX file permissions for the entry.\n *\n * @param mode\n */\nZipArchiveEntry.prototype.setUnixMode = function(mode) {\n mode |= this.isDirectory() ? constants.S_IFDIR : constants.S_IFREG;\n\n var extattr = 0;\n extattr |= (mode << constants.SHORT_SHIFT) | (this.isDirectory() ? constants.S_DOS_D : constants.S_DOS_A);\n\n this.setExternalAttributes(extattr);\n this.mode = mode & constants.MODE_MASK;\n this.platform = constants.PLATFORM_UNIX;\n};\n\n/**\n * Sets the version of ZIP needed to extract this entry.\n *\n * @param minver\n */\nZipArchiveEntry.prototype.setVersionNeededToExtract = function(minver) {\n this.minver = minver;\n};\n\n/**\n * Returns true if this entry represents a directory.\n *\n * @returns {boolean}\n */\nZipArchiveEntry.prototype.isDirectory = function() {\n return this.getName().slice(-1) === '/';\n};\n\n/**\n * Returns true if this entry represents a unix symlink,\n * in which case the entry's content contains the target path\n * for the symlink.\n *\n * @returns {boolean}\n */\nZipArchiveEntry.prototype.isUnixSymlink = function() {\n return (this.getUnixMode() & UnixStat.FILE_TYPE_FLAG) === UnixStat.LINK_FLAG;\n};\n\n/**\n * Returns true if this entry is using the ZIP64 extension of ZIP.\n *\n * @returns {boolean}\n */\nZipArchiveEntry.prototype.isZip64 = function() {\n return this.csize > constants.ZIP64_MAGIC || this.size > constants.ZIP64_MAGIC;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcxNDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFDQUF3QjtBQUN2QyxvQkFBb0IsbUJBQU8sQ0FBQyxLQUFnQjs7QUFFNUMsbUJBQW1CLG1CQUFPLENBQUMsS0FBa0I7QUFDN0Msd0JBQXdCLG1CQUFPLENBQUMsS0FBdUI7QUFDdkQsZUFBZSxtQkFBTyxDQUFDLEtBQWE7O0FBRXBDLGdCQUFnQixtQkFBTyxDQUFDLEtBQWE7QUFDckMsY0FBYyxtQkFBTyxDQUFDLEtBQVE7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsS0FBSztBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvY29tcHJlc3MtY29tbW9ucy9saWIvYXJjaGl2ZXJzL3ppcC96aXAtYXJjaGl2ZS1lbnRyeS5qcz9mYTU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbm9kZS1jb21wcmVzcy1jb21tb25zXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY29tcHJlc3MtY29tbW9ucy9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxuICovXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCd1dGlsJykuaW5oZXJpdHM7XG52YXIgbm9ybWFsaXplUGF0aCA9IHJlcXVpcmUoJ25vcm1hbGl6ZS1wYXRoJyk7XG5cbnZhciBBcmNoaXZlRW50cnkgPSByZXF1aXJlKCcuLi9hcmNoaXZlLWVudHJ5Jyk7XG52YXIgR2VuZXJhbFB1cnBvc2VCaXQgPSByZXF1aXJlKCcuL2dlbmVyYWwtcHVycG9zZS1iaXQnKTtcbnZhciBVbml4U3RhdCA9IHJlcXVpcmUoJy4vdW5peC1zdGF0Jyk7XG5cbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xudmFyIHppcFV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIFppcEFyY2hpdmVFbnRyeSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgWmlwQXJjaGl2ZUVudHJ5KSkge1xuICAgIHJldHVybiBuZXcgWmlwQXJjaGl2ZUVudHJ5KG5hbWUpO1xuICB9XG5cbiAgQXJjaGl2ZUVudHJ5LmNhbGwodGhpcyk7XG5cbiAgdGhpcy5wbGF0Zm9ybSA9IGNvbnN0YW50cy5QTEFURk9STV9GQVQ7XG4gIHRoaXMubWV0aG9kID0gLTE7XG5cbiAgdGhpcy5uYW1lID0gbnVsbDtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5jc2l6ZSA9IDA7XG4gIHRoaXMuZ3BiID0gbmV3IEdlbmVyYWxQdXJwb3NlQml0KCk7XG4gIHRoaXMuY3JjID0gMDtcbiAgdGhpcy50aW1lID0gLTE7XG5cbiAgdGhpcy5taW52ZXIgPSBjb25zdGFudHMuTUlOX1ZFUlNJT05fSU5JVElBTDtcbiAgdGhpcy5tb2RlID0gLTE7XG4gIHRoaXMuZXh0cmEgPSBudWxsO1xuICB0aGlzLmV4YXR0ciA9IDA7XG4gIHRoaXMuaW5hdHRyID0gMDtcbiAgdGhpcy5jb21tZW50ID0gbnVsbDtcblxuICBpZiAobmFtZSkge1xuICAgIHRoaXMuc2V0TmFtZShuYW1lKTtcbiAgfVxufTtcblxuaW5oZXJpdHMoWmlwQXJjaGl2ZUVudHJ5LCBBcmNoaXZlRW50cnkpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dHJhIGZpZWxkcyByZWxhdGVkIHRvIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7QnVmZmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldENlbnRyYWxEaXJlY3RvcnlFeHRyYSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXRFeHRyYSgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21tZW50IHNldCBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0Q29tbWVudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb21tZW50ICE9PSBudWxsID8gdGhpcy5jb21tZW50IDogJyc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRDb21wcmVzc2VkU2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jc2l6ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgQ1JDMzIgZGlnZXN0IGZvciB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRDcmMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY3JjO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldEV4dGVybmFsQXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5leGF0dHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dHJhIGZpZWxkcyByZWxhdGVkIHRvIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7QnVmZmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldEV4dHJhID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmV4dHJhICE9PSBudWxsID8gdGhpcy5leHRyYSA6IGNvbnN0YW50cy5FTVBUWTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZ2VuZXJhbCBwdXJwb3NlIGJpdHMgcmVsYXRlZCB0byB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge0dlbmVyYWxQdXJwb3NlQml0fVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldEdlbmVyYWxQdXJwb3NlQml0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmdwYjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZvciB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRJbnRlcm5hbEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuaW5hdHRyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0TGFzdE1vZGlmaWVkRGF0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXRUaW1lKCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dHJhIGZpZWxkcyByZWxhdGVkIHRvIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7QnVmZmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldExvY2FsRmlsZURhdGFFeHRyYSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXRFeHRyYSgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZCBvbiB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRNZXRob2QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubWV0aG9kO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaWxlbmFtZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm5hbWU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSBlbnRyeSB3YXMgbWFkZS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldFBsYXRmb3JtID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnBsYXRmb3JtO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2l6ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGRhdGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfERhdGV9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0VGltZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50aW1lICE9PSAtMSA/IHppcFV0aWwuZG9zVG9EYXRlKHRoaXMudGltZSkgOiAtMTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgRE9TIHRpbWVzdGFtcCBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0VGltZURvcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50aW1lICE9PSAtMSA/IHRoaXMudGltZSA6IDA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIFVOSVggZmlsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0VW5peE1vZGUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucGxhdGZvcm0gIT09IGNvbnN0YW50cy5QTEFURk9STV9VTklYID8gMCA6ICgodGhpcy5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSA+PiBjb25zdGFudHMuU0hPUlRfU0hJRlQpICYgY29uc3RhbnRzLlNIT1JUX01BU0spO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIFpJUCBuZWVkZWQgdG8gZXh0cmFjdCB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm1pbnZlcjtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgY29tbWVudCBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIGNvbW1lbnRcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRDb21tZW50ID0gZnVuY3Rpb24oY29tbWVudCkge1xuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgoY29tbWVudCkgIT09IGNvbW1lbnQubGVuZ3RoKSB7XG4gICAgdGhpcy5nZXRHZW5lcmFsUHVycG9zZUJpdCgpLnVzZVVURjhGb3JOYW1lcyh0cnVlKTtcbiAgfVxuXG4gIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIHNpemVcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRDb21wcmVzc2VkU2l6ZSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudHJ5IGNvbXByZXNzZWQgc2l6ZScpO1xuICB9XG5cbiAgdGhpcy5jc2l6ZSA9IHNpemU7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGNoZWNrc3VtIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gY3JjXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0Q3JjID0gZnVuY3Rpb24oY3JjKSB7XG4gIGlmIChjcmMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudHJ5IGNyYzMyJyk7XG4gIH1cblxuICB0aGlzLmNyYyA9IGNyYztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gYXR0clxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldEV4dGVybmFsQXR0cmlidXRlcyA9IGZ1bmN0aW9uKGF0dHIpIHtcbiAgdGhpcy5leGF0dHIgPSBhdHRyID4+PiAwO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBleHRyYSBmaWVsZHMgcmVsYXRlZCB0byB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIGV4dHJhXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0RXh0cmEgPSBmdW5jdGlvbihleHRyYSkge1xuICB0aGlzLmV4dHJhID0gZXh0cmE7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGdlbmVyYWwgcHVycG9zZSBiaXRzIHJlbGF0ZWQgdG8gdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBncGJcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRHZW5lcmFsUHVycG9zZUJpdCA9IGZ1bmN0aW9uKGdwYikge1xuICBpZiAoIShncGIgaW5zdGFuY2VvZiBHZW5lcmFsUHVycG9zZUJpdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW50cnkgR2VuZXJhbFB1cnBvc2VCaXQnKTtcbiAgfVxuXG4gIHRoaXMuZ3BiID0gZ3BiO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBhdHRyXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0SW50ZXJuYWxBdHRyaWJ1dGVzID0gZnVuY3Rpb24oYXR0cikge1xuICB0aGlzLmluYXR0ciA9IGF0dHI7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIG1ldGhvZFxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldE1ldGhvZCA9IGZ1bmN0aW9uKG1ldGhvZCkge1xuICBpZiAobWV0aG9kIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyeSBjb21wcmVzc2lvbiBtZXRob2QnKTtcbiAgfVxuXG4gIHRoaXMubWV0aG9kID0gbWV0aG9kO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIHByZXBlbmRTbGFzaFxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbihuYW1lLCBwcmVwZW5kU2xhc2ggPSBmYWxzZSkge1xuICBuYW1lID0gbm9ybWFsaXplUGF0aChuYW1lLCBmYWxzZSlcbiAgICAucmVwbGFjZSgvXlxcdys6LywgJycpXG4gICAgLnJlcGxhY2UoL14oXFwuXFwuXFwvfFxcLykrLywgJycpO1xuXG4gIGlmIChwcmVwZW5kU2xhc2gpIHtcbiAgICBuYW1lID0gYC8ke25hbWV9YDtcbiAgfVxuXG4gIGlmIChCdWZmZXIuYnl0ZUxlbmd0aChuYW1lKSAhPT0gbmFtZS5sZW5ndGgpIHtcbiAgICB0aGlzLmdldEdlbmVyYWxQdXJwb3NlQml0KCkudXNlVVRGOEZvck5hbWVzKHRydWUpO1xuICB9XG5cbiAgdGhpcy5uYW1lID0gbmFtZTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgcGxhdGZvcm0gb24gd2hpY2ggdGhlIGVudHJ5IHdhcyBtYWRlLlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldFBsYXRmb3JtID0gZnVuY3Rpb24ocGxhdGZvcm0pIHtcbiAgdGhpcy5wbGF0Zm9ybSA9IHBsYXRmb3JtO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gc2l6ZVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbihzaXplKSB7XG4gIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyeSBzaXplJyk7XG4gIH1cblxuICB0aGlzLnNpemUgPSBzaXplO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0aW1lIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gdGltZVxuICogQHBhcmFtIGZvcmNlTG9jYWxUaW1lXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0VGltZSA9IGZ1bmN0aW9uKHRpbWUsIGZvcmNlTG9jYWxUaW1lKSB7XG4gIGlmICghKHRpbWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyeSB0aW1lJyk7XG4gIH1cblxuICB0aGlzLnRpbWUgPSB6aXBVdGlsLmRhdGVUb0Rvcyh0aW1lLCBmb3JjZUxvY2FsVGltZSk7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIFVOSVggZmlsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBtb2RlXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0VW5peE1vZGUgPSBmdW5jdGlvbihtb2RlKSB7XG4gIG1vZGUgfD0gdGhpcy5pc0RpcmVjdG9yeSgpID8gY29uc3RhbnRzLlNfSUZESVIgOiBjb25zdGFudHMuU19JRlJFRztcblxuICB2YXIgZXh0YXR0ciA9IDA7XG4gIGV4dGF0dHIgfD0gKG1vZGUgPDwgY29uc3RhbnRzLlNIT1JUX1NISUZUKSB8ICh0aGlzLmlzRGlyZWN0b3J5KCkgPyBjb25zdGFudHMuU19ET1NfRCA6IGNvbnN0YW50cy5TX0RPU19BKTtcblxuICB0aGlzLnNldEV4dGVybmFsQXR0cmlidXRlcyhleHRhdHRyKTtcbiAgdGhpcy5tb2RlID0gbW9kZSAmIGNvbnN0YW50cy5NT0RFX01BU0s7XG4gIHRoaXMucGxhdGZvcm0gPSBjb25zdGFudHMuUExBVEZPUk1fVU5JWDtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgdmVyc2lvbiBvZiBaSVAgbmVlZGVkIHRvIGV4dHJhY3QgdGhpcyBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbWludmVyXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IGZ1bmN0aW9uKG1pbnZlcikge1xuICB0aGlzLm1pbnZlciA9IG1pbnZlcjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZW50cnkgcmVwcmVzZW50cyBhIGRpcmVjdG9yeS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5pc0RpcmVjdG9yeSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXROYW1lKCkuc2xpY2UoLTEpID09PSAnLyc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVudHJ5IHJlcHJlc2VudHMgYSB1bml4IHN5bWxpbmssXG4gKiBpbiB3aGljaCBjYXNlIHRoZSBlbnRyeSdzIGNvbnRlbnQgY29udGFpbnMgdGhlIHRhcmdldCBwYXRoXG4gKiBmb3IgdGhlIHN5bWxpbmsuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuaXNVbml4U3ltbGluayA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gKHRoaXMuZ2V0VW5peE1vZGUoKSAmIFVuaXhTdGF0LkZJTEVfVFlQRV9GTEFHKSA9PT0gVW5peFN0YXQuTElOS19GTEFHO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlbnRyeSBpcyB1c2luZyB0aGUgWklQNjQgZXh0ZW5zaW9uIG9mIFpJUC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5pc1ppcDY0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNzaXplID4gY29uc3RhbnRzLlpJUDY0X01BR0lDIHx8IHRoaXMuc2l6ZSA+IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///57149\n")},73349:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar inherits = (__webpack_require__(39023).inherits);\nvar crc32 = __webpack_require__(52566);\nvar {CRC32Stream} = __webpack_require__(71);\nvar {DeflateCRC32Stream} = __webpack_require__(71);\n\nvar ArchiveOutputStream = __webpack_require__(10587);\nvar ZipArchiveEntry = __webpack_require__(57149);\nvar GeneralPurposeBit = __webpack_require__(49933);\n\nvar constants = __webpack_require__(14909);\nvar util = __webpack_require__(78575);\nvar zipUtil = __webpack_require__(95026);\n\nvar ZipArchiveOutputStream = module.exports = function(options) {\n if (!(this instanceof ZipArchiveOutputStream)) {\n return new ZipArchiveOutputStream(options);\n }\n\n options = this.options = this._defaults(options);\n\n ArchiveOutputStream.call(this, options);\n\n this._entry = null;\n this._entries = [];\n this._archive = {\n centralLength: 0,\n centralOffset: 0,\n comment: '',\n finish: false,\n finished: false,\n processing: false,\n forceZip64: options.forceZip64,\n forceLocalTime: options.forceLocalTime\n };\n};\n\ninherits(ZipArchiveOutputStream, ArchiveOutputStream);\n\nZipArchiveOutputStream.prototype._afterAppend = function(ae) {\n this._entries.push(ae);\n\n if (ae.getGeneralPurposeBit().usesDataDescriptor()) {\n this._writeDataDescriptor(ae);\n }\n\n this._archive.processing = false;\n this._entry = null;\n\n if (this._archive.finish && !this._archive.finished) {\n this._finish();\n }\n};\n\nZipArchiveOutputStream.prototype._appendBuffer = function(ae, source, callback) {\n if (source.length === 0) {\n ae.setMethod(constants.METHOD_STORED);\n }\n\n var method = ae.getMethod();\n\n if (method === constants.METHOD_STORED) {\n ae.setSize(source.length);\n ae.setCompressedSize(source.length);\n ae.setCrc(crc32.buf(source) >>> 0);\n }\n\n this._writeLocalFileHeader(ae);\n\n if (method === constants.METHOD_STORED) {\n this.write(source);\n this._afterAppend(ae);\n callback(null, ae);\n return;\n } else if (method === constants.METHOD_DEFLATED) {\n this._smartStream(ae, callback).end(source);\n return;\n } else {\n callback(new Error('compression method ' + method + ' not implemented'));\n return;\n }\n};\n\nZipArchiveOutputStream.prototype._appendStream = function(ae, source, callback) {\n ae.getGeneralPurposeBit().useDataDescriptor(true);\n ae.setVersionNeededToExtract(constants.MIN_VERSION_DATA_DESCRIPTOR);\n\n this._writeLocalFileHeader(ae);\n\n var smart = this._smartStream(ae, callback);\n source.once('error', function(err) {\n smart.emit('error', err);\n smart.end();\n })\n source.pipe(smart);\n};\n\nZipArchiveOutputStream.prototype._defaults = function(o) {\n if (typeof o !== 'object') {\n o = {};\n }\n\n if (typeof o.zlib !== 'object') {\n o.zlib = {};\n }\n\n if (typeof o.zlib.level !== 'number') {\n o.zlib.level = constants.ZLIB_BEST_SPEED;\n }\n\n o.forceZip64 = !!o.forceZip64;\n o.forceLocalTime = !!o.forceLocalTime;\n\n return o;\n};\n\nZipArchiveOutputStream.prototype._finish = function() {\n this._archive.centralOffset = this.offset;\n\n this._entries.forEach(function(ae) {\n this._writeCentralFileHeader(ae);\n }.bind(this));\n\n this._archive.centralLength = this.offset - this._archive.centralOffset;\n\n if (this.isZip64()) {\n this._writeCentralDirectoryZip64();\n }\n\n this._writeCentralDirectoryEnd();\n\n this._archive.processing = false;\n this._archive.finish = true;\n this._archive.finished = true;\n this.end();\n};\n\nZipArchiveOutputStream.prototype._normalizeEntry = function(ae) {\n if (ae.getMethod() === -1) {\n ae.setMethod(constants.METHOD_DEFLATED);\n }\n\n if (ae.getMethod() === constants.METHOD_DEFLATED) {\n ae.getGeneralPurposeBit().useDataDescriptor(true);\n ae.setVersionNeededToExtract(constants.MIN_VERSION_DATA_DESCRIPTOR);\n }\n\n if (ae.getTime() === -1) {\n ae.setTime(new Date(), this._archive.forceLocalTime);\n }\n\n ae._offsets = {\n file: 0,\n data: 0,\n contents: 0,\n };\n};\n\nZipArchiveOutputStream.prototype._smartStream = function(ae, callback) {\n var deflate = ae.getMethod() === constants.METHOD_DEFLATED;\n var process = deflate ? new DeflateCRC32Stream(this.options.zlib) : new CRC32Stream();\n var error = null;\n\n function handleStuff() {\n var digest = process.digest().readUInt32BE(0);\n ae.setCrc(digest);\n ae.setSize(process.size());\n ae.setCompressedSize(process.size(true));\n this._afterAppend(ae);\n callback(error, ae);\n }\n\n process.once('end', handleStuff.bind(this));\n process.once('error', function(err) {\n error = err;\n });\n\n process.pipe(this, { end: false });\n\n return process;\n};\n\nZipArchiveOutputStream.prototype._writeCentralDirectoryEnd = function() {\n var records = this._entries.length;\n var size = this._archive.centralLength;\n var offset = this._archive.centralOffset;\n\n if (this.isZip64()) {\n records = constants.ZIP64_MAGIC_SHORT;\n size = constants.ZIP64_MAGIC;\n offset = constants.ZIP64_MAGIC;\n }\n\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_EOCD));\n\n // disk numbers\n this.write(constants.SHORT_ZERO);\n this.write(constants.SHORT_ZERO);\n\n // number of entries\n this.write(zipUtil.getShortBytes(records));\n this.write(zipUtil.getShortBytes(records));\n\n // length and location of CD\n this.write(zipUtil.getLongBytes(size));\n this.write(zipUtil.getLongBytes(offset));\n\n // archive comment\n var comment = this.getComment();\n var commentLength = Buffer.byteLength(comment);\n this.write(zipUtil.getShortBytes(commentLength));\n this.write(comment);\n};\n\nZipArchiveOutputStream.prototype._writeCentralDirectoryZip64 = function() {\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_ZIP64_EOCD));\n\n // size of the ZIP64 EOCD record\n this.write(zipUtil.getEightBytes(44));\n\n // version made by\n this.write(zipUtil.getShortBytes(constants.MIN_VERSION_ZIP64));\n\n // version to extract\n this.write(zipUtil.getShortBytes(constants.MIN_VERSION_ZIP64));\n\n // disk numbers\n this.write(constants.LONG_ZERO);\n this.write(constants.LONG_ZERO);\n\n // number of entries\n this.write(zipUtil.getEightBytes(this._entries.length));\n this.write(zipUtil.getEightBytes(this._entries.length));\n\n // length and location of CD\n this.write(zipUtil.getEightBytes(this._archive.centralLength));\n this.write(zipUtil.getEightBytes(this._archive.centralOffset));\n\n // extensible data sector\n // not implemented at this time\n\n // end of central directory locator\n this.write(zipUtil.getLongBytes(constants.SIG_ZIP64_EOCD_LOC));\n\n // disk number holding the ZIP64 EOCD record\n this.write(constants.LONG_ZERO);\n\n // relative offset of the ZIP64 EOCD record\n this.write(zipUtil.getEightBytes(this._archive.centralOffset + this._archive.centralLength));\n\n // total number of disks\n this.write(zipUtil.getLongBytes(1));\n};\n\nZipArchiveOutputStream.prototype._writeCentralFileHeader = function(ae) {\n var gpb = ae.getGeneralPurposeBit();\n var method = ae.getMethod();\n var fileOffset = ae._offsets.file;\n\n var size = ae.getSize();\n var compressedSize = ae.getCompressedSize();\n\n if (ae.isZip64() || fileOffset > constants.ZIP64_MAGIC) {\n size = constants.ZIP64_MAGIC;\n compressedSize = constants.ZIP64_MAGIC;\n fileOffset = constants.ZIP64_MAGIC;\n\n ae.setVersionNeededToExtract(constants.MIN_VERSION_ZIP64);\n\n var extraBuf = Buffer.concat([\n zipUtil.getShortBytes(constants.ZIP64_EXTRA_ID),\n zipUtil.getShortBytes(24),\n zipUtil.getEightBytes(ae.getSize()),\n zipUtil.getEightBytes(ae.getCompressedSize()),\n zipUtil.getEightBytes(ae._offsets.file)\n ], 28);\n\n ae.setExtra(extraBuf);\n }\n\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_CFH));\n\n // version made by\n this.write(zipUtil.getShortBytes((ae.getPlatform() << 8) | constants.VERSION_MADEBY));\n\n // version to extract and general bit flag\n this.write(zipUtil.getShortBytes(ae.getVersionNeededToExtract()));\n this.write(gpb.encode());\n\n // compression method\n this.write(zipUtil.getShortBytes(method));\n\n // datetime\n this.write(zipUtil.getLongBytes(ae.getTimeDos()));\n\n // crc32 checksum\n this.write(zipUtil.getLongBytes(ae.getCrc()));\n\n // sizes\n this.write(zipUtil.getLongBytes(compressedSize));\n this.write(zipUtil.getLongBytes(size));\n\n var name = ae.getName();\n var comment = ae.getComment();\n var extra = ae.getCentralDirectoryExtra();\n\n if (gpb.usesUTF8ForNames()) {\n name = Buffer.from(name);\n comment = Buffer.from(comment);\n }\n\n // name length\n this.write(zipUtil.getShortBytes(name.length));\n\n // extra length\n this.write(zipUtil.getShortBytes(extra.length));\n\n // comments length\n this.write(zipUtil.getShortBytes(comment.length));\n\n // disk number start\n this.write(constants.SHORT_ZERO);\n\n // internal attributes\n this.write(zipUtil.getShortBytes(ae.getInternalAttributes()));\n\n // external attributes\n this.write(zipUtil.getLongBytes(ae.getExternalAttributes()));\n\n // relative offset of LFH\n this.write(zipUtil.getLongBytes(fileOffset));\n\n // name\n this.write(name);\n\n // extra\n this.write(extra);\n\n // comment\n this.write(comment);\n};\n\nZipArchiveOutputStream.prototype._writeDataDescriptor = function(ae) {\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_DD));\n\n // crc32 checksum\n this.write(zipUtil.getLongBytes(ae.getCrc()));\n\n // sizes\n if (ae.isZip64()) {\n this.write(zipUtil.getEightBytes(ae.getCompressedSize()));\n this.write(zipUtil.getEightBytes(ae.getSize()));\n } else {\n this.write(zipUtil.getLongBytes(ae.getCompressedSize()));\n this.write(zipUtil.getLongBytes(ae.getSize()));\n }\n};\n\nZipArchiveOutputStream.prototype._writeLocalFileHeader = function(ae) {\n var gpb = ae.getGeneralPurposeBit();\n var method = ae.getMethod();\n var name = ae.getName();\n var extra = ae.getLocalFileDataExtra();\n\n if (ae.isZip64()) {\n gpb.useDataDescriptor(true);\n ae.setVersionNeededToExtract(constants.MIN_VERSION_ZIP64);\n }\n\n if (gpb.usesUTF8ForNames()) {\n name = Buffer.from(name);\n }\n\n ae._offsets.file = this.offset;\n\n // signature\n this.write(zipUtil.getLongBytes(constants.SIG_LFH));\n\n // version to extract and general bit flag\n this.write(zipUtil.getShortBytes(ae.getVersionNeededToExtract()));\n this.write(gpb.encode());\n\n // compression method\n this.write(zipUtil.getShortBytes(method));\n\n // datetime\n this.write(zipUtil.getLongBytes(ae.getTimeDos()));\n\n ae._offsets.data = this.offset;\n\n // crc32 checksum and sizes\n if (gpb.usesDataDescriptor()) {\n this.write(constants.LONG_ZERO);\n this.write(constants.LONG_ZERO);\n this.write(constants.LONG_ZERO);\n } else {\n this.write(zipUtil.getLongBytes(ae.getCrc()));\n this.write(zipUtil.getLongBytes(ae.getCompressedSize()));\n this.write(zipUtil.getLongBytes(ae.getSize()));\n }\n\n // name length\n this.write(zipUtil.getShortBytes(name.length));\n\n // extra length\n this.write(zipUtil.getShortBytes(extra.length));\n\n // name\n this.write(name);\n\n // extra\n this.write(extra);\n\n ae._offsets.contents = this.offset;\n};\n\nZipArchiveOutputStream.prototype.getComment = function(comment) {\n return this._archive.comment !== null ? this._archive.comment : '';\n};\n\nZipArchiveOutputStream.prototype.isZip64 = function() {\n return this._archive.forceZip64 || this._entries.length > constants.ZIP64_MAGIC_SHORT || this._archive.centralLength > constants.ZIP64_MAGIC || this._archive.centralOffset > constants.ZIP64_MAGIC;\n};\n\nZipArchiveOutputStream.prototype.setComment = function(comment) {\n this._archive.comment = comment;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMzNDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFDQUF3QjtBQUN2QyxZQUFZLG1CQUFPLENBQUMsS0FBUTtBQUM1QixLQUFLLGFBQWEsRUFBRSxtQkFBTyxDQUFDLEVBQWM7QUFDMUMsS0FBSyxvQkFBb0IsRUFBRSxtQkFBTyxDQUFDLEVBQWM7O0FBRWpELDBCQUEwQixtQkFBTyxDQUFDLEtBQTBCO0FBQzVELHNCQUFzQixtQkFBTyxDQUFDLEtBQXFCO0FBQ25ELHdCQUF3QixtQkFBTyxDQUFDLEtBQXVCOztBQUV2RCxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUFhO0FBQ3JDLFdBQVcsbUJBQU8sQ0FBQyxLQUFZO0FBQy9CLGNBQWMsbUJBQU8sQ0FBQyxLQUFROztBQUU5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsdUJBQXVCLFlBQVk7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvemlwL3ppcC1hcmNoaXZlLW91dHB1dC1zdHJlYW0uanM/YjJlZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzO1xudmFyIGNyYzMyID0gcmVxdWlyZSgnY3JjLTMyJyk7XG52YXIge0NSQzMyU3RyZWFtfSA9IHJlcXVpcmUoJ2NyYzMyLXN0cmVhbScpO1xudmFyIHtEZWZsYXRlQ1JDMzJTdHJlYW19ID0gcmVxdWlyZSgnY3JjMzItc3RyZWFtJyk7XG5cbnZhciBBcmNoaXZlT3V0cHV0U3RyZWFtID0gcmVxdWlyZSgnLi4vYXJjaGl2ZS1vdXRwdXQtc3RyZWFtJyk7XG52YXIgWmlwQXJjaGl2ZUVudHJ5ID0gcmVxdWlyZSgnLi96aXAtYXJjaGl2ZS1lbnRyeScpO1xudmFyIEdlbmVyYWxQdXJwb3NlQml0ID0gcmVxdWlyZSgnLi9nZW5lcmFsLXB1cnBvc2UtYml0Jyk7XG5cbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyk7XG52YXIgemlwVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgWmlwQXJjaGl2ZU91dHB1dFN0cmVhbSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgWmlwQXJjaGl2ZU91dHB1dFN0cmVhbSkpIHtcbiAgICByZXR1cm4gbmV3IFppcEFyY2hpdmVPdXRwdXRTdHJlYW0ob3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdGhpcy5fZGVmYXVsdHMob3B0aW9ucyk7XG5cbiAgQXJjaGl2ZU91dHB1dFN0cmVhbS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX2VudHJ5ID0gbnVsbDtcbiAgdGhpcy5fZW50cmllcyA9IFtdO1xuICB0aGlzLl9hcmNoaXZlID0ge1xuICAgIGNlbnRyYWxMZW5ndGg6IDAsXG4gICAgY2VudHJhbE9mZnNldDogMCxcbiAgICBjb21tZW50OiAnJyxcbiAgICBmaW5pc2g6IGZhbHNlLFxuICAgIGZpbmlzaGVkOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZSxcbiAgICBmb3JjZVppcDY0OiBvcHRpb25zLmZvcmNlWmlwNjQsXG4gICAgZm9yY2VMb2NhbFRpbWU6IG9wdGlvbnMuZm9yY2VMb2NhbFRpbWVcbiAgfTtcbn07XG5cbmluaGVyaXRzKFppcEFyY2hpdmVPdXRwdXRTdHJlYW0sIEFyY2hpdmVPdXRwdXRTdHJlYW0pO1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fYWZ0ZXJBcHBlbmQgPSBmdW5jdGlvbihhZSkge1xuICB0aGlzLl9lbnRyaWVzLnB1c2goYWUpO1xuXG4gIGlmIChhZS5nZXRHZW5lcmFsUHVycG9zZUJpdCgpLnVzZXNEYXRhRGVzY3JpcHRvcigpKSB7XG4gICAgdGhpcy5fd3JpdGVEYXRhRGVzY3JpcHRvcihhZSk7XG4gIH1cblxuICB0aGlzLl9hcmNoaXZlLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgdGhpcy5fZW50cnkgPSBudWxsO1xuXG4gIGlmICh0aGlzLl9hcmNoaXZlLmZpbmlzaCAmJiAhdGhpcy5fYXJjaGl2ZS5maW5pc2hlZCkge1xuICAgIHRoaXMuX2ZpbmlzaCgpO1xuICB9XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fYXBwZW5kQnVmZmVyID0gZnVuY3Rpb24oYWUsIHNvdXJjZSwgY2FsbGJhY2spIHtcbiAgaWYgKHNvdXJjZS5sZW5ndGggPT09IDApIHtcbiAgICBhZS5zZXRNZXRob2QoY29uc3RhbnRzLk1FVEhPRF9TVE9SRUQpO1xuICB9XG5cbiAgdmFyIG1ldGhvZCA9IGFlLmdldE1ldGhvZCgpO1xuXG4gIGlmIChtZXRob2QgPT09IGNvbnN0YW50cy5NRVRIT0RfU1RPUkVEKSB7XG4gICAgYWUuc2V0U2l6ZShzb3VyY2UubGVuZ3RoKTtcbiAgICBhZS5zZXRDb21wcmVzc2VkU2l6ZShzb3VyY2UubGVuZ3RoKTtcbiAgICBhZS5zZXRDcmMoY3JjMzIuYnVmKHNvdXJjZSkgPj4+IDApO1xuICB9XG5cbiAgdGhpcy5fd3JpdGVMb2NhbEZpbGVIZWFkZXIoYWUpO1xuXG4gIGlmIChtZXRob2QgPT09IGNvbnN0YW50cy5NRVRIT0RfU1RPUkVEKSB7XG4gICAgdGhpcy53cml0ZShzb3VyY2UpO1xuICAgIHRoaXMuX2FmdGVyQXBwZW5kKGFlKTtcbiAgICBjYWxsYmFjayhudWxsLCBhZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gY29uc3RhbnRzLk1FVEhPRF9ERUZMQVRFRCkge1xuICAgIHRoaXMuX3NtYXJ0U3RyZWFtKGFlLCBjYWxsYmFjaykuZW5kKHNvdXJjZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcignY29tcHJlc3Npb24gbWV0aG9kICcgKyBtZXRob2QgKyAnIG5vdCBpbXBsZW1lbnRlZCcpKTtcbiAgICByZXR1cm47XG4gIH1cbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9hcHBlbmRTdHJlYW0gPSBmdW5jdGlvbihhZSwgc291cmNlLCBjYWxsYmFjaykge1xuICBhZS5nZXRHZW5lcmFsUHVycG9zZUJpdCgpLnVzZURhdGFEZXNjcmlwdG9yKHRydWUpO1xuICBhZS5zZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0KGNvbnN0YW50cy5NSU5fVkVSU0lPTl9EQVRBX0RFU0NSSVBUT1IpO1xuXG4gIHRoaXMuX3dyaXRlTG9jYWxGaWxlSGVhZGVyKGFlKTtcblxuICB2YXIgc21hcnQgPSB0aGlzLl9zbWFydFN0cmVhbShhZSwgY2FsbGJhY2spO1xuICBzb3VyY2Uub25jZSgnZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICBzbWFydC5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgc21hcnQuZW5kKCk7XG4gIH0pXG4gIHNvdXJjZS5waXBlKHNtYXJ0KTtcbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9kZWZhdWx0cyA9IGZ1bmN0aW9uKG8pIHtcbiAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0Jykge1xuICAgIG8gPSB7fTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygby56bGliICE9PSAnb2JqZWN0Jykge1xuICAgIG8uemxpYiA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvLnpsaWIubGV2ZWwgIT09ICdudW1iZXInKSB7XG4gICAgby56bGliLmxldmVsID0gY29uc3RhbnRzLlpMSUJfQkVTVF9TUEVFRDtcbiAgfVxuXG4gIG8uZm9yY2VaaXA2NCA9ICEhby5mb3JjZVppcDY0O1xuICBvLmZvcmNlTG9jYWxUaW1lID0gISFvLmZvcmNlTG9jYWxUaW1lO1xuXG4gIHJldHVybiBvO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX2ZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9hcmNoaXZlLmNlbnRyYWxPZmZzZXQgPSB0aGlzLm9mZnNldDtcblxuICB0aGlzLl9lbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oYWUpIHtcbiAgICB0aGlzLl93cml0ZUNlbnRyYWxGaWxlSGVhZGVyKGFlKTtcbiAgfS5iaW5kKHRoaXMpKTtcblxuICB0aGlzLl9hcmNoaXZlLmNlbnRyYWxMZW5ndGggPSB0aGlzLm9mZnNldCAtIHRoaXMuX2FyY2hpdmUuY2VudHJhbE9mZnNldDtcblxuICBpZiAodGhpcy5pc1ppcDY0KCkpIHtcbiAgICB0aGlzLl93cml0ZUNlbnRyYWxEaXJlY3RvcnlaaXA2NCgpO1xuICB9XG5cbiAgdGhpcy5fd3JpdGVDZW50cmFsRGlyZWN0b3J5RW5kKCk7XG5cbiAgdGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nID0gZmFsc2U7XG4gIHRoaXMuX2FyY2hpdmUuZmluaXNoID0gdHJ1ZTtcbiAgdGhpcy5fYXJjaGl2ZS5maW5pc2hlZCA9IHRydWU7XG4gIHRoaXMuZW5kKCk7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fbm9ybWFsaXplRW50cnkgPSBmdW5jdGlvbihhZSkge1xuICBpZiAoYWUuZ2V0TWV0aG9kKCkgPT09IC0xKSB7XG4gICAgYWUuc2V0TWV0aG9kKGNvbnN0YW50cy5NRVRIT0RfREVGTEFURUQpO1xuICB9XG5cbiAgaWYgKGFlLmdldE1ldGhvZCgpID09PSBjb25zdGFudHMuTUVUSE9EX0RFRkxBVEVEKSB7XG4gICAgYWUuZ2V0R2VuZXJhbFB1cnBvc2VCaXQoKS51c2VEYXRhRGVzY3JpcHRvcih0cnVlKTtcbiAgICBhZS5zZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0KGNvbnN0YW50cy5NSU5fVkVSU0lPTl9EQVRBX0RFU0NSSVBUT1IpO1xuICB9XG5cbiAgaWYgKGFlLmdldFRpbWUoKSA9PT0gLTEpIHtcbiAgICBhZS5zZXRUaW1lKG5ldyBEYXRlKCksIHRoaXMuX2FyY2hpdmUuZm9yY2VMb2NhbFRpbWUpO1xuICB9XG5cbiAgYWUuX29mZnNldHMgPSB7XG4gICAgZmlsZTogMCxcbiAgICBkYXRhOiAwLFxuICAgIGNvbnRlbnRzOiAwLFxuICB9O1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3NtYXJ0U3RyZWFtID0gZnVuY3Rpb24oYWUsIGNhbGxiYWNrKSB7XG4gIHZhciBkZWZsYXRlID0gYWUuZ2V0TWV0aG9kKCkgPT09IGNvbnN0YW50cy5NRVRIT0RfREVGTEFURUQ7XG4gIHZhciBwcm9jZXNzID0gZGVmbGF0ZSA/IG5ldyBEZWZsYXRlQ1JDMzJTdHJlYW0odGhpcy5vcHRpb25zLnpsaWIpIDogbmV3IENSQzMyU3RyZWFtKCk7XG4gIHZhciBlcnJvciA9IG51bGw7XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3R1ZmYoKSB7XG4gICAgdmFyIGRpZ2VzdCA9IHByb2Nlc3MuZGlnZXN0KCkucmVhZFVJbnQzMkJFKDApO1xuICAgIGFlLnNldENyYyhkaWdlc3QpO1xuICAgIGFlLnNldFNpemUocHJvY2Vzcy5zaXplKCkpO1xuICAgIGFlLnNldENvbXByZXNzZWRTaXplKHByb2Nlc3Muc2l6ZSh0cnVlKSk7XG4gICAgdGhpcy5fYWZ0ZXJBcHBlbmQoYWUpO1xuICAgIGNhbGxiYWNrKGVycm9yLCBhZSk7XG4gIH1cblxuICBwcm9jZXNzLm9uY2UoJ2VuZCcsIGhhbmRsZVN0dWZmLmJpbmQodGhpcykpO1xuICBwcm9jZXNzLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgZXJyb3IgPSBlcnI7XG4gIH0pO1xuXG4gIHByb2Nlc3MucGlwZSh0aGlzLCB7IGVuZDogZmFsc2UgfSk7XG5cbiAgcmV0dXJuIHByb2Nlc3M7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fd3JpdGVDZW50cmFsRGlyZWN0b3J5RW5kID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZWNvcmRzID0gdGhpcy5fZW50cmllcy5sZW5ndGg7XG4gIHZhciBzaXplID0gdGhpcy5fYXJjaGl2ZS5jZW50cmFsTGVuZ3RoO1xuICB2YXIgb2Zmc2V0ID0gdGhpcy5fYXJjaGl2ZS5jZW50cmFsT2Zmc2V0O1xuXG4gIGlmICh0aGlzLmlzWmlwNjQoKSkge1xuICAgIHJlY29yZHMgPSBjb25zdGFudHMuWklQNjRfTUFHSUNfU0hPUlQ7XG4gICAgc2l6ZSA9IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbiAgICBvZmZzZXQgPSBjb25zdGFudHMuWklQNjRfTUFHSUM7XG4gIH1cblxuICAvLyBzaWduYXR1cmVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX0VPQ0QpKTtcblxuICAvLyBkaXNrIG51bWJlcnNcbiAgdGhpcy53cml0ZShjb25zdGFudHMuU0hPUlRfWkVSTyk7XG4gIHRoaXMud3JpdGUoY29uc3RhbnRzLlNIT1JUX1pFUk8pO1xuXG4gIC8vIG51bWJlciBvZiBlbnRyaWVzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKHJlY29yZHMpKTtcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMocmVjb3JkcykpO1xuXG4gIC8vIGxlbmd0aCBhbmQgbG9jYXRpb24gb2YgQ0RcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhzaXplKSk7XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMob2Zmc2V0KSk7XG5cbiAgLy8gYXJjaGl2ZSBjb21tZW50XG4gIHZhciBjb21tZW50ID0gdGhpcy5nZXRDb21tZW50KCk7XG4gIHZhciBjb21tZW50TGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoY29tbWVudCk7XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGNvbW1lbnRMZW5ndGgpKTtcbiAgdGhpcy53cml0ZShjb21tZW50KTtcbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl93cml0ZUNlbnRyYWxEaXJlY3RvcnlaaXA2NCA9IGZ1bmN0aW9uKCkge1xuICAvLyBzaWduYXR1cmVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX1pJUDY0X0VPQ0QpKTtcblxuICAvLyBzaXplIG9mIHRoZSBaSVA2NCBFT0NEIHJlY29yZFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0RWlnaHRCeXRlcyg0NCkpO1xuXG4gIC8vIHZlcnNpb24gbWFkZSBieVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhjb25zdGFudHMuTUlOX1ZFUlNJT05fWklQNjQpKTtcblxuICAvLyB2ZXJzaW9uIHRvIGV4dHJhY3RcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoY29uc3RhbnRzLk1JTl9WRVJTSU9OX1pJUDY0KSk7XG5cbiAgLy8gZGlzayBudW1iZXJzXG4gIHRoaXMud3JpdGUoY29uc3RhbnRzLkxPTkdfWkVSTyk7XG4gIHRoaXMud3JpdGUoY29uc3RhbnRzLkxPTkdfWkVSTyk7XG5cbiAgLy8gbnVtYmVyIG9mIGVudHJpZXNcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXModGhpcy5fZW50cmllcy5sZW5ndGgpKTtcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXModGhpcy5fZW50cmllcy5sZW5ndGgpKTtcblxuICAvLyBsZW5ndGggYW5kIGxvY2F0aW9uIG9mIENEXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRFaWdodEJ5dGVzKHRoaXMuX2FyY2hpdmUuY2VudHJhbExlbmd0aCkpO1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0RWlnaHRCeXRlcyh0aGlzLl9hcmNoaXZlLmNlbnRyYWxPZmZzZXQpKTtcblxuICAvLyBleHRlbnNpYmxlIGRhdGEgc2VjdG9yXG4gIC8vIG5vdCBpbXBsZW1lbnRlZCBhdCB0aGlzIHRpbWVcblxuICAvLyBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvclxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGNvbnN0YW50cy5TSUdfWklQNjRfRU9DRF9MT0MpKTtcblxuICAvLyBkaXNrIG51bWJlciBob2xkaW5nIHRoZSBaSVA2NCBFT0NEIHJlY29yZFxuICB0aGlzLndyaXRlKGNvbnN0YW50cy5MT05HX1pFUk8pO1xuXG4gIC8vIHJlbGF0aXZlIG9mZnNldCBvZiB0aGUgWklQNjQgRU9DRCByZWNvcmRcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXModGhpcy5fYXJjaGl2ZS5jZW50cmFsT2Zmc2V0ICsgdGhpcy5fYXJjaGl2ZS5jZW50cmFsTGVuZ3RoKSk7XG5cbiAgLy8gdG90YWwgbnVtYmVyIG9mIGRpc2tzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoMSkpO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3dyaXRlQ2VudHJhbEZpbGVIZWFkZXIgPSBmdW5jdGlvbihhZSkge1xuICB2YXIgZ3BiID0gYWUuZ2V0R2VuZXJhbFB1cnBvc2VCaXQoKTtcbiAgdmFyIG1ldGhvZCA9IGFlLmdldE1ldGhvZCgpO1xuICB2YXIgZmlsZU9mZnNldCA9IGFlLl9vZmZzZXRzLmZpbGU7XG5cbiAgdmFyIHNpemUgPSBhZS5nZXRTaXplKCk7XG4gIHZhciBjb21wcmVzc2VkU2l6ZSA9IGFlLmdldENvbXByZXNzZWRTaXplKCk7XG5cbiAgaWYgKGFlLmlzWmlwNjQoKSB8fCBmaWxlT2Zmc2V0ID4gY29uc3RhbnRzLlpJUDY0X01BR0lDKSB7XG4gICAgc2l6ZSA9IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbiAgICBjb21wcmVzc2VkU2l6ZSA9IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbiAgICBmaWxlT2Zmc2V0ID0gY29uc3RhbnRzLlpJUDY0X01BR0lDO1xuXG4gICAgYWUuc2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdChjb25zdGFudHMuTUlOX1ZFUlNJT05fWklQNjQpO1xuXG4gICAgdmFyIGV4dHJhQnVmID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICB6aXBVdGlsLmdldFNob3J0Qnl0ZXMoY29uc3RhbnRzLlpJUDY0X0VYVFJBX0lEKSxcbiAgICAgIHppcFV0aWwuZ2V0U2hvcnRCeXRlcygyNCksXG4gICAgICB6aXBVdGlsLmdldEVpZ2h0Qnl0ZXMoYWUuZ2V0U2l6ZSgpKSxcbiAgICAgIHppcFV0aWwuZ2V0RWlnaHRCeXRlcyhhZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSxcbiAgICAgIHppcFV0aWwuZ2V0RWlnaHRCeXRlcyhhZS5fb2Zmc2V0cy5maWxlKVxuICAgIF0sIDI4KTtcblxuICAgIGFlLnNldEV4dHJhKGV4dHJhQnVmKTtcbiAgfVxuXG4gIC8vIHNpZ25hdHVyZVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGNvbnN0YW50cy5TSUdfQ0ZIKSk7XG5cbiAgLy8gdmVyc2lvbiBtYWRlIGJ5XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKChhZS5nZXRQbGF0Zm9ybSgpIDw8IDgpIHwgY29uc3RhbnRzLlZFUlNJT05fTUFERUJZKSk7XG5cbiAgLy8gdmVyc2lvbiB0byBleHRyYWN0IGFuZCBnZW5lcmFsIGJpdCBmbGFnXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGFlLmdldFZlcnNpb25OZWVkZWRUb0V4dHJhY3QoKSkpO1xuICB0aGlzLndyaXRlKGdwYi5lbmNvZGUoKSk7XG5cbiAgLy8gY29tcHJlc3Npb24gbWV0aG9kXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKG1ldGhvZCkpO1xuXG4gIC8vIGRhdGV0aW1lXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoYWUuZ2V0VGltZURvcygpKSk7XG5cbiAgLy8gY3JjMzIgY2hlY2tzdW1cbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRDcmMoKSkpO1xuXG4gIC8vIHNpemVzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoY29tcHJlc3NlZFNpemUpKTtcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhzaXplKSk7XG5cbiAgdmFyIG5hbWUgPSBhZS5nZXROYW1lKCk7XG4gIHZhciBjb21tZW50ID0gYWUuZ2V0Q29tbWVudCgpO1xuICB2YXIgZXh0cmEgPSBhZS5nZXRDZW50cmFsRGlyZWN0b3J5RXh0cmEoKTtcblxuICBpZiAoZ3BiLnVzZXNVVEY4Rm9yTmFtZXMoKSkge1xuICAgIG5hbWUgPSBCdWZmZXIuZnJvbShuYW1lKTtcbiAgICBjb21tZW50ID0gQnVmZmVyLmZyb20oY29tbWVudCk7XG4gIH1cblxuICAvLyBuYW1lIGxlbmd0aFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhuYW1lLmxlbmd0aCkpO1xuXG4gIC8vIGV4dHJhIGxlbmd0aFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhleHRyYS5sZW5ndGgpKTtcblxuICAvLyBjb21tZW50cyBsZW5ndGhcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoY29tbWVudC5sZW5ndGgpKTtcblxuICAvLyBkaXNrIG51bWJlciBzdGFydFxuICB0aGlzLndyaXRlKGNvbnN0YW50cy5TSE9SVF9aRVJPKTtcblxuICAvLyBpbnRlcm5hbCBhdHRyaWJ1dGVzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGFlLmdldEludGVybmFsQXR0cmlidXRlcygpKSk7XG5cbiAgLy8gZXh0ZXJuYWwgYXR0cmlidXRlc1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldEV4dGVybmFsQXR0cmlidXRlcygpKSk7XG5cbiAgLy8gcmVsYXRpdmUgb2Zmc2V0IG9mIExGSFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGZpbGVPZmZzZXQpKTtcblxuICAvLyBuYW1lXG4gIHRoaXMud3JpdGUobmFtZSk7XG5cbiAgLy8gZXh0cmFcbiAgdGhpcy53cml0ZShleHRyYSk7XG5cbiAgLy8gY29tbWVudFxuICB0aGlzLndyaXRlKGNvbW1lbnQpO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3dyaXRlRGF0YURlc2NyaXB0b3IgPSBmdW5jdGlvbihhZSkge1xuICAvLyBzaWduYXR1cmVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX0REKSk7XG5cbiAgLy8gY3JjMzIgY2hlY2tzdW1cbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRDcmMoKSkpO1xuXG4gIC8vIHNpemVzXG4gIGlmIChhZS5pc1ppcDY0KCkpIHtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0RWlnaHRCeXRlcyhhZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXMoYWUuZ2V0U2l6ZSgpKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRTaXplKCkpKTtcbiAgfVxufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3dyaXRlTG9jYWxGaWxlSGVhZGVyID0gZnVuY3Rpb24oYWUpIHtcbiAgdmFyIGdwYiA9IGFlLmdldEdlbmVyYWxQdXJwb3NlQml0KCk7XG4gIHZhciBtZXRob2QgPSBhZS5nZXRNZXRob2QoKTtcbiAgdmFyIG5hbWUgPSBhZS5nZXROYW1lKCk7XG4gIHZhciBleHRyYSA9IGFlLmdldExvY2FsRmlsZURhdGFFeHRyYSgpO1xuXG4gIGlmIChhZS5pc1ppcDY0KCkpIHtcbiAgICBncGIudXNlRGF0YURlc2NyaXB0b3IodHJ1ZSk7XG4gICAgYWUuc2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdChjb25zdGFudHMuTUlOX1ZFUlNJT05fWklQNjQpO1xuICB9XG5cbiAgaWYgKGdwYi51c2VzVVRGOEZvck5hbWVzKCkpIHtcbiAgICBuYW1lID0gQnVmZmVyLmZyb20obmFtZSk7XG4gIH1cblxuICBhZS5fb2Zmc2V0cy5maWxlID0gdGhpcy5vZmZzZXQ7XG5cbiAgLy8gc2lnbmF0dXJlXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoY29uc3RhbnRzLlNJR19MRkgpKTtcblxuICAvLyB2ZXJzaW9uIHRvIGV4dHJhY3QgYW5kIGdlbmVyYWwgYml0IGZsYWdcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoYWUuZ2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdCgpKSk7XG4gIHRoaXMud3JpdGUoZ3BiLmVuY29kZSgpKTtcblxuICAvLyBjb21wcmVzc2lvbiBtZXRob2RcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMobWV0aG9kKSk7XG5cbiAgLy8gZGF0ZXRpbWVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRUaW1lRG9zKCkpKTtcblxuICBhZS5fb2Zmc2V0cy5kYXRhID0gdGhpcy5vZmZzZXQ7XG5cbiAgLy8gY3JjMzIgY2hlY2tzdW0gYW5kIHNpemVzXG4gIGlmIChncGIudXNlc0RhdGFEZXNjcmlwdG9yKCkpIHtcbiAgICB0aGlzLndyaXRlKGNvbnN0YW50cy5MT05HX1pFUk8pO1xuICAgIHRoaXMud3JpdGUoY29uc3RhbnRzLkxPTkdfWkVSTyk7XG4gICAgdGhpcy53cml0ZShjb25zdGFudHMuTE9OR19aRVJPKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldENyYygpKSk7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRTaXplKCkpKTtcbiAgfVxuXG4gIC8vIG5hbWUgbGVuZ3RoXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKG5hbWUubGVuZ3RoKSk7XG5cbiAgLy8gZXh0cmEgbGVuZ3RoXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGV4dHJhLmxlbmd0aCkpO1xuXG4gIC8vIG5hbWVcbiAgdGhpcy53cml0ZShuYW1lKTtcblxuICAvLyBleHRyYVxuICB0aGlzLndyaXRlKGV4dHJhKTtcblxuICBhZS5fb2Zmc2V0cy5jb250ZW50cyA9IHRoaXMub2Zmc2V0O1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuZ2V0Q29tbWVudCA9IGZ1bmN0aW9uKGNvbW1lbnQpIHtcbiAgcmV0dXJuIHRoaXMuX2FyY2hpdmUuY29tbWVudCAhPT0gbnVsbCA/IHRoaXMuX2FyY2hpdmUuY29tbWVudCA6ICcnO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuaXNaaXA2NCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJjaGl2ZS5mb3JjZVppcDY0IHx8IHRoaXMuX2VudHJpZXMubGVuZ3RoID4gY29uc3RhbnRzLlpJUDY0X01BR0lDX1NIT1JUIHx8IHRoaXMuX2FyY2hpdmUuY2VudHJhbExlbmd0aCA+IGNvbnN0YW50cy5aSVA2NF9NQUdJQyB8fCB0aGlzLl9hcmNoaXZlLmNlbnRyYWxPZmZzZXQgPiBjb25zdGFudHMuWklQNjRfTUFHSUM7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5zZXRDb21tZW50ID0gZnVuY3Rpb24oY29tbWVudCkge1xuICB0aGlzLl9hcmNoaXZlLmNvbW1lbnQgPSBjb21tZW50O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///73349\n")},8351:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nmodule.exports = {\n ArchiveEntry: __webpack_require__(53543),\n ZipArchiveEntry: __webpack_require__(57149),\n ArchiveOutputStream: __webpack_require__(10587),\n ZipArchiveOutputStream: __webpack_require__(73349)\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODM1MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1CQUFPLENBQUMsS0FBMkI7QUFDbkQsbUJBQW1CLG1CQUFPLENBQUMsS0FBbUM7QUFDOUQsdUJBQXVCLG1CQUFPLENBQUMsS0FBbUM7QUFDbEUsMEJBQTBCLG1CQUFPLENBQUMsS0FBMkM7QUFDN0UiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2NvbXByZXNzLWNvbW1vbnMuanM/NmQyZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFyY2hpdmVFbnRyeTogcmVxdWlyZSgnLi9hcmNoaXZlcnMvYXJjaGl2ZS1lbnRyeScpLFxuICBaaXBBcmNoaXZlRW50cnk6IHJlcXVpcmUoJy4vYXJjaGl2ZXJzL3ppcC96aXAtYXJjaGl2ZS1lbnRyeScpLFxuICBBcmNoaXZlT3V0cHV0U3RyZWFtOiByZXF1aXJlKCcuL2FyY2hpdmVycy9hcmNoaXZlLW91dHB1dC1zdHJlYW0nKSxcbiAgWmlwQXJjaGl2ZU91dHB1dFN0cmVhbTogcmVxdWlyZSgnLi9hcmNoaXZlcnMvemlwL3ppcC1hcmNoaXZlLW91dHB1dC1zdHJlYW0nKVxufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8351\n")},78575:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * node-compress-commons\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT\n */\nvar Stream = (__webpack_require__(2203).Stream);\nvar PassThrough = (__webpack_require__(34478).PassThrough);\nvar isStream = __webpack_require__(31232);\n\nvar util = module.exports = {};\n\nutil.normalizeInputSource = function(source) {\n if (source === null) {\n return Buffer.alloc(0);\n } else if (typeof source === 'string') {\n return Buffer.from(source);\n } else if (isStream(source) && !source._readableState) {\n var normalized = new PassThrough();\n source.pipe(normalized);\n\n return normalized;\n }\n\n return source;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzg1NzUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGtDQUF3QjtBQUNyQyxrQkFBa0Isd0NBQXNDO0FBQ3hELGVBQWUsbUJBQU8sQ0FBQyxLQUFXOztBQUVsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL3V0aWwvaW5kZXguanM/ZGI5MSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciBQYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlBhc3NUaHJvdWdoO1xudmFyIGlzU3RyZWFtID0gcmVxdWlyZSgnaXMtc3RyZWFtJyk7XG5cbnZhciB1dGlsID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxudXRpbC5ub3JtYWxpemVJbnB1dFNvdXJjZSA9IGZ1bmN0aW9uKHNvdXJjZSkge1xuICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzU3RyZWFtKHNvdXJjZSkgJiYgIXNvdXJjZS5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHZhciBub3JtYWxpemVkID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgc291cmNlLnBpcGUobm9ybWFsaXplZCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIHJldHVybiBzb3VyY2U7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///78575\n")},15622:(__unused_webpack_module,exports,__webpack_require__)=>{eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = __webpack_require__(20181).Buffer.isBuffer;\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU2MjIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7QUFDQSxjQUFjOztBQUVkO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDtBQUNBO0FBQ0E7QUFDQSxlQUFlOztBQUVmO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkIsNkRBQW9EOztBQUVwRDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcz8zYTdjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///15622\n")},52566:(__unused_webpack_module,exports)=>{eval("/*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported CRC32 */\nvar CRC32;\n(function (factory) {\n\t/*jshint ignore:start */\n\t/*eslint-disable */\n\tif(typeof DO_NOT_EXPORT_CRC === 'undefined') {\n\t\tif(true) {\n\t\t\tfactory(exports);\n\t\t} else {}\n\t} else {\n\t\tfactory(CRC32 = {});\n\t}\n\t/*eslint-enable */\n\t/*jshint ignore:end */\n}(function(CRC32) {\nCRC32.version = '1.2.2';\n/*global Int32Array */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar T0 = signed_crc_table();\nfunction slice_by_16_tables(T) {\n\tvar c = 0, v = 0, n = 0, table = typeof Int32Array !== 'undefined' ? new Int32Array(4096) : new Array(4096) ;\n\n\tfor(n = 0; n != 256; ++n) table[n] = T[n];\n\tfor(n = 0; n != 256; ++n) {\n\t\tv = T[n];\n\t\tfor(c = 256 + n; c < 4096; c += 256) v = table[c] = (v >>> 8) ^ T[v & 0xFF];\n\t}\n\tvar out = [];\n\tfor(n = 1; n != 16; ++n) out[n - 1] = typeof Int32Array !== 'undefined' ? table.subarray(n * 256, n * 256 + 256) : table.slice(n * 256, n * 256 + 256);\n\treturn out;\n}\nvar TT = slice_by_16_tables(T0);\nvar T1 = TT[0], T2 = TT[1], T3 = TT[2], T4 = TT[3], T5 = TT[4];\nvar T6 = TT[5], T7 = TT[6], T8 = TT[7], T9 = TT[8], Ta = TT[9];\nvar Tb = TT[10], Tc = TT[11], Td = TT[12], Te = TT[13], Tf = TT[14];\nfunction crc32_bstr(bstr, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = bstr.length; i < L;) C = (C>>>8) ^ T0[(C^bstr.charCodeAt(i++))&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_buf(B, seed) {\n\tvar C = seed ^ -1, L = B.length - 15, i = 0;\n\tfor(; i < L;) C =\n\t\tTf[B[i++] ^ (C & 255)] ^\n\t\tTe[B[i++] ^ ((C >> 8) & 255)] ^\n\t\tTd[B[i++] ^ ((C >> 16) & 255)] ^\n\t\tTc[B[i++] ^ (C >>> 24)] ^\n\t\tTb[B[i++]] ^ Ta[B[i++]] ^ T9[B[i++]] ^ T8[B[i++]] ^\n\t\tT7[B[i++]] ^ T6[B[i++]] ^ T5[B[i++]] ^ T4[B[i++]] ^\n\t\tT3[B[i++]] ^ T2[B[i++]] ^ T1[B[i++]] ^ T0[B[i++]];\n\tL += 15;\n\twhile(i < L) C = (C>>>8) ^ T0[(C^B[i++])&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_str(str, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = str.length, c = 0, d = 0; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tC = (C>>>8) ^ T0[(C^c)&0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (192|((c>>6)&31)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++)&1023;\n\t\t\tC = (C>>>8) ^ T0[(C ^ (240|((c>>8)&7)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>2)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(d&63)))&0xFF];\n\t\t} else {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (224|((c>>12)&15)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>6)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t}\n\t}\n\treturn ~C;\n}\nCRC32.table = T0;\n// $FlowIgnore\nCRC32.bstr = crc32_bstr;\n// $FlowIgnore\nCRC32.buf = crc32_buf;\n// $FlowIgnore\nCRC32.str = crc32_str;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI1NjYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssSUFBMkI7QUFDaEM7QUFDQSxJQUFJLEtBQUssRUFRTjtBQUNILEdBQUc7QUFDSCxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLFlBQVksVUFBVTtBQUN0QixZQUFZLFVBQVU7QUFDdEI7QUFDQSxtQkFBbUIsVUFBVTtBQUM3QjtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsTUFBTTtBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPLE1BQU07QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEMsTUFBTTtBQUNwRDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSixvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2NyYy0zMi9jcmMzMi5qcz83MDJkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISBjcmMzMi5qcyAoQykgMjAxNC1wcmVzZW50IFNoZWV0SlMgLS0gaHR0cDovL3NoZWV0anMuY29tICovXG4vKiB2aW06IHNldCB0cz0yOiAqL1xuLypleHBvcnRlZCBDUkMzMiAqL1xudmFyIENSQzMyO1xuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdC8qanNoaW50IGlnbm9yZTpzdGFydCAqL1xuXHQvKmVzbGludC1kaXNhYmxlICovXG5cdGlmKHR5cGVvZiBET19OT1RfRVhQT1JUX0NSQyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRpZignb2JqZWN0JyA9PT0gdHlwZW9mIGV4cG9ydHMpIHtcblx0XHRcdGZhY3RvcnkoZXhwb3J0cyk7XG5cdFx0fSBlbHNlIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcblx0XHRcdGRlZmluZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBtb2R1bGUgPSB7fTtcblx0XHRcdFx0ZmFjdG9yeShtb2R1bGUpO1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZhY3RvcnkoQ1JDMzIgPSB7fSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoQ1JDMzIgPSB7fSk7XG5cdH1cblx0Lyplc2xpbnQtZW5hYmxlICovXG5cdC8qanNoaW50IGlnbm9yZTplbmQgKi9cbn0oZnVuY3Rpb24oQ1JDMzIpIHtcbkNSQzMyLnZlcnNpb24gPSAnMS4yLjInO1xuLypnbG9iYWwgSW50MzJBcnJheSAqL1xuZnVuY3Rpb24gc2lnbmVkX2NyY190YWJsZSgpIHtcblx0dmFyIGMgPSAwLCB0YWJsZSA9IG5ldyBBcnJheSgyNTYpO1xuXG5cdGZvcih2YXIgbiA9MDsgbiAhPSAyNTY7ICsrbil7XG5cdFx0YyA9IG47XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0dGFibGVbbl0gPSBjO1xuXHR9XG5cblx0cmV0dXJuIHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IG5ldyBJbnQzMkFycmF5KHRhYmxlKSA6IHRhYmxlO1xufVxuXG52YXIgVDAgPSBzaWduZWRfY3JjX3RhYmxlKCk7XG5mdW5jdGlvbiBzbGljZV9ieV8xNl90YWJsZXMoVCkge1xuXHR2YXIgYyA9IDAsIHYgPSAwLCBuID0gMCwgdGFibGUgPSB0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgSW50MzJBcnJheSg0MDk2KSA6IG5ldyBBcnJheSg0MDk2KSA7XG5cblx0Zm9yKG4gPSAwOyBuICE9IDI1NjsgKytuKSB0YWJsZVtuXSA9IFRbbl07XG5cdGZvcihuID0gMDsgbiAhPSAyNTY7ICsrbikge1xuXHRcdHYgPSBUW25dO1xuXHRcdGZvcihjID0gMjU2ICsgbjsgYyA8IDQwOTY7IGMgKz0gMjU2KSB2ID0gdGFibGVbY10gPSAodiA+Pj4gOCkgXiBUW3YgJiAweEZGXTtcblx0fVxuXHR2YXIgb3V0ID0gW107XG5cdGZvcihuID0gMTsgbiAhPSAxNjsgKytuKSBvdXRbbiAtIDFdID0gdHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gdGFibGUuc3ViYXJyYXkobiAqIDI1NiwgbiAqIDI1NiArIDI1NikgOiB0YWJsZS5zbGljZShuICogMjU2LCBuICogMjU2ICsgMjU2KTtcblx0cmV0dXJuIG91dDtcbn1cbnZhciBUVCA9IHNsaWNlX2J5XzE2X3RhYmxlcyhUMCk7XG52YXIgVDEgPSBUVFswXSwgIFQyID0gVFRbMV0sICBUMyA9IFRUWzJdLCAgVDQgPSBUVFszXSwgIFQ1ID0gVFRbNF07XG52YXIgVDYgPSBUVFs1XSwgIFQ3ID0gVFRbNl0sICBUOCA9IFRUWzddLCAgVDkgPSBUVFs4XSwgIFRhID0gVFRbOV07XG52YXIgVGIgPSBUVFsxMF0sIFRjID0gVFRbMTFdLCBUZCA9IFRUWzEyXSwgVGUgPSBUVFsxM10sIFRmID0gVFRbMTRdO1xuZnVuY3Rpb24gY3JjMzJfYnN0cihic3RyLCBzZWVkKSB7XG5cdHZhciBDID0gc2VlZCBeIC0xO1xuXHRmb3IodmFyIGkgPSAwLCBMID0gYnN0ci5sZW5ndGg7IGkgPCBMOykgQyA9IChDPj4+OCkgXiBUMFsoQ15ic3RyLmNoYXJDb2RlQXQoaSsrKSkmMHhGRl07XG5cdHJldHVybiB+Qztcbn1cblxuZnVuY3Rpb24gY3JjMzJfYnVmKEIsIHNlZWQpIHtcblx0dmFyIEMgPSBzZWVkIF4gLTEsIEwgPSBCLmxlbmd0aCAtIDE1LCBpID0gMDtcblx0Zm9yKDsgaSA8IEw7KSBDID1cblx0XHRUZltCW2krK10gXiAoQyAmIDI1NSldIF5cblx0XHRUZVtCW2krK10gXiAoKEMgPj4gOCkgJiAyNTUpXSBeXG5cdFx0VGRbQltpKytdIF4gKChDID4+IDE2KSAmIDI1NSldIF5cblx0XHRUY1tCW2krK10gXiAoQyA+Pj4gMjQpXSBeXG5cdFx0VGJbQltpKytdXSBeIFRhW0JbaSsrXV0gXiBUOVtCW2krK11dIF4gVDhbQltpKytdXSBeXG5cdFx0VDdbQltpKytdXSBeIFQ2W0JbaSsrXV0gXiBUNVtCW2krK11dIF4gVDRbQltpKytdXSBeXG5cdFx0VDNbQltpKytdXSBeIFQyW0JbaSsrXV0gXiBUMVtCW2krK11dIF4gVDBbQltpKytdXTtcblx0TCArPSAxNTtcblx0d2hpbGUoaSA8IEwpIEMgPSAoQz4+PjgpIF4gVDBbKENeQltpKytdKSYweEZGXTtcblx0cmV0dXJuIH5DO1xufVxuXG5mdW5jdGlvbiBjcmMzMl9zdHIoc3RyLCBzZWVkKSB7XG5cdHZhciBDID0gc2VlZCBeIC0xO1xuXHRmb3IodmFyIGkgPSAwLCBMID0gc3RyLmxlbmd0aCwgYyA9IDAsIGQgPSAwOyBpIDwgTDspIHtcblx0XHRjID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcblx0XHRpZihjIDwgMHg4MCkge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQ15jKSYweEZGXTtcblx0XHR9IGVsc2UgaWYoYyA8IDB4ODAwKSB7XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDE5MnwoKGM+PjYpJjMxKSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KGMmNjMpKSkmMHhGRl07XG5cdFx0fSBlbHNlIGlmKGMgPj0gMHhEODAwICYmIGMgPCAweEUwMDApIHtcblx0XHRcdGMgPSAoYyYxMDIzKSs2NDsgZCA9IHN0ci5jaGFyQ29kZUF0KGkrKykmMTAyMztcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMjQwfCgoYz4+OCkmNykpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTI4fCgoYz4+MikmNjMpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoKGQ+PjYpJjE1KXwoKGMmMyk8PDQpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoZCY2MykpKSYweEZGXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgyMjR8KChjPj4xMikmMTUpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoKGM+PjYpJjYzKSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KGMmNjMpKSkmMHhGRl07XG5cdFx0fVxuXHR9XG5cdHJldHVybiB+Qztcbn1cbkNSQzMyLnRhYmxlID0gVDA7XG4vLyAkRmxvd0lnbm9yZVxuQ1JDMzIuYnN0ciA9IGNyYzMyX2JzdHI7XG4vLyAkRmxvd0lnbm9yZVxuQ1JDMzIuYnVmID0gY3JjMzJfYnVmO1xuLy8gJEZsb3dJZ25vcmVcbkNSQzMyLnN0ciA9IGNyYzMyX3N0cjtcbn0pKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///52566\n")},35485:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * node-crc32-stream\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-crc32-stream/blob/master/LICENSE-MIT\n */\n\n \n\nconst {Transform} = __webpack_require__(34478);\n\nconst crc32 = __webpack_require__(52566);\n\nclass CRC32Stream extends Transform {\n constructor(options) {\n super(options);\n this.checksum = Buffer.allocUnsafe(4);\n this.checksum.writeInt32BE(0, 0);\n\n this.rawSize = 0;\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk) {\n this.checksum = crc32.buf(chunk, this.checksum) >>> 0;\n this.rawSize += chunk.length;\n }\n\n callback(null, chunk);\n }\n\n digest(encoding) {\n const checksum = Buffer.allocUnsafe(4);\n checksum.writeUInt32BE(this.checksum >>> 0, 0);\n return encoding ? checksum.toString(encoding) : checksum;\n }\n\n hex() {\n return this.digest('hex').toUpperCase();\n }\n\n size() {\n return this.rawSize;\n }\n}\n\nmodule.exports = CRC32Stream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU0ODUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBYzs7QUFFZCxPQUFPLFdBQVcsRUFBRSxtQkFBTyxDQUFDLEtBQWlCOztBQUU3QyxjQUFjLG1CQUFPLENBQUMsS0FBUTs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvY3JjMzItc3RyZWFtL2xpYi9jcmMzMi1zdHJlYW0uanM/ZTk0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY3JjMzItc3RyZWFtXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY3JjMzItc3RyZWFtL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cblxuICd1c2Ugc3RyaWN0JztcblxuY29uc3Qge1RyYW5zZm9ybX0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKTtcblxuY29uc3QgY3JjMzIgPSByZXF1aXJlKCdjcmMtMzInKTtcblxuY2xhc3MgQ1JDMzJTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5jaGVja3N1bSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KTtcbiAgICB0aGlzLmNoZWNrc3VtLndyaXRlSW50MzJCRSgwLCAwKTtcblxuICAgIHRoaXMucmF3U2l6ZSA9IDA7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAoY2h1bmspIHtcbiAgICAgIHRoaXMuY2hlY2tzdW0gPSBjcmMzMi5idWYoY2h1bmssIHRoaXMuY2hlY2tzdW0pID4+PiAwO1xuICAgICAgdGhpcy5yYXdTaXplICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCBjaHVuayk7XG4gIH1cblxuICBkaWdlc3QoZW5jb2RpbmcpIHtcbiAgICBjb25zdCBjaGVja3N1bSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KTtcbiAgICBjaGVja3N1bS53cml0ZVVJbnQzMkJFKHRoaXMuY2hlY2tzdW0gPj4+IDAsIDApO1xuICAgIHJldHVybiBlbmNvZGluZyA/IGNoZWNrc3VtLnRvU3RyaW5nKGVuY29kaW5nKSA6IGNoZWNrc3VtO1xuICB9XG5cbiAgaGV4KCkge1xuICAgIHJldHVybiB0aGlzLmRpZ2VzdCgnaGV4JykudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3U2l6ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENSQzMyU3RyZWFtO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///35485\n")},40951:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * node-crc32-stream\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-crc32-stream/blob/master/LICENSE-MIT\n */\n\n\n\nconst {DeflateRaw} = __webpack_require__(43106);\n\nconst crc32 = __webpack_require__(52566);\n\nclass DeflateCRC32Stream extends DeflateRaw {\n constructor(options) {\n super(options);\n\n this.checksum = Buffer.allocUnsafe(4);\n this.checksum.writeInt32BE(0, 0);\n\n this.rawSize = 0;\n this.compressedSize = 0;\n }\n\n push(chunk, encoding) {\n if (chunk) {\n this.compressedSize += chunk.length;\n }\n\n return super.push(chunk, encoding);\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk) {\n this.checksum = crc32.buf(chunk, this.checksum) >>> 0;\n this.rawSize += chunk.length;\n }\n\n super._transform(chunk, encoding, callback)\n }\n\n digest(encoding) {\n const checksum = Buffer.allocUnsafe(4);\n checksum.writeUInt32BE(this.checksum >>> 0, 0);\n return encoding ? checksum.toString(encoding) : checksum;\n }\n\n hex() {\n return this.digest('hex').toUpperCase();\n }\n\n size(compressed = false) {\n if (compressed) {\n return this.compressedSize;\n } else {\n return this.rawSize;\n }\n }\n}\n\nmodule.exports = DeflateCRC32Stream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA5NTEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsT0FBTyxZQUFZLEVBQUUsbUJBQU8sQ0FBQyxLQUFNOztBQUVuQyxjQUFjLG1CQUFPLENBQUMsS0FBUTs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvY3JjMzItc3RyZWFtL2xpYi9kZWZsYXRlLWNyYzMyLXN0cmVhbS5qcz8wMTQ4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbm9kZS1jcmMzMi1zdHJlYW1cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jcmMzMi1zdHJlYW0vYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHtEZWZsYXRlUmF3fSA9IHJlcXVpcmUoJ3psaWInKTtcblxuY29uc3QgY3JjMzIgPSByZXF1aXJlKCdjcmMtMzInKTtcblxuY2xhc3MgRGVmbGF0ZUNSQzMyU3RyZWFtIGV4dGVuZHMgRGVmbGF0ZVJhdyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuY2hlY2tzdW0gPSBCdWZmZXIuYWxsb2NVbnNhZmUoNCk7XG4gICAgdGhpcy5jaGVja3N1bS53cml0ZUludDMyQkUoMCwgMCk7XG5cbiAgICB0aGlzLnJhd1NpemUgPSAwO1xuICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSAwO1xuICB9XG5cbiAgcHVzaChjaHVuaywgZW5jb2RpbmcpIHtcbiAgICBpZiAoY2h1bmspIHtcbiAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5wdXNoKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAoY2h1bmspIHtcbiAgICAgIHRoaXMuY2hlY2tzdW0gPSBjcmMzMi5idWYoY2h1bmssIHRoaXMuY2hlY2tzdW0pID4+PiAwO1xuICAgICAgdGhpcy5yYXdTaXplICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG5cbiAgICBzdXBlci5fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spXG4gIH1cblxuICBkaWdlc3QoZW5jb2RpbmcpIHtcbiAgICBjb25zdCBjaGVja3N1bSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KTtcbiAgICBjaGVja3N1bS53cml0ZVVJbnQzMkJFKHRoaXMuY2hlY2tzdW0gPj4+IDAsIDApO1xuICAgIHJldHVybiBlbmNvZGluZyA/IGNoZWNrc3VtLnRvU3RyaW5nKGVuY29kaW5nKSA6IGNoZWNrc3VtO1xuICB9XG5cbiAgaGV4KCkge1xuICAgIHJldHVybiB0aGlzLmRpZ2VzdCgnaGV4JykudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIHNpemUoY29tcHJlc3NlZCA9IGZhbHNlKSB7XG4gICAgaWYgKGNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXByZXNzZWRTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yYXdTaXplO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERlZmxhdGVDUkMzMlN0cmVhbTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///40951\n")},71:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * node-crc32-stream\n *\n * Copyright (c) 2014 Chris Talkington, contributors.\n * Licensed under the MIT license.\n * https://github.com/archiverjs/node-crc32-stream/blob/master/LICENSE-MIT\n */\n\n\n\nmodule.exports = {\n CRC32Stream: __webpack_require__(35485),\n DeflateCRC32Stream: __webpack_require__(40951)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQSxlQUFlLG1CQUFPLENBQUMsS0FBZ0I7QUFDdkMsc0JBQXNCLG1CQUFPLENBQUMsS0FBd0I7QUFDdEQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2NyYzMyLXN0cmVhbS9saWIvaW5kZXguanM/ODQyMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG5vZGUtY3JjMzItc3RyZWFtXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY3JjMzItc3RyZWFtL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1JDMzJTdHJlYW06IHJlcXVpcmUoJy4vY3JjMzItc3RyZWFtJyksXG4gIERlZmxhdGVDUkMzMlN0cmVhbTogcmVxdWlyZSgnLi9kZWZsYXRlLWNyYzMyLXN0cmVhbScpXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///71\n")},12315:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.deepKeysFromList = exports.deepKeys = void 0;\nconst utils = __importStar(__webpack_require__(77034));\n__exportStar(__webpack_require__(33574), exports);\n/**\n * Return the deep keys list for a single document\n * @param object\n * @param options\n * @returns {Array}\n */\nfunction deepKeys(object, options) {\n const parsedOptions = mergeOptions(options);\n if (typeof object === \'object\' && object !== null) {\n return generateDeepKeysList(\'\', object, parsedOptions);\n }\n return [];\n}\nexports.deepKeys = deepKeys;\n/**\n * Return the deep keys list for all documents in the provided list\n * @param list\n * @param options\n * @returns Array[Array[String]]\n */\nfunction deepKeysFromList(list, options) {\n const parsedOptions = mergeOptions(options);\n return list.map((document) => {\n if (typeof document === \'object\' && document !== null) {\n // if the data at the key is a document, then we retrieve the subHeading starting with an empty string heading and the doc\n return deepKeys(document, parsedOptions);\n }\n return [];\n });\n}\nexports.deepKeysFromList = deepKeysFromList;\nfunction generateDeepKeysList(heading, data, options) {\n const keys = Object.keys(data).map((currentKey) => {\n // If the given heading is empty, then we set the heading to be the subKey, otherwise set it as a nested heading w/ a dot\n const keyName = buildKeyName(heading, escapeNestedDotsIfSpecified(currentKey, options));\n // If we have another nested document, recur on the sub-document to retrieve the full key name\n if (options.expandNestedObjects && utils.isDocumentToRecurOn(data[currentKey]) || (options.arrayIndexesAsKeys && Array.isArray(data[currentKey]) && data[currentKey].length)) {\n return generateDeepKeysList(keyName, data[currentKey], options);\n }\n else if (options.expandArrayObjects && Array.isArray(data[currentKey])) {\n // If we have a nested array that we need to recur on\n return processArrayKeys(data[currentKey], keyName, options);\n }\n else if (options.ignoreEmptyArrays && Array.isArray(data[currentKey]) && !data[currentKey].length) {\n return [];\n }\n // Otherwise return this key name since we don\'t have a sub document\n return keyName;\n });\n return utils.flatten(keys);\n}\n/**\n * Helper function to handle the processing of arrays when the expandArrayObjects\n * option is specified.\n * @param subArray\n * @param currentKeyPath\n * @param options\n * @returns {*}\n */\nfunction processArrayKeys(subArray, currentKeyPath, options) {\n let subArrayKeys = deepKeysFromList(subArray, options);\n if (!subArray.length) {\n return options.ignoreEmptyArraysWhenExpanding ? [] : [currentKeyPath];\n }\n else if (subArray.length && utils.flatten(subArrayKeys).length === 0) {\n // Has items in the array, but no objects\n return [currentKeyPath];\n }\n else {\n subArrayKeys = subArrayKeys.map((schemaKeys) => {\n if (Array.isArray(schemaKeys) && schemaKeys.length === 0) {\n return [currentKeyPath];\n }\n return schemaKeys.map((subKey) => buildKeyName(currentKeyPath, escapeNestedDotsIfSpecified(subKey, options)));\n });\n return utils.unique(utils.flatten(subArrayKeys));\n }\n}\nfunction escapeNestedDotsIfSpecified(key, options) {\n if (options.escapeNestedDots) {\n return key.replace(/\\./g, \'\\\\.\');\n }\n return key;\n}\n/**\n * Function used to generate the key path\n * @param upperKeyName String accumulated key path\n * @param currentKeyName String current key name\n * @returns String\n */\nfunction buildKeyName(upperKeyName, currentKeyName) {\n if (upperKeyName) {\n return upperKeyName + \'.\' + currentKeyName;\n }\n return currentKeyName;\n}\nfunction mergeOptions(options) {\n return {\n arrayIndexesAsKeys: false,\n expandNestedObjects: true,\n expandArrayObjects: false,\n ignoreEmptyArraysWhenExpanding: false,\n escapeNestedDots: false,\n ignoreEmptyArrays: false,\n ...(options ?? {})\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIzMTUuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHdCQUF3QixHQUFHLGdCQUFnQjtBQUMzQywyQkFBMkIsbUJBQU8sQ0FBQyxLQUFTO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxLQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9kZWVrcy9saWIvZGVla3MuanM/NGQyYyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZXBLZXlzRnJvbUxpc3QgPSBleHBvcnRzLmRlZXBLZXlzID0gdm9pZCAwO1xuY29uc3QgdXRpbHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vdXRpbHNcIikpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzXCIpLCBleHBvcnRzKTtcbi8qKlxuICogUmV0dXJuIHRoZSBkZWVwIGtleXMgbGlzdCBmb3IgYSBzaW5nbGUgZG9jdW1lbnRcbiAqIEBwYXJhbSBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGRlZXBLZXlzKG9iamVjdCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHBhcnNlZE9wdGlvbnMgPSBtZXJnZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZ2VuZXJhdGVEZWVwS2V5c0xpc3QoJycsIG9iamVjdCwgcGFyc2VkT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cbmV4cG9ydHMuZGVlcEtleXMgPSBkZWVwS2V5cztcbi8qKlxuICogUmV0dXJuIHRoZSBkZWVwIGtleXMgbGlzdCBmb3IgYWxsIGRvY3VtZW50cyBpbiB0aGUgcHJvdmlkZWQgbGlzdFxuICogQHBhcmFtIGxpc3RcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyBBcnJheVtBcnJheVtTdHJpbmddXVxuICovXG5mdW5jdGlvbiBkZWVwS2V5c0Zyb21MaXN0KGxpc3QsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXJzZWRPcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiBsaXN0Lm1hcCgoZG9jdW1lbnQpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ29iamVjdCcgJiYgZG9jdW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGF0IHRoZSBrZXkgaXMgYSBkb2N1bWVudCwgdGhlbiB3ZSByZXRyaWV2ZSB0aGUgc3ViSGVhZGluZyBzdGFydGluZyB3aXRoIGFuIGVtcHR5IHN0cmluZyBoZWFkaW5nIGFuZCB0aGUgZG9jXG4gICAgICAgICAgICByZXR1cm4gZGVlcEtleXMoZG9jdW1lbnQsIHBhcnNlZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVlcEtleXNGcm9tTGlzdCA9IGRlZXBLZXlzRnJvbUxpc3Q7XG5mdW5jdGlvbiBnZW5lcmF0ZURlZXBLZXlzTGlzdChoZWFkaW5nLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpLm1hcCgoY3VycmVudEtleSkgPT4ge1xuICAgICAgICAvLyBJZiB0aGUgZ2l2ZW4gaGVhZGluZyBpcyBlbXB0eSwgdGhlbiB3ZSBzZXQgdGhlIGhlYWRpbmcgdG8gYmUgdGhlIHN1YktleSwgb3RoZXJ3aXNlIHNldCBpdCBhcyBhIG5lc3RlZCBoZWFkaW5nIHcvIGEgZG90XG4gICAgICAgIGNvbnN0IGtleU5hbWUgPSBidWlsZEtleU5hbWUoaGVhZGluZywgZXNjYXBlTmVzdGVkRG90c0lmU3BlY2lmaWVkKGN1cnJlbnRLZXksIG9wdGlvbnMpKTtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbm90aGVyIG5lc3RlZCBkb2N1bWVudCwgcmVjdXIgb24gdGhlIHN1Yi1kb2N1bWVudCB0byByZXRyaWV2ZSB0aGUgZnVsbCBrZXkgbmFtZVxuICAgICAgICBpZiAob3B0aW9ucy5leHBhbmROZXN0ZWRPYmplY3RzICYmIHV0aWxzLmlzRG9jdW1lbnRUb1JlY3VyT24oZGF0YVtjdXJyZW50S2V5XSkgfHwgKG9wdGlvbnMuYXJyYXlJbmRleGVzQXNLZXlzICYmIEFycmF5LmlzQXJyYXkoZGF0YVtjdXJyZW50S2V5XSkgJiYgZGF0YVtjdXJyZW50S2V5XS5sZW5ndGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVEZWVwS2V5c0xpc3Qoa2V5TmFtZSwgZGF0YVtjdXJyZW50S2V5XSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5leHBhbmRBcnJheU9iamVjdHMgJiYgQXJyYXkuaXNBcnJheShkYXRhW2N1cnJlbnRLZXldKSkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG5lc3RlZCBhcnJheSB0aGF0IHdlIG5lZWQgdG8gcmVjdXIgb25cbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzQXJyYXlLZXlzKGRhdGFbY3VycmVudEtleV0sIGtleU5hbWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaWdub3JlRW1wdHlBcnJheXMgJiYgQXJyYXkuaXNBcnJheShkYXRhW2N1cnJlbnRLZXldKSAmJiAhZGF0YVtjdXJyZW50S2V5XS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIHRoaXMga2V5IG5hbWUgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHN1YiBkb2N1bWVudFxuICAgICAgICByZXR1cm4ga2V5TmFtZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdXRpbHMuZmxhdHRlbihrZXlzKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcHJvY2Vzc2luZyBvZiBhcnJheXMgd2hlbiB0aGUgZXhwYW5kQXJyYXlPYmplY3RzXG4gKiBvcHRpb24gaXMgc3BlY2lmaWVkLlxuICogQHBhcmFtIHN1YkFycmF5XG4gKiBAcGFyYW0gY3VycmVudEtleVBhdGhcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0FycmF5S2V5cyhzdWJBcnJheSwgY3VycmVudEtleVBhdGgsIG9wdGlvbnMpIHtcbiAgICBsZXQgc3ViQXJyYXlLZXlzID0gZGVlcEtleXNGcm9tTGlzdChzdWJBcnJheSwgb3B0aW9ucyk7XG4gICAgaWYgKCFzdWJBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuaWdub3JlRW1wdHlBcnJheXNXaGVuRXhwYW5kaW5nID8gW10gOiBbY3VycmVudEtleVBhdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChzdWJBcnJheS5sZW5ndGggJiYgdXRpbHMuZmxhdHRlbihzdWJBcnJheUtleXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBIYXMgaXRlbXMgaW4gdGhlIGFycmF5LCBidXQgbm8gb2JqZWN0c1xuICAgICAgICByZXR1cm4gW2N1cnJlbnRLZXlQYXRoXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN1YkFycmF5S2V5cyA9IHN1YkFycmF5S2V5cy5tYXAoKHNjaGVtYUtleXMpID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYUtleXMpICYmIHNjaGVtYUtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjdXJyZW50S2V5UGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hS2V5cy5tYXAoKHN1YktleSkgPT4gYnVpbGRLZXlOYW1lKGN1cnJlbnRLZXlQYXRoLCBlc2NhcGVOZXN0ZWREb3RzSWZTcGVjaWZpZWQoc3ViS2V5LCBvcHRpb25zKSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnVuaXF1ZSh1dGlscy5mbGF0dGVuKHN1YkFycmF5S2V5cykpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVzY2FwZU5lc3RlZERvdHNJZlNwZWNpZmllZChrZXksIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5lc2NhcGVOZXN0ZWREb3RzKSB7XG4gICAgICAgIHJldHVybiBrZXkucmVwbGFjZSgvXFwuL2csICdcXFxcLicpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xufVxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBrZXkgcGF0aFxuICogQHBhcmFtIHVwcGVyS2V5TmFtZSBTdHJpbmcgYWNjdW11bGF0ZWQga2V5IHBhdGhcbiAqIEBwYXJhbSBjdXJyZW50S2V5TmFtZSBTdHJpbmcgY3VycmVudCBrZXkgbmFtZVxuICogQHJldHVybnMgU3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkS2V5TmFtZSh1cHBlcktleU5hbWUsIGN1cnJlbnRLZXlOYW1lKSB7XG4gICAgaWYgKHVwcGVyS2V5TmFtZSkge1xuICAgICAgICByZXR1cm4gdXBwZXJLZXlOYW1lICsgJy4nICsgY3VycmVudEtleU5hbWU7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50S2V5TmFtZTtcbn1cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXJyYXlJbmRleGVzQXNLZXlzOiBmYWxzZSxcbiAgICAgICAgZXhwYW5kTmVzdGVkT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgZXhwYW5kQXJyYXlPYmplY3RzOiBmYWxzZSxcbiAgICAgICAgaWdub3JlRW1wdHlBcnJheXNXaGVuRXhwYW5kaW5nOiBmYWxzZSxcbiAgICAgICAgZXNjYXBlTmVzdGVkRG90czogZmFsc2UsXG4gICAgICAgIGlnbm9yZUVtcHR5QXJyYXlzOiBmYWxzZSxcbiAgICAgICAgLi4uKG9wdGlvbnMgPz8ge30pXG4gICAgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///12315\n')},33574:(__unused_webpack_module,exports)=>{"use strict";eval('\nObject.defineProperty(exports, "__esModule", ({ value: true }));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM1NzQuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2RlZWtzL2xpYi90eXBlcy5qcz9jYWM4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///33574\n')},77034:(__unused_webpack_module,exports)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.isDocumentToRecurOn = exports.flatten = exports.unique = void 0;\nfunction unique(array) {\n return [...new Set(array)];\n}\nexports.unique = unique;\nfunction flatten(array) {\n return [].concat(...array);\n}\nexports.flatten = flatten;\n/**\n * Returns whether this value is a document to recur on or not\n * @param val Any item whose type will be evaluated\n * @returns {boolean}\n */\nfunction isDocumentToRecurOn(val) {\n return typeof val === 'object' && val !== null && !Array.isArray(val) && Object.keys(val).length;\n}\nexports.isDocumentToRecurOn = isDocumentToRecurOn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcwMzQuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsMkJBQTJCLEdBQUcsZUFBZSxHQUFHLGNBQWM7QUFDOUQ7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2RlZWtzL2xpYi91dGlscy5qcz82ODQ0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNEb2N1bWVudFRvUmVjdXJPbiA9IGV4cG9ydHMuZmxhdHRlbiA9IGV4cG9ydHMudW5pcXVlID0gdm9pZCAwO1xuZnVuY3Rpb24gdW5pcXVlKGFycmF5KSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KGFycmF5KV07XG59XG5leHBvcnRzLnVuaXF1ZSA9IHVuaXF1ZTtcbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLmFycmF5KTtcbn1cbmV4cG9ydHMuZmxhdHRlbiA9IGZsYXR0ZW47XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGlzIHZhbHVlIGlzIGEgZG9jdW1lbnQgdG8gcmVjdXIgb24gb3Igbm90XG4gKiBAcGFyYW0gdmFsIEFueSBpdGVtIHdob3NlIHR5cGUgd2lsbCBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0RvY3VtZW50VG9SZWN1ck9uKHZhbCkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKSAmJiBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aDtcbn1cbmV4cG9ydHMuaXNEb2N1bWVudFRvUmVjdXJPbiA9IGlzRG9jdW1lbnRUb1JlY3VyT247XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///77034\n")},78069:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Stream = (__webpack_require__(2203).Stream);\nvar util = __webpack_require__(39023);\n\nmodule.exports = DelayedStream;\nfunction DelayedStream() {\n this.source = null;\n this.dataSize = 0;\n this.maxDataSize = 1024 * 1024;\n this.pauseStream = true;\n\n this._maxDataSizeExceeded = false;\n this._released = false;\n this._bufferedEvents = [];\n}\nutil.inherits(DelayedStream, Stream);\n\nDelayedStream.create = function(source, options) {\n var delayedStream = new this();\n\n options = options || {};\n for (var option in options) {\n delayedStream[option] = options[option];\n }\n\n delayedStream.source = source;\n\n var realEmit = source.emit;\n source.emit = function() {\n delayedStream._handleEmit(arguments);\n return realEmit.apply(source, arguments);\n };\n\n source.on('error', function() {});\n if (delayedStream.pauseStream) {\n source.pause();\n }\n\n return delayedStream;\n};\n\nObject.defineProperty(DelayedStream.prototype, 'readable', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this.source.readable;\n }\n});\n\nDelayedStream.prototype.setEncoding = function() {\n return this.source.setEncoding.apply(this.source, arguments);\n};\n\nDelayedStream.prototype.resume = function() {\n if (!this._released) {\n this.release();\n }\n\n this.source.resume();\n};\n\nDelayedStream.prototype.pause = function() {\n this.source.pause();\n};\n\nDelayedStream.prototype.release = function() {\n this._released = true;\n\n this._bufferedEvents.forEach(function(args) {\n this.emit.apply(this, args);\n }.bind(this));\n this._bufferedEvents = [];\n};\n\nDelayedStream.prototype.pipe = function() {\n var r = Stream.prototype.pipe.apply(this, arguments);\n this.resume();\n return r;\n};\n\nDelayedStream.prototype._handleEmit = function(args) {\n if (this._released) {\n this.emit.apply(this, args);\n return;\n }\n\n if (args[0] === 'data') {\n this.dataSize += args[1].length;\n this._checkIfMaxDataSizeExceeded();\n }\n\n this._bufferedEvents.push(args);\n};\n\nDelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {\n if (this._maxDataSizeExceeded) {\n return;\n }\n\n if (this.dataSize <= this.maxDataSize) {\n return;\n }\n\n this._maxDataSizeExceeded = true;\n var message =\n 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'\n this.emit('error', new Error(message));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzgwNjkuanMiLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxrQ0FBd0I7QUFDckMsV0FBVyxtQkFBTyxDQUFDLEtBQU07O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2RlbGF5ZWQtc3RyZWFtL2xpYi9kZWxheWVkX3N0cmVhbS5qcz9kOTU2Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW07XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEZWxheWVkU3RyZWFtO1xuZnVuY3Rpb24gRGVsYXllZFN0cmVhbSgpIHtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLmRhdGFTaXplID0gMDtcbiAgdGhpcy5tYXhEYXRhU2l6ZSA9IDEwMjQgKiAxMDI0O1xuICB0aGlzLnBhdXNlU3RyZWFtID0gdHJ1ZTtcblxuICB0aGlzLl9tYXhEYXRhU2l6ZUV4Y2VlZGVkID0gZmFsc2U7XG4gIHRoaXMuX3JlbGVhc2VkID0gZmFsc2U7XG4gIHRoaXMuX2J1ZmZlcmVkRXZlbnRzID0gW107XG59XG51dGlsLmluaGVyaXRzKERlbGF5ZWRTdHJlYW0sIFN0cmVhbSk7XG5cbkRlbGF5ZWRTdHJlYW0uY3JlYXRlID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBkZWxheWVkU3RyZWFtID0gbmV3IHRoaXMoKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgZm9yICh2YXIgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICBkZWxheWVkU3RyZWFtW29wdGlvbl0gPSBvcHRpb25zW29wdGlvbl07XG4gIH1cblxuICBkZWxheWVkU3RyZWFtLnNvdXJjZSA9IHNvdXJjZTtcblxuICB2YXIgcmVhbEVtaXQgPSBzb3VyY2UuZW1pdDtcbiAgc291cmNlLmVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICBkZWxheWVkU3RyZWFtLl9oYW5kbGVFbWl0KGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHJlYWxFbWl0LmFwcGx5KHNvdXJjZSwgYXJndW1lbnRzKTtcbiAgfTtcblxuICBzb3VyY2Uub24oJ2Vycm9yJywgZnVuY3Rpb24oKSB7fSk7XG4gIGlmIChkZWxheWVkU3RyZWFtLnBhdXNlU3RyZWFtKSB7XG4gICAgc291cmNlLnBhdXNlKCk7XG4gIH1cblxuICByZXR1cm4gZGVsYXllZFN0cmVhbTtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWxheWVkU3RyZWFtLnByb3RvdHlwZSwgJ3JlYWRhYmxlJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLnJlYWRhYmxlO1xuICB9XG59KTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc291cmNlLnNldEVuY29kaW5nLmFwcGx5KHRoaXMuc291cmNlLCBhcmd1bWVudHMpO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5fcmVsZWFzZWQpIHtcbiAgICB0aGlzLnJlbGVhc2UoKTtcbiAgfVxuXG4gIHRoaXMuc291cmNlLnJlc3VtZSgpO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zb3VyY2UucGF1c2UoKTtcbn07XG5cbkRlbGF5ZWRTdHJlYW0ucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVsZWFzZWQgPSB0cnVlO1xuXG4gIHRoaXMuX2J1ZmZlcmVkRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oYXJncykge1xuICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfS5iaW5kKHRoaXMpKTtcbiAgdGhpcy5fYnVmZmVyZWRFdmVudHMgPSBbXTtcbn07XG5cbkRlbGF5ZWRTdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHIgPSBTdHJlYW0ucHJvdG90eXBlLnBpcGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgdGhpcy5yZXN1bWUoKTtcbiAgcmV0dXJuIHI7XG59O1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5faGFuZGxlRW1pdCA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgaWYgKHRoaXMuX3JlbGVhc2VkKSB7XG4gICAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhcmdzWzBdID09PSAnZGF0YScpIHtcbiAgICB0aGlzLmRhdGFTaXplICs9IGFyZ3NbMV0ubGVuZ3RoO1xuICAgIHRoaXMuX2NoZWNrSWZNYXhEYXRhU2l6ZUV4Y2VlZGVkKCk7XG4gIH1cblxuICB0aGlzLl9idWZmZXJlZEV2ZW50cy5wdXNoKGFyZ3MpO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUuX2NoZWNrSWZNYXhEYXRhU2l6ZUV4Y2VlZGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9tYXhEYXRhU2l6ZUV4Y2VlZGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuZGF0YVNpemUgPD0gdGhpcy5tYXhEYXRhU2l6ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX21heERhdGFTaXplRXhjZWVkZWQgPSB0cnVlO1xuICB2YXIgbWVzc2FnZSA9XG4gICAgJ0RlbGF5ZWRTdHJlYW0jbWF4RGF0YVNpemUgb2YgJyArIHRoaXMubWF4RGF0YVNpemUgKyAnIGJ5dGVzIGV4Y2VlZGVkLidcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihtZXNzYWdlKSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///78069\n")},62185:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ J: () => (/* binding */ Deprecation)\n/* harmony export */ });\nclass Deprecation extends Error {\n constructor(message) {\n super(message); // Maintains proper stack trace (only available on V8)\n\n /* istanbul ignore next */\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n\n this.name = 'Deprecation';\n }\n\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIxODUuanMiLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUNBLG9CQUFvQjs7QUFFcEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRXVCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9kZXByZWNhdGlvbi9kaXN0LXdlYi9pbmRleC5qcz9jZTI0Il0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIERlcHJlY2F0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7IC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgKG9ubHkgYXZhaWxhYmxlIG9uIFY4KVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gJ0RlcHJlY2F0aW9uJztcbiAgfVxuXG59XG5cbmV4cG9ydCB7IERlcHJlY2F0aW9uIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///62185\n")},6052:(__unused_webpack_module,exports)=>{"use strict";eval("/**\n * @license MIT\n * doc-path \n * Copyright (c) 2015-present, Michael Rodrigues.\n */\n\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.setPath = exports.evaluatePath = void 0;\n/**\n * Main function that evaluates the path in a particular object\n * @throws {Error} possible error if call stack size is exceeded\n */\nfunction evaluatePath(obj, kp) {\n if (!obj) {\n return null;\n }\n const { dotIndex, key, remaining } = state(kp);\n const kpVal = typeof obj === 'object' && kp in obj ? obj[kp] : undefined;\n const keyVal = typeof obj === 'object' && key in obj ? obj[key] : undefined;\n if (dotIndex >= 0 && typeof obj === 'object' && !(kp in obj)) {\n const { key: nextKey } = state(remaining);\n const nextKeyAsInt = parseInt(nextKey);\n // If there's an array at the current key in the object, then iterate over those items evaluating the remaining path\n if (Array.isArray(keyVal) && isNaN(nextKeyAsInt)) {\n return keyVal.map((doc) => evaluatePath(doc, remaining));\n }\n // Otherwise, we can just recur\n return evaluatePath(keyVal, remaining);\n }\n else if (Array.isArray(obj)) {\n const keyAsInt = parseInt(key);\n if (kp === key && dotIndex === -1 && !isNaN(keyAsInt)) {\n return keyVal;\n }\n // If this object is actually an array, then iterate over those items evaluating the path\n return obj.map((doc) => evaluatePath(doc, kp));\n }\n else if (dotIndex >= 0 && kp !== key && typeof obj === 'object' && key in obj) {\n // If there's a field with a non-nested dot, then recur into that sub-value\n return evaluatePath(keyVal, remaining);\n }\n else if (dotIndex === -1 && typeof obj === 'object' && key in obj && !(kp in obj)) {\n // If the field is here, but the key was escaped\n return keyVal;\n }\n // Otherwise, we can just return value directly\n return kpVal;\n}\nexports.evaluatePath = evaluatePath;\n/**\n * Main function that performs validation before passing off to _sp\n * @throws {Error} possible error if call stack size is exceeded\n */\nfunction setPath(obj, kp, v) {\n if (!obj) {\n throw new Error('No object was provided.');\n }\n else if (!kp) {\n throw new Error('No keyPath was provided.');\n }\n return _sp(obj, kp, v);\n}\nexports.setPath = setPath;\n// Helper function that will set the value in the provided object/array.\nfunction _sp(obj, kp, v) {\n const { dotIndex, key, remaining } = state(kp);\n // If this is clearly a prototype pollution attempt, then refuse to modify the path\n if (kp.startsWith('__proto__') || kp.startsWith('constructor') || kp.startsWith('prototype')) {\n return obj;\n }\n if (dotIndex >= 0) {\n const keyAsInt = parseInt(key);\n // If there is a '.' in the key path, recur on the subdoc and ...\n if (typeof obj === 'object' && obj !== null && !(key in obj) && Array.isArray(obj) && !isNaN(keyAsInt)) {\n // If there's no value at obj[key] then populate an empty object\n obj[key] = obj[key] ?? {};\n // Continue iterating on the rest of the key path to set the appropriate value where intended and then return\n _sp(obj[key], remaining, v);\n return obj;\n }\n else if (typeof obj === 'object' && obj !== null && !(key in obj) && Array.isArray(obj)) {\n // If this is an array and there are multiple levels of keys to iterate over, recur.\n obj.forEach((doc) => _sp(doc, kp, v));\n return obj;\n }\n else if (typeof obj === 'object' && obj !== null && !(key in obj) && !Array.isArray(obj)) {\n const { key: nextKey } = state(remaining);\n const nextKeyAsInt = parseInt(nextKey);\n if (!isNaN(nextKeyAsInt)) {\n // If the current key doesn't exist yet and the next key is a number (likely array index), populate an empty array\n obj[key] = [];\n }\n else if (remaining === '') {\n // If the remaining key is empty, then a `.` character appeared right at the end of the path and wasn't actually indicating a separate level\n obj[kp] = v;\n return obj;\n }\n else {\n // If the current key doesn't exist yet, populate it\n obj[key] = {};\n }\n }\n _sp(obj[key], remaining, v);\n }\n else if (Array.isArray(obj)) {\n const keyAsInt = parseInt(key);\n // If the object is an array and this key is an int (likely array index), then set the value directly and return\n if (kp === key && dotIndex === -1 && !isNaN(keyAsInt)) {\n obj[key] = v;\n return obj;\n }\n // If this \"obj\" is actually an array, then we can loop over each of the values and set the path\n obj.forEach((doc) => _sp(doc, remaining, v));\n return obj;\n }\n else {\n // Otherwise, we can set the path directly\n obj[key] = v;\n }\n return obj;\n}\n// Helper function that returns some information necessary to evaluate or set a path based on the provided keyPath value\nfunction state(kp) {\n const dotIndex = findFirstNonEscapedDotIndex(kp);\n return {\n dotIndex,\n key: kp.slice(0, dotIndex >= 0 ? dotIndex : undefined).replace(/\\\\./g, '.'),\n remaining: kp.slice(dotIndex + 1)\n };\n}\nfunction findFirstNonEscapedDotIndex(kp) {\n for (let i = 0; i < kp.length; i++) {\n const previousChar = i > 0 ? kp[i - 1] : '', currentChar = kp[i];\n if (currentChar === '.' && previousChar !== '\\\\')\n return i;\n }\n return -1;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA1Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2E7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZUFBZSxHQUFHLG9CQUFvQjtBQUN0QztBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDJCQUEyQjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZUFBZTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsWUFBWSwyQkFBMkI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixlQUFlO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2RvYy1wYXRoL2xpYi9wYXRoLmpzPzNkNGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBNSVRcbiAqIGRvYy1wYXRoIDxodHRwczovL2dpdGh1Yi5jb20vbXJvZHJpZy9kb2MtcGF0aD5cbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBNaWNoYWVsIFJvZHJpZ3Vlcy5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zZXRQYXRoID0gZXhwb3J0cy5ldmFsdWF0ZVBhdGggPSB2b2lkIDA7XG4vKipcbiAqIE1haW4gZnVuY3Rpb24gdGhhdCBldmFsdWF0ZXMgdGhlIHBhdGggaW4gYSBwYXJ0aWN1bGFyIG9iamVjdFxuICogQHRocm93cyB7RXJyb3J9IHBvc3NpYmxlIGVycm9yIGlmIGNhbGwgc3RhY2sgc2l6ZSBpcyBleGNlZWRlZFxuICovXG5mdW5jdGlvbiBldmFsdWF0ZVBhdGgob2JqLCBrcCkge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IGRvdEluZGV4LCBrZXksIHJlbWFpbmluZyB9ID0gc3RhdGUoa3ApO1xuICAgIGNvbnN0IGtwVmFsID0gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYga3AgaW4gb2JqID8gb2JqW2twXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBrZXlWYWwgPSB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBrZXkgaW4gb2JqID8gb2JqW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKGRvdEluZGV4ID49IDAgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIShrcCBpbiBvYmopKSB7XG4gICAgICAgIGNvbnN0IHsga2V5OiBuZXh0S2V5IH0gPSBzdGF0ZShyZW1haW5pbmcpO1xuICAgICAgICBjb25zdCBuZXh0S2V5QXNJbnQgPSBwYXJzZUludChuZXh0S2V5KTtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhcnJheSBhdCB0aGUgY3VycmVudCBrZXkgaW4gdGhlIG9iamVjdCwgdGhlbiBpdGVyYXRlIG92ZXIgdGhvc2UgaXRlbXMgZXZhbHVhdGluZyB0aGUgcmVtYWluaW5nIHBhdGhcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5VmFsKSAmJiBpc05hTihuZXh0S2V5QXNJbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5VmFsLm1hcCgoZG9jKSA9PiBldmFsdWF0ZVBhdGgoZG9jLCByZW1haW5pbmcpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNhbiBqdXN0IHJlY3VyXG4gICAgICAgIHJldHVybiBldmFsdWF0ZVBhdGgoa2V5VmFsLCByZW1haW5pbmcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgY29uc3Qga2V5QXNJbnQgPSBwYXJzZUludChrZXkpO1xuICAgICAgICBpZiAoa3AgPT09IGtleSAmJiBkb3RJbmRleCA9PT0gLTEgJiYgIWlzTmFOKGtleUFzSW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleVZhbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhY3R1YWxseSBhbiBhcnJheSwgdGhlbiBpdGVyYXRlIG92ZXIgdGhvc2UgaXRlbXMgZXZhbHVhdGluZyB0aGUgcGF0aFxuICAgICAgICByZXR1cm4gb2JqLm1hcCgoZG9jKSA9PiBldmFsdWF0ZVBhdGgoZG9jLCBrcCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkb3RJbmRleCA+PSAwICYmIGtwICE9PSBrZXkgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYga2V5IGluIG9iaikge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGEgZmllbGQgd2l0aCBhIG5vbi1uZXN0ZWQgZG90LCB0aGVuIHJlY3VyIGludG8gdGhhdCBzdWItdmFsdWVcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlUGF0aChrZXlWYWwsIHJlbWFpbmluZyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvdEluZGV4ID09PSAtMSAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBrZXkgaW4gb2JqICYmICEoa3AgaW4gb2JqKSkge1xuICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgaGVyZSwgYnV0IHRoZSBrZXkgd2FzIGVzY2FwZWRcbiAgICAgICAgcmV0dXJuIGtleVZhbDtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCB3ZSBjYW4ganVzdCByZXR1cm4gdmFsdWUgZGlyZWN0bHlcbiAgICByZXR1cm4ga3BWYWw7XG59XG5leHBvcnRzLmV2YWx1YXRlUGF0aCA9IGV2YWx1YXRlUGF0aDtcbi8qKlxuICogTWFpbiBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIHZhbGlkYXRpb24gYmVmb3JlIHBhc3Npbmcgb2ZmIHRvIF9zcFxuICogQHRocm93cyB7RXJyb3J9IHBvc3NpYmxlIGVycm9yIGlmIGNhbGwgc3RhY2sgc2l6ZSBpcyBleGNlZWRlZFxuICovXG5mdW5jdGlvbiBzZXRQYXRoKG9iaiwga3AsIHYpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG9iamVjdCB3YXMgcHJvdmlkZWQuJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFrcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGtleVBhdGggd2FzIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgICByZXR1cm4gX3NwKG9iaiwga3AsIHYpO1xufVxuZXhwb3J0cy5zZXRQYXRoID0gc2V0UGF0aDtcbi8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHdpbGwgc2V0IHRoZSB2YWx1ZSBpbiB0aGUgcHJvdmlkZWQgb2JqZWN0L2FycmF5LlxuZnVuY3Rpb24gX3NwKG9iaiwga3AsIHYpIHtcbiAgICBjb25zdCB7IGRvdEluZGV4LCBrZXksIHJlbWFpbmluZyB9ID0gc3RhdGUoa3ApO1xuICAgIC8vIElmIHRoaXMgaXMgY2xlYXJseSBhIHByb3RvdHlwZSBwb2xsdXRpb24gYXR0ZW1wdCwgdGhlbiByZWZ1c2UgdG8gbW9kaWZ5IHRoZSBwYXRoXG4gICAgaWYgKGtwLnN0YXJ0c1dpdGgoJ19fcHJvdG9fXycpIHx8IGtwLnN0YXJ0c1dpdGgoJ2NvbnN0cnVjdG9yJykgfHwga3Auc3RhcnRzV2l0aCgncHJvdG90eXBlJykpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKGRvdEluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3Qga2V5QXNJbnQgPSBwYXJzZUludChrZXkpO1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhICcuJyBpbiB0aGUga2V5IHBhdGgsIHJlY3VyIG9uIHRoZSBzdWJkb2MgYW5kIC4uLlxuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmICEoa2V5IGluIG9iaikgJiYgQXJyYXkuaXNBcnJheShvYmopICYmICFpc05hTihrZXlBc0ludCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gdmFsdWUgYXQgb2JqW2tleV0gdGhlbiBwb3B1bGF0ZSBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgICAgIG9ialtrZXldID0gb2JqW2tleV0gPz8ge307XG4gICAgICAgICAgICAvLyBDb250aW51ZSBpdGVyYXRpbmcgb24gdGhlIHJlc3Qgb2YgdGhlIGtleSBwYXRoIHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgd2hlcmUgaW50ZW5kZWQgYW5kIHRoZW4gcmV0dXJuXG4gICAgICAgICAgICBfc3Aob2JqW2tleV0sIHJlbWFpbmluZywgdik7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiAhKGtleSBpbiBvYmopICYmIEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBhcnJheSBhbmQgdGhlcmUgYXJlIG11bHRpcGxlIGxldmVscyBvZiBrZXlzIHRvIGl0ZXJhdGUgb3ZlciwgcmVjdXIuXG4gICAgICAgICAgICBvYmouZm9yRWFjaCgoZG9jKSA9PiBfc3AoZG9jLCBrcCwgdikpO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgIShrZXkgaW4gb2JqKSAmJiAhQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBjb25zdCB7IGtleTogbmV4dEtleSB9ID0gc3RhdGUocmVtYWluaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRLZXlBc0ludCA9IHBhcnNlSW50KG5leHRLZXkpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihuZXh0S2V5QXNJbnQpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQga2V5IGRvZXNuJ3QgZXhpc3QgeWV0IGFuZCB0aGUgbmV4dCBrZXkgaXMgYSBudW1iZXIgKGxpa2VseSBhcnJheSBpbmRleCksIHBvcHVsYXRlIGFuIGVtcHR5IGFycmF5XG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZyA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVtYWluaW5nIGtleSBpcyBlbXB0eSwgdGhlbiBhIGAuYCBjaGFyYWN0ZXIgYXBwZWFyZWQgcmlnaHQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBhbmQgd2Fzbid0IGFjdHVhbGx5IGluZGljYXRpbmcgYSBzZXBhcmF0ZSBsZXZlbFxuICAgICAgICAgICAgICAgIG9ialtrcF0gPSB2O1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBrZXkgZG9lc24ndCBleGlzdCB5ZXQsIHBvcHVsYXRlIGl0XG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfc3Aob2JqW2tleV0sIHJlbWFpbmluZywgdik7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBjb25zdCBrZXlBc0ludCA9IHBhcnNlSW50KGtleSk7XG4gICAgICAgIC8vIElmIHRoZSBvYmplY3QgaXMgYW4gYXJyYXkgYW5kIHRoaXMga2V5IGlzIGFuIGludCAobGlrZWx5IGFycmF5IGluZGV4KSwgdGhlbiBzZXQgdGhlIHZhbHVlIGRpcmVjdGx5IGFuZCByZXR1cm5cbiAgICAgICAgaWYgKGtwID09PSBrZXkgJiYgZG90SW5kZXggPT09IC0xICYmICFpc05hTihrZXlBc0ludCkpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdjtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhpcyBcIm9ialwiIGlzIGFjdHVhbGx5IGFuIGFycmF5LCB0aGVuIHdlIGNhbiBsb29wIG92ZXIgZWFjaCBvZiB0aGUgdmFsdWVzIGFuZCBzZXQgdGhlIHBhdGhcbiAgICAgICAgb2JqLmZvckVhY2goKGRvYykgPT4gX3NwKGRvYywgcmVtYWluaW5nLCB2KSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNhbiBzZXQgdGhlIHBhdGggZGlyZWN0bHlcbiAgICAgICAgb2JqW2tleV0gPSB2O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBzb21lIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBldmFsdWF0ZSBvciBzZXQgYSBwYXRoICBiYXNlZCBvbiB0aGUgcHJvdmlkZWQga2V5UGF0aCB2YWx1ZVxuZnVuY3Rpb24gc3RhdGUoa3ApIHtcbiAgICBjb25zdCBkb3RJbmRleCA9IGZpbmRGaXJzdE5vbkVzY2FwZWREb3RJbmRleChrcCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZG90SW5kZXgsXG4gICAgICAgIGtleToga3Auc2xpY2UoMCwgZG90SW5kZXggPj0gMCA/IGRvdEluZGV4IDogdW5kZWZpbmVkKS5yZXBsYWNlKC9cXFxcLi9nLCAnLicpLFxuICAgICAgICByZW1haW5pbmc6IGtwLnNsaWNlKGRvdEluZGV4ICsgMSlcbiAgICB9O1xufVxuZnVuY3Rpb24gZmluZEZpcnN0Tm9uRXNjYXBlZERvdEluZGV4KGtwKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrcC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcmV2aW91c0NoYXIgPSBpID4gMCA/IGtwW2kgLSAxXSA6ICcnLCBjdXJyZW50Q2hhciA9IGtwW2ldO1xuICAgICAgICBpZiAoY3VycmVudENoYXIgPT09ICcuJyAmJiBwcmV2aW91c0NoYXIgIT09ICdcXFxcJylcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6052\n")},21780:module=>{"use strict";eval("\n\nfunction _process (v, mod) {\n var i\n var r\n\n if (typeof mod === 'function') {\n r = mod(v)\n if (r !== undefined) {\n v = r\n }\n } else if (Array.isArray(mod)) {\n for (i = 0; i < mod.length; i++) {\n r = mod[i](v)\n if (r !== undefined) {\n v = r\n }\n }\n }\n\n return v\n}\n\nfunction parseKey (key, val) {\n // detect negative index notation\n if (key[0] === '-' && Array.isArray(val) && /^-\\d+$/.test(key)) {\n return val.length + parseInt(key, 10)\n }\n return key\n}\n\nfunction isIndex (k) {\n return /^\\d+$/.test(k)\n}\n\nfunction isObject (val) {\n return Object.prototype.toString.call(val) === '[object Object]'\n}\n\nfunction isArrayOrObject (val) {\n return Object(val) === val\n}\n\nfunction isEmptyObject (val) {\n return Object.keys(val).length === 0\n}\n\nvar blacklist = ['__proto__', 'prototype', 'constructor']\nvar blacklistFilter = function (part) { return blacklist.indexOf(part) === -1 }\n\nfunction parsePath (path, sep) {\n if (path.indexOf('[') >= 0) {\n path = path.replace(/\\[/g, sep).replace(/]/g, '')\n }\n\n var parts = path.split(sep)\n\n var check = parts.filter(blacklistFilter)\n\n if (check.length !== parts.length) {\n throw Error('Refusing to update blacklisted property ' + path)\n }\n\n return parts\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction DotObject (separator, override, useArray, useBrackets) {\n if (!(this instanceof DotObject)) {\n return new DotObject(separator, override, useArray, useBrackets)\n }\n\n if (typeof override === 'undefined') override = false\n if (typeof useArray === 'undefined') useArray = true\n if (typeof useBrackets === 'undefined') useBrackets = true\n this.separator = separator || '.'\n this.override = override\n this.useArray = useArray\n this.useBrackets = useBrackets\n this.keepArray = false\n\n // contains touched arrays\n this.cleanup = []\n}\n\nvar dotDefault = new DotObject('.', false, true, true)\nfunction wrap (method) {\n return function () {\n return dotDefault[method].apply(dotDefault, arguments)\n }\n}\n\nDotObject.prototype._fill = function (a, obj, v, mod) {\n var k = a.shift()\n\n if (a.length > 0) {\n obj[k] = obj[k] || (this.useArray && isIndex(a[0]) ? [] : {})\n\n if (!isArrayOrObject(obj[k])) {\n if (this.override) {\n obj[k] = {}\n } else {\n if (!(isArrayOrObject(v) && isEmptyObject(v))) {\n throw new Error(\n 'Trying to redefine `' + k + '` which is a ' + typeof obj[k]\n )\n }\n\n return\n }\n }\n\n this._fill(a, obj[k], v, mod)\n } else {\n if (!this.override && isArrayOrObject(obj[k]) && !isEmptyObject(obj[k])) {\n if (!(isArrayOrObject(v) && isEmptyObject(v))) {\n throw new Error(\"Trying to redefine non-empty obj['\" + k + \"']\")\n }\n\n return\n }\n\n obj[k] = _process(v, mod)\n }\n}\n\n/**\n *\n * Converts an object with dotted-key/value pairs to it's expanded version\n *\n * Optionally transformed by a set of modifiers.\n *\n * Usage:\n *\n * var row = {\n * 'nr': 200,\n * 'doc.name': ' My Document '\n * }\n *\n * var mods = {\n * 'doc.name': [_s.trim, _s.underscored]\n * }\n *\n * dot.object(row, mods)\n *\n * @param {Object} obj\n * @param {Object} mods\n */\nDotObject.prototype.object = function (obj, mods) {\n var self = this\n\n Object.keys(obj).forEach(function (k) {\n var mod = mods === undefined ? null : mods[k]\n // normalize array notation.\n var ok = parsePath(k, self.separator).join(self.separator)\n\n if (ok.indexOf(self.separator) !== -1) {\n self._fill(ok.split(self.separator), obj, obj[k], mod)\n delete obj[k]\n } else {\n obj[k] = _process(obj[k], mod)\n }\n })\n\n return obj\n}\n\n/**\n * @param {String} path dotted path\n * @param {String} v value to be set\n * @param {Object} obj object to be modified\n * @param {Function|Array} mod optional modifier\n */\nDotObject.prototype.str = function (path, v, obj, mod) {\n var ok = parsePath(path, this.separator).join(this.separator)\n\n if (path.indexOf(this.separator) !== -1) {\n this._fill(ok.split(this.separator), obj, v, mod)\n } else {\n obj[path] = _process(v, mod)\n }\n\n return obj\n}\n\n/**\n *\n * Pick a value from an object using dot notation.\n *\n * Optionally remove the value\n *\n * @param {String} path\n * @param {Object} obj\n * @param {Boolean} remove\n */\nDotObject.prototype.pick = function (path, obj, remove, reindexArray) {\n var i\n var keys\n var val\n var key\n var cp\n\n keys = parsePath(path, this.separator)\n for (i = 0; i < keys.length; i++) {\n key = parseKey(keys[i], obj)\n if (obj && typeof obj === 'object' && key in obj) {\n if (i === keys.length - 1) {\n if (remove) {\n val = obj[key]\n if (reindexArray && Array.isArray(obj)) {\n obj.splice(key, 1)\n } else {\n delete obj[key]\n }\n if (Array.isArray(obj)) {\n cp = keys.slice(0, -1).join('.')\n if (this.cleanup.indexOf(cp) === -1) {\n this.cleanup.push(cp)\n }\n }\n return val\n } else {\n return obj[key]\n }\n } else {\n obj = obj[key]\n }\n } else {\n return undefined\n }\n }\n if (remove && Array.isArray(obj)) {\n obj = obj.filter(function (n) {\n return n !== undefined\n })\n }\n return obj\n}\n/**\n *\n * Delete value from an object using dot notation.\n *\n * @param {String} path\n * @param {Object} obj\n * @return {any} The removed value\n */\nDotObject.prototype.delete = function (path, obj) {\n return this.remove(path, obj, true)\n}\n\n/**\n *\n * Remove value from an object using dot notation.\n *\n * Will remove multiple items if path is an array.\n * In this case array indexes will be retained until all\n * removals have been processed.\n *\n * Use dot.delete() to automatically re-index arrays.\n *\n * @param {String|Array} path\n * @param {Object} obj\n * @param {Boolean} reindexArray\n * @return {any} The removed value\n */\nDotObject.prototype.remove = function (path, obj, reindexArray) {\n var i\n\n this.cleanup = []\n if (Array.isArray(path)) {\n for (i = 0; i < path.length; i++) {\n this.pick(path[i], obj, true, reindexArray)\n }\n if (!reindexArray) {\n this._cleanup(obj)\n }\n return obj\n } else {\n return this.pick(path, obj, true, reindexArray)\n }\n}\n\nDotObject.prototype._cleanup = function (obj) {\n var ret\n var i\n var keys\n var root\n if (this.cleanup.length) {\n for (i = 0; i < this.cleanup.length; i++) {\n keys = this.cleanup[i].split('.')\n root = keys.splice(0, -1).join('.')\n ret = root ? this.pick(root, obj) : obj\n ret = ret[keys[0]].filter(function (v) {\n return v !== undefined\n })\n this.set(this.cleanup[i], ret, obj)\n }\n this.cleanup = []\n }\n}\n\n/**\n * Alias method for `dot.remove`\n *\n * Note: this is not an alias for dot.delete()\n *\n * @param {String|Array} path\n * @param {Object} obj\n * @param {Boolean} reindexArray\n * @return {any} The removed value\n */\nDotObject.prototype.del = DotObject.prototype.remove\n\n/**\n *\n * Move a property from one place to the other.\n *\n * If the source path does not exist (undefined)\n * the target property will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.move = function (source, target, obj, mods, merge) {\n if (typeof mods === 'function' || Array.isArray(mods)) {\n this.set(target, _process(this.pick(source, obj, true), mods), obj, merge)\n } else {\n merge = mods\n this.set(target, this.pick(source, obj, true), obj, merge)\n }\n\n return obj\n}\n\n/**\n *\n * Transfer a property from one object to another object.\n *\n * If the source path does not exist (undefined)\n * the property on the other object will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj1\n * @param {Object} obj2\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.transfer = function (\n source,\n target,\n obj1,\n obj2,\n mods,\n merge\n) {\n if (typeof mods === 'function' || Array.isArray(mods)) {\n this.set(\n target,\n _process(this.pick(source, obj1, true), mods),\n obj2,\n merge\n )\n } else {\n merge = mods\n this.set(target, this.pick(source, obj1, true), obj2, merge)\n }\n\n return obj2\n}\n\n/**\n *\n * Copy a property from one object to another object.\n *\n * If the source path does not exist (undefined)\n * the property on the other object will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj1\n * @param {Object} obj2\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.copy = function (source, target, obj1, obj2, mods, merge) {\n if (typeof mods === 'function' || Array.isArray(mods)) {\n this.set(\n target,\n _process(\n // clone what is picked\n JSON.parse(JSON.stringify(this.pick(source, obj1, false))),\n mods\n ),\n obj2,\n merge\n )\n } else {\n merge = mods\n this.set(target, this.pick(source, obj1, false), obj2, merge)\n }\n\n return obj2\n}\n\n/**\n *\n * Set a property on an object using dot notation.\n *\n * @param {String} path\n * @param {any} val\n * @param {Object} obj\n * @param {Boolean} merge\n */\nDotObject.prototype.set = function (path, val, obj, merge) {\n var i\n var k\n var keys\n var key\n\n // Do not operate if the value is undefined.\n if (typeof val === 'undefined') {\n return obj\n }\n keys = parsePath(path, this.separator)\n\n for (i = 0; i < keys.length; i++) {\n key = keys[i]\n if (i === keys.length - 1) {\n if (merge && isObject(val) && isObject(obj[key])) {\n for (k in val) {\n if (hasOwnProperty.call(val, k)) {\n obj[key][k] = val[k]\n }\n }\n } else if (merge && Array.isArray(obj[key]) && Array.isArray(val)) {\n for (var j = 0; j < val.length; j++) {\n obj[keys[i]].push(val[j])\n }\n } else {\n obj[key] = val\n }\n } else if (\n // force the value to be an object\n !hasOwnProperty.call(obj, key) ||\n (!isObject(obj[key]) && !Array.isArray(obj[key]))\n ) {\n // initialize as array if next key is numeric\n if (/^\\d+$/.test(keys[i + 1])) {\n obj[key] = []\n } else {\n obj[key] = {}\n }\n }\n obj = obj[key]\n }\n return obj\n}\n\n/**\n *\n * Transform an object\n *\n * Usage:\n *\n * var obj = {\n * \"id\": 1,\n * \"some\": {\n * \"thing\": \"else\"\n * }\n * }\n *\n * var transform = {\n * \"id\": \"nr\",\n * \"some.thing\": \"name\"\n * }\n *\n * var tgt = dot.transform(transform, obj)\n *\n * @param {Object} recipe Transform recipe\n * @param {Object} obj Object to be transformed\n * @param {Array} mods modifiers for the target\n */\nDotObject.prototype.transform = function (recipe, obj, tgt) {\n obj = obj || {}\n tgt = tgt || {}\n Object.keys(recipe).forEach(\n function (key) {\n this.set(recipe[key], this.pick(key, obj), tgt)\n }.bind(this)\n )\n return tgt\n}\n\n/**\n *\n * Convert object to dotted-key/value pair\n *\n * Usage:\n *\n * var tgt = dot.dot(obj)\n *\n * or\n *\n * var tgt = {}\n * dot.dot(obj, tgt)\n *\n * @param {Object} obj source object\n * @param {Object} tgt target object\n * @param {Array} path path array (internal)\n */\nDotObject.prototype.dot = function (obj, tgt, path) {\n tgt = tgt || {}\n path = path || []\n var isArray = Array.isArray(obj)\n\n Object.keys(obj).forEach(\n function (key) {\n var index = isArray && this.useBrackets ? '[' + key + ']' : key\n if (\n isArrayOrObject(obj[key]) &&\n ((isObject(obj[key]) && !isEmptyObject(obj[key])) ||\n (Array.isArray(obj[key]) && !this.keepArray && obj[key].length !== 0))\n ) {\n if (isArray && this.useBrackets) {\n var previousKey = path[path.length - 1] || ''\n return this.dot(\n obj[key],\n tgt,\n path.slice(0, -1).concat(previousKey + index)\n )\n } else {\n return this.dot(obj[key], tgt, path.concat(index))\n }\n } else {\n if (isArray && this.useBrackets) {\n tgt[path.join(this.separator).concat('[' + key + ']')] = obj[key]\n } else {\n tgt[path.concat(index).join(this.separator)] = obj[key]\n }\n }\n }.bind(this)\n )\n return tgt\n}\n\nDotObject.pick = wrap('pick')\nDotObject.move = wrap('move')\nDotObject.transfer = wrap('transfer')\nDotObject.transform = wrap('transform')\nDotObject.copy = wrap('copy')\nDotObject.object = wrap('object')\nDotObject.str = wrap('str')\nDotObject.set = wrap('set')\nDotObject.delete = wrap('delete')\nDotObject.del = DotObject.remove = wrap('remove')\nDotObject.dot = wrap('dot');\n['override', 'overwrite'].forEach(function (prop) {\n Object.defineProperty(DotObject, prop, {\n get: function () {\n return dotDefault.override\n },\n set: function (val) {\n dotDefault.override = !!val\n }\n })\n});\n['useArray', 'keepArray', 'useBrackets'].forEach(function (prop) {\n Object.defineProperty(DotObject, prop, {\n get: function () {\n return dotDefault[prop]\n },\n set: function (val) {\n dotDefault[prop] = val\n }\n })\n})\n\nDotObject._process = _process\n\nmodule.exports = DotObject\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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L2luZGV4LmpzPzg0YjUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIF9wcm9jZXNzICh2LCBtb2QpIHtcbiAgdmFyIGlcbiAgdmFyIHJcblxuICBpZiAodHlwZW9mIG1vZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHIgPSBtb2QodilcbiAgICBpZiAociAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2ID0gclxuICAgIH1cbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1vZCkpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbW9kLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gbW9kW2ldKHYpXG4gICAgICBpZiAociAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHYgPSByXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZcbn1cblxuZnVuY3Rpb24gcGFyc2VLZXkgKGtleSwgdmFsKSB7XG4gIC8vIGRldGVjdCBuZWdhdGl2ZSBpbmRleCBub3RhdGlvblxuICBpZiAoa2V5WzBdID09PSAnLScgJiYgQXJyYXkuaXNBcnJheSh2YWwpICYmIC9eLVxcZCskLy50ZXN0KGtleSkpIHtcbiAgICByZXR1cm4gdmFsLmxlbmd0aCArIHBhcnNlSW50KGtleSwgMTApXG4gIH1cbiAgcmV0dXJuIGtleVxufVxuXG5mdW5jdGlvbiBpc0luZGV4IChrKSB7XG4gIHJldHVybiAvXlxcZCskLy50ZXN0KGspXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0ICh2YWwpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBPYmplY3RdJ1xufVxuXG5mdW5jdGlvbiBpc0FycmF5T3JPYmplY3QgKHZhbCkge1xuICByZXR1cm4gT2JqZWN0KHZhbCkgPT09IHZhbFxufVxuXG5mdW5jdGlvbiBpc0VtcHR5T2JqZWN0ICh2YWwpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbCkubGVuZ3RoID09PSAwXG59XG5cbnZhciBibGFja2xpc3QgPSBbJ19fcHJvdG9fXycsICdwcm90b3R5cGUnLCAnY29uc3RydWN0b3InXVxudmFyIGJsYWNrbGlzdEZpbHRlciA9IGZ1bmN0aW9uIChwYXJ0KSB7IHJldHVybiBibGFja2xpc3QuaW5kZXhPZihwYXJ0KSA9PT0gLTEgfVxuXG5mdW5jdGlvbiBwYXJzZVBhdGggKHBhdGgsIHNlcCkge1xuICBpZiAocGF0aC5pbmRleE9mKCdbJykgPj0gMCkge1xuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcWy9nLCBzZXApLnJlcGxhY2UoL10vZywgJycpXG4gIH1cblxuICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KHNlcClcblxuICB2YXIgY2hlY2sgPSBwYXJ0cy5maWx0ZXIoYmxhY2tsaXN0RmlsdGVyKVxuXG4gIGlmIChjaGVjay5sZW5ndGggIT09IHBhcnRzLmxlbmd0aCkge1xuICAgIHRocm93IEVycm9yKCdSZWZ1c2luZyB0byB1cGRhdGUgYmxhY2tsaXN0ZWQgcHJvcGVydHkgJyArIHBhdGgpXG4gIH1cblxuICByZXR1cm4gcGFydHNcbn1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuXG5mdW5jdGlvbiBEb3RPYmplY3QgKHNlcGFyYXRvciwgb3ZlcnJpZGUsIHVzZUFycmF5LCB1c2VCcmFja2V0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRG90T2JqZWN0KSkge1xuICAgIHJldHVybiBuZXcgRG90T2JqZWN0KHNlcGFyYXRvciwgb3ZlcnJpZGUsIHVzZUFycmF5LCB1c2VCcmFja2V0cylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3ZlcnJpZGUgPT09ICd1bmRlZmluZWQnKSBvdmVycmlkZSA9IGZhbHNlXG4gIGlmICh0eXBlb2YgdXNlQXJyYXkgPT09ICd1bmRlZmluZWQnKSB1c2VBcnJheSA9IHRydWVcbiAgaWYgKHR5cGVvZiB1c2VCcmFja2V0cyA9PT0gJ3VuZGVmaW5lZCcpIHVzZUJyYWNrZXRzID0gdHJ1ZVxuICB0aGlzLnNlcGFyYXRvciA9IHNlcGFyYXRvciB8fCAnLidcbiAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlXG4gIHRoaXMudXNlQXJyYXkgPSB1c2VBcnJheVxuICB0aGlzLnVzZUJyYWNrZXRzID0gdXNlQnJhY2tldHNcbiAgdGhpcy5rZWVwQXJyYXkgPSBmYWxzZVxuXG4gIC8vIGNvbnRhaW5zIHRvdWNoZWQgYXJyYXlzXG4gIHRoaXMuY2xlYW51cCA9IFtdXG59XG5cbnZhciBkb3REZWZhdWx0ID0gbmV3IERvdE9iamVjdCgnLicsIGZhbHNlLCB0cnVlLCB0cnVlKVxuZnVuY3Rpb24gd3JhcCAobWV0aG9kKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRvdERlZmF1bHRbbWV0aG9kXS5hcHBseShkb3REZWZhdWx0LCBhcmd1bWVudHMpXG4gIH1cbn1cblxuRG90T2JqZWN0LnByb3RvdHlwZS5fZmlsbCA9IGZ1bmN0aW9uIChhLCBvYmosIHYsIG1vZCkge1xuICB2YXIgayA9IGEuc2hpZnQoKVxuXG4gIGlmIChhLmxlbmd0aCA+IDApIHtcbiAgICBvYmpba10gPSBvYmpba10gfHwgKHRoaXMudXNlQXJyYXkgJiYgaXNJbmRleChhWzBdKSA/IFtdIDoge30pXG5cbiAgICBpZiAoIWlzQXJyYXlPck9iamVjdChvYmpba10pKSB7XG4gICAgICBpZiAodGhpcy5vdmVycmlkZSkge1xuICAgICAgICBvYmpba10gPSB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEoaXNBcnJheU9yT2JqZWN0KHYpICYmIGlzRW1wdHlPYmplY3QodikpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RyeWluZyB0byByZWRlZmluZSBgJyArIGsgKyAnYCB3aGljaCBpcyBhICcgKyB0eXBlb2Ygb2JqW2tdXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZmlsbChhLCBvYmpba10sIHYsIG1vZClcbiAgfSBlbHNlIHtcbiAgICBpZiAoIXRoaXMub3ZlcnJpZGUgJiYgaXNBcnJheU9yT2JqZWN0KG9ialtrXSkgJiYgIWlzRW1wdHlPYmplY3Qob2JqW2tdKSkge1xuICAgICAgaWYgKCEoaXNBcnJheU9yT2JqZWN0KHYpICYmIGlzRW1wdHlPYmplY3QodikpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byByZWRlZmluZSBub24tZW1wdHkgb2JqWydcIiArIGsgKyBcIiddXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIG9ialtrXSA9IF9wcm9jZXNzKHYsIG1vZClcbiAgfVxufVxuXG4vKipcbiAqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgd2l0aCBkb3R0ZWQta2V5L3ZhbHVlIHBhaXJzIHRvIGl0J3MgZXhwYW5kZWQgdmVyc2lvblxuICpcbiAqIE9wdGlvbmFsbHkgdHJhbnNmb3JtZWQgYnkgYSBzZXQgb2YgbW9kaWZpZXJzLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqICAgdmFyIHJvdyA9IHtcbiAqICAgICAnbnInOiAyMDAsXG4gKiAgICAgJ2RvYy5uYW1lJzogJyAgTXkgRG9jdW1lbnQgICdcbiAqICAgfVxuICpcbiAqICAgdmFyIG1vZHMgPSB7XG4gKiAgICAgJ2RvYy5uYW1lJzogW19zLnRyaW0sIF9zLnVuZGVyc2NvcmVkXVxuICogICB9XG4gKlxuICogICBkb3Qub2JqZWN0KHJvdywgbW9kcylcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kc1xuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLm9iamVjdCA9IGZ1bmN0aW9uIChvYmosIG1vZHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgdmFyIG1vZCA9IG1vZHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBtb2RzW2tdXG4gICAgLy8gbm9ybWFsaXplIGFycmF5IG5vdGF0aW9uLlxuICAgIHZhciBvayA9IHBhcnNlUGF0aChrLCBzZWxmLnNlcGFyYXRvcikuam9pbihzZWxmLnNlcGFyYXRvcilcblxuICAgIGlmIChvay5pbmRleE9mKHNlbGYuc2VwYXJhdG9yKSAhPT0gLTEpIHtcbiAgICAgIHNlbGYuX2ZpbGwob2suc3BsaXQoc2VsZi5zZXBhcmF0b3IpLCBvYmosIG9ialtrXSwgbW9kKVxuICAgICAgZGVsZXRlIG9ialtrXVxuICAgIH0gZWxzZSB7XG4gICAgICBvYmpba10gPSBfcHJvY2VzcyhvYmpba10sIG1vZClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG9ialxufVxuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIGRvdHRlZCBwYXRoXG4gKiBAcGFyYW0ge1N0cmluZ30gdiB2YWx1ZSB0byBiZSBzZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogb2JqZWN0IHRvIGJlIG1vZGlmaWVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5fSBtb2Qgb3B0aW9uYWwgbW9kaWZpZXJcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5zdHIgPSBmdW5jdGlvbiAocGF0aCwgdiwgb2JqLCBtb2QpIHtcbiAgdmFyIG9rID0gcGFyc2VQYXRoKHBhdGgsIHRoaXMuc2VwYXJhdG9yKS5qb2luKHRoaXMuc2VwYXJhdG9yKVxuXG4gIGlmIChwYXRoLmluZGV4T2YodGhpcy5zZXBhcmF0b3IpICE9PSAtMSkge1xuICAgIHRoaXMuX2ZpbGwob2suc3BsaXQodGhpcy5zZXBhcmF0b3IpLCBvYmosIHYsIG1vZClcbiAgfSBlbHNlIHtcbiAgICBvYmpbcGF0aF0gPSBfcHJvY2Vzcyh2LCBtb2QpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICpcbiAqIFBpY2sgYSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogT3B0aW9uYWxseSByZW1vdmUgdGhlIHZhbHVlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVtb3ZlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUucGljayA9IGZ1bmN0aW9uIChwYXRoLCBvYmosIHJlbW92ZSwgcmVpbmRleEFycmF5KSB7XG4gIHZhciBpXG4gIHZhciBrZXlzXG4gIHZhciB2YWxcbiAgdmFyIGtleVxuICB2YXIgY3BcblxuICBrZXlzID0gcGFyc2VQYXRoKHBhdGgsIHRoaXMuc2VwYXJhdG9yKVxuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHBhcnNlS2V5KGtleXNbaV0sIG9iailcbiAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICAgIHZhbCA9IG9ialtrZXldXG4gICAgICAgICAgaWYgKHJlaW5kZXhBcnJheSAmJiBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIG9iai5zcGxpY2Uoa2V5LCAxKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgb2JqW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgY3AgPSBrZXlzLnNsaWNlKDAsIC0xKS5qb2luKCcuJylcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFudXAuaW5kZXhPZihjcCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xlYW51cC5wdXNoKGNwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtrZXldXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iaiA9IG9ialtrZXldXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbiAgaWYgKHJlbW92ZSAmJiBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICBvYmogPSBvYmouZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gbiAhPT0gdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuICByZXR1cm4gb2JqXG59XG4vKipcbiAqXG4gKiBEZWxldGUgdmFsdWUgZnJvbSBhbiBvYmplY3QgdXNpbmcgZG90IG5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW1vdmVkIHZhbHVlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhdGgsIG9iaikge1xuICByZXR1cm4gdGhpcy5yZW1vdmUocGF0aCwgb2JqLCB0cnVlKVxufVxuXG4vKipcbiAqXG4gKiBSZW1vdmUgdmFsdWUgZnJvbSBhbiBvYmplY3QgdXNpbmcgZG90IG5vdGF0aW9uLlxuICpcbiAqIFdpbGwgcmVtb3ZlIG11bHRpcGxlIGl0ZW1zIGlmIHBhdGggaXMgYW4gYXJyYXkuXG4gKiBJbiB0aGlzIGNhc2UgYXJyYXkgaW5kZXhlcyB3aWxsIGJlIHJldGFpbmVkIHVudGlsIGFsbFxuICogcmVtb3ZhbHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAqXG4gKiBVc2UgZG90LmRlbGV0ZSgpIHRvIGF1dG9tYXRpY2FsbHkgIHJlLWluZGV4IGFycmF5cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxTdHJpbmc+fSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlaW5kZXhBcnJheVxuICogQHJldHVybiB7YW55fSBUaGUgcmVtb3ZlZCB2YWx1ZVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChwYXRoLCBvYmosIHJlaW5kZXhBcnJheSkge1xuICB2YXIgaVxuXG4gIHRoaXMuY2xlYW51cCA9IFtdXG4gIGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGljayhwYXRoW2ldLCBvYmosIHRydWUsIHJlaW5kZXhBcnJheSlcbiAgICB9XG4gICAgaWYgKCFyZWluZGV4QXJyYXkpIHtcbiAgICAgIHRoaXMuX2NsZWFudXAob2JqKVxuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMucGljayhwYXRoLCBvYmosIHRydWUsIHJlaW5kZXhBcnJheSlcbiAgfVxufVxuXG5Eb3RPYmplY3QucHJvdG90eXBlLl9jbGVhbnVwID0gZnVuY3Rpb24gKG9iaikge1xuICB2YXIgcmV0XG4gIHZhciBpXG4gIHZhciBrZXlzXG4gIHZhciByb290XG4gIGlmICh0aGlzLmNsZWFudXAubGVuZ3RoKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY2xlYW51cC5sZW5ndGg7IGkrKykge1xuICAgICAga2V5cyA9IHRoaXMuY2xlYW51cFtpXS5zcGxpdCgnLicpXG4gICAgICByb290ID0ga2V5cy5zcGxpY2UoMCwgLTEpLmpvaW4oJy4nKVxuICAgICAgcmV0ID0gcm9vdCA/IHRoaXMucGljayhyb290LCBvYmopIDogb2JqXG4gICAgICByZXQgPSByZXRba2V5c1swXV0uZmlsdGVyKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB2ICE9PSB1bmRlZmluZWRcbiAgICAgIH0pXG4gICAgICB0aGlzLnNldCh0aGlzLmNsZWFudXBbaV0sIHJldCwgb2JqKVxuICAgIH1cbiAgICB0aGlzLmNsZWFudXAgPSBbXVxuICB9XG59XG5cbi8qKlxuICogQWxpYXMgbWV0aG9kICBmb3IgYGRvdC5yZW1vdmVgXG4gKlxuICogTm90ZTogdGhpcyBpcyBub3QgYW4gYWxpYXMgZm9yIGRvdC5kZWxldGUoKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PFN0cmluZz59IHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVpbmRleEFycmF5XG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW1vdmVkIHZhbHVlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUuZGVsID0gRG90T2JqZWN0LnByb3RvdHlwZS5yZW1vdmVcblxuLyoqXG4gKlxuICogTW92ZSBhIHByb3BlcnR5IGZyb20gb25lIHBsYWNlIHRvIHRoZSBvdGhlci5cbiAqXG4gKiBJZiB0aGUgc291cmNlIHBhdGggZG9lcyBub3QgZXhpc3QgKHVuZGVmaW5lZClcbiAqIHRoZSB0YXJnZXQgcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl9IG1vZHNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbWVyZ2VcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0LCBvYmosIG1vZHMsIG1lcmdlKSB7XG4gIGlmICh0eXBlb2YgbW9kcyA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgdGhpcy5zZXQodGFyZ2V0LCBfcHJvY2Vzcyh0aGlzLnBpY2soc291cmNlLCBvYmosIHRydWUpLCBtb2RzKSwgb2JqLCBtZXJnZSlcbiAgfSBlbHNlIHtcbiAgICBtZXJnZSA9IG1vZHNcbiAgICB0aGlzLnNldCh0YXJnZXQsIHRoaXMucGljayhzb3VyY2UsIG9iaiwgdHJ1ZSksIG9iaiwgbWVyZ2UpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICpcbiAqIFRyYW5zZmVyIGEgcHJvcGVydHkgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIgb2JqZWN0LlxuICpcbiAqIElmIHRoZSBzb3VyY2UgcGF0aCBkb2VzIG5vdCBleGlzdCAodW5kZWZpbmVkKVxuICogdGhlIHByb3BlcnR5IG9uIHRoZSBvdGhlciBvYmplY3Qgd2lsbCBub3QgYmUgc2V0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMlxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gbW9kc1xuICogQHBhcmFtIHtCb29sZWFufSBtZXJnZVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLnRyYW5zZmVyID0gZnVuY3Rpb24gKFxuICBzb3VyY2UsXG4gIHRhcmdldCxcbiAgb2JqMSxcbiAgb2JqMixcbiAgbW9kcyxcbiAgbWVyZ2Vcbikge1xuICBpZiAodHlwZW9mIG1vZHMgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShtb2RzKSkge1xuICAgIHRoaXMuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgX3Byb2Nlc3ModGhpcy5waWNrKHNvdXJjZSwgb2JqMSwgdHJ1ZSksIG1vZHMpLFxuICAgICAgb2JqMixcbiAgICAgIG1lcmdlXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIG1lcmdlID0gbW9kc1xuICAgIHRoaXMuc2V0KHRhcmdldCwgdGhpcy5waWNrKHNvdXJjZSwgb2JqMSwgdHJ1ZSksIG9iajIsIG1lcmdlKVxuICB9XG5cbiAgcmV0dXJuIG9iajJcbn1cblxuLyoqXG4gKlxuICogQ29weSBhIHByb3BlcnR5IGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyIG9iamVjdC5cbiAqXG4gKiBJZiB0aGUgc291cmNlIHBhdGggZG9lcyBub3QgZXhpc3QgKHVuZGVmaW5lZClcbiAqIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb3RoZXIgb2JqZWN0IHdpbGwgbm90IGJlIHNldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFyZ2V0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMVxuICogQHBhcmFtIHtPYmplY3R9IG9iajJcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl9IG1vZHNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbWVyZ2VcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0LCBvYmoxLCBvYmoyLCBtb2RzLCBtZXJnZSkge1xuICBpZiAodHlwZW9mIG1vZHMgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShtb2RzKSkge1xuICAgIHRoaXMuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgX3Byb2Nlc3MoXG4gICAgICAgIC8vIGNsb25lIHdoYXQgaXMgcGlja2VkXG4gICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5waWNrKHNvdXJjZSwgb2JqMSwgZmFsc2UpKSksXG4gICAgICAgIG1vZHNcbiAgICAgICksXG4gICAgICBvYmoyLFxuICAgICAgbWVyZ2VcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgbWVyZ2UgPSBtb2RzXG4gICAgdGhpcy5zZXQodGFyZ2V0LCB0aGlzLnBpY2soc291cmNlLCBvYmoxLCBmYWxzZSksIG9iajIsIG1lcmdlKVxuICB9XG5cbiAgcmV0dXJuIG9iajJcbn1cblxuLyoqXG4gKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtCb29sZWFufSBtZXJnZVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChwYXRoLCB2YWwsIG9iaiwgbWVyZ2UpIHtcbiAgdmFyIGlcbiAgdmFyIGtcbiAgdmFyIGtleXNcbiAgdmFyIGtleVxuXG4gIC8vIERvIG5vdCBvcGVyYXRlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQuXG4gIGlmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBvYmpcbiAgfVxuICBrZXlzID0gcGFyc2VQYXRoKHBhdGgsIHRoaXMuc2VwYXJhdG9yKVxuXG4gIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXVxuICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGlmIChtZXJnZSAmJiBpc09iamVjdCh2YWwpICYmIGlzT2JqZWN0KG9ialtrZXldKSkge1xuICAgICAgICBmb3IgKGsgaW4gdmFsKSB7XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsLCBrKSkge1xuICAgICAgICAgICAgb2JqW2tleV1ba10gPSB2YWxba11cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobWVyZ2UgJiYgQXJyYXkuaXNBcnJheShvYmpba2V5XSkgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgb2JqW2tleXNbaV1dLnB1c2godmFsW2pdKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBmb3JjZSB0aGUgdmFsdWUgdG8gYmUgYW4gb2JqZWN0XG4gICAgICAhaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgfHxcbiAgICAgICghaXNPYmplY3Qob2JqW2tleV0pICYmICFBcnJheS5pc0FycmF5KG9ialtrZXldKSlcbiAgICApIHtcbiAgICAgIC8vIGluaXRpYWxpemUgYXMgYXJyYXkgaWYgbmV4dCBrZXkgaXMgbnVtZXJpY1xuICAgICAgaWYgKC9eXFxkKyQvLnRlc3Qoa2V5c1tpICsgMV0pKSB7XG4gICAgICAgIG9ialtrZXldID0gW11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0ge31cbiAgICAgIH1cbiAgICB9XG4gICAgb2JqID0gb2JqW2tleV1cbiAgfVxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICpcbiAqIFRyYW5zZm9ybSBhbiBvYmplY3RcbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiAgIHZhciBvYmogPSB7XG4gKiAgICAgXCJpZFwiOiAxLFxuICogICAgXCJzb21lXCI6IHtcbiAqICAgICAgXCJ0aGluZ1wiOiBcImVsc2VcIlxuICogICAgfVxuICogICB9XG4gKlxuICogICB2YXIgdHJhbnNmb3JtID0ge1xuICogICAgIFwiaWRcIjogXCJuclwiLFxuICogICAgXCJzb21lLnRoaW5nXCI6IFwibmFtZVwiXG4gKiAgIH1cbiAqXG4gKiAgIHZhciB0Z3QgPSBkb3QudHJhbnNmb3JtKHRyYW5zZm9ybSwgb2JqKVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWNpcGUgVHJhbnNmb3JtIHJlY2lwZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBPYmplY3QgdG8gYmUgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZHMgbW9kaWZpZXJzIGZvciB0aGUgdGFyZ2V0XG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHJlY2lwZSwgb2JqLCB0Z3QpIHtcbiAgb2JqID0gb2JqIHx8IHt9XG4gIHRndCA9IHRndCB8fCB7fVxuICBPYmplY3Qua2V5cyhyZWNpcGUpLmZvckVhY2goXG4gICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgdGhpcy5zZXQocmVjaXBlW2tleV0sIHRoaXMucGljayhrZXksIG9iaiksIHRndClcbiAgICB9LmJpbmQodGhpcylcbiAgKVxuICByZXR1cm4gdGd0XG59XG5cbi8qKlxuICpcbiAqIENvbnZlcnQgb2JqZWN0IHRvIGRvdHRlZC1rZXkvdmFsdWUgcGFpclxuICpcbiAqIFVzYWdlOlxuICpcbiAqICAgdmFyIHRndCA9IGRvdC5kb3Qob2JqKVxuICpcbiAqICAgb3JcbiAqXG4gKiAgIHZhciB0Z3QgPSB7fVxuICogICBkb3QuZG90KG9iaiwgdGd0KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogc291cmNlIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHRndCB0YXJnZXQgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIHBhdGggYXJyYXkgKGludGVybmFsKVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLmRvdCA9IGZ1bmN0aW9uIChvYmosIHRndCwgcGF0aCkge1xuICB0Z3QgPSB0Z3QgfHwge31cbiAgcGF0aCA9IHBhdGggfHwgW11cbiAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KG9iailcblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goXG4gICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGluZGV4ID0gaXNBcnJheSAmJiB0aGlzLnVzZUJyYWNrZXRzID8gJ1snICsga2V5ICsgJ10nIDoga2V5XG4gICAgICBpZiAoXG4gICAgICAgIGlzQXJyYXlPck9iamVjdChvYmpba2V5XSkgJiZcbiAgICAgICAgKChpc09iamVjdChvYmpba2V5XSkgJiYgIWlzRW1wdHlPYmplY3Qob2JqW2tleV0pKSB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KG9ialtrZXldKSAmJiAhdGhpcy5rZWVwQXJyYXkgJiYgb2JqW2tleV0ubGVuZ3RoICE9PSAwKSlcbiAgICAgICkge1xuICAgICAgICBpZiAoaXNBcnJheSAmJiB0aGlzLnVzZUJyYWNrZXRzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzS2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdIHx8ICcnXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZG90KFxuICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICB0Z3QsXG4gICAgICAgICAgICBwYXRoLnNsaWNlKDAsIC0xKS5jb25jYXQocHJldmlvdXNLZXkgKyBpbmRleClcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZG90KG9ialtrZXldLCB0Z3QsIHBhdGguY29uY2F0KGluZGV4KSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzQXJyYXkgJiYgdGhpcy51c2VCcmFja2V0cykge1xuICAgICAgICAgIHRndFtwYXRoLmpvaW4odGhpcy5zZXBhcmF0b3IpLmNvbmNhdCgnWycgKyBrZXkgKyAnXScpXSA9IG9ialtrZXldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGd0W3BhdGguY29uY2F0KGluZGV4KS5qb2luKHRoaXMuc2VwYXJhdG9yKV0gPSBvYmpba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpXG4gIClcbiAgcmV0dXJuIHRndFxufVxuXG5Eb3RPYmplY3QucGljayA9IHdyYXAoJ3BpY2snKVxuRG90T2JqZWN0Lm1vdmUgPSB3cmFwKCdtb3ZlJylcbkRvdE9iamVjdC50cmFuc2ZlciA9IHdyYXAoJ3RyYW5zZmVyJylcbkRvdE9iamVjdC50cmFuc2Zvcm0gPSB3cmFwKCd0cmFuc2Zvcm0nKVxuRG90T2JqZWN0LmNvcHkgPSB3cmFwKCdjb3B5JylcbkRvdE9iamVjdC5vYmplY3QgPSB3cmFwKCdvYmplY3QnKVxuRG90T2JqZWN0LnN0ciA9IHdyYXAoJ3N0cicpXG5Eb3RPYmplY3Quc2V0ID0gd3JhcCgnc2V0JylcbkRvdE9iamVjdC5kZWxldGUgPSB3cmFwKCdkZWxldGUnKVxuRG90T2JqZWN0LmRlbCA9IERvdE9iamVjdC5yZW1vdmUgPSB3cmFwKCdyZW1vdmUnKVxuRG90T2JqZWN0LmRvdCA9IHdyYXAoJ2RvdCcpO1xuWydvdmVycmlkZScsICdvdmVyd3JpdGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEb3RPYmplY3QsIHByb3AsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkb3REZWZhdWx0Lm92ZXJyaWRlXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGRvdERlZmF1bHQub3ZlcnJpZGUgPSAhIXZhbFxuICAgIH1cbiAgfSlcbn0pO1xuWyd1c2VBcnJheScsICdrZWVwQXJyYXknLCAndXNlQnJhY2tldHMnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEb3RPYmplY3QsIHByb3AsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkb3REZWZhdWx0W3Byb3BdXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGRvdERlZmF1bHRbcHJvcF0gPSB2YWxcbiAgICB9XG4gIH0pXG59KVxuXG5Eb3RPYmplY3QuX3Byb2Nlc3MgPSBfcHJvY2Vzc1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvdE9iamVjdFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///21780\n")},14988:(module,exports)=>{"use strict";eval('/**\n * @author Toru Nagashima \n * @copyright 2015 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\n\n\nObject.defineProperty(exports, "__esModule", ({ value: true }));\n\n/**\n * @typedef {object} PrivateData\n * @property {EventTarget} eventTarget The event target.\n * @property {{type:string}} event The original event object.\n * @property {number} eventPhase The current event phase.\n * @property {EventTarget|null} currentTarget The current event target.\n * @property {boolean} canceled The flag to prevent default.\n * @property {boolean} stopped The flag to stop propagation.\n * @property {boolean} immediateStopped The flag to stop propagation immediately.\n * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null.\n * @property {number} timeStamp The unix time.\n * @private\n */\n\n/**\n * Private data for event wrappers.\n * @type {WeakMap}\n * @private\n */\nconst privateData = new WeakMap();\n\n/**\n * Cache for wrapper classes.\n * @type {WeakMap}\n * @private\n */\nconst wrappers = new WeakMap();\n\n/**\n * Get private data.\n * @param {Event} event The event object to get private data.\n * @returns {PrivateData} The private data of the event.\n * @private\n */\nfunction pd(event) {\n const retv = privateData.get(event);\n console.assert(\n retv != null,\n "\'this\' is expected an Event object, but got",\n event\n );\n return retv\n}\n\n/**\n * https://dom.spec.whatwg.org/#set-the-canceled-flag\n * @param data {PrivateData} private data.\n */\nfunction setCancelFlag(data) {\n if (data.passiveListener != null) {\n if (\n typeof console !== "undefined" &&\n typeof console.error === "function"\n ) {\n console.error(\n "Unable to preventDefault inside passive event listener invocation.",\n data.passiveListener\n );\n }\n return\n }\n if (!data.event.cancelable) {\n return\n }\n\n data.canceled = true;\n if (typeof data.event.preventDefault === "function") {\n data.event.preventDefault();\n }\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#interface-event\n * @private\n */\n/**\n * The event wrapper.\n * @constructor\n * @param {EventTarget} eventTarget The event target of this dispatching.\n * @param {Event|{type:string}} event The original event to wrap.\n */\nfunction Event(eventTarget, event) {\n privateData.set(this, {\n eventTarget,\n event,\n eventPhase: 2,\n currentTarget: eventTarget,\n canceled: false,\n stopped: false,\n immediateStopped: false,\n passiveListener: null,\n timeStamp: event.timeStamp || Date.now(),\n });\n\n // https://heycam.github.io/webidl/#Unforgeable\n Object.defineProperty(this, "isTrusted", { value: false, enumerable: true });\n\n // Define accessors\n const keys = Object.keys(event);\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n if (!(key in this)) {\n Object.defineProperty(this, key, defineRedirectDescriptor(key));\n }\n }\n}\n\n// Should be enumerable, but class methods are not enumerable.\nEvent.prototype = {\n /**\n * The type of this event.\n * @type {string}\n */\n get type() {\n return pd(this).event.type\n },\n\n /**\n * The target of this event.\n * @type {EventTarget}\n */\n get target() {\n return pd(this).eventTarget\n },\n\n /**\n * The target of this event.\n * @type {EventTarget}\n */\n get currentTarget() {\n return pd(this).currentTarget\n },\n\n /**\n * @returns {EventTarget[]} The composed path of this event.\n */\n composedPath() {\n const currentTarget = pd(this).currentTarget;\n if (currentTarget == null) {\n return []\n }\n return [currentTarget]\n },\n\n /**\n * Constant of NONE.\n * @type {number}\n */\n get NONE() {\n return 0\n },\n\n /**\n * Constant of CAPTURING_PHASE.\n * @type {number}\n */\n get CAPTURING_PHASE() {\n return 1\n },\n\n /**\n * Constant of AT_TARGET.\n * @type {number}\n */\n get AT_TARGET() {\n return 2\n },\n\n /**\n * Constant of BUBBLING_PHASE.\n * @type {number}\n */\n get BUBBLING_PHASE() {\n return 3\n },\n\n /**\n * The target of this event.\n * @type {number}\n */\n get eventPhase() {\n return pd(this).eventPhase\n },\n\n /**\n * Stop event bubbling.\n * @returns {void}\n */\n stopPropagation() {\n const data = pd(this);\n\n data.stopped = true;\n if (typeof data.event.stopPropagation === "function") {\n data.event.stopPropagation();\n }\n },\n\n /**\n * Stop event bubbling.\n * @returns {void}\n */\n stopImmediatePropagation() {\n const data = pd(this);\n\n data.stopped = true;\n data.immediateStopped = true;\n if (typeof data.event.stopImmediatePropagation === "function") {\n data.event.stopImmediatePropagation();\n }\n },\n\n /**\n * The flag to be bubbling.\n * @type {boolean}\n */\n get bubbles() {\n return Boolean(pd(this).event.bubbles)\n },\n\n /**\n * The flag to be cancelable.\n * @type {boolean}\n */\n get cancelable() {\n return Boolean(pd(this).event.cancelable)\n },\n\n /**\n * Cancel this event.\n * @returns {void}\n */\n preventDefault() {\n setCancelFlag(pd(this));\n },\n\n /**\n * The flag to indicate cancellation state.\n * @type {boolean}\n */\n get defaultPrevented() {\n return pd(this).canceled\n },\n\n /**\n * The flag to be composed.\n * @type {boolean}\n */\n get composed() {\n return Boolean(pd(this).event.composed)\n },\n\n /**\n * The unix time of this event.\n * @type {number}\n */\n get timeStamp() {\n return pd(this).timeStamp\n },\n\n /**\n * The target of this event.\n * @type {EventTarget}\n * @deprecated\n */\n get srcElement() {\n return pd(this).eventTarget\n },\n\n /**\n * The flag to stop event bubbling.\n * @type {boolean}\n * @deprecated\n */\n get cancelBubble() {\n return pd(this).stopped\n },\n set cancelBubble(value) {\n if (!value) {\n return\n }\n const data = pd(this);\n\n data.stopped = true;\n if (typeof data.event.cancelBubble === "boolean") {\n data.event.cancelBubble = true;\n }\n },\n\n /**\n * The flag to indicate cancellation state.\n * @type {boolean}\n * @deprecated\n */\n get returnValue() {\n return !pd(this).canceled\n },\n set returnValue(value) {\n if (!value) {\n setCancelFlag(pd(this));\n }\n },\n\n /**\n * Initialize this event object. But do nothing under event dispatching.\n * @param {string} type The event type.\n * @param {boolean} [bubbles=false] The flag to be possible to bubble up.\n * @param {boolean} [cancelable=false] The flag to be possible to cancel.\n * @deprecated\n */\n initEvent() {\n // Do nothing.\n },\n};\n\n// `constructor` is not enumerable.\nObject.defineProperty(Event.prototype, "constructor", {\n value: Event,\n configurable: true,\n writable: true,\n});\n\n// Ensure `event instanceof window.Event` is `true`.\nif (typeof window !== "undefined" && typeof window.Event !== "undefined") {\n Object.setPrototypeOf(Event.prototype, window.Event.prototype);\n\n // Make association for wrappers.\n wrappers.set(window.Event.prototype, Event);\n}\n\n/**\n * Get the property descriptor to redirect a given property.\n * @param {string} key Property name to define property descriptor.\n * @returns {PropertyDescriptor} The property descriptor to redirect the property.\n * @private\n */\nfunction defineRedirectDescriptor(key) {\n return {\n get() {\n return pd(this).event[key]\n },\n set(value) {\n pd(this).event[key] = value;\n },\n configurable: true,\n enumerable: true,\n }\n}\n\n/**\n * Get the property descriptor to call a given method property.\n * @param {string} key Property name to define property descriptor.\n * @returns {PropertyDescriptor} The property descriptor to call the method property.\n * @private\n */\nfunction defineCallDescriptor(key) {\n return {\n value() {\n const event = pd(this).event;\n return event[key].apply(event, arguments)\n },\n configurable: true,\n enumerable: true,\n }\n}\n\n/**\n * Define new wrapper class.\n * @param {Function} BaseEvent The base wrapper class.\n * @param {Object} proto The prototype of the original event.\n * @returns {Function} The defined wrapper class.\n * @private\n */\nfunction defineWrapper(BaseEvent, proto) {\n const keys = Object.keys(proto);\n if (keys.length === 0) {\n return BaseEvent\n }\n\n /** CustomEvent */\n function CustomEvent(eventTarget, event) {\n BaseEvent.call(this, eventTarget, event);\n }\n\n CustomEvent.prototype = Object.create(BaseEvent.prototype, {\n constructor: { value: CustomEvent, configurable: true, writable: true },\n });\n\n // Define accessors.\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n if (!(key in BaseEvent.prototype)) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, key);\n const isFunc = typeof descriptor.value === "function";\n Object.defineProperty(\n CustomEvent.prototype,\n key,\n isFunc\n ? defineCallDescriptor(key)\n : defineRedirectDescriptor(key)\n );\n }\n }\n\n return CustomEvent\n}\n\n/**\n * Get the wrapper class of a given prototype.\n * @param {Object} proto The prototype of the original event to get its wrapper.\n * @returns {Function} The wrapper class.\n * @private\n */\nfunction getWrapper(proto) {\n if (proto == null || proto === Object.prototype) {\n return Event\n }\n\n let wrapper = wrappers.get(proto);\n if (wrapper == null) {\n wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto);\n wrappers.set(proto, wrapper);\n }\n return wrapper\n}\n\n/**\n * Wrap a given event to management a dispatching.\n * @param {EventTarget} eventTarget The event target of this dispatching.\n * @param {Object} event The event to wrap.\n * @returns {Event} The wrapper instance.\n * @private\n */\nfunction wrapEvent(eventTarget, event) {\n const Wrapper = getWrapper(Object.getPrototypeOf(event));\n return new Wrapper(eventTarget, event)\n}\n\n/**\n * Get the immediateStopped flag of a given event.\n * @param {Event} event The event to get.\n * @returns {boolean} The flag to stop propagation immediately.\n * @private\n */\nfunction isStopped(event) {\n return pd(event).immediateStopped\n}\n\n/**\n * Set the current event phase of a given event.\n * @param {Event} event The event to set current target.\n * @param {number} eventPhase New event phase.\n * @returns {void}\n * @private\n */\nfunction setEventPhase(event, eventPhase) {\n pd(event).eventPhase = eventPhase;\n}\n\n/**\n * Set the current target of a given event.\n * @param {Event} event The event to set current target.\n * @param {EventTarget|null} currentTarget New current target.\n * @returns {void}\n * @private\n */\nfunction setCurrentTarget(event, currentTarget) {\n pd(event).currentTarget = currentTarget;\n}\n\n/**\n * Set a passive listener of a given event.\n * @param {Event} event The event to set current target.\n * @param {Function|null} passiveListener New passive listener.\n * @returns {void}\n * @private\n */\nfunction setPassiveListener(event, passiveListener) {\n pd(event).passiveListener = passiveListener;\n}\n\n/**\n * @typedef {object} ListenerNode\n * @property {Function} listener\n * @property {1|2|3} listenerType\n * @property {boolean} passive\n * @property {boolean} once\n * @property {ListenerNode|null} next\n * @private\n */\n\n/**\n * @type {WeakMap>}\n * @private\n */\nconst listenersMap = new WeakMap();\n\n// Listener types\nconst CAPTURE = 1;\nconst BUBBLE = 2;\nconst ATTRIBUTE = 3;\n\n/**\n * Check whether a given value is an object or not.\n * @param {any} x The value to check.\n * @returns {boolean} `true` if the value is an object.\n */\nfunction isObject(x) {\n return x !== null && typeof x === "object" //eslint-disable-line no-restricted-syntax\n}\n\n/**\n * Get listeners.\n * @param {EventTarget} eventTarget The event target to get.\n * @returns {Map} The listeners.\n * @private\n */\nfunction getListeners(eventTarget) {\n const listeners = listenersMap.get(eventTarget);\n if (listeners == null) {\n throw new TypeError(\n "\'this\' is expected an EventTarget object, but got another value."\n )\n }\n return listeners\n}\n\n/**\n * Get the property descriptor for the event attribute of a given event.\n * @param {string} eventName The event name to get property descriptor.\n * @returns {PropertyDescriptor} The property descriptor.\n * @private\n */\nfunction defineEventAttributeDescriptor(eventName) {\n return {\n get() {\n const listeners = getListeners(this);\n let node = listeners.get(eventName);\n while (node != null) {\n if (node.listenerType === ATTRIBUTE) {\n return node.listener\n }\n node = node.next;\n }\n return null\n },\n\n set(listener) {\n if (typeof listener !== "function" && !isObject(listener)) {\n listener = null; // eslint-disable-line no-param-reassign\n }\n const listeners = getListeners(this);\n\n // Traverse to the tail while removing old value.\n let prev = null;\n let node = listeners.get(eventName);\n while (node != null) {\n if (node.listenerType === ATTRIBUTE) {\n // Remove old value.\n if (prev !== null) {\n prev.next = node.next;\n } else if (node.next !== null) {\n listeners.set(eventName, node.next);\n } else {\n listeners.delete(eventName);\n }\n } else {\n prev = node;\n }\n\n node = node.next;\n }\n\n // Add new value.\n if (listener !== null) {\n const newNode = {\n listener,\n listenerType: ATTRIBUTE,\n passive: false,\n once: false,\n next: null,\n };\n if (prev === null) {\n listeners.set(eventName, newNode);\n } else {\n prev.next = newNode;\n }\n }\n },\n configurable: true,\n enumerable: true,\n }\n}\n\n/**\n * Define an event attribute (e.g. `eventTarget.onclick`).\n * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite.\n * @param {string} eventName The event name to define.\n * @returns {void}\n */\nfunction defineEventAttribute(eventTargetPrototype, eventName) {\n Object.defineProperty(\n eventTargetPrototype,\n `on${eventName}`,\n defineEventAttributeDescriptor(eventName)\n );\n}\n\n/**\n * Define a custom EventTarget with event attributes.\n * @param {string[]} eventNames Event names for event attributes.\n * @returns {EventTarget} The custom EventTarget.\n * @private\n */\nfunction defineCustomEventTarget(eventNames) {\n /** CustomEventTarget */\n function CustomEventTarget() {\n EventTarget.call(this);\n }\n\n CustomEventTarget.prototype = Object.create(EventTarget.prototype, {\n constructor: {\n value: CustomEventTarget,\n configurable: true,\n writable: true,\n },\n });\n\n for (let i = 0; i < eventNames.length; ++i) {\n defineEventAttribute(CustomEventTarget.prototype, eventNames[i]);\n }\n\n return CustomEventTarget\n}\n\n/**\n * EventTarget.\n *\n * - This is constructor if no arguments.\n * - This is a function which returns a CustomEventTarget constructor if there are arguments.\n *\n * For example:\n *\n * class A extends EventTarget {}\n * class B extends EventTarget("message") {}\n * class C extends EventTarget("message", "error") {}\n * class D extends EventTarget(["message", "error"]) {}\n */\nfunction EventTarget() {\n /*eslint-disable consistent-return */\n if (this instanceof EventTarget) {\n listenersMap.set(this, new Map());\n return\n }\n if (arguments.length === 1 && Array.isArray(arguments[0])) {\n return defineCustomEventTarget(arguments[0])\n }\n if (arguments.length > 0) {\n const types = new Array(arguments.length);\n for (let i = 0; i < arguments.length; ++i) {\n types[i] = arguments[i];\n }\n return defineCustomEventTarget(types)\n }\n throw new TypeError("Cannot call a class as a function")\n /*eslint-enable consistent-return */\n}\n\n// Should be enumerable, but class methods are not enumerable.\nEventTarget.prototype = {\n /**\n * Add a given listener to this event target.\n * @param {string} eventName The event name to add.\n * @param {Function} listener The listener to add.\n * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.\n * @returns {void}\n */\n addEventListener(eventName, listener, options) {\n if (listener == null) {\n return\n }\n if (typeof listener !== "function" && !isObject(listener)) {\n throw new TypeError("\'listener\' should be a function or an object.")\n }\n\n const listeners = getListeners(this);\n const optionsIsObj = isObject(options);\n const capture = optionsIsObj\n ? Boolean(options.capture)\n : Boolean(options);\n const listenerType = capture ? CAPTURE : BUBBLE;\n const newNode = {\n listener,\n listenerType,\n passive: optionsIsObj && Boolean(options.passive),\n once: optionsIsObj && Boolean(options.once),\n next: null,\n };\n\n // Set it as the first node if the first node is null.\n let node = listeners.get(eventName);\n if (node === undefined) {\n listeners.set(eventName, newNode);\n return\n }\n\n // Traverse to the tail while checking duplication..\n let prev = null;\n while (node != null) {\n if (\n node.listener === listener &&\n node.listenerType === listenerType\n ) {\n // Should ignore duplication.\n return\n }\n prev = node;\n node = node.next;\n }\n\n // Add it.\n prev.next = newNode;\n },\n\n /**\n * Remove a given listener from this event target.\n * @param {string} eventName The event name to remove.\n * @param {Function} listener The listener to remove.\n * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.\n * @returns {void}\n */\n removeEventListener(eventName, listener, options) {\n if (listener == null) {\n return\n }\n\n const listeners = getListeners(this);\n const capture = isObject(options)\n ? Boolean(options.capture)\n : Boolean(options);\n const listenerType = capture ? CAPTURE : BUBBLE;\n\n let prev = null;\n let node = listeners.get(eventName);\n while (node != null) {\n if (\n node.listener === listener &&\n node.listenerType === listenerType\n ) {\n if (prev !== null) {\n prev.next = node.next;\n } else if (node.next !== null) {\n listeners.set(eventName, node.next);\n } else {\n listeners.delete(eventName);\n }\n return\n }\n\n prev = node;\n node = node.next;\n }\n },\n\n /**\n * Dispatch a given event.\n * @param {Event|{type:string}} event The event to dispatch.\n * @returns {boolean} `false` if canceled.\n */\n dispatchEvent(event) {\n if (event == null || typeof event.type !== "string") {\n throw new TypeError(\'"event.type" should be a string.\')\n }\n\n // If listeners aren\'t registered, terminate.\n const listeners = getListeners(this);\n const eventName = event.type;\n let node = listeners.get(eventName);\n if (node == null) {\n return true\n }\n\n // Since we cannot rewrite several properties, so wrap object.\n const wrappedEvent = wrapEvent(this, event);\n\n // This doesn\'t process capturing phase and bubbling phase.\n // This isn\'t participating in a tree.\n let prev = null;\n while (node != null) {\n // Remove this listener if it\'s once\n if (node.once) {\n if (prev !== null) {\n prev.next = node.next;\n } else if (node.next !== null) {\n listeners.set(eventName, node.next);\n } else {\n listeners.delete(eventName);\n }\n } else {\n prev = node;\n }\n\n // Call this listener\n setPassiveListener(\n wrappedEvent,\n node.passive ? node.listener : null\n );\n if (typeof node.listener === "function") {\n try {\n node.listener.call(this, wrappedEvent);\n } catch (err) {\n if (\n typeof console !== "undefined" &&\n typeof console.error === "function"\n ) {\n console.error(err);\n }\n }\n } else if (\n node.listenerType !== ATTRIBUTE &&\n typeof node.listener.handleEvent === "function"\n ) {\n node.listener.handleEvent(wrappedEvent);\n }\n\n // Break if `event.stopImmediatePropagation` was called.\n if (isStopped(wrappedEvent)) {\n break\n }\n\n node = node.next;\n }\n setPassiveListener(wrappedEvent, null);\n setEventPhase(wrappedEvent, 0);\n setCurrentTarget(wrappedEvent, null);\n\n return !wrappedEvent.defaultPrevented\n },\n};\n\n// `constructor` is not enumerable.\nObject.defineProperty(EventTarget.prototype, "constructor", {\n value: EventTarget,\n configurable: true,\n writable: true,\n});\n\n// Ensure `eventTarget instanceof window.EventTarget` is `true`.\nif (\n typeof window !== "undefined" &&\n typeof window.EventTarget !== "undefined"\n) {\n Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype);\n}\n\nexports.defineEventAttribute = defineEventAttribute;\nexports.EventTarget = EventTarget;\nexports["default"] = EventTarget;\n\nmodule.exports = EventTarget\nmodule.exports.EventTarget = module.exports["default"] = EventTarget\nmodule.exports.defineEventAttribute = defineEventAttribute\n//# sourceMappingURL=event-target-shim.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5ODguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNhOztBQUViLDhDQUE2QyxFQUFFLGFBQWEsRUFBQzs7QUFFN0Q7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYyxhQUFhO0FBQzNCLGVBQWUsY0FBYztBQUM3QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxrQkFBa0I7QUFDaEMsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsU0FBUztBQUN2QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxlQUFlO0FBQzdCLGNBQWMsUUFBUTtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU8sY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsK0NBQStDLGdDQUFnQzs7QUFFL0U7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLGlCQUFpQixlQUFlO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FB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d2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvZXZlbnQtdGFyZ2V0LXNoaW0vZGlzdC9ldmVudC10YXJnZXQtc2hpbS5qcz9hOWNhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcml2YXRlRGF0YVxuICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgVGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBldmVudFBoYXNlIFRoZSBjdXJyZW50IGV2ZW50IHBoYXNlLlxuICogQHByb3BlcnR5IHtFdmVudFRhcmdldHxudWxsfSBjdXJyZW50VGFyZ2V0IFRoZSBjdXJyZW50IGV2ZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2FuY2VsZWQgVGhlIGZsYWcgdG8gcHJldmVudCBkZWZhdWx0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBzdG9wcGVkIFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGltbWVkaWF0ZVN0b3BwZWQgVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbiBpbW1lZGlhdGVseS5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb258bnVsbH0gcGFzc2l2ZUxpc3RlbmVyIFRoZSBsaXN0ZW5lciBpZiB0aGUgY3VycmVudCBsaXN0ZW5lciBpcyBwYXNzaXZlLiBPdGhlcndpc2UgdGhpcyBpcyBudWxsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVTdGFtcCBUaGUgdW5peCB0aW1lLlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIFByaXZhdGUgZGF0YSBmb3IgZXZlbnQgd3JhcHBlcnMuXG4gKiBAdHlwZSB7V2Vha01hcDxFdmVudCwgUHJpdmF0ZURhdGE+fVxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgcHJpdmF0ZURhdGEgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIENhY2hlIGZvciB3cmFwcGVyIGNsYXNzZXMuXG4gKiBAdHlwZSB7V2Vha01hcDxPYmplY3QsIEZ1bmN0aW9uPn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHdyYXBwZXJzID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBHZXQgcHJpdmF0ZSBkYXRhLlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IG9iamVjdCB0byBnZXQgcHJpdmF0ZSBkYXRhLlxuICogQHJldHVybnMge1ByaXZhdGVEYXRhfSBUaGUgcHJpdmF0ZSBkYXRhIG9mIHRoZSBldmVudC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHBkKGV2ZW50KSB7XG4gICAgY29uc3QgcmV0diA9IHByaXZhdGVEYXRhLmdldChldmVudCk7XG4gICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgIHJldHYgIT0gbnVsbCxcbiAgICAgICAgXCIndGhpcycgaXMgZXhwZWN0ZWQgYW4gRXZlbnQgb2JqZWN0LCBidXQgZ290XCIsXG4gICAgICAgIGV2ZW50XG4gICAgKTtcbiAgICByZXR1cm4gcmV0dlxufVxuXG4vKipcbiAqIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jc2V0LXRoZS1jYW5jZWxlZC1mbGFnXG4gKiBAcGFyYW0gZGF0YSB7UHJpdmF0ZURhdGF9IHByaXZhdGUgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FuY2VsRmxhZyhkYXRhKSB7XG4gICAgaWYgKGRhdGEucGFzc2l2ZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIFwiVW5hYmxlIHRvIHByZXZlbnREZWZhdWx0IGluc2lkZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVyIGludm9jYXRpb24uXCIsXG4gICAgICAgICAgICAgICAgZGF0YS5wYXNzaXZlTGlzdGVuZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghZGF0YS5ldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGRhdGEuY2FuY2VsZWQgPSB0cnVlO1xuICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudC5wcmV2ZW50RGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGRhdGEuZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2ludGVyZmFjZS1ldmVudFxuICogQHByaXZhdGVcbiAqL1xuLyoqXG4gKiBUaGUgZXZlbnQgd3JhcHBlci5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgVGhlIGV2ZW50IHRhcmdldCBvZiB0aGlzIGRpc3BhdGNoaW5nLlxuICogQHBhcmFtIHtFdmVudHx7dHlwZTpzdHJpbmd9fSBldmVudCBUaGUgb3JpZ2luYWwgZXZlbnQgdG8gd3JhcC5cbiAqL1xuZnVuY3Rpb24gRXZlbnQoZXZlbnRUYXJnZXQsIGV2ZW50KSB7XG4gICAgcHJpdmF0ZURhdGEuc2V0KHRoaXMsIHtcbiAgICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBldmVudFBoYXNlOiAyLFxuICAgICAgICBjdXJyZW50VGFyZ2V0OiBldmVudFRhcmdldCxcbiAgICAgICAgY2FuY2VsZWQ6IGZhbHNlLFxuICAgICAgICBzdG9wcGVkOiBmYWxzZSxcbiAgICAgICAgaW1tZWRpYXRlU3RvcHBlZDogZmFsc2UsXG4gICAgICAgIHBhc3NpdmVMaXN0ZW5lcjogbnVsbCxcbiAgICAgICAgdGltZVN0YW1wOiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKSxcbiAgICB9KTtcblxuICAgIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI1VuZm9yZ2VhYmxlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiaXNUcnVzdGVkXCIsIHsgdmFsdWU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4gICAgLy8gRGVmaW5lIGFjY2Vzc29yc1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhldmVudCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghKGtleSBpbiB0aGlzKSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwgZGVmaW5lUmVkaXJlY3REZXNjcmlwdG9yKGtleSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBTaG91bGQgYmUgZW51bWVyYWJsZSwgYnV0IGNsYXNzIG1ldGhvZHMgYXJlIG5vdCBlbnVtZXJhYmxlLlxuRXZlbnQucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50LnR5cGVcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKi9cbiAgICBnZXQgdGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudFRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmN1cnJlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge0V2ZW50VGFyZ2V0W119IFRoZSBjb21wb3NlZCBwYXRoIG9mIHRoaXMgZXZlbnQuXG4gICAgICovXG4gICAgY29tcG9zZWRQYXRoKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gcGQodGhpcykuY3VycmVudFRhcmdldDtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjdXJyZW50VGFyZ2V0XVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBOT05FLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IE5PTkUoKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IG9mIENBUFRVUklOR19QSEFTRS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBDQVBUVVJJTkdfUEhBU0UoKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IG9mIEFUX1RBUkdFVC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBBVF9UQVJHRVQoKSB7XG4gICAgICAgIHJldHVybiAyXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IG9mIEJVQkJMSU5HX1BIQVNFLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IEJVQkJMSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gM1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgZXZlbnRQaGFzZSgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50UGhhc2VcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuc3RvcFByb3BhZ2F0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRhdGEuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBkYXRhLmltbWVkaWF0ZVN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRhdGEuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gYmUgYnViYmxpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGJ1YmJsZXMoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBkKHRoaXMpLmV2ZW50LmJ1YmJsZXMpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGNhbmNlbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGNhbmNlbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBkKHRoaXMpLmV2ZW50LmNhbmNlbGFibGUpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbmNlbCB0aGlzIGV2ZW50LlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICBzZXRDYW5jZWxGbGFnKHBkKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gaW5kaWNhdGUgY2FuY2VsbGF0aW9uIHN0YXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0UHJldmVudGVkKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuY2FuY2VsZWRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gYmUgY29tcG9zZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGNvbXBvc2VkKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5jb21wb3NlZClcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHVuaXggdGltZSBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IHRpbWVTdGFtcCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLnRpbWVTdGFtcFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IHNyY0VsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFRhcmdldFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBzdG9wIGV2ZW50IGJ1YmJsaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IGNhbmNlbEJ1YmJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLnN0b3BwZWRcbiAgICB9LFxuICAgIHNldCBjYW5jZWxCdWJibGUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IHBkKHRoaXMpO1xuXG4gICAgICAgIGRhdGEuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudC5jYW5jZWxCdWJibGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gaW5kaWNhdGUgY2FuY2VsbGF0aW9uIHN0YXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IHJldHVyblZhbHVlKCkge1xuICAgICAgICByZXR1cm4gIXBkKHRoaXMpLmNhbmNlbGVkXG4gICAgfSxcbiAgICBzZXQgcmV0dXJuVmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgc2V0Q2FuY2VsRmxhZyhwZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGV2ZW50IG9iamVjdC4gQnV0IGRvIG5vdGhpbmcgdW5kZXIgZXZlbnQgZGlzcGF0Y2hpbmcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYnViYmxlcz1mYWxzZV0gVGhlIGZsYWcgdG8gYmUgcG9zc2libGUgdG8gYnViYmxlIHVwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhbmNlbGFibGU9ZmFsc2VdIFRoZSBmbGFnIHRvIGJlIHBvc3NpYmxlIHRvIGNhbmNlbC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluaXRFdmVudCgpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9LFxufTtcblxuLy8gYGNvbnN0cnVjdG9yYCBpcyBub3QgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBFdmVudCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG59KTtcblxuLy8gRW5zdXJlIGBldmVudCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudGAgaXMgYHRydWVgLlxuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHdpbmRvdy5FdmVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihFdmVudC5wcm90b3R5cGUsIHdpbmRvdy5FdmVudC5wcm90b3R5cGUpO1xuXG4gICAgLy8gTWFrZSBhc3NvY2lhdGlvbiBmb3Igd3JhcHBlcnMuXG4gICAgd3JhcHBlcnMuc2V0KHdpbmRvdy5FdmVudC5wcm90b3R5cGUsIEV2ZW50KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gcmVkaXJlY3QgYSBnaXZlbiBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgUHJvcGVydHkgbmFtZSB0byBkZWZpbmUgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0IHRoZSBwcm9wZXJ0eS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRba2V5XVxuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgIHBkKHRoaXMpLmV2ZW50W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gY2FsbCBhIGdpdmVuIG1ldGhvZCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgUHJvcGVydHkgbmFtZSB0byBkZWZpbmUgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGNhbGwgdGhlIG1ldGhvZCBwcm9wZXJ0eS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUNhbGxEZXNjcmlwdG9yKGtleSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlKCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBwZCh0aGlzKS5ldmVudDtcbiAgICAgICAgICAgIHJldHVybiBldmVudFtrZXldLmFwcGx5KGV2ZW50LCBhcmd1bWVudHMpXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogRGVmaW5lIG5ldyB3cmFwcGVyIGNsYXNzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gQmFzZUV2ZW50IFRoZSBiYXNlIHdyYXBwZXIgY2xhc3MuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIHByb3RvdHlwZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSBkZWZpbmVkIHdyYXBwZXIgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVXcmFwcGVyKEJhc2VFdmVudCwgcHJvdG8pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvdG8pO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQmFzZUV2ZW50XG4gICAgfVxuXG4gICAgLyoqIEN1c3RvbUV2ZW50ICovXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnRUYXJnZXQsIGV2ZW50KSB7XG4gICAgICAgIEJhc2VFdmVudC5jYWxsKHRoaXMsIGV2ZW50VGFyZ2V0LCBldmVudCk7XG4gICAgfVxuXG4gICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBDdXN0b21FdmVudCwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9LFxuICAgIH0pO1xuXG4gICAgLy8gRGVmaW5lIGFjY2Vzc29ycy5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKCEoa2V5IGluIEJhc2VFdmVudC5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGlzRnVuYyA9IHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBpc0Z1bmNcbiAgICAgICAgICAgICAgICAgICAgPyBkZWZpbmVDYWxsRGVzY3JpcHRvcihrZXkpXG4gICAgICAgICAgICAgICAgICAgIDogZGVmaW5lUmVkaXJlY3REZXNjcmlwdG9yKGtleSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tRXZlbnRcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHdyYXBwZXIgY2xhc3Mgb2YgYSBnaXZlbiBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIHByb3RvdHlwZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZ2V0IGl0cyB3cmFwcGVyLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgd3JhcHBlciBjbGFzcy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBwZXIocHJvdG8pIHtcbiAgICBpZiAocHJvdG8gPT0gbnVsbCB8fCBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICByZXR1cm4gRXZlbnRcbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlciA9IHdyYXBwZXJzLmdldChwcm90byk7XG4gICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkge1xuICAgICAgICB3cmFwcGVyID0gZGVmaW5lV3JhcHBlcihnZXRXcmFwcGVyKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpLCBwcm90byk7XG4gICAgICAgIHdyYXBwZXJzLnNldChwcm90bywgd3JhcHBlcik7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVyXG59XG5cbi8qKlxuICogV3JhcCBhIGdpdmVuIGV2ZW50IHRvIG1hbmFnZW1lbnQgYSBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2YgdGhpcyBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBUaGUgZXZlbnQgdG8gd3JhcC5cbiAqIEByZXR1cm5zIHtFdmVudH0gVGhlIHdyYXBwZXIgaW5zdGFuY2UuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB3cmFwRXZlbnQoZXZlbnRUYXJnZXQsIGV2ZW50KSB7XG4gICAgY29uc3QgV3JhcHBlciA9IGdldFdyYXBwZXIoT2JqZWN0LmdldFByb3RvdHlwZU9mKGV2ZW50KSk7XG4gICAgcmV0dXJuIG5ldyBXcmFwcGVyKGV2ZW50VGFyZ2V0LCBldmVudClcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGltbWVkaWF0ZVN0b3BwZWQgZmxhZyBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIGdldC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uIGltbWVkaWF0ZWx5LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNTdG9wcGVkKGV2ZW50KSB7XG4gICAgcmV0dXJuIHBkKGV2ZW50KS5pbW1lZGlhdGVTdG9wcGVkXG59XG5cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IGV2ZW50IHBoYXNlIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50UGhhc2UgTmV3IGV2ZW50IHBoYXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRFdmVudFBoYXNlKGV2ZW50LCBldmVudFBoYXNlKSB7XG4gICAgcGQoZXZlbnQpLmV2ZW50UGhhc2UgPSBldmVudFBoYXNlO1xufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCB0YXJnZXQgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBzZXQgY3VycmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fG51bGx9IGN1cnJlbnRUYXJnZXQgTmV3IGN1cnJlbnQgdGFyZ2V0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRDdXJyZW50VGFyZ2V0KGV2ZW50LCBjdXJyZW50VGFyZ2V0KSB7XG4gICAgcGQoZXZlbnQpLmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xufVxuXG4vKipcbiAqIFNldCBhIHBhc3NpdmUgbGlzdGVuZXIgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBzZXQgY3VycmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHBhc3NpdmVMaXN0ZW5lciBOZXcgcGFzc2l2ZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0UGFzc2l2ZUxpc3RlbmVyKGV2ZW50LCBwYXNzaXZlTGlzdGVuZXIpIHtcbiAgICBwZChldmVudCkucGFzc2l2ZUxpc3RlbmVyID0gcGFzc2l2ZUxpc3RlbmVyO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExpc3RlbmVyTm9kZVxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqIEBwcm9wZXJ0eSB7MXwyfDN9IGxpc3RlbmVyVHlwZVxuICogQHByb3BlcnR5IHtib29sZWFufSBwYXNzaXZlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9uY2VcbiAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJOb2RlfG51bGx9IG5leHRcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIExpc3RlbmVyTm9kZT4+fVxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgbGlzdGVuZXJzTWFwID0gbmV3IFdlYWtNYXAoKTtcblxuLy8gTGlzdGVuZXIgdHlwZXNcbmNvbnN0IENBUFRVUkUgPSAxO1xuY29uc3QgQlVCQkxFID0gMjtcbmNvbnN0IEFUVFJJQlVURSA9IDM7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGdpdmVuIHZhbHVlIGlzIGFuIG9iamVjdCBvciBub3QuXG4gKiBAcGFyYW0ge2FueX0geCBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbn1cblxuLyoqXG4gKiBHZXQgbGlzdGVuZXJzLlxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgVGhlIGV2ZW50IHRhcmdldCB0byBnZXQuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgTGlzdGVuZXJOb2RlPn0gVGhlIGxpc3RlbmVycy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldExpc3RlbmVycyhldmVudFRhcmdldCkge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IGxpc3RlbmVyc01hcC5nZXQoZXZlbnRUYXJnZXQpO1xuICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgXCIndGhpcycgaXMgZXhwZWN0ZWQgYW4gRXZlbnRUYXJnZXQgb2JqZWN0LCBidXQgZ290IGFub3RoZXIgdmFsdWUuXCJcbiAgICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gbGlzdGVuZXJzXG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgZXZlbnQgYXR0cmlidXRlIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGdldCBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1Byb3BlcnR5RGVzY3JpcHRvcn0gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVFdmVudEF0dHJpYnV0ZURlc2NyaXB0b3IoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXJUeXBlID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUubGlzdGVuZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIgJiYgIWlzT2JqZWN0KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSB0byB0aGUgdGFpbCB3aGlsZSByZW1vdmluZyBvbGQgdmFsdWUuXG4gICAgICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5saXN0ZW5lclR5cGUgPT09IEFUVFJJQlVURSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgb2xkIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5vZGUubmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgbmV3IHZhbHVlLlxuICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyVHlwZTogQVRUUklCVVRFLFxuICAgICAgICAgICAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb25jZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbmV3Tm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogRGVmaW5lIGFuIGV2ZW50IGF0dHJpYnV0ZSAoZS5nLiBgZXZlbnRUYXJnZXQub25jbGlja2ApLlxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50VGFyZ2V0UHJvdG90eXBlIFRoZSBldmVudCB0YXJnZXQgcHJvdG90eXBlIHRvIGRlZmluZSBhbiBldmVudCBhdHRyYml0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gZGVmaW5lLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGRlZmluZUV2ZW50QXR0cmlidXRlKGV2ZW50VGFyZ2V0UHJvdG90eXBlLCBldmVudE5hbWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIGV2ZW50VGFyZ2V0UHJvdG90eXBlLFxuICAgICAgICBgb24ke2V2ZW50TmFtZX1gLFxuICAgICAgICBkZWZpbmVFdmVudEF0dHJpYnV0ZURlc2NyaXB0b3IoZXZlbnROYW1lKVxuICAgICk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgY3VzdG9tIEV2ZW50VGFyZ2V0IHdpdGggZXZlbnQgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGV2ZW50TmFtZXMgRXZlbnQgbmFtZXMgZm9yIGV2ZW50IGF0dHJpYnV0ZXMuXG4gKiBAcmV0dXJucyB7RXZlbnRUYXJnZXR9IFRoZSBjdXN0b20gRXZlbnRUYXJnZXQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVDdXN0b21FdmVudFRhcmdldChldmVudE5hbWVzKSB7XG4gICAgLyoqIEN1c3RvbUV2ZW50VGFyZ2V0ICovXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnRUYXJnZXQoKSB7XG4gICAgICAgIEV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgQ3VzdG9tRXZlbnRUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVudFRhcmdldC5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgIHZhbHVlOiBDdXN0b21FdmVudFRhcmdldCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGRlZmluZUV2ZW50QXR0cmlidXRlKEN1c3RvbUV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgZXZlbnROYW1lc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50VGFyZ2V0XG59XG5cbi8qKlxuICogRXZlbnRUYXJnZXQuXG4gKlxuICogLSBUaGlzIGlzIGNvbnN0cnVjdG9yIGlmIG5vIGFyZ3VtZW50cy5cbiAqIC0gVGhpcyBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBDdXN0b21FdmVudFRhcmdldCBjb25zdHJ1Y3RvciBpZiB0aGVyZSBhcmUgYXJndW1lbnRzLlxuICpcbiAqIEZvciBleGFtcGxlOlxuICpcbiAqICAgICBjbGFzcyBBIGV4dGVuZHMgRXZlbnRUYXJnZXQge31cbiAqICAgICBjbGFzcyBCIGV4dGVuZHMgRXZlbnRUYXJnZXQoXCJtZXNzYWdlXCIpIHt9XG4gKiAgICAgY2xhc3MgQyBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiLCBcImVycm9yXCIpIHt9XG4gKiAgICAgY2xhc3MgRCBleHRlbmRzIEV2ZW50VGFyZ2V0KFtcIm1lc3NhZ2VcIiwgXCJlcnJvclwiXSkge31cbiAqL1xuZnVuY3Rpb24gRXZlbnRUYXJnZXQoKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXJldHVybiAqL1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpIHtcbiAgICAgICAgbGlzdGVuZXJzTWFwLnNldCh0aGlzLCBuZXcgTWFwKCkpO1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVDdXN0b21FdmVudFRhcmdldChhcmd1bWVudHNbMF0pXG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0eXBlcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHR5cGVzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVDdXN0b21FdmVudFRhcmdldCh0eXBlcylcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKVxuICAgIC8qZXNsaW50LWVuYWJsZSBjb25zaXN0ZW50LXJldHVybiAqL1xufVxuXG4vLyBTaG91bGQgYmUgZW51bWVyYWJsZSwgYnV0IGNsYXNzIG1ldGhvZHMgYXJlIG5vdCBlbnVtZXJhYmxlLlxuRXZlbnRUYXJnZXQucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEFkZCBhIGdpdmVuIGxpc3RlbmVyIHRvIHRoaXMgZXZlbnQgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQuXG4gICAgICogQHBhcmFtIHtib29sZWFufHtjYXB0dXJlPzpib29sZWFuLHBhc3NpdmU/OmJvb2xlYW4sb25jZT86Ym9vbGVhbn19IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIiAmJiAhaXNPYmplY3QobGlzdGVuZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiJ2xpc3RlbmVyJyBzaG91bGQgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QuXCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNJc09iaiA9IGlzT2JqZWN0KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBjYXB0dXJlID0gb3B0aW9uc0lzT2JqXG4gICAgICAgICAgICA/IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKVxuICAgICAgICAgICAgOiBCb29sZWFuKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBsaXN0ZW5lclR5cGUgPSBjYXB0dXJlID8gQ0FQVFVSRSA6IEJVQkJMRTtcbiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHtcbiAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgbGlzdGVuZXJUeXBlLFxuICAgICAgICAgICAgcGFzc2l2ZTogb3B0aW9uc0lzT2JqICYmIEJvb2xlYW4ob3B0aW9ucy5wYXNzaXZlKSxcbiAgICAgICAgICAgIG9uY2U6IG9wdGlvbnNJc09iaiAmJiBCb29sZWFuKG9wdGlvbnMub25jZSksXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldCBpdCBhcyB0aGUgZmlyc3Qgbm9kZSBpZiB0aGUgZmlyc3Qgbm9kZSBpcyBudWxsLlxuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ld05vZGUpO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmF2ZXJzZSB0byB0aGUgdGFpbCB3aGlsZSBjaGVja2luZyBkdXBsaWNhdGlvbi4uXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgPT09IGxpc3RlbmVyVHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdWxkIGlnbm9yZSBkdXBsaWNhdGlvbi5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBpdC5cbiAgICAgICAgcHJldi5uZXh0ID0gbmV3Tm9kZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGlzIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnx7Y2FwdHVyZT86Ym9vbGVhbixwYXNzaXZlPzpib29sZWFuLG9uY2U/OmJvb2xlYW59fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IGlzT2JqZWN0KG9wdGlvbnMpXG4gICAgICAgICAgICA/IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKVxuICAgICAgICAgICAgOiBCb29sZWFuKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBsaXN0ZW5lclR5cGUgPSBjYXB0dXJlID8gQ0FQVFVSRSA6IEJVQkJMRTtcblxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lciA9PT0gbGlzdGVuZXIgJiZcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyVHlwZSA9PT0gbGlzdGVuZXJUeXBlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAocHJldiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5vZGUubmV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgZ2l2ZW4gZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudHx7dHlwZTpzdHJpbmd9fSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2guXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGBmYWxzZWAgaWYgY2FuY2VsZWQuXG4gICAgICovXG4gICAgZGlzcGF0Y2hFdmVudChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCB8fCB0eXBlb2YgZXZlbnQudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJldmVudC50eXBlXCIgc2hvdWxkIGJlIGEgc3RyaW5nLicpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBsaXN0ZW5lcnMgYXJlbid0IHJlZ2lzdGVyZWQsIHRlcm1pbmF0ZS5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBldmVudE5hbWUgPSBldmVudC50eXBlO1xuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpbmNlIHdlIGNhbm5vdCByZXdyaXRlIHNldmVyYWwgcHJvcGVydGllcywgc28gd3JhcCBvYmplY3QuXG4gICAgICAgIGNvbnN0IHdyYXBwZWRFdmVudCA9IHdyYXBFdmVudCh0aGlzLCBldmVudCk7XG5cbiAgICAgICAgLy8gVGhpcyBkb2Vzbid0IHByb2Nlc3MgY2FwdHVyaW5nIHBoYXNlIGFuZCBidWJibGluZyBwaGFzZS5cbiAgICAgICAgLy8gVGhpcyBpc24ndCBwYXJ0aWNpcGF0aW5nIGluIGEgdHJlZS5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBsaXN0ZW5lciBpZiBpdCdzIG9uY2VcbiAgICAgICAgICAgIGlmIChub2RlLm9uY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJldiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5vZGUubmV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENhbGwgdGhpcyBsaXN0ZW5lclxuICAgICAgICAgICAgc2V0UGFzc2l2ZUxpc3RlbmVyKFxuICAgICAgICAgICAgICAgIHdyYXBwZWRFdmVudCxcbiAgICAgICAgICAgICAgICBub2RlLnBhc3NpdmUgPyBub2RlLmxpc3RlbmVyIDogbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZS5saXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lci5jYWxsKHRoaXMsIHdyYXBwZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyVHlwZSAhPT0gQVRUUklCVVRFICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG5vZGUubGlzdGVuZXIuaGFuZGxlRXZlbnQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lci5oYW5kbGVFdmVudCh3cmFwcGVkRXZlbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCcmVhayBpZiBgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uYCB3YXMgY2FsbGVkLlxuICAgICAgICAgICAgaWYgKGlzU3RvcHBlZCh3cmFwcGVkRXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBzZXRQYXNzaXZlTGlzdGVuZXIod3JhcHBlZEV2ZW50LCBudWxsKTtcbiAgICAgICAgc2V0RXZlbnRQaGFzZSh3cmFwcGVkRXZlbnQsIDApO1xuICAgICAgICBzZXRDdXJyZW50VGFyZ2V0KHdyYXBwZWRFdmVudCwgbnVsbCk7XG5cbiAgICAgICAgcmV0dXJuICF3cmFwcGVkRXZlbnQuZGVmYXVsdFByZXZlbnRlZFxuICAgIH0sXG59O1xuXG4vLyBgY29uc3RydWN0b3JgIGlzIG5vdCBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEV2ZW50VGFyZ2V0LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbn0pO1xuXG4vLyBFbnN1cmUgYGV2ZW50VGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkV2ZW50VGFyZ2V0YCBpcyBgdHJ1ZWAuXG5pZiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiB3aW5kb3cuRXZlbnRUYXJnZXQgIT09IFwidW5kZWZpbmVkXCJcbikge1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihFdmVudFRhcmdldC5wcm90b3R5cGUsIHdpbmRvdy5FdmVudFRhcmdldC5wcm90b3R5cGUpO1xufVxuXG5leHBvcnRzLmRlZmluZUV2ZW50QXR0cmlidXRlID0gZGVmaW5lRXZlbnRBdHRyaWJ1dGU7XG5leHBvcnRzLkV2ZW50VGFyZ2V0ID0gRXZlbnRUYXJnZXQ7XG5leHBvcnRzLmRlZmF1bHQgPSBFdmVudFRhcmdldDtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFRhcmdldFxubW9kdWxlLmV4cG9ydHMuRXZlbnRUYXJnZXQgPSBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFdmVudFRhcmdldFxubW9kdWxlLmV4cG9ydHMuZGVmaW5lRXZlbnRBdHRyaWJ1dGUgPSBkZWZpbmVFdmVudEF0dHJpYnV0ZVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnQtdGFyZ2V0LXNoaW0uanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14988\n')},8190:module=>{eval("module.exports = class FixedFIFO {\n constructor (hwm) {\n if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) throw new Error('Max size for a FixedFIFO should be a power of two')\n this.buffer = new Array(hwm)\n this.mask = hwm - 1\n this.top = 0\n this.btm = 0\n this.next = null\n }\n\n clear () {\n this.top = this.btm = 0\n this.next = null\n this.buffer.fill(undefined)\n }\n\n push (data) {\n if (this.buffer[this.top] !== undefined) return false\n this.buffer[this.top] = data\n this.top = (this.top + 1) & this.mask\n return true\n }\n\n shift () {\n const last = this.buffer[this.btm]\n if (last === undefined) return undefined\n this.buffer[this.btm] = undefined\n this.btm = (this.btm + 1) & this.mask\n return last\n }\n\n peek () {\n return this.buffer[this.btm]\n }\n\n isEmpty () {\n return this.buffer[this.btm] === undefined\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODE5MC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9mYXN0LWZpZm8vZml4ZWQtc2l6ZS5qcz84NGQxIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRml4ZWRGSUZPIHtcbiAgY29uc3RydWN0b3IgKGh3bSkge1xuICAgIGlmICghKGh3bSA+IDApIHx8ICgoaHdtIC0gMSkgJiBod20pICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ01heCBzaXplIGZvciBhIEZpeGVkRklGTyBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28nKVxuICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KGh3bSlcbiAgICB0aGlzLm1hc2sgPSBod20gLSAxXG4gICAgdGhpcy50b3AgPSAwXG4gICAgdGhpcy5idG0gPSAwXG4gICAgdGhpcy5uZXh0ID0gbnVsbFxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMudG9wID0gdGhpcy5idG0gPSAwXG4gICAgdGhpcy5uZXh0ID0gbnVsbFxuICAgIHRoaXMuYnVmZmVyLmZpbGwodW5kZWZpbmVkKVxuICB9XG5cbiAgcHVzaCAoZGF0YSkge1xuICAgIGlmICh0aGlzLmJ1ZmZlclt0aGlzLnRvcF0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5idWZmZXJbdGhpcy50b3BdID0gZGF0YVxuICAgIHRoaXMudG9wID0gKHRoaXMudG9wICsgMSkgJiB0aGlzLm1hc2tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc2hpZnQgKCkge1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmJ1ZmZlclt0aGlzLmJ0bV1cbiAgICBpZiAobGFzdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgdGhpcy5idWZmZXJbdGhpcy5idG1dID0gdW5kZWZpbmVkXG4gICAgdGhpcy5idG0gPSAodGhpcy5idG0gKyAxKSAmIHRoaXMubWFza1xuICAgIHJldHVybiBsYXN0XG4gIH1cblxuICBwZWVrICgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5idG1dXG4gIH1cblxuICBpc0VtcHR5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5idG1dID09PSB1bmRlZmluZWRcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8190\n")},36080:(module,__unused_webpack_exports,__webpack_require__)=>{eval("const FixedFIFO = __webpack_require__(8190)\n\nmodule.exports = class FastFIFO {\n constructor (hwm) {\n this.hwm = hwm || 16\n this.head = new FixedFIFO(this.hwm)\n this.tail = this.head\n this.length = 0\n }\n\n clear () {\n this.head = this.tail\n this.head.clear()\n this.length = 0\n }\n\n push (val) {\n this.length++\n if (!this.head.push(val)) {\n const prev = this.head\n this.head = prev.next = new FixedFIFO(2 * this.head.buffer.length)\n this.head.push(val)\n }\n }\n\n shift () {\n if (this.length !== 0) this.length--\n const val = this.tail.shift()\n if (val === undefined && this.tail.next) {\n const next = this.tail.next\n this.tail.next = null\n this.tail = next\n return this.tail.shift()\n }\n\n return val\n }\n\n peek () {\n const val = this.tail.peek()\n if (val === undefined && this.tail.next) return this.tail.next.peek()\n return val\n }\n\n isEmpty () {\n return this.length === 0\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYwODAuanMiLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsSUFBYzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2Zhc3QtZmlmby9pbmRleC5qcz83OTg2Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEZpeGVkRklGTyA9IHJlcXVpcmUoJy4vZml4ZWQtc2l6ZScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRmFzdEZJRk8ge1xuICBjb25zdHJ1Y3RvciAoaHdtKSB7XG4gICAgdGhpcy5od20gPSBod20gfHwgMTZcbiAgICB0aGlzLmhlYWQgPSBuZXcgRml4ZWRGSUZPKHRoaXMuaHdtKVxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZFxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbFxuICAgIHRoaXMuaGVhZC5jbGVhcigpXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cblxuICBwdXNoICh2YWwpIHtcbiAgICB0aGlzLmxlbmd0aCsrXG4gICAgaWYgKCF0aGlzLmhlYWQucHVzaCh2YWwpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5oZWFkXG4gICAgICB0aGlzLmhlYWQgPSBwcmV2Lm5leHQgPSBuZXcgRml4ZWRGSUZPKDIgKiB0aGlzLmhlYWQuYnVmZmVyLmxlbmd0aClcbiAgICAgIHRoaXMuaGVhZC5wdXNoKHZhbClcbiAgICB9XG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICE9PSAwKSB0aGlzLmxlbmd0aC0tXG4gICAgY29uc3QgdmFsID0gdGhpcy50YWlsLnNoaWZ0KClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnRhaWwubmV4dFxuICAgICAgdGhpcy50YWlsLm5leHQgPSBudWxsXG4gICAgICB0aGlzLnRhaWwgPSBuZXh0XG4gICAgICByZXR1cm4gdGhpcy50YWlsLnNoaWZ0KClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICBwZWVrICgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLnRhaWwucGVlaygpXG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIHRoaXMudGFpbC5uZXh0KSByZXR1cm4gdGhpcy50YWlsLm5leHQucGVlaygpXG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwXG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///36080\n")},30737:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var CombinedStream = __webpack_require__(80801);\nvar util = __webpack_require__(39023);\nvar path = __webpack_require__(16928);\nvar http = __webpack_require__(58611);\nvar https = __webpack_require__(65692);\nvar parseUrl = (__webpack_require__(87016).parse);\nvar fs = __webpack_require__(79896);\nvar Stream = (__webpack_require__(2203).Stream);\nvar mime = __webpack_require__(86049);\nvar asynckit = __webpack_require__(21873);\nvar populate = __webpack_require__(41362);\n\n// Public API\nmodule.exports = FormData;\n\n// make it a Stream\nutil.inherits(FormData, CombinedStream);\n\n/**\n * Create readable \"multipart/form-data\" streams.\n * Can be used to submit forms\n * and file uploads to other web applications.\n *\n * @constructor\n * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream\n */\nfunction FormData(options) {\n if (!(this instanceof FormData)) {\n return new FormData(options);\n }\n\n this._overheadLength = 0;\n this._valueLength = 0;\n this._valuesToMeasure = [];\n\n CombinedStream.call(this);\n\n options = options || {};\n for (var option in options) {\n this[option] = options[option];\n }\n}\n\nFormData.LINE_BREAK = '\\r\\n';\nFormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';\n\nFormData.prototype.append = function(field, value, options) {\n\n options = options || {};\n\n // allow filename as single option\n if (typeof options == 'string') {\n options = {filename: options};\n }\n\n var append = CombinedStream.prototype.append.bind(this);\n\n // all that streamy business can't handle numbers\n if (typeof value == 'number') {\n value = '' + value;\n }\n\n // https://github.com/felixge/node-form-data/issues/38\n if (util.isArray(value)) {\n // Please convert your array into string\n // the way web server expects it\n this._error(new Error('Arrays are not supported.'));\n return;\n }\n\n var header = this._multiPartHeader(field, value, options);\n var footer = this._multiPartFooter();\n\n append(header);\n append(value);\n append(footer);\n\n // pass along options.knownLength\n this._trackLength(header, value, options);\n};\n\nFormData.prototype._trackLength = function(header, value, options) {\n var valueLength = 0;\n\n // used w/ getLengthSync(), when length is known.\n // e.g. for streaming directly from a remote server,\n // w/ a known file a size, and not wanting to wait for\n // incoming file to finish to get its size.\n if (options.knownLength != null) {\n valueLength += +options.knownLength;\n } else if (Buffer.isBuffer(value)) {\n valueLength = value.length;\n } else if (typeof value === 'string') {\n valueLength = Buffer.byteLength(value);\n }\n\n this._valueLength += valueLength;\n\n // @check why add CRLF? does this account for custom/multiple CRLFs?\n this._overheadLength +=\n Buffer.byteLength(header) +\n FormData.LINE_BREAK.length;\n\n // empty or either doesn't have path or not an http response or not a stream\n if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {\n return;\n }\n\n // no need to bother with the length\n if (!options.knownLength) {\n this._valuesToMeasure.push(value);\n }\n};\n\nFormData.prototype._lengthRetriever = function(value, callback) {\n\n if (value.hasOwnProperty('fd')) {\n\n // take read range into a account\n // `end` = Infinity –> read file till the end\n //\n // TODO: Looks like there is bug in Node fs.createReadStream\n // it doesn't respect `end` options without `start` options\n // Fix it when node fixes it.\n // https://github.com/joyent/node/issues/7819\n if (value.end != undefined && value.end != Infinity && value.start != undefined) {\n\n // when end specified\n // no need to calculate range\n // inclusive, starts with 0\n callback(null, value.end + 1 - (value.start ? value.start : 0));\n\n // not that fast snoopy\n } else {\n // still need to fetch file size from fs\n fs.stat(value.path, function(err, stat) {\n\n var fileSize;\n\n if (err) {\n callback(err);\n return;\n }\n\n // update final size based on the range options\n fileSize = stat.size - (value.start ? value.start : 0);\n callback(null, fileSize);\n });\n }\n\n // or http response\n } else if (value.hasOwnProperty('httpVersion')) {\n callback(null, +value.headers['content-length']);\n\n // or request stream http://github.com/mikeal/request\n } else if (value.hasOwnProperty('httpModule')) {\n // wait till response come back\n value.on('response', function(response) {\n value.pause();\n callback(null, +response.headers['content-length']);\n });\n value.resume();\n\n // something else\n } else {\n callback('Unknown stream');\n }\n};\n\nFormData.prototype._multiPartHeader = function(field, value, options) {\n // custom header specified (as string)?\n // it becomes responsible for boundary\n // (e.g. to handle extra CRLFs on .NET servers)\n if (typeof options.header == 'string') {\n return options.header;\n }\n\n var contentDisposition = this._getContentDisposition(value, options);\n var contentType = this._getContentType(value, options);\n\n var contents = '';\n var headers = {\n // add custom disposition as third element or keep it two elements if not\n 'Content-Disposition': ['form-data', 'name=\"' + field + '\"'].concat(contentDisposition || []),\n // if no content type. allow it to be empty array\n 'Content-Type': [].concat(contentType || [])\n };\n\n // allow custom headers.\n if (typeof options.header == 'object') {\n populate(headers, options.header);\n }\n\n var header;\n for (var prop in headers) {\n if (!headers.hasOwnProperty(prop)) continue;\n header = headers[prop];\n\n // skip nullish headers.\n if (header == null) {\n continue;\n }\n\n // convert all headers to arrays.\n if (!Array.isArray(header)) {\n header = [header];\n }\n\n // add non-empty headers.\n if (header.length) {\n contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;\n }\n }\n\n return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;\n};\n\nFormData.prototype._getContentDisposition = function(value, options) {\n\n var filename\n , contentDisposition\n ;\n\n if (typeof options.filepath === 'string') {\n // custom filepath for relative paths\n filename = path.normalize(options.filepath).replace(/\\\\/g, '/');\n } else if (options.filename || value.name || value.path) {\n // custom filename take precedence\n // formidable and the browser add a name property\n // fs- and request- streams have path property\n filename = path.basename(options.filename || value.name || value.path);\n } else if (value.readable && value.hasOwnProperty('httpVersion')) {\n // or try http response\n filename = path.basename(value.client._httpMessage.path || '');\n }\n\n if (filename) {\n contentDisposition = 'filename=\"' + filename + '\"';\n }\n\n return contentDisposition;\n};\n\nFormData.prototype._getContentType = function(value, options) {\n\n // use custom content-type above all\n var contentType = options.contentType;\n\n // or try `name` from formidable, browser\n if (!contentType && value.name) {\n contentType = mime.lookup(value.name);\n }\n\n // or try `path` from fs-, request- streams\n if (!contentType && value.path) {\n contentType = mime.lookup(value.path);\n }\n\n // or if it's http-reponse\n if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {\n contentType = value.headers['content-type'];\n }\n\n // or guess it from the filepath or filename\n if (!contentType && (options.filepath || options.filename)) {\n contentType = mime.lookup(options.filepath || options.filename);\n }\n\n // fallback to the default content type if `value` is not simple value\n if (!contentType && typeof value == 'object') {\n contentType = FormData.DEFAULT_CONTENT_TYPE;\n }\n\n return contentType;\n};\n\nFormData.prototype._multiPartFooter = function() {\n return function(next) {\n var footer = FormData.LINE_BREAK;\n\n var lastPart = (this._streams.length === 0);\n if (lastPart) {\n footer += this._lastBoundary();\n }\n\n next(footer);\n }.bind(this);\n};\n\nFormData.prototype._lastBoundary = function() {\n return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;\n};\n\nFormData.prototype.getHeaders = function(userHeaders) {\n var header;\n var formHeaders = {\n 'content-type': 'multipart/form-data; boundary=' + this.getBoundary()\n };\n\n for (header in userHeaders) {\n if (userHeaders.hasOwnProperty(header)) {\n formHeaders[header.toLowerCase()] = userHeaders[header];\n }\n }\n\n return formHeaders;\n};\n\nFormData.prototype.setBoundary = function(boundary) {\n this._boundary = boundary;\n};\n\nFormData.prototype.getBoundary = function() {\n if (!this._boundary) {\n this._generateBoundary();\n }\n\n return this._boundary;\n};\n\nFormData.prototype.getBuffer = function() {\n var dataBuffer = new Buffer.alloc( 0 );\n var boundary = this.getBoundary();\n\n // Create the form content. Add Line breaks to the end of data.\n for (var i = 0, len = this._streams.length; i < len; i++) {\n if (typeof this._streams[i] !== 'function') {\n\n // Add content to the buffer.\n if(Buffer.isBuffer(this._streams[i])) {\n dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);\n }else {\n dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);\n }\n\n // Add break after content.\n if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {\n dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );\n }\n }\n }\n\n // Add the footer and return the Buffer object.\n return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );\n};\n\nFormData.prototype._generateBoundary = function() {\n // This generates a 50 character boundary similar to those used by Firefox.\n // They are optimized for boyer-moore parsing.\n var boundary = '--------------------------';\n for (var i = 0; i < 24; i++) {\n boundary += Math.floor(Math.random() * 10).toString(16);\n }\n\n this._boundary = boundary;\n};\n\n// Note: getLengthSync DOESN'T calculate streams length\n// As workaround one can calculate file size manually\n// and add it as knownLength option\nFormData.prototype.getLengthSync = function() {\n var knownLength = this._overheadLength + this._valueLength;\n\n // Don't get confused, there are 3 \"internal\" streams for each keyval pair\n // so it basically checks if there is any value added to the form\n if (this._streams.length) {\n knownLength += this._lastBoundary().length;\n }\n\n // https://github.com/form-data/form-data/issues/40\n if (!this.hasKnownLength()) {\n // Some async length retrievers are present\n // therefore synchronous length calculation is false.\n // Please use getLength(callback) to get proper length\n this._error(new Error('Cannot calculate proper length in synchronous way.'));\n }\n\n return knownLength;\n};\n\n// Public API to check if length of added values is known\n// https://github.com/form-data/form-data/issues/196\n// https://github.com/form-data/form-data/issues/262\nFormData.prototype.hasKnownLength = function() {\n var hasKnownLength = true;\n\n if (this._valuesToMeasure.length) {\n hasKnownLength = false;\n }\n\n return hasKnownLength;\n};\n\nFormData.prototype.getLength = function(cb) {\n var knownLength = this._overheadLength + this._valueLength;\n\n if (this._streams.length) {\n knownLength += this._lastBoundary().length;\n }\n\n if (!this._valuesToMeasure.length) {\n process.nextTick(cb.bind(this, null, knownLength));\n return;\n }\n\n asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {\n if (err) {\n cb(err);\n return;\n }\n\n values.forEach(function(length) {\n knownLength += length;\n });\n\n cb(null, knownLength);\n });\n};\n\nFormData.prototype.submit = function(params, cb) {\n var request\n , options\n , defaults = {method: 'post'}\n ;\n\n // parse provided url if it's string\n // or treat it as options object\n if (typeof params == 'string') {\n\n params = parseUrl(params);\n options = populate({\n port: params.port,\n path: params.pathname,\n host: params.hostname,\n protocol: params.protocol\n }, defaults);\n\n // use custom params\n } else {\n\n options = populate(params, defaults);\n // if no port provided use default one\n if (!options.port) {\n options.port = options.protocol == 'https:' ? 443 : 80;\n }\n }\n\n // put that good code in getHeaders to some use\n options.headers = this.getHeaders(params.headers);\n\n // https if specified, fallback to http in any other case\n if (options.protocol == 'https:') {\n request = https.request(options);\n } else {\n request = http.request(options);\n }\n\n // get content length and fire away\n this.getLength(function(err, length) {\n if (err && err !== 'Unknown stream') {\n this._error(err);\n return;\n }\n\n // add content length\n if (length) {\n request.setHeader('Content-Length', length);\n }\n\n this.pipe(request);\n if (cb) {\n var onResponse;\n\n var callback = function (error, responce) {\n request.removeListener('error', callback);\n request.removeListener('response', onResponse);\n\n return cb.call(this, error, responce);\n };\n\n onResponse = callback.bind(this, null);\n\n request.on('error', callback);\n request.on('response', onResponse);\n }\n }.bind(this));\n\n return request;\n};\n\nFormData.prototype._error = function(err) {\n if (!this.error) {\n this.error = err;\n this.pause();\n this.emit('error', err);\n }\n};\n\nFormData.prototype.toString = function () {\n return '[object FormData]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA3MzcuanMiLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCLG1CQUFPLENBQUMsS0FBaUI7QUFDOUMsV0FBVyxtQkFBTyxDQUFDLEtBQU07QUFDekIsV0FBVyxtQkFBTyxDQUFDLEtBQU07QUFDekIsV0FBVyxtQkFBTyxDQUFDLEtBQU07QUFDekIsWUFBWSxtQkFBTyxDQUFDLEtBQU87QUFDM0IsZUFBZSxrQ0FBb0I7QUFDbkMsU0FBUyxtQkFBTyxDQUFDLEtBQUk7QUFDckIsYUFBYSxrQ0FBd0I7QUFDckMsV0FBVyxtQkFBTyxDQUFDLEtBQVk7QUFDL0IsZUFBZSxtQkFBTyxDQUFDLEtBQVU7QUFDakMsZUFBZSxtQkFBTyxDQUFDLEtBQWU7O0FBRXRDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDLFNBQVM7QUFDdkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvZm9ybV9kYXRhLmpzPzJiMjciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIENvbWJpbmVkU3RyZWFtID0gcmVxdWlyZSgnY29tYmluZWQtc3RyZWFtJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2U7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciBtaW1lID0gcmVxdWlyZSgnbWltZS10eXBlcycpO1xudmFyIGFzeW5ja2l0ID0gcmVxdWlyZSgnYXN5bmNraXQnKTtcbnZhciBwb3B1bGF0ZSA9IHJlcXVpcmUoJy4vcG9wdWxhdGUuanMnKTtcblxuLy8gUHVibGljIEFQSVxubW9kdWxlLmV4cG9ydHMgPSBGb3JtRGF0YTtcblxuLy8gbWFrZSBpdCBhIFN0cmVhbVxudXRpbC5pbmhlcml0cyhGb3JtRGF0YSwgQ29tYmluZWRTdHJlYW0pO1xuXG4vKipcbiAqIENyZWF0ZSByZWFkYWJsZSBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiBzdHJlYW1zLlxuICogQ2FuIGJlIHVzZWQgdG8gc3VibWl0IGZvcm1zXG4gKiBhbmQgZmlsZSB1cGxvYWRzIHRvIG90aGVyIHdlYiBhcHBsaWNhdGlvbnMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFByb3BlcnRpZXMgdG8gYmUgYWRkZWQvb3ZlcnJpZGVuIGZvciBGb3JtRGF0YSBhbmQgQ29tYmluZWRTdHJlYW1cbiAqL1xuZnVuY3Rpb24gRm9ybURhdGEob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRm9ybURhdGEpKSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtRGF0YShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX292ZXJoZWFkTGVuZ3RoID0gMDtcbiAgdGhpcy5fdmFsdWVMZW5ndGggPSAwO1xuICB0aGlzLl92YWx1ZXNUb01lYXN1cmUgPSBbXTtcblxuICBDb21iaW5lZFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIHRoaXNbb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgfVxufVxuXG5Gb3JtRGF0YS5MSU5FX0JSRUFLID0gJ1xcclxcbic7XG5Gb3JtRGF0YS5ERUZBVUxUX0NPTlRFTlRfVFlQRSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlLCBvcHRpb25zKSB7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gYWxsb3cgZmlsZW5hbWUgYXMgc2luZ2xlIG9wdGlvblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0ge2ZpbGVuYW1lOiBvcHRpb25zfTtcbiAgfVxuXG4gIHZhciBhcHBlbmQgPSBDb21iaW5lZFN0cmVhbS5wcm90b3R5cGUuYXBwZW5kLmJpbmQodGhpcyk7XG5cbiAgLy8gYWxsIHRoYXQgc3RyZWFteSBidXNpbmVzcyBjYW4ndCBoYW5kbGUgbnVtYmVyc1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgdmFsdWUgPSAnJyArIHZhbHVlO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZlbGl4Z2Uvbm9kZS1mb3JtLWRhdGEvaXNzdWVzLzM4XG4gIGlmICh1dGlsLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUGxlYXNlIGNvbnZlcnQgeW91ciBhcnJheSBpbnRvIHN0cmluZ1xuICAgIC8vIHRoZSB3YXkgd2ViIHNlcnZlciBleHBlY3RzIGl0XG4gICAgdGhpcy5fZXJyb3IobmV3IEVycm9yKCdBcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBoZWFkZXIgPSB0aGlzLl9tdWx0aVBhcnRIZWFkZXIoZmllbGQsIHZhbHVlLCBvcHRpb25zKTtcbiAgdmFyIGZvb3RlciA9IHRoaXMuX211bHRpUGFydEZvb3RlcigpO1xuXG4gIGFwcGVuZChoZWFkZXIpO1xuICBhcHBlbmQodmFsdWUpO1xuICBhcHBlbmQoZm9vdGVyKTtcblxuICAvLyBwYXNzIGFsb25nIG9wdGlvbnMua25vd25MZW5ndGhcbiAgdGhpcy5fdHJhY2tMZW5ndGgoaGVhZGVyLCB2YWx1ZSwgb3B0aW9ucyk7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuX3RyYWNrTGVuZ3RoID0gZnVuY3Rpb24oaGVhZGVyLCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdmFsdWVMZW5ndGggPSAwO1xuXG4gIC8vIHVzZWQgdy8gZ2V0TGVuZ3RoU3luYygpLCB3aGVuIGxlbmd0aCBpcyBrbm93bi5cbiAgLy8gZS5nLiBmb3Igc3RyZWFtaW5nIGRpcmVjdGx5IGZyb20gYSByZW1vdGUgc2VydmVyLFxuICAvLyB3LyBhIGtub3duIGZpbGUgYSBzaXplLCBhbmQgbm90IHdhbnRpbmcgdG8gd2FpdCBmb3JcbiAgLy8gaW5jb21pbmcgZmlsZSB0byBmaW5pc2ggdG8gZ2V0IGl0cyBzaXplLlxuICBpZiAob3B0aW9ucy5rbm93bkxlbmd0aCAhPSBudWxsKSB7XG4gICAgdmFsdWVMZW5ndGggKz0gK29wdGlvbnMua25vd25MZW5ndGg7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgIHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlKTtcbiAgfVxuXG4gIHRoaXMuX3ZhbHVlTGVuZ3RoICs9IHZhbHVlTGVuZ3RoO1xuXG4gIC8vIEBjaGVjayB3aHkgYWRkIENSTEY/IGRvZXMgdGhpcyBhY2NvdW50IGZvciBjdXN0b20vbXVsdGlwbGUgQ1JMRnM/XG4gIHRoaXMuX292ZXJoZWFkTGVuZ3RoICs9XG4gICAgQnVmZmVyLmJ5dGVMZW5ndGgoaGVhZGVyKSArXG4gICAgRm9ybURhdGEuTElORV9CUkVBSy5sZW5ndGg7XG5cbiAgLy8gZW1wdHkgb3IgZWl0aGVyIGRvZXNuJ3QgaGF2ZSBwYXRoIG9yIG5vdCBhbiBodHRwIHJlc3BvbnNlIG9yIG5vdCBhIHN0cmVhbVxuICBpZiAoIXZhbHVlIHx8ICggIXZhbHVlLnBhdGggJiYgISh2YWx1ZS5yZWFkYWJsZSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaHR0cFZlcnNpb24nKSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmVhbSkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gbm8gbmVlZCB0byBib3RoZXIgd2l0aCB0aGUgbGVuZ3RoXG4gIGlmICghb3B0aW9ucy5rbm93bkxlbmd0aCkge1xuICAgIHRoaXMuX3ZhbHVlc1RvTWVhc3VyZS5wdXNoKHZhbHVlKTtcbiAgfVxufTtcblxuRm9ybURhdGEucHJvdG90eXBlLl9sZW5ndGhSZXRyaWV2ZXIgPSBmdW5jdGlvbih2YWx1ZSwgY2FsbGJhY2spIHtcblxuICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoJ2ZkJykpIHtcblxuICAgIC8vIHRha2UgcmVhZCByYW5nZSBpbnRvIGEgYWNjb3VudFxuICAgIC8vIGBlbmRgID0gSW5maW5pdHkg4oCTPiByZWFkIGZpbGUgdGlsbCB0aGUgZW5kXG4gICAgLy9cbiAgICAvLyBUT0RPOiBMb29rcyBsaWtlIHRoZXJlIGlzIGJ1ZyBpbiBOb2RlIGZzLmNyZWF0ZVJlYWRTdHJlYW1cbiAgICAvLyBpdCBkb2Vzbid0IHJlc3BlY3QgYGVuZGAgb3B0aW9ucyB3aXRob3V0IGBzdGFydGAgb3B0aW9uc1xuICAgIC8vIEZpeCBpdCB3aGVuIG5vZGUgZml4ZXMgaXQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy83ODE5XG4gICAgaWYgKHZhbHVlLmVuZCAhPSB1bmRlZmluZWQgJiYgdmFsdWUuZW5kICE9IEluZmluaXR5ICYmIHZhbHVlLnN0YXJ0ICE9IHVuZGVmaW5lZCkge1xuXG4gICAgICAvLyB3aGVuIGVuZCBzcGVjaWZpZWRcbiAgICAgIC8vIG5vIG5lZWQgdG8gY2FsY3VsYXRlIHJhbmdlXG4gICAgICAvLyBpbmNsdXNpdmUsIHN0YXJ0cyB3aXRoIDBcbiAgICAgIGNhbGxiYWNrKG51bGwsIHZhbHVlLmVuZCArIDEgLSAodmFsdWUuc3RhcnQgPyB2YWx1ZS5zdGFydCA6IDApKTtcblxuICAgIC8vIG5vdCB0aGF0IGZhc3Qgc25vb3B5XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN0aWxsIG5lZWQgdG8gZmV0Y2ggZmlsZSBzaXplIGZyb20gZnNcbiAgICAgIGZzLnN0YXQodmFsdWUucGF0aCwgZnVuY3Rpb24oZXJyLCBzdGF0KSB7XG5cbiAgICAgICAgdmFyIGZpbGVTaXplO1xuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBmaW5hbCBzaXplIGJhc2VkIG9uIHRoZSByYW5nZSBvcHRpb25zXG4gICAgICAgIGZpbGVTaXplID0gc3RhdC5zaXplIC0gKHZhbHVlLnN0YXJ0ID8gdmFsdWUuc3RhcnQgOiAwKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZmlsZVNpemUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gIC8vIG9yIGh0dHAgcmVzcG9uc2VcbiAgfSBlbHNlIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaHR0cFZlcnNpb24nKSkge1xuICAgIGNhbGxiYWNrKG51bGwsICt2YWx1ZS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddKTtcblxuICAvLyBvciByZXF1ZXN0IHN0cmVhbSBodHRwOi8vZ2l0aHViLmNvbS9taWtlYWwvcmVxdWVzdFxuICB9IGVsc2UgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdodHRwTW9kdWxlJykpIHtcbiAgICAvLyB3YWl0IHRpbGwgcmVzcG9uc2UgY29tZSBiYWNrXG4gICAgdmFsdWUub24oJ3Jlc3BvbnNlJywgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIHZhbHVlLnBhdXNlKCk7XG4gICAgICBjYWxsYmFjayhudWxsLCArcmVzcG9uc2UuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSk7XG4gICAgfSk7XG4gICAgdmFsdWUucmVzdW1lKCk7XG5cbiAgLy8gc29tZXRoaW5nIGVsc2VcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjaygnVW5rbm93biBzdHJlYW0nKTtcbiAgfVxufTtcblxuRm9ybURhdGEucHJvdG90eXBlLl9tdWx0aVBhcnRIZWFkZXIgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgLy8gY3VzdG9tIGhlYWRlciBzcGVjaWZpZWQgKGFzIHN0cmluZyk/XG4gIC8vIGl0IGJlY29tZXMgcmVzcG9uc2libGUgZm9yIGJvdW5kYXJ5XG4gIC8vIChlLmcuIHRvIGhhbmRsZSBleHRyYSBDUkxGcyBvbiAuTkVUIHNlcnZlcnMpXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5oZWFkZXIgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5oZWFkZXI7XG4gIH1cblxuICB2YXIgY29udGVudERpc3Bvc2l0aW9uID0gdGhpcy5fZ2V0Q29udGVudERpc3Bvc2l0aW9uKHZhbHVlLCBvcHRpb25zKTtcbiAgdmFyIGNvbnRlbnRUeXBlID0gdGhpcy5fZ2V0Q29udGVudFR5cGUodmFsdWUsIG9wdGlvbnMpO1xuXG4gIHZhciBjb250ZW50cyA9ICcnO1xuICB2YXIgaGVhZGVycyAgPSB7XG4gICAgLy8gYWRkIGN1c3RvbSBkaXNwb3NpdGlvbiBhcyB0aGlyZCBlbGVtZW50IG9yIGtlZXAgaXQgdHdvIGVsZW1lbnRzIGlmIG5vdFxuICAgICdDb250ZW50LURpc3Bvc2l0aW9uJzogWydmb3JtLWRhdGEnLCAnbmFtZT1cIicgKyBmaWVsZCArICdcIiddLmNvbmNhdChjb250ZW50RGlzcG9zaXRpb24gfHwgW10pLFxuICAgIC8vIGlmIG5vIGNvbnRlbnQgdHlwZS4gYWxsb3cgaXQgdG8gYmUgZW1wdHkgYXJyYXlcbiAgICAnQ29udGVudC1UeXBlJzogW10uY29uY2F0KGNvbnRlbnRUeXBlIHx8IFtdKVxuICB9O1xuXG4gIC8vIGFsbG93IGN1c3RvbSBoZWFkZXJzLlxuICBpZiAodHlwZW9mIG9wdGlvbnMuaGVhZGVyID09ICdvYmplY3QnKSB7XG4gICAgcG9wdWxhdGUoaGVhZGVycywgb3B0aW9ucy5oZWFkZXIpO1xuICB9XG5cbiAgdmFyIGhlYWRlcjtcbiAgZm9yICh2YXIgcHJvcCBpbiBoZWFkZXJzKSB7XG4gICAgaWYgKCFoZWFkZXJzLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICBoZWFkZXIgPSBoZWFkZXJzW3Byb3BdO1xuXG4gICAgLy8gc2tpcCBudWxsaXNoIGhlYWRlcnMuXG4gICAgaWYgKGhlYWRlciA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFsbCBoZWFkZXJzIHRvIGFycmF5cy5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGVhZGVyKSkge1xuICAgICAgaGVhZGVyID0gW2hlYWRlcl07XG4gICAgfVxuXG4gICAgLy8gYWRkIG5vbi1lbXB0eSBoZWFkZXJzLlxuICAgIGlmIChoZWFkZXIubGVuZ3RoKSB7XG4gICAgICBjb250ZW50cyArPSBwcm9wICsgJzogJyArIGhlYWRlci5qb2luKCc7ICcpICsgRm9ybURhdGEuTElORV9CUkVBSztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJy0tJyArIHRoaXMuZ2V0Qm91bmRhcnkoKSArIEZvcm1EYXRhLkxJTkVfQlJFQUsgKyBjb250ZW50cyArIEZvcm1EYXRhLkxJTkVfQlJFQUs7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuX2dldENvbnRlbnREaXNwb3NpdGlvbiA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKSB7XG5cbiAgdmFyIGZpbGVuYW1lXG4gICAgLCBjb250ZW50RGlzcG9zaXRpb25cbiAgICA7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbGVwYXRoID09PSAnc3RyaW5nJykge1xuICAgIC8vIGN1c3RvbSBmaWxlcGF0aCBmb3IgcmVsYXRpdmUgcGF0aHNcbiAgICBmaWxlbmFtZSA9IHBhdGgubm9ybWFsaXplKG9wdGlvbnMuZmlsZXBhdGgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgfSBlbHNlIGlmIChvcHRpb25zLmZpbGVuYW1lIHx8IHZhbHVlLm5hbWUgfHwgdmFsdWUucGF0aCkge1xuICAgIC8vIGN1c3RvbSBmaWxlbmFtZSB0YWtlIHByZWNlZGVuY2VcbiAgICAvLyBmb3JtaWRhYmxlIGFuZCB0aGUgYnJvd3NlciBhZGQgYSBuYW1lIHByb3BlcnR5XG4gICAgLy8gZnMtIGFuZCByZXF1ZXN0LSBzdHJlYW1zIGhhdmUgcGF0aCBwcm9wZXJ0eVxuICAgIGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShvcHRpb25zLmZpbGVuYW1lIHx8IHZhbHVlLm5hbWUgfHwgdmFsdWUucGF0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUucmVhZGFibGUgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoJ2h0dHBWZXJzaW9uJykpIHtcbiAgICAvLyBvciB0cnkgaHR0cCByZXNwb25zZVxuICAgIGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZSh2YWx1ZS5jbGllbnQuX2h0dHBNZXNzYWdlLnBhdGggfHwgJycpO1xuICB9XG5cbiAgaWYgKGZpbGVuYW1lKSB7XG4gICAgY29udGVudERpc3Bvc2l0aW9uID0gJ2ZpbGVuYW1lPVwiJyArIGZpbGVuYW1lICsgJ1wiJztcbiAgfVxuXG4gIHJldHVybiBjb250ZW50RGlzcG9zaXRpb247XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuX2dldENvbnRlbnRUeXBlID0gZnVuY3Rpb24odmFsdWUsIG9wdGlvbnMpIHtcblxuICAvLyB1c2UgY3VzdG9tIGNvbnRlbnQtdHlwZSBhYm92ZSBhbGxcbiAgdmFyIGNvbnRlbnRUeXBlID0gb3B0aW9ucy5jb250ZW50VHlwZTtcblxuICAvLyBvciB0cnkgYG5hbWVgIGZyb20gZm9ybWlkYWJsZSwgYnJvd3NlclxuICBpZiAoIWNvbnRlbnRUeXBlICYmIHZhbHVlLm5hbWUpIHtcbiAgICBjb250ZW50VHlwZSA9IG1pbWUubG9va3VwKHZhbHVlLm5hbWUpO1xuICB9XG5cbiAgLy8gb3IgdHJ5IGBwYXRoYCBmcm9tIGZzLSwgcmVxdWVzdC0gc3RyZWFtc1xuICBpZiAoIWNvbnRlbnRUeXBlICYmIHZhbHVlLnBhdGgpIHtcbiAgICBjb250ZW50VHlwZSA9IG1pbWUubG9va3VwKHZhbHVlLnBhdGgpO1xuICB9XG5cbiAgLy8gb3IgaWYgaXQncyBodHRwLXJlcG9uc2VcbiAgaWYgKCFjb250ZW50VHlwZSAmJiB2YWx1ZS5yZWFkYWJsZSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaHR0cFZlcnNpb24nKSkge1xuICAgIGNvbnRlbnRUeXBlID0gdmFsdWUuaGVhZGVyc1snY29udGVudC10eXBlJ107XG4gIH1cblxuICAvLyBvciBndWVzcyBpdCBmcm9tIHRoZSBmaWxlcGF0aCBvciBmaWxlbmFtZVxuICBpZiAoIWNvbnRlbnRUeXBlICYmIChvcHRpb25zLmZpbGVwYXRoIHx8IG9wdGlvbnMuZmlsZW5hbWUpKSB7XG4gICAgY29udGVudFR5cGUgPSBtaW1lLmxvb2t1cChvcHRpb25zLmZpbGVwYXRoIHx8IG9wdGlvbnMuZmlsZW5hbWUpO1xuICB9XG5cbiAgLy8gZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgY29udGVudCB0eXBlIGlmIGB2YWx1ZWAgaXMgbm90IHNpbXBsZSB2YWx1ZVxuICBpZiAoIWNvbnRlbnRUeXBlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgIGNvbnRlbnRUeXBlID0gRm9ybURhdGEuREVGQVVMVF9DT05URU5UX1RZUEU7XG4gIH1cblxuICByZXR1cm4gY29udGVudFR5cGU7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuX211bHRpUGFydEZvb3RlciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZnVuY3Rpb24obmV4dCkge1xuICAgIHZhciBmb290ZXIgPSBGb3JtRGF0YS5MSU5FX0JSRUFLO1xuXG4gICAgdmFyIGxhc3RQYXJ0ID0gKHRoaXMuX3N0cmVhbXMubGVuZ3RoID09PSAwKTtcbiAgICBpZiAobGFzdFBhcnQpIHtcbiAgICAgIGZvb3RlciArPSB0aGlzLl9sYXN0Qm91bmRhcnkoKTtcbiAgICB9XG5cbiAgICBuZXh0KGZvb3Rlcik7XG4gIH0uYmluZCh0aGlzKTtcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5fbGFzdEJvdW5kYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnLS0nICsgdGhpcy5nZXRCb3VuZGFyeSgpICsgJy0tJyArIEZvcm1EYXRhLkxJTkVfQlJFQUs7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuZ2V0SGVhZGVycyA9IGZ1bmN0aW9uKHVzZXJIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXI7XG4gIHZhciBmb3JtSGVhZGVycyA9IHtcbiAgICAnY29udGVudC10eXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PScgKyB0aGlzLmdldEJvdW5kYXJ5KClcbiAgfTtcblxuICBmb3IgKGhlYWRlciBpbiB1c2VySGVhZGVycykge1xuICAgIGlmICh1c2VySGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICBmb3JtSGVhZGVyc1toZWFkZXIudG9Mb3dlckNhc2UoKV0gPSB1c2VySGVhZGVyc1toZWFkZXJdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtSGVhZGVycztcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5zZXRCb3VuZGFyeSA9IGZ1bmN0aW9uKGJvdW5kYXJ5KSB7XG4gIHRoaXMuX2JvdW5kYXJ5ID0gYm91bmRhcnk7XG59O1xuXG5Gb3JtRGF0YS5wcm90b3R5cGUuZ2V0Qm91bmRhcnkgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9ib3VuZGFyeSkge1xuICAgIHRoaXMuX2dlbmVyYXRlQm91bmRhcnkoKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9ib3VuZGFyeTtcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGRhdGFCdWZmZXIgPSBuZXcgQnVmZmVyLmFsbG9jKCAwICk7XG4gIHZhciBib3VuZGFyeSA9IHRoaXMuZ2V0Qm91bmRhcnkoKTtcblxuICAvLyBDcmVhdGUgdGhlIGZvcm0gY29udGVudC4gQWRkIExpbmUgYnJlYWtzIHRvIHRoZSBlbmQgb2YgZGF0YS5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuX3N0cmVhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3N0cmVhbXNbaV0gIT09ICdmdW5jdGlvbicpIHtcblxuICAgICAgLy8gQWRkIGNvbnRlbnQgdG8gdGhlIGJ1ZmZlci5cbiAgICAgIGlmKEJ1ZmZlci5pc0J1ZmZlcih0aGlzLl9zdHJlYW1zW2ldKSkge1xuICAgICAgICBkYXRhQnVmZmVyID0gQnVmZmVyLmNvbmNhdCggW2RhdGFCdWZmZXIsIHRoaXMuX3N0cmVhbXNbaV1dKTtcbiAgICAgIH1lbHNlIHtcbiAgICAgICAgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoIFtkYXRhQnVmZmVyLCBCdWZmZXIuZnJvbSh0aGlzLl9zdHJlYW1zW2ldKV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYnJlYWsgYWZ0ZXIgY29udGVudC5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fc3RyZWFtc1tpXSAhPT0gJ3N0cmluZycgfHwgdGhpcy5fc3RyZWFtc1tpXS5zdWJzdHJpbmcoIDIsIGJvdW5kYXJ5Lmxlbmd0aCArIDIgKSAhPT0gYm91bmRhcnkpIHtcbiAgICAgICAgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoIFtkYXRhQnVmZmVyLCBCdWZmZXIuZnJvbShGb3JtRGF0YS5MSU5FX0JSRUFLKV0gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhlIGZvb3RlciBhbmQgcmV0dXJuIHRoZSBCdWZmZXIgb2JqZWN0LlxuICByZXR1cm4gQnVmZmVyLmNvbmNhdCggW2RhdGFCdWZmZXIsIEJ1ZmZlci5mcm9tKHRoaXMuX2xhc3RCb3VuZGFyeSgpKV0gKTtcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5fZ2VuZXJhdGVCb3VuZGFyeSA9IGZ1bmN0aW9uKCkge1xuICAvLyBUaGlzIGdlbmVyYXRlcyBhIDUwIGNoYXJhY3RlciBib3VuZGFyeSBzaW1pbGFyIHRvIHRob3NlIHVzZWQgYnkgRmlyZWZveC5cbiAgLy8gVGhleSBhcmUgb3B0aW1pemVkIGZvciBib3llci1tb29yZSBwYXJzaW5nLlxuICB2YXIgYm91bmRhcnkgPSAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICBib3VuZGFyeSArPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMCkudG9TdHJpbmcoMTYpO1xuICB9XG5cbiAgdGhpcy5fYm91bmRhcnkgPSBib3VuZGFyeTtcbn07XG5cbi8vIE5vdGU6IGdldExlbmd0aFN5bmMgRE9FU04nVCBjYWxjdWxhdGUgc3RyZWFtcyBsZW5ndGhcbi8vIEFzIHdvcmthcm91bmQgb25lIGNhbiBjYWxjdWxhdGUgZmlsZSBzaXplIG1hbnVhbGx5XG4vLyBhbmQgYWRkIGl0IGFzIGtub3duTGVuZ3RoIG9wdGlvblxuRm9ybURhdGEucHJvdG90eXBlLmdldExlbmd0aFN5bmMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGtub3duTGVuZ3RoID0gdGhpcy5fb3ZlcmhlYWRMZW5ndGggKyB0aGlzLl92YWx1ZUxlbmd0aDtcblxuICAvLyBEb24ndCBnZXQgY29uZnVzZWQsIHRoZXJlIGFyZSAzIFwiaW50ZXJuYWxcIiBzdHJlYW1zIGZvciBlYWNoIGtleXZhbCBwYWlyXG4gIC8vIHNvIGl0IGJhc2ljYWxseSBjaGVja3MgaWYgdGhlcmUgaXMgYW55IHZhbHVlIGFkZGVkIHRvIHRoZSBmb3JtXG4gIGlmICh0aGlzLl9zdHJlYW1zLmxlbmd0aCkge1xuICAgIGtub3duTGVuZ3RoICs9IHRoaXMuX2xhc3RCb3VuZGFyeSgpLmxlbmd0aDtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JtLWRhdGEvZm9ybS1kYXRhL2lzc3Vlcy80MFxuICBpZiAoIXRoaXMuaGFzS25vd25MZW5ndGgoKSkge1xuICAgIC8vIFNvbWUgYXN5bmMgbGVuZ3RoIHJldHJpZXZlcnMgYXJlIHByZXNlbnRcbiAgICAvLyB0aGVyZWZvcmUgc3luY2hyb25vdXMgbGVuZ3RoIGNhbGN1bGF0aW9uIGlzIGZhbHNlLlxuICAgIC8vIFBsZWFzZSB1c2UgZ2V0TGVuZ3RoKGNhbGxiYWNrKSB0byBnZXQgcHJvcGVyIGxlbmd0aFxuICAgIHRoaXMuX2Vycm9yKG5ldyBFcnJvcignQ2Fubm90IGNhbGN1bGF0ZSBwcm9wZXIgbGVuZ3RoIGluIHN5bmNocm9ub3VzIHdheS4nKSk7XG4gIH1cblxuICByZXR1cm4ga25vd25MZW5ndGg7XG59O1xuXG4vLyBQdWJsaWMgQVBJIHRvIGNoZWNrIGlmIGxlbmd0aCBvZiBhZGRlZCB2YWx1ZXMgaXMga25vd25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JtLWRhdGEvZm9ybS1kYXRhL2lzc3Vlcy8xOTZcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JtLWRhdGEvZm9ybS1kYXRhL2lzc3Vlcy8yNjJcbkZvcm1EYXRhLnByb3RvdHlwZS5oYXNLbm93bkxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaGFzS25vd25MZW5ndGggPSB0cnVlO1xuXG4gIGlmICh0aGlzLl92YWx1ZXNUb01lYXN1cmUubGVuZ3RoKSB7XG4gICAgaGFzS25vd25MZW5ndGggPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBoYXNLbm93bkxlbmd0aDtcbn07XG5cbkZvcm1EYXRhLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbihjYikge1xuICB2YXIga25vd25MZW5ndGggPSB0aGlzLl9vdmVyaGVhZExlbmd0aCArIHRoaXMuX3ZhbHVlTGVuZ3RoO1xuXG4gIGlmICh0aGlzLl9zdHJlYW1zLmxlbmd0aCkge1xuICAgIGtub3duTGVuZ3RoICs9IHRoaXMuX2xhc3RCb3VuZGFyeSgpLmxlbmd0aDtcbiAgfVxuXG4gIGlmICghdGhpcy5fdmFsdWVzVG9NZWFzdXJlLmxlbmd0aCkge1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2IuYmluZCh0aGlzLCBudWxsLCBrbm93bkxlbmd0aCkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFzeW5ja2l0LnBhcmFsbGVsKHRoaXMuX3ZhbHVlc1RvTWVhc3VyZSwgdGhpcy5fbGVuZ3RoUmV0cmlldmVyLCBmdW5jdGlvbihlcnIsIHZhbHVlcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNiKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24obGVuZ3RoKSB7XG4gICAgICBrbm93bkxlbmd0aCArPSBsZW5ndGg7XG4gICAgfSk7XG5cbiAgICBjYihudWxsLCBrbm93bkxlbmd0aCk7XG4gIH0pO1xufTtcblxuRm9ybURhdGEucHJvdG90eXBlLnN1Ym1pdCA9IGZ1bmN0aW9uKHBhcmFtcywgY2IpIHtcbiAgdmFyIHJlcXVlc3RcbiAgICAsIG9wdGlvbnNcbiAgICAsIGRlZmF1bHRzID0ge21ldGhvZDogJ3Bvc3QnfVxuICAgIDtcblxuICAvLyBwYXJzZSBwcm92aWRlZCB1cmwgaWYgaXQncyBzdHJpbmdcbiAgLy8gb3IgdHJlYXQgaXQgYXMgb3B0aW9ucyBvYmplY3RcbiAgaWYgKHR5cGVvZiBwYXJhbXMgPT0gJ3N0cmluZycpIHtcblxuICAgIHBhcmFtcyA9IHBhcnNlVXJsKHBhcmFtcyk7XG4gICAgb3B0aW9ucyA9IHBvcHVsYXRlKHtcbiAgICAgIHBvcnQ6IHBhcmFtcy5wb3J0LFxuICAgICAgcGF0aDogcGFyYW1zLnBhdGhuYW1lLFxuICAgICAgaG9zdDogcGFyYW1zLmhvc3RuYW1lLFxuICAgICAgcHJvdG9jb2w6IHBhcmFtcy5wcm90b2NvbFxuICAgIH0sIGRlZmF1bHRzKTtcblxuICAvLyB1c2UgY3VzdG9tIHBhcmFtc1xuICB9IGVsc2Uge1xuXG4gICAgb3B0aW9ucyA9IHBvcHVsYXRlKHBhcmFtcywgZGVmYXVsdHMpO1xuICAgIC8vIGlmIG5vIHBvcnQgcHJvdmlkZWQgdXNlIGRlZmF1bHQgb25lXG4gICAgaWYgKCFvcHRpb25zLnBvcnQpIHtcbiAgICAgIG9wdGlvbnMucG9ydCA9IG9wdGlvbnMucHJvdG9jb2wgPT0gJ2h0dHBzOicgPyA0NDMgOiA4MDtcbiAgICB9XG4gIH1cblxuICAvLyBwdXQgdGhhdCBnb29kIGNvZGUgaW4gZ2V0SGVhZGVycyB0byBzb21lIHVzZVxuICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnMocGFyYW1zLmhlYWRlcnMpO1xuXG4gIC8vIGh0dHBzIGlmIHNwZWNpZmllZCwgZmFsbGJhY2sgdG8gaHR0cCBpbiBhbnkgb3RoZXIgY2FzZVxuICBpZiAob3B0aW9ucy5wcm90b2NvbCA9PSAnaHR0cHM6Jykge1xuICAgIHJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJlcXVlc3QgPSBodHRwLnJlcXVlc3Qob3B0aW9ucyk7XG4gIH1cblxuICAvLyBnZXQgY29udGVudCBsZW5ndGggYW5kIGZpcmUgYXdheVxuICB0aGlzLmdldExlbmd0aChmdW5jdGlvbihlcnIsIGxlbmd0aCkge1xuICAgIGlmIChlcnIgJiYgZXJyICE9PSAnVW5rbm93biBzdHJlYW0nKSB7XG4gICAgICB0aGlzLl9lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGFkZCBjb250ZW50IGxlbmd0aFxuICAgIGlmIChsZW5ndGgpIHtcbiAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5waXBlKHJlcXVlc3QpO1xuICAgIGlmIChjYikge1xuICAgICAgdmFyIG9uUmVzcG9uc2U7XG5cbiAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uY2UpIHtcbiAgICAgICAgcmVxdWVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBjYWxsYmFjayk7XG4gICAgICAgIHJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoJ3Jlc3BvbnNlJywgb25SZXNwb25zZSk7XG5cbiAgICAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgZXJyb3IsIHJlc3BvbmNlKTtcbiAgICAgIH07XG5cbiAgICAgIG9uUmVzcG9uc2UgPSBjYWxsYmFjay5iaW5kKHRoaXMsIG51bGwpO1xuXG4gICAgICByZXF1ZXN0Lm9uKCdlcnJvcicsIGNhbGxiYWNrKTtcbiAgICAgIHJlcXVlc3Qub24oJ3Jlc3BvbnNlJywgb25SZXNwb25zZSk7XG4gICAgfVxuICB9LmJpbmQodGhpcykpO1xuXG4gIHJldHVybiByZXF1ZXN0O1xufTtcblxuRm9ybURhdGEucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICBpZiAoIXRoaXMuZXJyb3IpIHtcbiAgICB0aGlzLmVycm9yID0gZXJyO1xuICAgIHRoaXMucGF1c2UoKTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxufTtcblxuRm9ybURhdGEucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ1tvYmplY3QgRm9ybURhdGFdJztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///30737\n")},41362:module=>{eval("// populates missing values\nmodule.exports = function(dst, src) {\n\n Object.keys(src).forEach(function(prop)\n {\n dst[prop] = dst[prop] || src[prop];\n });\n\n return dst;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEzNjIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvcG9wdWxhdGUuanM/MTIxMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwb3B1bGF0ZXMgbWlzc2luZyB2YWx1ZXNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZHN0LCBzcmMpIHtcblxuICBPYmplY3Qua2V5cyhzcmMpLmZvckVhY2goZnVuY3Rpb24ocHJvcClcbiAge1xuICAgIGRzdFtwcm9wXSA9IGRzdFtwcm9wXSB8fCBzcmNbcHJvcF07XG4gIH0pO1xuXG4gIHJldHVybiBkc3Q7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41362\n")},1283:module=>{"use strict";eval("\n\nmodule.exports = clone\n\nvar getPrototypeOf = Object.getPrototypeOf || function (obj) {\n return obj.__proto__\n}\n\nfunction clone (obj) {\n if (obj === null || typeof obj !== 'object')\n return obj\n\n if (obj instanceof Object)\n var copy = { __proto__: getPrototypeOf(obj) }\n else\n var copy = Object.create(null)\n\n Object.getOwnPropertyNames(obj).forEach(function (key) {\n Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))\n })\n\n return copy\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4My5qcyIsIm1hcHBpbmdzIjoiQUFBWTs7QUFFWjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvZ3JhY2VmdWwtZnMvY2xvbmUuanM/ZWM2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVxuXG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqLl9fcHJvdG9fX1xufVxuXG5mdW5jdGlvbiBjbG9uZSAob2JqKSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpXG4gICAgcmV0dXJuIG9ialxuXG4gIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgdmFyIGNvcHkgPSB7IF9fcHJvdG9fXzogZ2V0UHJvdG90eXBlT2Yob2JqKSB9XG4gIGVsc2VcbiAgICB2YXIgY29weSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb3B5LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpKVxuICB9KVxuXG4gIHJldHVybiBjb3B5XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1283\n")},63735:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var fs = __webpack_require__(79896)\nvar polyfills = __webpack_require__(69106)\nvar legacy = __webpack_require__(11995)\nvar clone = __webpack_require__(1283)\n\nvar util = __webpack_require__(39023)\n\n/* istanbul ignore next - node 0.x polyfill */\nvar gracefulQueue\nvar previousSymbol\n\n/* istanbul ignore else - node 0.x polyfill */\nif (typeof Symbol === 'function' && typeof Symbol.for === 'function') {\n gracefulQueue = Symbol.for('graceful-fs.queue')\n // This is used in testing by future versions\n previousSymbol = Symbol.for('graceful-fs.previous')\n} else {\n gracefulQueue = '___graceful-fs.queue'\n previousSymbol = '___graceful-fs.previous'\n}\n\nfunction noop () {}\n\nfunction publishQueue(context, queue) {\n Object.defineProperty(context, gracefulQueue, {\n get: function() {\n return queue\n }\n })\n}\n\nvar debug = noop\nif (util.debuglog)\n debug = util.debuglog('gfs4')\nelse if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || ''))\n debug = function() {\n var m = util.format.apply(util, arguments)\n m = 'GFS4: ' + m.split(/\\n/).join('\\nGFS4: ')\n console.error(m)\n }\n\n// Once time initialization\nif (!fs[gracefulQueue]) {\n // This queue can be shared by multiple loaded instances\n var queue = global[gracefulQueue] || []\n publishQueue(fs, queue)\n\n // Patch fs.close/closeSync to shared queue version, because we need\n // to retry() whenever a close happens *anywhere* in the program.\n // This is essential when multiple graceful-fs instances are\n // in play at the same time.\n fs.close = (function (fs$close) {\n function close (fd, cb) {\n return fs$close.call(fs, fd, function (err) {\n // This function uses the graceful-fs shared queue\n if (!err) {\n resetQueue()\n }\n\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n })\n }\n\n Object.defineProperty(close, previousSymbol, {\n value: fs$close\n })\n return close\n })(fs.close)\n\n fs.closeSync = (function (fs$closeSync) {\n function closeSync (fd) {\n // This function uses the graceful-fs shared queue\n fs$closeSync.apply(fs, arguments)\n resetQueue()\n }\n\n Object.defineProperty(closeSync, previousSymbol, {\n value: fs$closeSync\n })\n return closeSync\n })(fs.closeSync)\n\n if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || '')) {\n process.on('exit', function() {\n debug(fs[gracefulQueue])\n __webpack_require__(42613).equal(fs[gracefulQueue].length, 0)\n })\n }\n}\n\nif (!global[gracefulQueue]) {\n publishQueue(global, fs[gracefulQueue]);\n}\n\nmodule.exports = patch(clone(fs))\nif (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {\n module.exports = patch(fs)\n fs.__patched = true;\n}\n\nfunction patch (fs) {\n // Everything that references the open() function needs to be in here\n polyfills(fs)\n fs.gracefulify = patch\n\n fs.createReadStream = createReadStream\n fs.createWriteStream = createWriteStream\n var fs$readFile = fs.readFile\n fs.readFile = readFile\n function readFile (path, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$readFile(path, options, cb)\n\n function go$readFile (path, options, cb, startTime) {\n return fs$readFile(path, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$writeFile = fs.writeFile\n fs.writeFile = writeFile\n function writeFile (path, data, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$writeFile(path, data, options, cb)\n\n function go$writeFile (path, data, options, cb, startTime) {\n return fs$writeFile(path, data, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$appendFile = fs.appendFile\n if (fs$appendFile)\n fs.appendFile = appendFile\n function appendFile (path, data, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$appendFile(path, data, options, cb)\n\n function go$appendFile (path, data, options, cb, startTime) {\n return fs$appendFile(path, data, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$copyFile = fs.copyFile\n if (fs$copyFile)\n fs.copyFile = copyFile\n function copyFile (src, dest, flags, cb) {\n if (typeof flags === 'function') {\n cb = flags\n flags = 0\n }\n return go$copyFile(src, dest, flags, cb)\n\n function go$copyFile (src, dest, flags, cb, startTime) {\n return fs$copyFile(src, dest, flags, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$readdir = fs.readdir\n fs.readdir = readdir\n var noReaddirOptionVersions = /^v[0-5]\\./\n function readdir (path, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n var go$readdir = noReaddirOptionVersions.test(process.version)\n ? function go$readdir (path, options, cb, startTime) {\n return fs$readdir(path, fs$readdirCallback(\n path, options, cb, startTime\n ))\n }\n : function go$readdir (path, options, cb, startTime) {\n return fs$readdir(path, options, fs$readdirCallback(\n path, options, cb, startTime\n ))\n }\n\n return go$readdir(path, options, cb)\n\n function fs$readdirCallback (path, options, cb, startTime) {\n return function (err, files) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([\n go$readdir,\n [path, options, cb],\n err,\n startTime || Date.now(),\n Date.now()\n ])\n else {\n if (files && files.sort)\n files.sort()\n\n if (typeof cb === 'function')\n cb.call(this, err, files)\n }\n }\n }\n }\n\n if (process.version.substr(0, 4) === 'v0.8') {\n var legStreams = legacy(fs)\n ReadStream = legStreams.ReadStream\n WriteStream = legStreams.WriteStream\n }\n\n var fs$ReadStream = fs.ReadStream\n if (fs$ReadStream) {\n ReadStream.prototype = Object.create(fs$ReadStream.prototype)\n ReadStream.prototype.open = ReadStream$open\n }\n\n var fs$WriteStream = fs.WriteStream\n if (fs$WriteStream) {\n WriteStream.prototype = Object.create(fs$WriteStream.prototype)\n WriteStream.prototype.open = WriteStream$open\n }\n\n Object.defineProperty(fs, 'ReadStream', {\n get: function () {\n return ReadStream\n },\n set: function (val) {\n ReadStream = val\n },\n enumerable: true,\n configurable: true\n })\n Object.defineProperty(fs, 'WriteStream', {\n get: function () {\n return WriteStream\n },\n set: function (val) {\n WriteStream = val\n },\n enumerable: true,\n configurable: true\n })\n\n // legacy names\n var FileReadStream = ReadStream\n Object.defineProperty(fs, 'FileReadStream', {\n get: function () {\n return FileReadStream\n },\n set: function (val) {\n FileReadStream = val\n },\n enumerable: true,\n configurable: true\n })\n var FileWriteStream = WriteStream\n Object.defineProperty(fs, 'FileWriteStream', {\n get: function () {\n return FileWriteStream\n },\n set: function (val) {\n FileWriteStream = val\n },\n enumerable: true,\n configurable: true\n })\n\n function ReadStream (path, options) {\n if (this instanceof ReadStream)\n return fs$ReadStream.apply(this, arguments), this\n else\n return ReadStream.apply(Object.create(ReadStream.prototype), arguments)\n }\n\n function ReadStream$open () {\n var that = this\n open(that.path, that.flags, that.mode, function (err, fd) {\n if (err) {\n if (that.autoClose)\n that.destroy()\n\n that.emit('error', err)\n } else {\n that.fd = fd\n that.emit('open', fd)\n that.read()\n }\n })\n }\n\n function WriteStream (path, options) {\n if (this instanceof WriteStream)\n return fs$WriteStream.apply(this, arguments), this\n else\n return WriteStream.apply(Object.create(WriteStream.prototype), arguments)\n }\n\n function WriteStream$open () {\n var that = this\n open(that.path, that.flags, that.mode, function (err, fd) {\n if (err) {\n that.destroy()\n that.emit('error', err)\n } else {\n that.fd = fd\n that.emit('open', fd)\n }\n })\n }\n\n function createReadStream (path, options) {\n return new fs.ReadStream(path, options)\n }\n\n function createWriteStream (path, options) {\n return new fs.WriteStream(path, options)\n }\n\n var fs$open = fs.open\n fs.open = open\n function open (path, flags, mode, cb) {\n if (typeof mode === 'function')\n cb = mode, mode = null\n\n return go$open(path, flags, mode, cb)\n\n function go$open (path, flags, mode, cb, startTime) {\n return fs$open(path, flags, mode, function (err, fd) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n return fs\n}\n\nfunction enqueue (elem) {\n debug('ENQUEUE', elem[0].name, elem[1])\n fs[gracefulQueue].push(elem)\n retry()\n}\n\n// keep track of the timeout between retry() calls\nvar retryTimer\n\n// reset the startTime and lastTime to now\n// this resets the start of the 60 second overall timeout as well as the\n// delay between attempts so that we'll retry these jobs sooner\nfunction resetQueue () {\n var now = Date.now()\n for (var i = 0; i < fs[gracefulQueue].length; ++i) {\n // entries that are only a length of 2 are from an older version, don't\n // bother modifying those since they'll be retried anyway.\n if (fs[gracefulQueue][i].length > 2) {\n fs[gracefulQueue][i][3] = now // startTime\n fs[gracefulQueue][i][4] = now // lastTime\n }\n }\n // call retry to make sure we're actively processing the queue\n retry()\n}\n\nfunction retry () {\n // clear the timer and remove it to help prevent unintended concurrency\n clearTimeout(retryTimer)\n retryTimer = undefined\n\n if (fs[gracefulQueue].length === 0)\n return\n\n var elem = fs[gracefulQueue].shift()\n var fn = elem[0]\n var args = elem[1]\n // these items may be unset if they were added by an older graceful-fs\n var err = elem[2]\n var startTime = elem[3]\n var lastTime = elem[4]\n\n // if we don't have a startTime we have no way of knowing if we've waited\n // long enough, so go ahead and retry this item now\n if (startTime === undefined) {\n debug('RETRY', fn.name, args)\n fn.apply(null, args)\n } else if (Date.now() - startTime >= 60000) {\n // it's been more than 60 seconds total, bail now\n debug('TIMEOUT', fn.name, args)\n var cb = args.pop()\n if (typeof cb === 'function')\n cb.call(null, err)\n } else {\n // the amount of time between the last attempt and right now\n var sinceAttempt = Date.now() - lastTime\n // the amount of time between when we first tried, and when we last tried\n // rounded up to at least 1\n var sinceStart = Math.max(lastTime - startTime, 1)\n // backoff. wait longer than the total time we've been retrying, but only\n // up to a maximum of 100ms\n var desiredDelay = Math.min(sinceStart * 1.2, 100)\n // it's been long enough since the last retry, do it again\n if (sinceAttempt >= desiredDelay) {\n debug('RETRY', fn.name, args)\n fn.apply(null, args.concat([startTime]))\n } else {\n // if we can't do this job yet, push it to the end of the queue\n // and let the next iteration check again\n fs[gracefulQueue].push(elem)\n }\n }\n\n // schedule our next run if one isn't already scheduled\n if (retryTimer === undefined) {\n retryTimer = setTimeout(retry, 0)\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM3MzUuanMiLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxtQkFBTyxDQUFDLEtBQUk7QUFDckIsZ0JBQWdCLG1CQUFPLENBQUMsS0FBZ0I7QUFDeEMsYUFBYSxtQkFBTyxDQUFDLEtBQXFCO0FBQzFDLFlBQVksbUJBQU8sQ0FBQyxJQUFZOztBQUVoQyxXQUFXLG1CQUFPLENBQUMsS0FBTTs7QUFFekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdDQUF1QjtBQUM3QixLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsOEJBQThCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2dyYWNlZnVsLWZzLmpzPzBkYTciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIHBvbHlmaWxscyA9IHJlcXVpcmUoJy4vcG9seWZpbGxzLmpzJylcbnZhciBsZWdhY3kgPSByZXF1aXJlKCcuL2xlZ2FjeS1zdHJlYW1zLmpzJylcbnZhciBjbG9uZSA9IHJlcXVpcmUoJy4vY2xvbmUuanMnKVxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIG5vZGUgMC54IHBvbHlmaWxsICovXG52YXIgZ3JhY2VmdWxRdWV1ZVxudmFyIHByZXZpb3VzU3ltYm9sXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0gbm9kZSAwLnggcG9seWZpbGwgKi9cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuZm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGdyYWNlZnVsUXVldWUgPSBTeW1ib2wuZm9yKCdncmFjZWZ1bC1mcy5xdWV1ZScpXG4gIC8vIFRoaXMgaXMgdXNlZCBpbiB0ZXN0aW5nIGJ5IGZ1dHVyZSB2ZXJzaW9uc1xuICBwcmV2aW91c1N5bWJvbCA9IFN5bWJvbC5mb3IoJ2dyYWNlZnVsLWZzLnByZXZpb3VzJylcbn0gZWxzZSB7XG4gIGdyYWNlZnVsUXVldWUgPSAnX19fZ3JhY2VmdWwtZnMucXVldWUnXG4gIHByZXZpb3VzU3ltYm9sID0gJ19fX2dyYWNlZnVsLWZzLnByZXZpb3VzJ1xufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIHB1Ymxpc2hRdWV1ZShjb250ZXh0LCBxdWV1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dCwgZ3JhY2VmdWxRdWV1ZSwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcXVldWVcbiAgICB9XG4gIH0pXG59XG5cbnZhciBkZWJ1ZyA9IG5vb3BcbmlmICh1dGlsLmRlYnVnbG9nKVxuICBkZWJ1ZyA9IHV0aWwuZGVidWdsb2coJ2dmczQnKVxuZWxzZSBpZiAoL1xcYmdmczRcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJycpKVxuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBtID0gdXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKVxuICAgIG0gPSAnR0ZTNDogJyArIG0uc3BsaXQoL1xcbi8pLmpvaW4oJ1xcbkdGUzQ6ICcpXG4gICAgY29uc29sZS5lcnJvcihtKVxuICB9XG5cbi8vIE9uY2UgdGltZSBpbml0aWFsaXphdGlvblxuaWYgKCFmc1tncmFjZWZ1bFF1ZXVlXSkge1xuICAvLyBUaGlzIHF1ZXVlIGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgbG9hZGVkIGluc3RhbmNlc1xuICB2YXIgcXVldWUgPSBnbG9iYWxbZ3JhY2VmdWxRdWV1ZV0gfHwgW11cbiAgcHVibGlzaFF1ZXVlKGZzLCBxdWV1ZSlcblxuICAvLyBQYXRjaCBmcy5jbG9zZS9jbG9zZVN5bmMgdG8gc2hhcmVkIHF1ZXVlIHZlcnNpb24sIGJlY2F1c2Ugd2UgbmVlZFxuICAvLyB0byByZXRyeSgpIHdoZW5ldmVyIGEgY2xvc2UgaGFwcGVucyAqYW55d2hlcmUqIGluIHRoZSBwcm9ncmFtLlxuICAvLyBUaGlzIGlzIGVzc2VudGlhbCB3aGVuIG11bHRpcGxlIGdyYWNlZnVsLWZzIGluc3RhbmNlcyBhcmVcbiAgLy8gaW4gcGxheSBhdCB0aGUgc2FtZSB0aW1lLlxuICBmcy5jbG9zZSA9IChmdW5jdGlvbiAoZnMkY2xvc2UpIHtcbiAgICBmdW5jdGlvbiBjbG9zZSAoZmQsIGNiKSB7XG4gICAgICByZXR1cm4gZnMkY2xvc2UuY2FsbChmcywgZmQsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBncmFjZWZ1bC1mcyBzaGFyZWQgcXVldWVcbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICByZXNldFF1ZXVlKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvc2UsIHByZXZpb3VzU3ltYm9sLCB7XG4gICAgICB2YWx1ZTogZnMkY2xvc2VcbiAgICB9KVxuICAgIHJldHVybiBjbG9zZVxuICB9KShmcy5jbG9zZSlcblxuICBmcy5jbG9zZVN5bmMgPSAoZnVuY3Rpb24gKGZzJGNsb3NlU3luYykge1xuICAgIGZ1bmN0aW9uIGNsb3NlU3luYyAoZmQpIHtcbiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZ3JhY2VmdWwtZnMgc2hhcmVkIHF1ZXVlXG4gICAgICBmcyRjbG9zZVN5bmMuYXBwbHkoZnMsIGFyZ3VtZW50cylcbiAgICAgIHJlc2V0UXVldWUoKVxuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9zZVN5bmMsIHByZXZpb3VzU3ltYm9sLCB7XG4gICAgICB2YWx1ZTogZnMkY2xvc2VTeW5jXG4gICAgfSlcbiAgICByZXR1cm4gY2xvc2VTeW5jXG4gIH0pKGZzLmNsb3NlU3luYylcblxuICBpZiAoL1xcYmdmczRcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJycpKSB7XG4gICAgcHJvY2Vzcy5vbignZXhpdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgZGVidWcoZnNbZ3JhY2VmdWxRdWV1ZV0pXG4gICAgICByZXF1aXJlKCdhc3NlcnQnKS5lcXVhbChmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGgsIDApXG4gICAgfSlcbiAgfVxufVxuXG5pZiAoIWdsb2JhbFtncmFjZWZ1bFF1ZXVlXSkge1xuICBwdWJsaXNoUXVldWUoZ2xvYmFsLCBmc1tncmFjZWZ1bFF1ZXVlXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2goY2xvbmUoZnMpKVxuaWYgKHByb2Nlc3MuZW52LlRFU1RfR1JBQ0VGVUxfRlNfR0xPQkFMX1BBVENIICYmICFmcy5fX3BhdGNoZWQpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBhdGNoKGZzKVxuICAgIGZzLl9fcGF0Y2hlZCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHBhdGNoIChmcykge1xuICAvLyBFdmVyeXRoaW5nIHRoYXQgcmVmZXJlbmNlcyB0aGUgb3BlbigpIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGluIGhlcmVcbiAgcG9seWZpbGxzKGZzKVxuICBmcy5ncmFjZWZ1bGlmeSA9IHBhdGNoXG5cbiAgZnMuY3JlYXRlUmVhZFN0cmVhbSA9IGNyZWF0ZVJlYWRTdHJlYW1cbiAgZnMuY3JlYXRlV3JpdGVTdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbVxuICB2YXIgZnMkcmVhZEZpbGUgPSBmcy5yZWFkRmlsZVxuICBmcy5yZWFkRmlsZSA9IHJlYWRGaWxlXG4gIGZ1bmN0aW9uIHJlYWRGaWxlIChwYXRoLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyRyZWFkRmlsZShwYXRoLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJHJlYWRGaWxlIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkcmVhZEZpbGUocGF0aCwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRyZWFkRmlsZSwgW3BhdGgsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJHdyaXRlRmlsZSA9IGZzLndyaXRlRmlsZVxuICBmcy53cml0ZUZpbGUgPSB3cml0ZUZpbGVcbiAgZnVuY3Rpb24gd3JpdGVGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyR3cml0ZUZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyR3cml0ZUZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyR3cml0ZUZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyR3cml0ZUZpbGUsIFtwYXRoLCBkYXRhLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRhcHBlbmRGaWxlID0gZnMuYXBwZW5kRmlsZVxuICBpZiAoZnMkYXBwZW5kRmlsZSlcbiAgICBmcy5hcHBlbmRGaWxlID0gYXBwZW5kRmlsZVxuICBmdW5jdGlvbiBhcHBlbmRGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyRhcHBlbmRGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kYXBwZW5kRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJGFwcGVuZEZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRhcHBlbmRGaWxlLCBbcGF0aCwgZGF0YSwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkY29weUZpbGUgPSBmcy5jb3B5RmlsZVxuICBpZiAoZnMkY29weUZpbGUpXG4gICAgZnMuY29weUZpbGUgPSBjb3B5RmlsZVxuICBmdW5jdGlvbiBjb3B5RmlsZSAoc3JjLCBkZXN0LCBmbGFncywgY2IpIHtcbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IGZsYWdzXG4gICAgICBmbGFncyA9IDBcbiAgICB9XG4gICAgcmV0dXJuIGdvJGNvcHlGaWxlKHNyYywgZGVzdCwgZmxhZ3MsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kY29weUZpbGUgKHNyYywgZGVzdCwgZmxhZ3MsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRjb3B5RmlsZShzcmMsIGRlc3QsIGZsYWdzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJGNvcHlGaWxlLCBbc3JjLCBkZXN0LCBmbGFncywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkcmVhZGRpciA9IGZzLnJlYWRkaXJcbiAgZnMucmVhZGRpciA9IHJlYWRkaXJcbiAgdmFyIG5vUmVhZGRpck9wdGlvblZlcnNpb25zID0gL152WzAtNV1cXC4vXG4gIGZ1bmN0aW9uIHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgdmFyIGdvJHJlYWRkaXIgPSBub1JlYWRkaXJPcHRpb25WZXJzaW9ucy50ZXN0KHByb2Nlc3MudmVyc2lvbilcbiAgICAgID8gZnVuY3Rpb24gZ28kcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZGRpcihwYXRoLCBmcyRyZWFkZGlyQ2FsbGJhY2soXG4gICAgICAgICAgcGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZVxuICAgICAgICApKVxuICAgICAgfVxuICAgICAgOiBmdW5jdGlvbiBnbyRyZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkZGlyKHBhdGgsIG9wdGlvbnMsIGZzJHJlYWRkaXJDYWxsYmFjayhcbiAgICAgICAgICBwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lXG4gICAgICAgICkpXG4gICAgICB9XG5cbiAgICByZXR1cm4gZ28kcmVhZGRpcihwYXRoLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGZzJHJlYWRkaXJDYWxsYmFjayAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlcnIsIGZpbGVzKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW1xuICAgICAgICAgICAgZ28kcmVhZGRpcixcbiAgICAgICAgICAgIFtwYXRoLCBvcHRpb25zLCBjYl0sXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIERhdGUubm93KClcbiAgICAgICAgICBdKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMuc29ydClcbiAgICAgICAgICAgIGZpbGVzLnNvcnQoKVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmNhbGwodGhpcywgZXJyLCBmaWxlcylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLnZlcnNpb24uc3Vic3RyKDAsIDQpID09PSAndjAuOCcpIHtcbiAgICB2YXIgbGVnU3RyZWFtcyA9IGxlZ2FjeShmcylcbiAgICBSZWFkU3RyZWFtID0gbGVnU3RyZWFtcy5SZWFkU3RyZWFtXG4gICAgV3JpdGVTdHJlYW0gPSBsZWdTdHJlYW1zLldyaXRlU3RyZWFtXG4gIH1cblxuICB2YXIgZnMkUmVhZFN0cmVhbSA9IGZzLlJlYWRTdHJlYW1cbiAgaWYgKGZzJFJlYWRTdHJlYW0pIHtcbiAgICBSZWFkU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZnMkUmVhZFN0cmVhbS5wcm90b3R5cGUpXG4gICAgUmVhZFN0cmVhbS5wcm90b3R5cGUub3BlbiA9IFJlYWRTdHJlYW0kb3BlblxuICB9XG5cbiAgdmFyIGZzJFdyaXRlU3RyZWFtID0gZnMuV3JpdGVTdHJlYW1cbiAgaWYgKGZzJFdyaXRlU3RyZWFtKSB7XG4gICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShmcyRXcml0ZVN0cmVhbS5wcm90b3R5cGUpXG4gICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlLm9wZW4gPSBXcml0ZVN0cmVhbSRvcGVuXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdSZWFkU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFJlYWRTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgUmVhZFN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnV3JpdGVTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gV3JpdGVTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgV3JpdGVTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgLy8gbGVnYWN5IG5hbWVzXG4gIHZhciBGaWxlUmVhZFN0cmVhbSA9IFJlYWRTdHJlYW1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnRmlsZVJlYWRTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gRmlsZVJlYWRTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgRmlsZVJlYWRTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG4gIHZhciBGaWxlV3JpdGVTdHJlYW0gPSBXcml0ZVN0cmVhbVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdGaWxlV3JpdGVTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gRmlsZVdyaXRlU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIEZpbGVXcml0ZVN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICBmdW5jdGlvbiBSZWFkU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWFkU3RyZWFtKVxuICAgICAgcmV0dXJuIGZzJFJlYWRTdHJlYW0uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGhpc1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBSZWFkU3RyZWFtLmFwcGx5KE9iamVjdC5jcmVhdGUoUmVhZFN0cmVhbS5wcm90b3R5cGUpLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBSZWFkU3RyZWFtJG9wZW4gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIG9wZW4odGhhdC5wYXRoLCB0aGF0LmZsYWdzLCB0aGF0Lm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGlmICh0aGF0LmF1dG9DbG9zZSlcbiAgICAgICAgICB0aGF0LmRlc3Ryb3koKVxuXG4gICAgICAgIHRoYXQuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGF0LmZkID0gZmRcbiAgICAgICAgdGhhdC5lbWl0KCdvcGVuJywgZmQpXG4gICAgICAgIHRoYXQucmVhZCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIFdyaXRlU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBXcml0ZVN0cmVhbSlcbiAgICAgIHJldHVybiBmcyRXcml0ZVN0cmVhbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIFdyaXRlU3RyZWFtLmFwcGx5KE9iamVjdC5jcmVhdGUoV3JpdGVTdHJlYW0ucHJvdG90eXBlKSwgYXJndW1lbnRzKVxuICB9XG5cbiAgZnVuY3Rpb24gV3JpdGVTdHJlYW0kb3BlbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgb3Blbih0aGF0LnBhdGgsIHRoYXQuZmxhZ3MsIHRoYXQubW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdGhhdC5kZXN0cm95KClcbiAgICAgICAgdGhhdC5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoYXQuZmQgPSBmZFxuICAgICAgICB0aGF0LmVtaXQoJ29wZW4nLCBmZClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVhZFN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgZnMuUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlV3JpdGVTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IGZzLldyaXRlU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIH1cblxuICB2YXIgZnMkb3BlbiA9IGZzLm9wZW5cbiAgZnMub3BlbiA9IG9wZW5cbiAgZnVuY3Rpb24gb3BlbiAocGF0aCwgZmxhZ3MsIG1vZGUsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBtb2RlID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBtb2RlLCBtb2RlID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJG9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kb3BlbiAocGF0aCwgZmxhZ3MsIG1vZGUsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRvcGVuLCBbcGF0aCwgZmxhZ3MsIG1vZGUsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZzXG59XG5cbmZ1bmN0aW9uIGVucXVldWUgKGVsZW0pIHtcbiAgZGVidWcoJ0VOUVVFVUUnLCBlbGVtWzBdLm5hbWUsIGVsZW1bMV0pXG4gIGZzW2dyYWNlZnVsUXVldWVdLnB1c2goZWxlbSlcbiAgcmV0cnkoKVxufVxuXG4vLyBrZWVwIHRyYWNrIG9mIHRoZSB0aW1lb3V0IGJldHdlZW4gcmV0cnkoKSBjYWxsc1xudmFyIHJldHJ5VGltZXJcblxuLy8gcmVzZXQgdGhlIHN0YXJ0VGltZSBhbmQgbGFzdFRpbWUgdG8gbm93XG4vLyB0aGlzIHJlc2V0cyB0aGUgc3RhcnQgb2YgdGhlIDYwIHNlY29uZCBvdmVyYWxsIHRpbWVvdXQgYXMgd2VsbCBhcyB0aGVcbi8vIGRlbGF5IGJldHdlZW4gYXR0ZW1wdHMgc28gdGhhdCB3ZSdsbCByZXRyeSB0aGVzZSBqb2JzIHNvb25lclxuZnVuY3Rpb24gcmVzZXRRdWV1ZSAoKSB7XG4gIHZhciBub3cgPSBEYXRlLm5vdygpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBlbnRyaWVzIHRoYXQgYXJlIG9ubHkgYSBsZW5ndGggb2YgMiBhcmUgZnJvbSBhbiBvbGRlciB2ZXJzaW9uLCBkb24ndFxuICAgIC8vIGJvdGhlciBtb2RpZnlpbmcgdGhvc2Ugc2luY2UgdGhleSdsbCBiZSByZXRyaWVkIGFueXdheS5cbiAgICBpZiAoZnNbZ3JhY2VmdWxRdWV1ZV1baV0ubGVuZ3RoID4gMikge1xuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV1baV1bM10gPSBub3cgLy8gc3RhcnRUaW1lXG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXVtpXVs0XSA9IG5vdyAvLyBsYXN0VGltZVxuICAgIH1cbiAgfVxuICAvLyBjYWxsIHJldHJ5IHRvIG1ha2Ugc3VyZSB3ZSdyZSBhY3RpdmVseSBwcm9jZXNzaW5nIHRoZSBxdWV1ZVxuICByZXRyeSgpXG59XG5cbmZ1bmN0aW9uIHJldHJ5ICgpIHtcbiAgLy8gY2xlYXIgdGhlIHRpbWVyIGFuZCByZW1vdmUgaXQgdG8gaGVscCBwcmV2ZW50IHVuaW50ZW5kZWQgY29uY3VycmVuY3lcbiAgY2xlYXJUaW1lb3V0KHJldHJ5VGltZXIpXG4gIHJldHJ5VGltZXIgPSB1bmRlZmluZWRcblxuICBpZiAoZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoID09PSAwKVxuICAgIHJldHVyblxuXG4gIHZhciBlbGVtID0gZnNbZ3JhY2VmdWxRdWV1ZV0uc2hpZnQoKVxuICB2YXIgZm4gPSBlbGVtWzBdXG4gIHZhciBhcmdzID0gZWxlbVsxXVxuICAvLyB0aGVzZSBpdGVtcyBtYXkgYmUgdW5zZXQgaWYgdGhleSB3ZXJlIGFkZGVkIGJ5IGFuIG9sZGVyIGdyYWNlZnVsLWZzXG4gIHZhciBlcnIgPSBlbGVtWzJdXG4gIHZhciBzdGFydFRpbWUgPSBlbGVtWzNdXG4gIHZhciBsYXN0VGltZSA9IGVsZW1bNF1cblxuICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3RhcnRUaW1lIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgaWYgd2UndmUgd2FpdGVkXG4gIC8vIGxvbmcgZW5vdWdoLCBzbyBnbyBhaGVhZCBhbmQgcmV0cnkgdGhpcyBpdGVtIG5vd1xuICBpZiAoc3RhcnRUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBkZWJ1ZygnUkVUUlknLCBmbi5uYW1lLCBhcmdzKVxuICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpXG4gIH0gZWxzZSBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSA2MDAwMCkge1xuICAgIC8vIGl0J3MgYmVlbiBtb3JlIHRoYW4gNjAgc2Vjb25kcyB0b3RhbCwgYmFpbCBub3dcbiAgICBkZWJ1ZygnVElNRU9VVCcsIGZuLm5hbWUsIGFyZ3MpXG4gICAgdmFyIGNiID0gYXJncy5wb3AoKVxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYi5jYWxsKG51bGwsIGVycilcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBhdHRlbXB0IGFuZCByaWdodCBub3dcbiAgICB2YXIgc2luY2VBdHRlbXB0ID0gRGF0ZS5ub3coKSAtIGxhc3RUaW1lXG4gICAgLy8gdGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gd2hlbiB3ZSBmaXJzdCB0cmllZCwgYW5kIHdoZW4gd2UgbGFzdCB0cmllZFxuICAgIC8vIHJvdW5kZWQgdXAgdG8gYXQgbGVhc3QgMVxuICAgIHZhciBzaW5jZVN0YXJ0ID0gTWF0aC5tYXgobGFzdFRpbWUgLSBzdGFydFRpbWUsIDEpXG4gICAgLy8gYmFja29mZi4gd2FpdCBsb25nZXIgdGhhbiB0aGUgdG90YWwgdGltZSB3ZSd2ZSBiZWVuIHJldHJ5aW5nLCBidXQgb25seVxuICAgIC8vIHVwIHRvIGEgbWF4aW11bSBvZiAxMDBtc1xuICAgIHZhciBkZXNpcmVkRGVsYXkgPSBNYXRoLm1pbihzaW5jZVN0YXJ0ICogMS4yLCAxMDApXG4gICAgLy8gaXQncyBiZWVuIGxvbmcgZW5vdWdoIHNpbmNlIHRoZSBsYXN0IHJldHJ5LCBkbyBpdCBhZ2FpblxuICAgIGlmIChzaW5jZUF0dGVtcHQgPj0gZGVzaXJlZERlbGF5KSB7XG4gICAgICBkZWJ1ZygnUkVUUlknLCBmbi5uYW1lLCBhcmdzKVxuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncy5jb25jYXQoW3N0YXJ0VGltZV0pKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiB3ZSBjYW4ndCBkbyB0aGlzIGpvYiB5ZXQsIHB1c2ggaXQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcbiAgICAgIC8vIGFuZCBsZXQgdGhlIG5leHQgaXRlcmF0aW9uIGNoZWNrIGFnYWluXG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXS5wdXNoKGVsZW0pXG4gICAgfVxuICB9XG5cbiAgLy8gc2NoZWR1bGUgb3VyIG5leHQgcnVuIGlmIG9uZSBpc24ndCBhbHJlYWR5IHNjaGVkdWxlZFxuICBpZiAocmV0cnlUaW1lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0cnlUaW1lciA9IHNldFRpbWVvdXQocmV0cnksIDApXG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///63735\n")},11995:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Stream = (__webpack_require__(2203).Stream)\n\nmodule.exports = legacy\n\nfunction legacy (fs) {\n return {\n ReadStream: ReadStream,\n WriteStream: WriteStream\n }\n\n function ReadStream (path, options) {\n if (!(this instanceof ReadStream)) return new ReadStream(path, options);\n\n Stream.call(this);\n\n var self = this;\n\n this.path = path;\n this.fd = null;\n this.readable = true;\n this.paused = false;\n\n this.flags = 'r';\n this.mode = 438; /*=0666*/\n this.bufferSize = 64 * 1024;\n\n options = options || {};\n\n // Mixin options into this\n var keys = Object.keys(options);\n for (var index = 0, length = keys.length; index < length; index++) {\n var key = keys[index];\n this[key] = options[key];\n }\n\n if (this.encoding) this.setEncoding(this.encoding);\n\n if (this.start !== undefined) {\n if ('number' !== typeof this.start) {\n throw TypeError('start must be a Number');\n }\n if (this.end === undefined) {\n this.end = Infinity;\n } else if ('number' !== typeof this.end) {\n throw TypeError('end must be a Number');\n }\n\n if (this.start > this.end) {\n throw new Error('start must be <= end');\n }\n\n this.pos = this.start;\n }\n\n if (this.fd !== null) {\n process.nextTick(function() {\n self._read();\n });\n return;\n }\n\n fs.open(this.path, this.flags, this.mode, function (err, fd) {\n if (err) {\n self.emit('error', err);\n self.readable = false;\n return;\n }\n\n self.fd = fd;\n self.emit('open', fd);\n self._read();\n })\n }\n\n function WriteStream (path, options) {\n if (!(this instanceof WriteStream)) return new WriteStream(path, options);\n\n Stream.call(this);\n\n this.path = path;\n this.fd = null;\n this.writable = true;\n\n this.flags = 'w';\n this.encoding = 'binary';\n this.mode = 438; /*=0666*/\n this.bytesWritten = 0;\n\n options = options || {};\n\n // Mixin options into this\n var keys = Object.keys(options);\n for (var index = 0, length = keys.length; index < length; index++) {\n var key = keys[index];\n this[key] = options[key];\n }\n\n if (this.start !== undefined) {\n if ('number' !== typeof this.start) {\n throw TypeError('start must be a Number');\n }\n if (this.start < 0) {\n throw new Error('start must be >= zero');\n }\n\n this.pos = this.start;\n }\n\n this.busy = false;\n this._queue = [];\n\n if (this.fd === null) {\n this._open = fs.open;\n this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);\n this.flush();\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5OTUuanMiLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxrQ0FBd0I7O0FBRXJDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsOENBQThDLGdCQUFnQjtBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEMsZ0JBQWdCO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2xlZ2FjeS1zdHJlYW1zLmpzP2MwMmYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxlZ2FjeVxuXG5mdW5jdGlvbiBsZWdhY3kgKGZzKSB7XG4gIHJldHVybiB7XG4gICAgUmVhZFN0cmVhbTogUmVhZFN0cmVhbSxcbiAgICBXcml0ZVN0cmVhbTogV3JpdGVTdHJlYW1cbiAgfVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSkpIHJldHVybiBuZXcgUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKTtcblxuICAgIFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmZkID0gbnVsbDtcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5mbGFncyA9ICdyJztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnVmZmVyU2l6ZSA9IDY0ICogMTAyNDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5jb2RpbmcpIHRoaXMuc2V0RW5jb2RpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICBpZiAodGhpcy5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLnN0YXJ0KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignc3RhcnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5lbmQgPSBJbmZpbml0eTtcbiAgICAgIH0gZWxzZSBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLmVuZCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ2VuZCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0ID4gdGhpcy5lbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBtdXN0IGJlIDw9IGVuZCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmQgIT09IG51bGwpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX3JlYWQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm9wZW4odGhpcy5wYXRoLCB0aGlzLmZsYWdzLCB0aGlzLm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICBzZWxmLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi5mZCA9IGZkO1xuICAgICAgc2VsZi5lbWl0KCdvcGVuJywgZmQpO1xuICAgICAgc2VsZi5fcmVhZCgpO1xuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0ZVN0cmVhbSkpIHJldHVybiBuZXcgV3JpdGVTdHJlYW0ocGF0aCwgb3B0aW9ucyk7XG5cbiAgICBTdHJlYW0uY2FsbCh0aGlzKTtcblxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5mZCA9IG51bGw7XG4gICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgICB0aGlzLmZsYWdzID0gJ3cnO1xuICAgIHRoaXMuZW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5zdGFydCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ3N0YXJ0IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXJ0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG11c3QgYmUgPj0gemVybycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcblxuICAgIGlmICh0aGlzLmZkID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9vcGVuID0gZnMub3BlbjtcbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2goW3RoaXMuX29wZW4sIHRoaXMucGF0aCwgdGhpcy5mbGFncywgdGhpcy5tb2RlLCB1bmRlZmluZWRdKTtcbiAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///11995\n")},69106:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var constants = __webpack_require__(49140)\n\nvar origCwd = process.cwd\nvar cwd = null\n\nvar platform = process.env.GRACEFUL_FS_PLATFORM || process.platform\n\nprocess.cwd = function() {\n if (!cwd)\n cwd = origCwd.call(process)\n return cwd\n}\ntry {\n process.cwd()\n} catch (er) {}\n\n// This check is needed until node.js 12 is required\nif (typeof process.chdir === 'function') {\n var chdir = process.chdir\n process.chdir = function (d) {\n cwd = null\n chdir.call(process, d)\n }\n if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir)\n}\n\nmodule.exports = patch\n\nfunction patch (fs) {\n // (re-)implement some things that are known busted or missing.\n\n // lchmod, broken prior to 0.6.2\n // back-port the fix here.\n if (constants.hasOwnProperty('O_SYMLINK') &&\n process.version.match(/^v0\\.6\\.[0-2]|^v0\\.5\\./)) {\n patchLchmod(fs)\n }\n\n // lutimes implementation, or no-op\n if (!fs.lutimes) {\n patchLutimes(fs)\n }\n\n // https://github.com/isaacs/node-graceful-fs/issues/4\n // Chown should not fail on einval or eperm if non-root.\n // It should not fail on enosys ever, as this just indicates\n // that a fs doesn't support the intended operation.\n\n fs.chown = chownFix(fs.chown)\n fs.fchown = chownFix(fs.fchown)\n fs.lchown = chownFix(fs.lchown)\n\n fs.chmod = chmodFix(fs.chmod)\n fs.fchmod = chmodFix(fs.fchmod)\n fs.lchmod = chmodFix(fs.lchmod)\n\n fs.chownSync = chownFixSync(fs.chownSync)\n fs.fchownSync = chownFixSync(fs.fchownSync)\n fs.lchownSync = chownFixSync(fs.lchownSync)\n\n fs.chmodSync = chmodFixSync(fs.chmodSync)\n fs.fchmodSync = chmodFixSync(fs.fchmodSync)\n fs.lchmodSync = chmodFixSync(fs.lchmodSync)\n\n fs.stat = statFix(fs.stat)\n fs.fstat = statFix(fs.fstat)\n fs.lstat = statFix(fs.lstat)\n\n fs.statSync = statFixSync(fs.statSync)\n fs.fstatSync = statFixSync(fs.fstatSync)\n fs.lstatSync = statFixSync(fs.lstatSync)\n\n // if lchmod/lchown do not exist, then make them no-ops\n if (fs.chmod && !fs.lchmod) {\n fs.lchmod = function (path, mode, cb) {\n if (cb) process.nextTick(cb)\n }\n fs.lchmodSync = function () {}\n }\n if (fs.chown && !fs.lchown) {\n fs.lchown = function (path, uid, gid, cb) {\n if (cb) process.nextTick(cb)\n }\n fs.lchownSync = function () {}\n }\n\n // on Windows, A/V software can lock the directory, causing this\n // to fail with an EACCES or EPERM if the directory contains newly\n // created files. Try again on failure, for up to 60 seconds.\n\n // Set the timeout this long because some Windows Anti-Virus, such as Parity\n // bit9, may lock files for up to a minute, causing npm package install\n // failures. Also, take care to yield the scheduler. Windows scheduling gives\n // CPU to a busy looping process, which can cause the program causing the lock\n // contention to be starved of CPU by node, so the contention doesn't resolve.\n if (platform === \"win32\") {\n fs.rename = typeof fs.rename !== 'function' ? fs.rename\n : (function (fs$rename) {\n function rename (from, to, cb) {\n var start = Date.now()\n var backoff = 0;\n fs$rename(from, to, function CB (er) {\n if (er\n && (er.code === \"EACCES\" || er.code === \"EPERM\" || er.code === \"EBUSY\")\n && Date.now() - start < 60000) {\n setTimeout(function() {\n fs.stat(to, function (stater, st) {\n if (stater && stater.code === \"ENOENT\")\n fs$rename(from, to, CB);\n else\n cb(er)\n })\n }, backoff)\n if (backoff < 100)\n backoff += 10;\n return;\n }\n if (cb) cb(er)\n })\n }\n if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename)\n return rename\n })(fs.rename)\n }\n\n // if read() returns EAGAIN, then just try it again.\n fs.read = typeof fs.read !== 'function' ? fs.read\n : (function (fs$read) {\n function read (fd, buffer, offset, length, position, callback_) {\n var callback\n if (callback_ && typeof callback_ === 'function') {\n var eagCounter = 0\n callback = function (er, _, __) {\n if (er && er.code === 'EAGAIN' && eagCounter < 10) {\n eagCounter ++\n return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n }\n callback_.apply(this, arguments)\n }\n }\n return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n }\n\n // This ensures `util.promisify` works as it does for native `fs.read`.\n if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read)\n return read\n })(fs.read)\n\n fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync\n : (function (fs$readSync) { return function (fd, buffer, offset, length, position) {\n var eagCounter = 0\n while (true) {\n try {\n return fs$readSync.call(fs, fd, buffer, offset, length, position)\n } catch (er) {\n if (er.code === 'EAGAIN' && eagCounter < 10) {\n eagCounter ++\n continue\n }\n throw er\n }\n }\n }})(fs.readSync)\n\n function patchLchmod (fs) {\n fs.lchmod = function (path, mode, callback) {\n fs.open( path\n , constants.O_WRONLY | constants.O_SYMLINK\n , mode\n , function (err, fd) {\n if (err) {\n if (callback) callback(err)\n return\n }\n // prefer to return the chmod error, if one occurs,\n // but still try to close, and report closing errors if they occur.\n fs.fchmod(fd, mode, function (err) {\n fs.close(fd, function(err2) {\n if (callback) callback(err || err2)\n })\n })\n })\n }\n\n fs.lchmodSync = function (path, mode) {\n var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)\n\n // prefer to return the chmod error, if one occurs,\n // but still try to close, and report closing errors if they occur.\n var threw = true\n var ret\n try {\n ret = fs.fchmodSync(fd, mode)\n threw = false\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd)\n } catch (er) {}\n } else {\n fs.closeSync(fd)\n }\n }\n return ret\n }\n }\n\n function patchLutimes (fs) {\n if (constants.hasOwnProperty(\"O_SYMLINK\") && fs.futimes) {\n fs.lutimes = function (path, at, mt, cb) {\n fs.open(path, constants.O_SYMLINK, function (er, fd) {\n if (er) {\n if (cb) cb(er)\n return\n }\n fs.futimes(fd, at, mt, function (er) {\n fs.close(fd, function (er2) {\n if (cb) cb(er || er2)\n })\n })\n })\n }\n\n fs.lutimesSync = function (path, at, mt) {\n var fd = fs.openSync(path, constants.O_SYMLINK)\n var ret\n var threw = true\n try {\n ret = fs.futimesSync(fd, at, mt)\n threw = false\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd)\n } catch (er) {}\n } else {\n fs.closeSync(fd)\n }\n }\n return ret\n }\n\n } else if (fs.futimes) {\n fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }\n fs.lutimesSync = function () {}\n }\n }\n\n function chmodFix (orig) {\n if (!orig) return orig\n return function (target, mode, cb) {\n return orig.call(fs, target, mode, function (er) {\n if (chownErOk(er)) er = null\n if (cb) cb.apply(this, arguments)\n })\n }\n }\n\n function chmodFixSync (orig) {\n if (!orig) return orig\n return function (target, mode) {\n try {\n return orig.call(fs, target, mode)\n } catch (er) {\n if (!chownErOk(er)) throw er\n }\n }\n }\n\n\n function chownFix (orig) {\n if (!orig) return orig\n return function (target, uid, gid, cb) {\n return orig.call(fs, target, uid, gid, function (er) {\n if (chownErOk(er)) er = null\n if (cb) cb.apply(this, arguments)\n })\n }\n }\n\n function chownFixSync (orig) {\n if (!orig) return orig\n return function (target, uid, gid) {\n try {\n return orig.call(fs, target, uid, gid)\n } catch (er) {\n if (!chownErOk(er)) throw er\n }\n }\n }\n\n function statFix (orig) {\n if (!orig) return orig\n // Older versions of Node erroneously returned signed integers for\n // uid + gid.\n return function (target, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n function callback (er, stats) {\n if (stats) {\n if (stats.uid < 0) stats.uid += 0x100000000\n if (stats.gid < 0) stats.gid += 0x100000000\n }\n if (cb) cb.apply(this, arguments)\n }\n return options ? orig.call(fs, target, options, callback)\n : orig.call(fs, target, callback)\n }\n }\n\n function statFixSync (orig) {\n if (!orig) return orig\n // Older versions of Node erroneously returned signed integers for\n // uid + gid.\n return function (target, options) {\n var stats = options ? orig.call(fs, target, options)\n : orig.call(fs, target)\n if (stats) {\n if (stats.uid < 0) stats.uid += 0x100000000\n if (stats.gid < 0) stats.gid += 0x100000000\n }\n return stats;\n }\n }\n\n // ENOSYS means that the fs doesn't support the op. Just ignore\n // that, because it doesn't matter.\n //\n // if there's no getuid, or if getuid() is something other\n // than 0, and the error is EINVAL or EPERM, then just ignore\n // it.\n //\n // This specific case is a silent failure in cp, install, tar,\n // and most other unix tools that manage permissions.\n //\n // When running as root, or if other types of errors are\n // encountered, then it's strict.\n function chownErOk (er) {\n if (!er)\n return true\n\n if (er.code === \"ENOSYS\")\n return true\n\n var nonroot = !process.getuid || process.getuid() !== 0\n if (nonroot) {\n if (er.code === \"EINVAL\" || er.code === \"EPERM\")\n return true\n }\n\n return false\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9wb2x5ZmlsbHMuanM/YTBhMyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJylcblxudmFyIG9yaWdDd2QgPSBwcm9jZXNzLmN3ZFxudmFyIGN3ZCA9IG51bGxcblxudmFyIHBsYXRmb3JtID0gcHJvY2Vzcy5lbnYuR1JBQ0VGVUxfRlNfUExBVEZPUk0gfHwgcHJvY2Vzcy5wbGF0Zm9ybVxuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIWN3ZClcbiAgICBjd2QgPSBvcmlnQ3dkLmNhbGwocHJvY2VzcylcbiAgcmV0dXJuIGN3ZFxufVxudHJ5IHtcbiAgcHJvY2Vzcy5jd2QoKVxufSBjYXRjaCAoZXIpIHt9XG5cbi8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHVudGlsIG5vZGUuanMgMTIgaXMgcmVxdWlyZWRcbmlmICh0eXBlb2YgcHJvY2Vzcy5jaGRpciA9PT0gJ2Z1bmN0aW9uJykge1xuICB2YXIgY2hkaXIgPSBwcm9jZXNzLmNoZGlyXG4gIHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZCkge1xuICAgIGN3ZCA9IG51bGxcbiAgICBjaGRpci5jYWxsKHByb2Nlc3MsIGQpXG4gIH1cbiAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHByb2Nlc3MuY2hkaXIsIGNoZGlyKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG5cbmZ1bmN0aW9uIHBhdGNoIChmcykge1xuICAvLyAocmUtKWltcGxlbWVudCBzb21lIHRoaW5ncyB0aGF0IGFyZSBrbm93biBidXN0ZWQgb3IgbWlzc2luZy5cblxuICAvLyBsY2htb2QsIGJyb2tlbiBwcmlvciB0byAwLjYuMlxuICAvLyBiYWNrLXBvcnQgdGhlIGZpeCBoZXJlLlxuICBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KCdPX1NZTUxJTksnKSAmJlxuICAgICAgcHJvY2Vzcy52ZXJzaW9uLm1hdGNoKC9edjBcXC42XFwuWzAtMl18XnYwXFwuNVxcLi8pKSB7XG4gICAgcGF0Y2hMY2htb2QoZnMpXG4gIH1cblxuICAvLyBsdXRpbWVzIGltcGxlbWVudGF0aW9uLCBvciBuby1vcFxuICBpZiAoIWZzLmx1dGltZXMpIHtcbiAgICBwYXRjaEx1dGltZXMoZnMpXG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ3JhY2VmdWwtZnMvaXNzdWVzLzRcbiAgLy8gQ2hvd24gc2hvdWxkIG5vdCBmYWlsIG9uIGVpbnZhbCBvciBlcGVybSBpZiBub24tcm9vdC5cbiAgLy8gSXQgc2hvdWxkIG5vdCBmYWlsIG9uIGVub3N5cyBldmVyLCBhcyB0aGlzIGp1c3QgaW5kaWNhdGVzXG4gIC8vIHRoYXQgYSBmcyBkb2Vzbid0IHN1cHBvcnQgdGhlIGludGVuZGVkIG9wZXJhdGlvbi5cblxuICBmcy5jaG93biA9IGNob3duRml4KGZzLmNob3duKVxuICBmcy5mY2hvd24gPSBjaG93bkZpeChmcy5mY2hvd24pXG4gIGZzLmxjaG93biA9IGNob3duRml4KGZzLmxjaG93bilcblxuICBmcy5jaG1vZCA9IGNobW9kRml4KGZzLmNobW9kKVxuICBmcy5mY2htb2QgPSBjaG1vZEZpeChmcy5mY2htb2QpXG4gIGZzLmxjaG1vZCA9IGNobW9kRml4KGZzLmxjaG1vZClcblxuICBmcy5jaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMuY2hvd25TeW5jKVxuICBmcy5mY2hvd25TeW5jID0gY2hvd25GaXhTeW5jKGZzLmZjaG93blN5bmMpXG4gIGZzLmxjaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMubGNob3duU3luYylcblxuICBmcy5jaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMuY2htb2RTeW5jKVxuICBmcy5mY2htb2RTeW5jID0gY2htb2RGaXhTeW5jKGZzLmZjaG1vZFN5bmMpXG4gIGZzLmxjaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMubGNobW9kU3luYylcblxuICBmcy5zdGF0ID0gc3RhdEZpeChmcy5zdGF0KVxuICBmcy5mc3RhdCA9IHN0YXRGaXgoZnMuZnN0YXQpXG4gIGZzLmxzdGF0ID0gc3RhdEZpeChmcy5sc3RhdClcblxuICBmcy5zdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLnN0YXRTeW5jKVxuICBmcy5mc3RhdFN5bmMgPSBzdGF0Rml4U3luYyhmcy5mc3RhdFN5bmMpXG4gIGZzLmxzdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLmxzdGF0U3luYylcblxuICAvLyBpZiBsY2htb2QvbGNob3duIGRvIG5vdCBleGlzdCwgdGhlbiBtYWtlIHRoZW0gbm8tb3BzXG4gIGlmIChmcy5jaG1vZCAmJiAhZnMubGNobW9kKSB7XG4gICAgZnMubGNobW9kID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUsIGNiKSB7XG4gICAgICBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gICAgfVxuICAgIGZzLmxjaG1vZFN5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICB9XG4gIGlmIChmcy5jaG93biAmJiAhZnMubGNob3duKSB7XG4gICAgZnMubGNob3duID0gZnVuY3Rpb24gKHBhdGgsIHVpZCwgZ2lkLCBjYikge1xuICAgICAgaWYgKGNiKSBwcm9jZXNzLm5leHRUaWNrKGNiKVxuICAgIH1cbiAgICBmcy5sY2hvd25TeW5jID0gZnVuY3Rpb24gKCkge31cbiAgfVxuXG4gIC8vIG9uIFdpbmRvd3MsIEEvViBzb2Z0d2FyZSBjYW4gbG9jayB0aGUgZGlyZWN0b3J5LCBjYXVzaW5nIHRoaXNcbiAgLy8gdG8gZmFpbCB3aXRoIGFuIEVBQ0NFUyBvciBFUEVSTSBpZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zIG5ld2x5XG4gIC8vIGNyZWF0ZWQgZmlsZXMuICBUcnkgYWdhaW4gb24gZmFpbHVyZSwgZm9yIHVwIHRvIDYwIHNlY29uZHMuXG5cbiAgLy8gU2V0IHRoZSB0aW1lb3V0IHRoaXMgbG9uZyBiZWNhdXNlIHNvbWUgV2luZG93cyBBbnRpLVZpcnVzLCBzdWNoIGFzIFBhcml0eVxuICAvLyBiaXQ5LCBtYXkgbG9jayBmaWxlcyBmb3IgdXAgdG8gYSBtaW51dGUsIGNhdXNpbmcgbnBtIHBhY2thZ2UgaW5zdGFsbFxuICAvLyBmYWlsdXJlcy4gQWxzbywgdGFrZSBjYXJlIHRvIHlpZWxkIHRoZSBzY2hlZHVsZXIuIFdpbmRvd3Mgc2NoZWR1bGluZyBnaXZlc1xuICAvLyBDUFUgdG8gYSBidXN5IGxvb3BpbmcgcHJvY2Vzcywgd2hpY2ggY2FuIGNhdXNlIHRoZSBwcm9ncmFtIGNhdXNpbmcgdGhlIGxvY2tcbiAgLy8gY29udGVudGlvbiB0byBiZSBzdGFydmVkIG9mIENQVSBieSBub2RlLCBzbyB0aGUgY29udGVudGlvbiBkb2Vzbid0IHJlc29sdmUuXG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgZnMucmVuYW1lID0gdHlwZW9mIGZzLnJlbmFtZSAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlbmFtZVxuICAgIDogKGZ1bmN0aW9uIChmcyRyZW5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHJlbmFtZSAoZnJvbSwgdG8sIGNiKSB7XG4gICAgICAgIHZhciBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgdmFyIGJhY2tvZmYgPSAwO1xuICAgICAgICBmcyRyZW5hbWUoZnJvbSwgdG8sIGZ1bmN0aW9uIENCIChlcikge1xuICAgICAgICAgIGlmIChlclxuICAgICAgICAgICAgICAmJiAoZXIuY29kZSA9PT0gXCJFQUNDRVNcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIgfHwgZXIuY29kZSA9PT0gXCJFQlVTWVwiKVxuICAgICAgICAgICAgICAmJiBEYXRlLm5vdygpIC0gc3RhcnQgPCA2MDAwMCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgZnMuc3RhdCh0bywgZnVuY3Rpb24gKHN0YXRlciwgc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGVyICYmIHN0YXRlci5jb2RlID09PSBcIkVOT0VOVFwiKVxuICAgICAgICAgICAgICAgICAgZnMkcmVuYW1lKGZyb20sIHRvLCBDQik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgY2IoZXIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBiYWNrb2ZmKVxuICAgICAgICAgICAgaWYgKGJhY2tvZmYgPCAxMDApXG4gICAgICAgICAgICAgIGJhY2tvZmYgKz0gMTA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYikgY2IoZXIpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVuYW1lLCBmcyRyZW5hbWUpXG4gICAgICByZXR1cm4gcmVuYW1lXG4gICAgfSkoZnMucmVuYW1lKVxuICB9XG5cbiAgLy8gaWYgcmVhZCgpIHJldHVybnMgRUFHQUlOLCB0aGVuIGp1c3QgdHJ5IGl0IGFnYWluLlxuICBmcy5yZWFkID0gdHlwZW9mIGZzLnJlYWQgIT09ICdmdW5jdGlvbicgPyBmcy5yZWFkXG4gIDogKGZ1bmN0aW9uIChmcyRyZWFkKSB7XG4gICAgZnVuY3Rpb24gcmVhZCAoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFja18pIHtcbiAgICAgIHZhciBjYWxsYmFja1xuICAgICAgaWYgKGNhbGxiYWNrXyAmJiB0eXBlb2YgY2FsbGJhY2tfID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBlYWdDb3VudGVyID0gMFxuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uIChlciwgXywgX18pIHtcbiAgICAgICAgICBpZiAoZXIgJiYgZXIuY29kZSA9PT0gJ0VBR0FJTicgJiYgZWFnQ291bnRlciA8IDEwKSB7XG4gICAgICAgICAgICBlYWdDb3VudGVyICsrXG4gICAgICAgICAgICByZXR1cm4gZnMkcmVhZC5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsYmFja18uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZnMkcmVhZC5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8vIFRoaXMgZW5zdXJlcyBgdXRpbC5wcm9taXNpZnlgIHdvcmtzIGFzIGl0IGRvZXMgZm9yIG5hdGl2ZSBgZnMucmVhZGAuXG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlYWQsIGZzJHJlYWQpXG4gICAgcmV0dXJuIHJlYWRcbiAgfSkoZnMucmVhZClcblxuICBmcy5yZWFkU3luYyA9IHR5cGVvZiBmcy5yZWFkU3luYyAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWRTeW5jXG4gIDogKGZ1bmN0aW9uIChmcyRyZWFkU3luYykgeyByZXR1cm4gZnVuY3Rpb24gKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbikge1xuICAgIHZhciBlYWdDb3VudGVyID0gMFxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZFN5bmMuY2FsbChmcywgZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgaWYgKGVyLmNvZGUgPT09ICdFQUdBSU4nICYmIGVhZ0NvdW50ZXIgPCAxMCkge1xuICAgICAgICAgIGVhZ0NvdW50ZXIgKytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9fSkoZnMucmVhZFN5bmMpXG5cbiAgZnVuY3Rpb24gcGF0Y2hMY2htb2QgKGZzKSB7XG4gICAgZnMubGNobW9kID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUsIGNhbGxiYWNrKSB7XG4gICAgICBmcy5vcGVuKCBwYXRoXG4gICAgICAgICAgICAgLCBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19TWU1MSU5LXG4gICAgICAgICAgICAgLCBtb2RlXG4gICAgICAgICAgICAgLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJlZmVyIHRvIHJldHVybiB0aGUgY2htb2QgZXJyb3IsIGlmIG9uZSBvY2N1cnMsXG4gICAgICAgIC8vIGJ1dCBzdGlsbCB0cnkgdG8gY2xvc2UsIGFuZCByZXBvcnQgY2xvc2luZyBlcnJvcnMgaWYgdGhleSBvY2N1ci5cbiAgICAgICAgZnMuZmNobW9kKGZkLCBtb2RlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgZnMuY2xvc2UoZmQsIGZ1bmN0aW9uKGVycjIpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyIHx8IGVycjIpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnMubGNobW9kU3luYyA9IGZ1bmN0aW9uIChwYXRoLCBtb2RlKSB7XG4gICAgICB2YXIgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19TWU1MSU5LLCBtb2RlKVxuXG4gICAgICAvLyBwcmVmZXIgdG8gcmV0dXJuIHRoZSBjaG1vZCBlcnJvciwgaWYgb25lIG9jY3VycyxcbiAgICAgIC8vIGJ1dCBzdGlsbCB0cnkgdG8gY2xvc2UsIGFuZCByZXBvcnQgY2xvc2luZyBlcnJvcnMgaWYgdGhleSBvY2N1ci5cbiAgICAgIHZhciB0aHJldyA9IHRydWVcbiAgICAgIHZhciByZXRcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldCA9IGZzLmZjaG1vZFN5bmMoZmQsIG1vZGUpXG4gICAgICAgIHRocmV3ID0gZmFsc2VcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh0aHJldykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGF0Y2hMdXRpbWVzIChmcykge1xuICAgIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkoXCJPX1NZTUxJTktcIikgJiYgZnMuZnV0aW1lcykge1xuICAgICAgZnMubHV0aW1lcyA9IGZ1bmN0aW9uIChwYXRoLCBhdCwgbXQsIGNiKSB7XG4gICAgICAgIGZzLm9wZW4ocGF0aCwgY29uc3RhbnRzLk9fU1lNTElOSywgZnVuY3Rpb24gKGVyLCBmZCkge1xuICAgICAgICAgIGlmIChlcikge1xuICAgICAgICAgICAgaWYgKGNiKSBjYihlcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBmcy5mdXRpbWVzKGZkLCBhdCwgbXQsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICAgICAgZnMuY2xvc2UoZmQsIGZ1bmN0aW9uIChlcjIpIHtcbiAgICAgICAgICAgICAgaWYgKGNiKSBjYihlciB8fCBlcjIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZzLmx1dGltZXNTeW5jID0gZnVuY3Rpb24gKHBhdGgsIGF0LCBtdCkge1xuICAgICAgICB2YXIgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCBjb25zdGFudHMuT19TWU1MSU5LKVxuICAgICAgICB2YXIgcmV0XG4gICAgICAgIHZhciB0aHJldyA9IHRydWVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSBmcy5mdXRpbWVzU3luYyhmZCwgYXQsIG10KVxuICAgICAgICAgIHRocmV3ID0gZmFsc2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAodGhyZXcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7fVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoZnMuZnV0aW1lcykge1xuICAgICAgZnMubHV0aW1lcyA9IGZ1bmN0aW9uIChfYSwgX2IsIF9jLCBjYikgeyBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpIH1cbiAgICAgIGZzLmx1dGltZXNTeW5jID0gZnVuY3Rpb24gKCkge31cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaG1vZEZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgbW9kZSwgY2IpIHtcbiAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgbW9kZSwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgIGlmIChjaG93bkVyT2soZXIpKSBlciA9IG51bGxcbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNobW9kRml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgbW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCBtb2RlKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgaWYgKCFjaG93bkVyT2soZXIpKSB0aHJvdyBlclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gY2hvd25GaXggKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHVpZCwgZ2lkLCBjYikge1xuICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCB1aWQsIGdpZCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgIGlmIChjaG93bkVyT2soZXIpKSBlciA9IG51bGxcbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNob3duRml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdWlkLCBnaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgdWlkLCBnaWQpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoIWNob3duRXJPayhlcikpIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhdEZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBOb2RlIGVycm9uZW91c2x5IHJldHVybmVkIHNpZ25lZCBpbnRlZ2VycyBmb3JcbiAgICAvLyB1aWQgKyBnaWQuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMsIGNiKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2IgPSBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMgPSBudWxsXG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjYWxsYmFjayAoZXIsIHN0YXRzKSB7XG4gICAgICAgIGlmIChzdGF0cykge1xuICAgICAgICAgIGlmIChzdGF0cy51aWQgPCAwKSBzdGF0cy51aWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgICBpZiAoc3RhdHMuZ2lkIDwgMCkgc3RhdHMuZ2lkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucyA/IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICAgICAgOiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgY2FsbGJhY2spXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhdEZpeFN5bmMgKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgTm9kZSBlcnJvbmVvdXNseSByZXR1cm5lZCBzaWduZWQgaW50ZWdlcnMgZm9yXG4gICAgLy8gdWlkICsgZ2lkLlxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgc3RhdHMgPSBvcHRpb25zID8gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG9wdGlvbnMpXG4gICAgICAgIDogb3JpZy5jYWxsKGZzLCB0YXJnZXQpXG4gICAgICBpZiAoc3RhdHMpIHtcbiAgICAgICAgaWYgKHN0YXRzLnVpZCA8IDApIHN0YXRzLnVpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICBpZiAoc3RhdHMuZ2lkIDwgMCkgc3RhdHMuZ2lkICs9IDB4MTAwMDAwMDAwXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdHM7XG4gICAgfVxuICB9XG5cbiAgLy8gRU5PU1lTIG1lYW5zIHRoYXQgdGhlIGZzIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgb3AuIEp1c3QgaWdub3JlXG4gIC8vIHRoYXQsIGJlY2F1c2UgaXQgZG9lc24ndCBtYXR0ZXIuXG4gIC8vXG4gIC8vIGlmIHRoZXJlJ3Mgbm8gZ2V0dWlkLCBvciBpZiBnZXR1aWQoKSBpcyBzb21ldGhpbmcgb3RoZXJcbiAgLy8gdGhhbiAwLCBhbmQgdGhlIGVycm9yIGlzIEVJTlZBTCBvciBFUEVSTSwgdGhlbiBqdXN0IGlnbm9yZVxuICAvLyBpdC5cbiAgLy9cbiAgLy8gVGhpcyBzcGVjaWZpYyBjYXNlIGlzIGEgc2lsZW50IGZhaWx1cmUgaW4gY3AsIGluc3RhbGwsIHRhcixcbiAgLy8gYW5kIG1vc3Qgb3RoZXIgdW5peCB0b29scyB0aGF0IG1hbmFnZSBwZXJtaXNzaW9ucy5cbiAgLy9cbiAgLy8gV2hlbiBydW5uaW5nIGFzIHJvb3QsIG9yIGlmIG90aGVyIHR5cGVzIG9mIGVycm9ycyBhcmVcbiAgLy8gZW5jb3VudGVyZWQsIHRoZW4gaXQncyBzdHJpY3QuXG4gIGZ1bmN0aW9uIGNob3duRXJPayAoZXIpIHtcbiAgICBpZiAoIWVyKVxuICAgICAgcmV0dXJuIHRydWVcblxuICAgIGlmIChlci5jb2RlID09PSBcIkVOT1NZU1wiKVxuICAgICAgcmV0dXJuIHRydWVcblxuICAgIHZhciBub25yb290ID0gIXByb2Nlc3MuZ2V0dWlkIHx8IHByb2Nlc3MuZ2V0dWlkKCkgIT09IDBcbiAgICBpZiAobm9ucm9vdCkge1xuICAgICAgaWYgKGVyLmNvZGUgPT09IFwiRUlOVkFMXCIgfHwgZXIuY29kZSA9PT0gXCJFUEVSTVwiKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///69106\n")},72017:(module,__unused_webpack_exports,__webpack_require__)=>{eval("try {\n var util = __webpack_require__(39023);\n /* istanbul ignore next */\n if (typeof util.inherits !== 'function') throw '';\n module.exports = util.inherits;\n} catch (e) {\n /* istanbul ignore next */\n module.exports = __webpack_require__(56698);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIwMTcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxhQUFhLG1CQUFPLENBQUMsS0FBTTtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFLDJDQUFpRDtBQUNuRCIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHMuanM/ZDBhZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///72017\n")},56698:module=>{eval("if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY2OTguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcz8zZmI1Il0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56698\n")},31232:module=>{"use strict";eval("\n\nconst isStream = stream =>\n\tstream !== null &&\n\ttypeof stream === 'object' &&\n\ttypeof stream.pipe === 'function';\n\nisStream.writable = stream =>\n\tisStream(stream) &&\n\tstream.writable !== false &&\n\ttypeof stream._write === 'function' &&\n\ttypeof stream._writableState === 'object';\n\nisStream.readable = stream =>\n\tisStream(stream) &&\n\tstream.readable !== false &&\n\ttypeof stream._read === 'function' &&\n\ttypeof stream._readableState === 'object';\n\nisStream.duplex = stream =>\n\tisStream.writable(stream) &&\n\tisStream.readable(stream);\n\nisStream.transform = stream =>\n\tisStream.duplex(stream) &&\n\ttypeof stream._transform === 'function';\n\nmodule.exports = isStream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEyMzIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2lzLXN0cmVhbS9pbmRleC5qcz9jNjI1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaXNTdHJlYW0gPSBzdHJlYW0gPT5cblx0c3RyZWFtICE9PSBudWxsICYmXG5cdHR5cGVvZiBzdHJlYW0gPT09ICdvYmplY3QnICYmXG5cdHR5cGVvZiBzdHJlYW0ucGlwZSA9PT0gJ2Z1bmN0aW9uJztcblxuaXNTdHJlYW0ud3JpdGFibGUgPSBzdHJlYW0gPT5cblx0aXNTdHJlYW0oc3RyZWFtKSAmJlxuXHRzdHJlYW0ud3JpdGFibGUgIT09IGZhbHNlICYmXG5cdHR5cGVvZiBzdHJlYW0uX3dyaXRlID09PSAnZnVuY3Rpb24nICYmXG5cdHR5cGVvZiBzdHJlYW0uX3dyaXRhYmxlU3RhdGUgPT09ICdvYmplY3QnO1xuXG5pc1N0cmVhbS5yZWFkYWJsZSA9IHN0cmVhbSA9PlxuXHRpc1N0cmVhbShzdHJlYW0pICYmXG5cdHN0cmVhbS5yZWFkYWJsZSAhPT0gZmFsc2UgJiZcblx0dHlwZW9mIHN0cmVhbS5fcmVhZCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHR0eXBlb2Ygc3RyZWFtLl9yZWFkYWJsZVN0YXRlID09PSAnb2JqZWN0JztcblxuaXNTdHJlYW0uZHVwbGV4ID0gc3RyZWFtID0+XG5cdGlzU3RyZWFtLndyaXRhYmxlKHN0cmVhbSkgJiZcblx0aXNTdHJlYW0ucmVhZGFibGUoc3RyZWFtKTtcblxuaXNTdHJlYW0udHJhbnNmb3JtID0gc3RyZWFtID0+XG5cdGlzU3RyZWFtLmR1cGxleChzdHJlYW0pICYmXG5cdHR5cGVvZiBzdHJlYW0uX3RyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJztcblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmVhbTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///31232\n")},99488:(__unused_webpack_module,exports)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.excelBOM = exports.defaultCsv2JsonOptions = exports.defaultJson2CsvOptions = exports.errors = void 0;\nexports.errors = {\n optionsRequired: 'Options were not passed and are required.',\n json2csv: {\n cannotCallOn: 'Cannot call json2csv on',\n dataCheckFailure: 'Data provided was not an array of documents.',\n notSameSchema: 'Not all documents have the same schema.'\n },\n csv2json: {\n cannotCallOn: 'Cannot call csv2json on',\n dataCheckFailure: 'CSV is not a string.'\n }\n};\nexports.defaultJson2CsvOptions = {\n arrayIndexesAsKeys: false,\n checkSchemaDifferences: false,\n delimiter: {\n field: ',',\n wrap: '\"',\n eol: '\\n'\n },\n emptyFieldValue: undefined,\n escapeHeaderNestedDots: true,\n excelBOM: false,\n excludeKeys: [],\n expandNestedObjects: true,\n expandArrayObjects: false,\n prependHeader: true,\n preventCsvInjection: false,\n sortHeader: false,\n trimFieldValues: false,\n trimHeaderFields: false,\n unwindArrays: false,\n useDateIso8601Format: false,\n useLocaleFormat: false,\n wrapBooleans: false,\n};\nexports.defaultCsv2JsonOptions = {\n delimiter: {\n field: ',',\n wrap: '\"',\n eol: '\\n'\n },\n excelBOM: false,\n preventCsvInjection: false,\n trimFieldValues: false,\n trimHeaderFields: false,\n wrapBooleans: false,\n};\nexports.excelBOM = '\\ufeff';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTk0ODguanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZ0JBQWdCLEdBQUcsOEJBQThCLEdBQUcsOEJBQThCLEdBQUcsY0FBYztBQUNuRyxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2pzb24tMi1jc3YvbGliL2NvbnN0YW50cy5qcz8yMmQwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZXhjZWxCT00gPSBleHBvcnRzLmRlZmF1bHRDc3YySnNvbk9wdGlvbnMgPSBleHBvcnRzLmRlZmF1bHRKc29uMkNzdk9wdGlvbnMgPSBleHBvcnRzLmVycm9ycyA9IHZvaWQgMDtcbmV4cG9ydHMuZXJyb3JzID0ge1xuICAgIG9wdGlvbnNSZXF1aXJlZDogJ09wdGlvbnMgd2VyZSBub3QgcGFzc2VkIGFuZCBhcmUgcmVxdWlyZWQuJyxcbiAgICBqc29uMmNzdjoge1xuICAgICAgICBjYW5ub3RDYWxsT246ICdDYW5ub3QgY2FsbCBqc29uMmNzdiBvbicsXG4gICAgICAgIGRhdGFDaGVja0ZhaWx1cmU6ICdEYXRhIHByb3ZpZGVkIHdhcyBub3QgYW4gYXJyYXkgb2YgZG9jdW1lbnRzLicsXG4gICAgICAgIG5vdFNhbWVTY2hlbWE6ICdOb3QgYWxsIGRvY3VtZW50cyBoYXZlIHRoZSBzYW1lIHNjaGVtYS4nXG4gICAgfSxcbiAgICBjc3YyanNvbjoge1xuICAgICAgICBjYW5ub3RDYWxsT246ICdDYW5ub3QgY2FsbCBjc3YyanNvbiBvbicsXG4gICAgICAgIGRhdGFDaGVja0ZhaWx1cmU6ICdDU1YgaXMgbm90IGEgc3RyaW5nLidcbiAgICB9XG59O1xuZXhwb3J0cy5kZWZhdWx0SnNvbjJDc3ZPcHRpb25zID0ge1xuICAgIGFycmF5SW5kZXhlc0FzS2V5czogZmFsc2UsXG4gICAgY2hlY2tTY2hlbWFEaWZmZXJlbmNlczogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiB7XG4gICAgICAgIGZpZWxkOiAnLCcsXG4gICAgICAgIHdyYXA6ICdcIicsXG4gICAgICAgIGVvbDogJ1xcbidcbiAgICB9LFxuICAgIGVtcHR5RmllbGRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIGVzY2FwZUhlYWRlck5lc3RlZERvdHM6IHRydWUsXG4gICAgZXhjZWxCT006IGZhbHNlLFxuICAgIGV4Y2x1ZGVLZXlzOiBbXSxcbiAgICBleHBhbmROZXN0ZWRPYmplY3RzOiB0cnVlLFxuICAgIGV4cGFuZEFycmF5T2JqZWN0czogZmFsc2UsXG4gICAgcHJlcGVuZEhlYWRlcjogdHJ1ZSxcbiAgICBwcmV2ZW50Q3N2SW5qZWN0aW9uOiBmYWxzZSxcbiAgICBzb3J0SGVhZGVyOiBmYWxzZSxcbiAgICB0cmltRmllbGRWYWx1ZXM6IGZhbHNlLFxuICAgIHRyaW1IZWFkZXJGaWVsZHM6IGZhbHNlLFxuICAgIHVud2luZEFycmF5czogZmFsc2UsXG4gICAgdXNlRGF0ZUlzbzg2MDFGb3JtYXQ6IGZhbHNlLFxuICAgIHVzZUxvY2FsZUZvcm1hdDogZmFsc2UsXG4gICAgd3JhcEJvb2xlYW5zOiBmYWxzZSxcbn07XG5leHBvcnRzLmRlZmF1bHRDc3YySnNvbk9wdGlvbnMgPSB7XG4gICAgZGVsaW1pdGVyOiB7XG4gICAgICAgIGZpZWxkOiAnLCcsXG4gICAgICAgIHdyYXA6ICdcIicsXG4gICAgICAgIGVvbDogJ1xcbidcbiAgICB9LFxuICAgIGV4Y2VsQk9NOiBmYWxzZSxcbiAgICBwcmV2ZW50Q3N2SW5qZWN0aW9uOiBmYWxzZSxcbiAgICB0cmltRmllbGRWYWx1ZXM6IGZhbHNlLFxuICAgIHRyaW1IZWFkZXJGaWVsZHM6IGZhbHNlLFxuICAgIHdyYXBCb29sZWFuczogZmFsc2UsXG59O1xuZXhwb3J0cy5leGNlbEJPTSA9ICdcXHVmZWZmJztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///99488\n")},77645:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("var __webpack_unused_export__;\n\n__webpack_unused_export__ = ({ value: true });\n__webpack_unused_export__ = exports.Vu = void 0;\nconst constants_1 = __webpack_require__(99488);\nconst json2csv_1 = __webpack_require__(87389);\nconst csv2json_1 = __webpack_require__(93989);\nconst utils_1 = __webpack_require__(26164);\nfunction json2csv(data, options) {\n const builtOptions = (0, utils_1.buildJ2COptions)(options ?? {});\n // Validate the parameters before calling the converter's convert function\n (0, utils_1.validate)(data, utils_1.isObject, constants_1.errors.json2csv);\n return (0, json2csv_1.Json2Csv)(builtOptions).convert(data);\n}\nexports.Vu = json2csv;\nfunction csv2json(data, options) {\n const builtOptions = (0, utils_1.buildC2JOptions)(options ?? {});\n // Validate the parameters before calling the converter's convert function\n (0, utils_1.validate)(data, utils_1.isString, constants_1.errors.csv2json);\n return (0, csv2json_1.Csv2Json)(builtOptions).convert(data);\n}\n__webpack_unused_export__ = csv2json;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzc2NDUuanMiLCJtYXBwaW5ncyI6IjtBQUFhO0FBQ2IsNkJBQTZDLEVBQUUsYUFBYSxDQUFDO0FBQzdELHlCQUFnQixHQUFHLFVBQWdCO0FBQ25DLG9CQUFvQixtQkFBTyxDQUFDLEtBQWE7QUFDekMsbUJBQW1CLG1CQUFPLENBQUMsS0FBWTtBQUN2QyxtQkFBbUIsbUJBQU8sQ0FBQyxLQUFZO0FBQ3ZDLGdCQUFnQixtQkFBTyxDQUFDLEtBQVM7QUFDakM7QUFDQSxtRUFBbUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFnQjtBQUNoQjtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUFnQiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvanNvbi0yLWNzdi9saWIvY29udmVydGVyLmpzPzM5MzgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jc3YyanNvbiA9IGV4cG9ydHMuanNvbjJjc3YgPSB2b2lkIDA7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuL2NvbnN0YW50c1wiKTtcbmNvbnN0IGpzb24yY3N2XzEgPSByZXF1aXJlKFwiLi9qc29uMmNzdlwiKTtcbmNvbnN0IGNzdjJqc29uXzEgPSByZXF1aXJlKFwiLi9jc3YyanNvblwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmZ1bmN0aW9uIGpzb24yY3N2KGRhdGEsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBidWlsdE9wdGlvbnMgPSAoMCwgdXRpbHNfMS5idWlsZEoyQ09wdGlvbnMpKG9wdGlvbnMgPz8ge30pO1xuICAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBjYWxsaW5nIHRoZSBjb252ZXJ0ZXIncyBjb252ZXJ0IGZ1bmN0aW9uXG4gICAgKDAsIHV0aWxzXzEudmFsaWRhdGUpKGRhdGEsIHV0aWxzXzEuaXNPYmplY3QsIGNvbnN0YW50c18xLmVycm9ycy5qc29uMmNzdik7XG4gICAgcmV0dXJuICgwLCBqc29uMmNzdl8xLkpzb24yQ3N2KShidWlsdE9wdGlvbnMpLmNvbnZlcnQoZGF0YSk7XG59XG5leHBvcnRzLmpzb24yY3N2ID0ganNvbjJjc3Y7XG5mdW5jdGlvbiBjc3YyanNvbihkYXRhLCBvcHRpb25zKSB7XG4gICAgY29uc3QgYnVpbHRPcHRpb25zID0gKDAsIHV0aWxzXzEuYnVpbGRDMkpPcHRpb25zKShvcHRpb25zID8/IHt9KTtcbiAgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVycyBiZWZvcmUgY2FsbGluZyB0aGUgY29udmVydGVyJ3MgY29udmVydCBmdW5jdGlvblxuICAgICgwLCB1dGlsc18xLnZhbGlkYXRlKShkYXRhLCB1dGlsc18xLmlzU3RyaW5nLCBjb25zdGFudHNfMS5lcnJvcnMuY3N2Mmpzb24pO1xuICAgIHJldHVybiAoMCwgY3N2Mmpzb25fMS5Dc3YySnNvbikoYnVpbHRPcHRpb25zKS5jb252ZXJ0KGRhdGEpO1xufVxuZXhwb3J0cy5jc3YyanNvbiA9IGNzdjJqc29uO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///77645\n")},93989:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Csv2Json = void 0;\nconst doc_path_1 = __webpack_require__(6052);\nconst constants_1 = __webpack_require__(99488);\nconst utils = __importStar(__webpack_require__(26164));\nconst Csv2Json = function (options) {\n const escapedWrapDelimiterRegex = new RegExp(options.delimiter.wrap + options.delimiter.wrap, 'g'), excelBOMRegex = new RegExp('^' + constants_1.excelBOM), valueParserFn = options.parseValue && typeof options.parseValue === 'function' ? options.parseValue : JSON.parse;\n /**\n * Trims the header key, if specified by the user via the provided options\n */\n function processHeaderKey(headerKey) {\n headerKey = removeWrapDelimitersFromValue(headerKey);\n if (options.trimHeaderFields) {\n return headerKey.split('.')\n .map((component) => component.trim())\n .join('.');\n }\n return headerKey;\n }\n /**\n * Generate the JSON heading from the CSV\n */\n function retrieveHeading(lines) {\n let headerFields = [];\n if (options.headerFields) {\n headerFields = options.headerFields.map((headerField, index) => ({\n value: processHeaderKey(headerField),\n index\n }));\n }\n else {\n // Generate and return the heading keys\n const headerRow = lines[0];\n headerFields = headerRow.map((headerKey, index) => ({\n value: processHeaderKey(headerKey),\n index\n }));\n // If the user provided keys, filter the generated keys to just the user provided keys so we also have the key index\n if (options.keys) {\n const keys = options.keys; // TypeScript type checking work around to get it to recognize the option is not undefined\n headerFields = headerFields.filter((headerKey) => keys.includes(headerKey.value));\n }\n }\n return {\n lines,\n headerFields,\n recordLines: [],\n };\n }\n /**\n * Removes the Excel BOM value, if specified by the options object\n */\n function stripExcelBOM(csv) {\n if (options.excelBOM) {\n return csv.replace(excelBOMRegex, '');\n }\n return csv;\n }\n /**\n * Helper function that splits a line so that we can handle wrapped fields\n */\n function splitLines(csv) {\n // Parse out the line...\n const lines = [], lastCharacterIndex = csv.length - 1, eolDelimiterLength = options.delimiter.eol.length, stateVariables = {\n insideWrapDelimiter: false,\n parsingValue: true,\n justParsedDoubleQuote: false,\n startIndex: 0\n };\n let splitLine = [], character, charBefore, charAfter, nextNChar, index = 0;\n // Loop through each character in the line to identify where to split the values\n while (index < csv.length) {\n // Current character\n character = csv[index];\n // Previous character\n charBefore = index ? csv[index - 1] : '';\n // Next character\n charAfter = index < lastCharacterIndex ? csv[index + 1] : '';\n // Next n characters, including the current character, where n = length(EOL delimiter)\n // This allows for the checking of an EOL delimiter when if it is more than a single character (eg. '\\r\\n')\n nextNChar = utils.getNCharacters(csv, index, eolDelimiterLength);\n if ((nextNChar === options.delimiter.eol && !stateVariables.insideWrapDelimiter ||\n index === lastCharacterIndex) && charBefore === options.delimiter.field) {\n // If we reached an EOL delimiter or the end of the csv and the previous character is a field delimiter...\n // If the start index is the current index (and since the previous character is a comma),\n // then the value being parsed is an empty value accordingly, add an empty string\n if (nextNChar === options.delimiter.eol && stateVariables.startIndex === index) {\n splitLine.push('');\n }\n else if (character === options.delimiter.field) {\n // If we reached the end of the CSV, there's no new line, and the current character is a comma\n // then add an empty string for the current value\n splitLine.push('');\n }\n else {\n // Otherwise, there's a valid value, and the start index isn't the current index, grab the whole value\n splitLine.push(csv.substr(stateVariables.startIndex));\n }\n // Since the last character is a comma, there's still an additional implied field value trailing the comma.\n // Since this value is empty, we push an extra empty value\n splitLine.push('');\n // Finally, push the split line values into the lines array and clear the split line\n lines.push(splitLine);\n splitLine = [];\n stateVariables.startIndex = index + eolDelimiterLength;\n stateVariables.parsingValue = true;\n stateVariables.insideWrapDelimiter = charAfter === options.delimiter.wrap;\n }\n else if (index === lastCharacterIndex && character === options.delimiter.field) {\n // If we reach the end of the CSV and the current character is a field delimiter\n // Parse the previously seen value and add it to the line\n const parsedValue = csv.substring(stateVariables.startIndex, index);\n splitLine.push(parsedValue);\n // Then add an empty string to the line since the last character being a field delimiter indicates an empty field\n splitLine.push('');\n lines.push(splitLine);\n }\n else if (index === lastCharacterIndex || nextNChar === options.delimiter.eol &&\n // if we aren't inside wrap delimiters or if we are but the character before was a wrap delimiter and we didn't just see two\n (!stateVariables.insideWrapDelimiter ||\n stateVariables.insideWrapDelimiter && charBefore === options.delimiter.wrap && !stateVariables.justParsedDoubleQuote)) {\n // Otherwise if we reached the end of the line or csv (and current character is not a field delimiter)\n const toIndex = index !== lastCharacterIndex || charBefore === options.delimiter.wrap ? index : undefined;\n // Retrieve the remaining value and add it to the split line list of values\n splitLine.push(csv.substring(stateVariables.startIndex, toIndex));\n // Finally, push the split line values into the lines array and clear the split line\n lines.push(splitLine);\n splitLine = [];\n stateVariables.startIndex = index + eolDelimiterLength;\n stateVariables.parsingValue = true;\n stateVariables.insideWrapDelimiter = charAfter === options.delimiter.wrap;\n }\n else if (character === options.delimiter.wrap && charBefore === options.delimiter.field &&\n !stateVariables.insideWrapDelimiter && !stateVariables.parsingValue) {\n // If we reached a wrap delimiter after a comma and we aren't inside a wrap delimiter\n stateVariables.startIndex = index;\n stateVariables.insideWrapDelimiter = true;\n stateVariables.parsingValue = true;\n // If the next character(s) are an EOL delimiter, then skip them so we don't parse what we've seen as another value\n if (utils.getNCharacters(csv, index + 1, eolDelimiterLength) === options.delimiter.eol) {\n index += options.delimiter.eol.length + 1; // Skip past EOL\n }\n }\n else if ((charBefore !== options.delimiter.wrap || stateVariables.justParsedDoubleQuote && charBefore === options.delimiter.wrap) &&\n character === options.delimiter.wrap && utils.getNCharacters(csv, index + 1, eolDelimiterLength) === options.delimiter.eol) {\n // If we reach a wrap which is not preceded by a wrap delim and the next character is an EOL delim (ie. *\"\\n)\n stateVariables.insideWrapDelimiter = false;\n stateVariables.parsingValue = false;\n // Next iteration will substring, add the value to the line, and push the line onto the array of lines\n }\n else if (character === options.delimiter.wrap && (index === 0 || utils.getNCharacters(csv, index - eolDelimiterLength, eolDelimiterLength) === options.delimiter.eol && !stateVariables.insideWrapDelimiter)) {\n // If the line starts with a wrap delimiter (ie. \"*)\n stateVariables.insideWrapDelimiter = true;\n stateVariables.parsingValue = true;\n stateVariables.startIndex = index;\n }\n else if (character === options.delimiter.wrap && charAfter === options.delimiter.field) {\n // If we reached a wrap delimiter with a field delimiter after it (ie. *\",)\n splitLine.push(csv.substring(stateVariables.startIndex, index + 1));\n stateVariables.startIndex = index + 2; // next value starts after the field delimiter\n stateVariables.insideWrapDelimiter = false;\n stateVariables.parsingValue = false;\n }\n else if (character === options.delimiter.wrap && charBefore === options.delimiter.field &&\n !stateVariables.insideWrapDelimiter && stateVariables.parsingValue) {\n // If we reached a wrap delimiter with a field delimiter after it (ie. ,\"*)\n splitLine.push(csv.substring(stateVariables.startIndex, index - 1));\n stateVariables.insideWrapDelimiter = true;\n stateVariables.parsingValue = true;\n stateVariables.startIndex = index;\n }\n else if (character === options.delimiter.wrap && charAfter === options.delimiter.wrap && index !== stateVariables.startIndex) {\n // If we run into an escaped quote (ie. \"\") skip past the second quote\n index += 2;\n stateVariables.justParsedDoubleQuote = true;\n continue;\n }\n else if (character === options.delimiter.field && charBefore !== options.delimiter.wrap &&\n charAfter !== options.delimiter.wrap && !stateVariables.insideWrapDelimiter &&\n stateVariables.parsingValue) {\n // If we reached a field delimiter and are not inside the wrap delimiters (ie. *,*)\n splitLine.push(csv.substring(stateVariables.startIndex, index));\n stateVariables.startIndex = index + 1;\n }\n else if (character === options.delimiter.field && charBefore === options.delimiter.wrap &&\n charAfter !== options.delimiter.wrap && !stateVariables.parsingValue) {\n // If we reached a field delimiter, the previous character was a wrap delimiter, and the\n // next character is not a wrap delimiter (ie. \",*)\n stateVariables.insideWrapDelimiter = false;\n stateVariables.parsingValue = true;\n stateVariables.startIndex = index + 1;\n }\n // Otherwise increment to the next character\n index++;\n // Reset the double quote state variable\n stateVariables.justParsedDoubleQuote = false;\n }\n return lines;\n }\n /**\n * Retrieves the record lines from the split CSV lines and sets it on the params object\n */\n function retrieveRecordLines(params) {\n if (options.headerFields) { // This option is passed for instances where the CSV has no header line\n params.recordLines = params.lines;\n }\n else { // All lines except for the header line\n params.recordLines = params.lines.splice(1);\n }\n return params;\n }\n /**\n * Retrieves the value for the record from the line at the provided key.\n */\n function retrieveRecordValueFromLine(headerField, line) {\n // If there is a value at the key's index, use it; otherwise, null\n const value = line[headerField.index];\n // Perform any necessary value conversions on the record value\n return processRecordValue(value);\n }\n /**\n * Processes the record's value by parsing the data to ensure the CSV is\n * converted to the JSON that created it.\n */\n function processRecordValue(fieldValue) {\n // If the value is an array representation, convert it\n const parsedJson = parseValue(fieldValue);\n // If parsedJson is anything aside from an error, then we want to use the parsed value\n // This allows us to interpret values like 'null' --\x3e null, 'false' --\x3e false\n if (!utils.isError(parsedJson) && !utils.isInvalid(parsedJson)) {\n return parsedJson;\n }\n else if (fieldValue === 'undefined') {\n return undefined;\n }\n return fieldValue;\n }\n /**\n * Trims the record value, if specified by the user via the options object\n */\n function trimRecordValue(fieldValue) {\n if (options.trimFieldValues && fieldValue !== null) {\n return fieldValue.trim();\n }\n return fieldValue;\n }\n /**\n * Create a JSON document with the given keys (designated by the CSV header)\n * and the values (from the given line)\n * @returns {Object} created json document\n */\n function createDocument(headerFields, line) {\n // Reduce the keys into a JSON document representing the given line\n return headerFields.reduce((document, headerField) => {\n // If there is a value at the key's index in the line, set the value; otherwise null\n const value = retrieveRecordValueFromLine(headerField, line);\n try {\n // Otherwise add the key and value to the document\n return (0, doc_path_1.setPath)(document, headerField.value, value);\n }\n catch (error) {\n // Catch any errors where key paths are null or '' and continue\n return document;\n }\n }, {});\n }\n /**\n * Removes the outermost wrap delimiters from a value, if they are present\n * Otherwise, the non-wrapped value is returned as is\n */\n function removeWrapDelimitersFromValue(fieldValue) {\n const firstChar = fieldValue[0], lastIndex = fieldValue.length - 1, lastChar = fieldValue[lastIndex];\n // If the field starts and ends with a wrap delimiter\n if (firstChar === options.delimiter.wrap && lastChar === options.delimiter.wrap) {\n return fieldValue.substr(1, lastIndex - 1);\n }\n return fieldValue;\n }\n /**\n * Unescapes wrap delimiters by replacing duplicates with a single (eg. \"\" -> \")\n * This is done in order to parse RFC 4180 compliant CSV back to JSON\n */\n function unescapeWrapDelimiterInField(fieldValue) {\n return fieldValue.replace(escapedWrapDelimiterRegex, options.delimiter.wrap);\n }\n /**\n * Main helper function to convert the CSV to the JSON document array\n */\n function transformRecordLines(params) {\n // For each line, create the document and add it to the array of documents\n return params.recordLines.reduce((generatedJsonObjects, line) => {\n line = line.map((fieldValue) => {\n // Perform the necessary operations on each line\n fieldValue = removeWrapDelimitersFromValue(fieldValue);\n fieldValue = unescapeWrapDelimiterInField(fieldValue);\n fieldValue = trimRecordValue(fieldValue);\n return fieldValue;\n });\n const generatedDocument = createDocument(params.headerFields, line);\n return generatedJsonObjects.concat(generatedDocument);\n }, []);\n }\n /**\n * Attempts to parse the provided value. If it is not parsable, then an error is returned\n */\n function parseValue(value) {\n try {\n if (utils.isStringRepresentation(value, options) && !utils.isDateRepresentation(value)) {\n return value;\n }\n const parsedJson = valueParserFn(value);\n // If the parsed value is an array, then we also need to trim record values, if specified\n if (Array.isArray(parsedJson)) {\n return parsedJson.map(trimRecordValue);\n }\n return parsedJson;\n }\n catch (err) {\n return err;\n }\n }\n /**\n * Internally exported csv2json function\n */\n function convert(data) {\n // Split the CSV into lines using the specified EOL option\n const stripped = stripExcelBOM(data);\n const split = splitLines(stripped);\n const heading = retrieveHeading(split); // Retrieve the headings from the CSV, unless the user specified the keys\n const lines = retrieveRecordLines(heading); // Retrieve the record lines from the CSV\n return transformRecordLines(lines); // Retrieve the JSON document array\n }\n return {\n convert,\n };\n};\nexports.Csv2Json = Csv2Json;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hELG9EQUFvRDtBQUNwRCw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvanNvbi0yLWNzdi9saWIvY3N2Mmpzb24uanM/ODgyMSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ3N2Mkpzb24gPSB2b2lkIDA7XG5jb25zdCBkb2NfcGF0aF8xID0gcmVxdWlyZShcImRvYy1wYXRoXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi9jb25zdGFudHNcIik7XG5jb25zdCB1dGlscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi91dGlsc1wiKSk7XG5jb25zdCBDc3YySnNvbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgY29uc3QgZXNjYXBlZFdyYXBEZWxpbWl0ZXJSZWdleCA9IG5ldyBSZWdFeHAob3B0aW9ucy5kZWxpbWl0ZXIud3JhcCArIG9wdGlvbnMuZGVsaW1pdGVyLndyYXAsICdnJyksIGV4Y2VsQk9NUmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIGNvbnN0YW50c18xLmV4Y2VsQk9NKSwgdmFsdWVQYXJzZXJGbiA9IG9wdGlvbnMucGFyc2VWYWx1ZSAmJiB0eXBlb2Ygb3B0aW9ucy5wYXJzZVZhbHVlID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5wYXJzZVZhbHVlIDogSlNPTi5wYXJzZTtcbiAgICAvKipcbiAgICAgKiBUcmltcyB0aGUgaGVhZGVyIGtleSwgaWYgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHZpYSB0aGUgcHJvdmlkZWQgb3B0aW9uc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NIZWFkZXJLZXkoaGVhZGVyS2V5KSB7XG4gICAgICAgIGhlYWRlcktleSA9IHJlbW92ZVdyYXBEZWxpbWl0ZXJzRnJvbVZhbHVlKGhlYWRlcktleSk7XG4gICAgICAgIGlmIChvcHRpb25zLnRyaW1IZWFkZXJGaWVsZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJLZXkuc3BsaXQoJy4nKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnRyaW0oKSlcbiAgICAgICAgICAgICAgICAuam9pbignLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJLZXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBKU09OIGhlYWRpbmcgZnJvbSB0aGUgQ1NWXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV0cmlldmVIZWFkaW5nKGxpbmVzKSB7XG4gICAgICAgIGxldCBoZWFkZXJGaWVsZHMgPSBbXTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVyRmllbGRzKSB7XG4gICAgICAgICAgICBoZWFkZXJGaWVsZHMgPSBvcHRpb25zLmhlYWRlckZpZWxkcy5tYXAoKGhlYWRlckZpZWxkLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvY2Vzc0hlYWRlcktleShoZWFkZXJGaWVsZCksXG4gICAgICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEdlbmVyYXRlIGFuZCByZXR1cm4gdGhlIGhlYWRpbmcga2V5c1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gbGluZXNbMF07XG4gICAgICAgICAgICBoZWFkZXJGaWVsZHMgPSBoZWFkZXJSb3cubWFwKChoZWFkZXJLZXksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9jZXNzSGVhZGVyS2V5KGhlYWRlcktleSksXG4gICAgICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIHByb3ZpZGVkIGtleXMsIGZpbHRlciB0aGUgZ2VuZXJhdGVkIGtleXMgdG8ganVzdCB0aGUgdXNlciBwcm92aWRlZCBrZXlzIHNvIHdlIGFsc28gaGF2ZSB0aGUga2V5IGluZGV4XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5rZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IG9wdGlvbnMua2V5czsgLy8gVHlwZVNjcmlwdCB0eXBlIGNoZWNraW5nIHdvcmsgYXJvdW5kIHRvIGdldCBpdCB0byByZWNvZ25pemUgdGhlIG9wdGlvbiBpcyBub3QgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaGVhZGVyRmllbGRzID0gaGVhZGVyRmllbGRzLmZpbHRlcigoaGVhZGVyS2V5KSA9PiBrZXlzLmluY2x1ZGVzKGhlYWRlcktleS52YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIGhlYWRlckZpZWxkcyxcbiAgICAgICAgICAgIHJlY29yZExpbmVzOiBbXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgRXhjZWwgQk9NIHZhbHVlLCBpZiBzcGVjaWZpZWQgYnkgdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RyaXBFeGNlbEJPTShjc3YpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjZWxCT00pIHtcbiAgICAgICAgICAgIHJldHVybiBjc3YucmVwbGFjZShleGNlbEJPTVJlZ2V4LCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNzdjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgc3BsaXRzIGEgbGluZSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgd3JhcHBlZCBmaWVsZHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcGxpdExpbmVzKGNzdikge1xuICAgICAgICAvLyBQYXJzZSBvdXQgdGhlIGxpbmUuLi5cbiAgICAgICAgY29uc3QgbGluZXMgPSBbXSwgbGFzdENoYXJhY3RlckluZGV4ID0gY3N2Lmxlbmd0aCAtIDEsIGVvbERlbGltaXRlckxlbmd0aCA9IG9wdGlvbnMuZGVsaW1pdGVyLmVvbC5sZW5ndGgsIHN0YXRlVmFyaWFibGVzID0ge1xuICAgICAgICAgICAgaW5zaWRlV3JhcERlbGltaXRlcjogZmFsc2UsXG4gICAgICAgICAgICBwYXJzaW5nVmFsdWU6IHRydWUsXG4gICAgICAgICAgICBqdXN0UGFyc2VkRG91YmxlUXVvdGU6IGZhbHNlLFxuICAgICAgICAgICAgc3RhcnRJbmRleDogMFxuICAgICAgICB9O1xuICAgICAgICBsZXQgc3BsaXRMaW5lID0gW10sIGNoYXJhY3RlciwgY2hhckJlZm9yZSwgY2hhckFmdGVyLCBuZXh0TkNoYXIsIGluZGV4ID0gMDtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggY2hhcmFjdGVyIGluIHRoZSBsaW5lIHRvIGlkZW50aWZ5IHdoZXJlIHRvIHNwbGl0IHRoZSB2YWx1ZXNcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgY3N2Lmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gQ3VycmVudCBjaGFyYWN0ZXJcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IGNzdltpbmRleF07XG4gICAgICAgICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXJcbiAgICAgICAgICAgIGNoYXJCZWZvcmUgPSBpbmRleCA/IGNzdltpbmRleCAtIDFdIDogJyc7XG4gICAgICAgICAgICAvLyBOZXh0IGNoYXJhY3RlclxuICAgICAgICAgICAgY2hhckFmdGVyID0gaW5kZXggPCBsYXN0Q2hhcmFjdGVySW5kZXggPyBjc3ZbaW5kZXggKyAxXSA6ICcnO1xuICAgICAgICAgICAgLy8gTmV4dCBuIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgY3VycmVudCBjaGFyYWN0ZXIsIHdoZXJlIG4gPSBsZW5ndGgoRU9MIGRlbGltaXRlcilcbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGZvciB0aGUgY2hlY2tpbmcgb2YgYW4gRU9MIGRlbGltaXRlciB3aGVuIGlmIGl0IGlzIG1vcmUgdGhhbiBhIHNpbmdsZSBjaGFyYWN0ZXIgKGVnLiAnXFxyXFxuJylcbiAgICAgICAgICAgIG5leHROQ2hhciA9IHV0aWxzLmdldE5DaGFyYWN0ZXJzKGNzdiwgaW5kZXgsIGVvbERlbGltaXRlckxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoKG5leHROQ2hhciA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIuZW9sICYmICFzdGF0ZVZhcmlhYmxlcy5pbnNpZGVXcmFwRGVsaW1pdGVyIHx8XG4gICAgICAgICAgICAgICAgaW5kZXggPT09IGxhc3RDaGFyYWN0ZXJJbmRleCkgJiYgY2hhckJlZm9yZSA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGFuIEVPTCBkZWxpbWl0ZXIgb3IgdGhlIGVuZCBvZiB0aGUgY3N2IGFuZCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGlzIGEgZmllbGQgZGVsaW1pdGVyLi4uXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXJ0IGluZGV4IGlzIHRoZSBjdXJyZW50IGluZGV4IChhbmQgc2luY2UgdGhlIHByZXZpb3VzIGNoYXJhY3RlciBpcyBhIGNvbW1hKSxcbiAgICAgICAgICAgICAgICAvLyAgIHRoZW4gdGhlIHZhbHVlIGJlaW5nIHBhcnNlZCBpcyBhbiBlbXB0eSB2YWx1ZSBhY2NvcmRpbmdseSwgYWRkIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgICAgIGlmIChuZXh0TkNoYXIgPT09IG9wdGlvbnMuZGVsaW1pdGVyLmVvbCAmJiBzdGF0ZVZhcmlhYmxlcy5zdGFydEluZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmUucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBDU1YsIHRoZXJlJ3Mgbm8gbmV3IGxpbmUsIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBjb21tYVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGFkZCBhbiBlbXB0eSBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0TGluZS5wdXNoKCcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlcmUncyBhIHZhbGlkIHZhbHVlLCBhbmQgdGhlIHN0YXJ0IGluZGV4IGlzbid0IHRoZSBjdXJyZW50IGluZGV4LCBncmFiIHRoZSB3aG9sZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBzcGxpdExpbmUucHVzaChjc3Yuc3Vic3RyKHN0YXRlVmFyaWFibGVzLnN0YXJ0SW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgY29tbWEsIHRoZXJlJ3Mgc3RpbGwgYW4gYWRkaXRpb25hbCBpbXBsaWVkIGZpZWxkIHZhbHVlIHRyYWlsaW5nIHRoZSBjb21tYS5cbiAgICAgICAgICAgICAgICAvLyAgIFNpbmNlIHRoaXMgdmFsdWUgaXMgZW1wdHksIHdlIHB1c2ggYW4gZXh0cmEgZW1wdHkgdmFsdWVcbiAgICAgICAgICAgICAgICBzcGxpdExpbmUucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgLy8gRmluYWxseSwgcHVzaCB0aGUgc3BsaXQgbGluZSB2YWx1ZXMgaW50byB0aGUgbGluZXMgYXJyYXkgYW5kIGNsZWFyIHRoZSBzcGxpdCBsaW5lXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChzcGxpdExpbmUpO1xuICAgICAgICAgICAgICAgIHNwbGl0TGluZSA9IFtdO1xuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLnN0YXJ0SW5kZXggPSBpbmRleCArIGVvbERlbGltaXRlckxlbmd0aDtcbiAgICAgICAgICAgICAgICBzdGF0ZVZhcmlhYmxlcy5wYXJzaW5nVmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLmluc2lkZVdyYXBEZWxpbWl0ZXIgPSBjaGFyQWZ0ZXIgPT09IG9wdGlvbnMuZGVsaW1pdGVyLndyYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gbGFzdENoYXJhY3RlckluZGV4ICYmIGNoYXJhY3RlciA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBDU1YgYW5kIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhIGZpZWxkIGRlbGltaXRlclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBwcmV2aW91c2x5IHNlZW4gdmFsdWUgYW5kIGFkZCBpdCB0byB0aGUgbGluZVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gY3N2LnN1YnN0cmluZyhzdGF0ZVZhcmlhYmxlcy5zdGFydEluZGV4LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgc3BsaXRMaW5lLnB1c2gocGFyc2VkVmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRoZW4gYWRkIGFuIGVtcHR5IHN0cmluZyB0byB0aGUgbGluZSBzaW5jZSB0aGUgbGFzdCBjaGFyYWN0ZXIgYmVpbmcgYSBmaWVsZCBkZWxpbWl0ZXIgaW5kaWNhdGVzIGFuIGVtcHR5IGZpZWxkXG4gICAgICAgICAgICAgICAgc3BsaXRMaW5lLnB1c2goJycpO1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3BsaXRMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSBsYXN0Q2hhcmFjdGVySW5kZXggfHwgbmV4dE5DaGFyID09PSBvcHRpb25zLmRlbGltaXRlci5lb2wgJiZcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmVuJ3QgaW5zaWRlIHdyYXAgZGVsaW1pdGVycyBvciBpZiB3ZSBhcmUgYnV0IHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHdhcyBhIHdyYXAgZGVsaW1pdGVyIGFuZCB3ZSBkaWRuJ3QganVzdCBzZWUgdHdvXG4gICAgICAgICAgICAgICAgKCFzdGF0ZVZhcmlhYmxlcy5pbnNpZGVXcmFwRGVsaW1pdGVyIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLmluc2lkZVdyYXBEZWxpbWl0ZXIgJiYgY2hhckJlZm9yZSA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIud3JhcCAmJiAhc3RhdGVWYXJpYWJsZXMuanVzdFBhcnNlZERvdWJsZVF1b3RlKSkge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpbmUgb3IgY3N2IChhbmQgY3VycmVudCBjaGFyYWN0ZXIgaXMgbm90IGEgZmllbGQgZGVsaW1pdGVyKVxuICAgICAgICAgICAgICAgIGNvbnN0IHRvSW5kZXggPSBpbmRleCAhPT0gbGFzdENoYXJhY3RlckluZGV4IHx8IGNoYXJCZWZvcmUgPT09IG9wdGlvbnMuZGVsaW1pdGVyLndyYXAgPyBpbmRleCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgcmVtYWluaW5nIHZhbHVlIGFuZCBhZGQgaXQgdG8gdGhlIHNwbGl0IGxpbmUgbGlzdCBvZiB2YWx1ZXNcbiAgICAgICAgICAgICAgICBzcGxpdExpbmUucHVzaChjc3Yuc3Vic3RyaW5nKHN0YXRlVmFyaWFibGVzLnN0YXJ0SW5kZXgsIHRvSW5kZXgpKTtcbiAgICAgICAgICAgICAgICAvLyBGaW5hbGx5LCBwdXNoIHRoZSBzcGxpdCBsaW5lIHZhbHVlcyBpbnRvIHRoZSBsaW5lcyBhcnJheSBhbmQgY2xlYXIgdGhlIHNwbGl0IGxpbmVcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKHNwbGl0TGluZSk7XG4gICAgICAgICAgICAgICAgc3BsaXRMaW5lID0gW107XG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMuc3RhcnRJbmRleCA9IGluZGV4ICsgZW9sRGVsaW1pdGVyTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLnBhcnNpbmdWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMuaW5zaWRlV3JhcERlbGltaXRlciA9IGNoYXJBZnRlciA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIud3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIud3JhcCAmJiBjaGFyQmVmb3JlID09PSBvcHRpb25zLmRlbGltaXRlci5maWVsZCAmJlxuICAgICAgICAgICAgICAgICFzdGF0ZVZhcmlhYmxlcy5pbnNpZGVXcmFwRGVsaW1pdGVyICYmICFzdGF0ZVZhcmlhYmxlcy5wYXJzaW5nVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgd3JhcCBkZWxpbWl0ZXIgYWZ0ZXIgYSBjb21tYSBhbmQgd2UgYXJlbid0IGluc2lkZSBhIHdyYXAgZGVsaW1pdGVyXG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMuc3RhcnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLmluc2lkZVdyYXBEZWxpbWl0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLnBhcnNpbmdWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5leHQgY2hhcmFjdGVyKHMpIGFyZSBhbiBFT0wgZGVsaW1pdGVyLCB0aGVuIHNraXAgdGhlbSBzbyB3ZSBkb24ndCBwYXJzZSB3aGF0IHdlJ3ZlIHNlZW4gYXMgYW5vdGhlciB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmICh1dGlscy5nZXROQ2hhcmFjdGVycyhjc3YsIGluZGV4ICsgMSwgZW9sRGVsaW1pdGVyTGVuZ3RoKSA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIuZW9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IG9wdGlvbnMuZGVsaW1pdGVyLmVvbC5sZW5ndGggKyAxOyAvLyBTa2lwIHBhc3QgRU9MXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKGNoYXJCZWZvcmUgIT09IG9wdGlvbnMuZGVsaW1pdGVyLndyYXAgfHwgc3RhdGVWYXJpYWJsZXMuanVzdFBhcnNlZERvdWJsZVF1b3RlICYmIGNoYXJCZWZvcmUgPT09IG9wdGlvbnMuZGVsaW1pdGVyLndyYXApICYmXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID09PSBvcHRpb25zLmRlbGltaXRlci53cmFwICYmIHV0aWxzLmdldE5DaGFyYWN0ZXJzKGNzdiwgaW5kZXggKyAxLCBlb2xEZWxpbWl0ZXJMZW5ndGgpID09PSBvcHRpb25zLmRlbGltaXRlci5lb2wpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaCBhIHdyYXAgd2hpY2ggaXMgbm90IHByZWNlZGVkIGJ5IGEgd3JhcCBkZWxpbSBhbmQgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGFuIEVPTCBkZWxpbSAoaWUuICpcIlxcbilcbiAgICAgICAgICAgICAgICBzdGF0ZVZhcmlhYmxlcy5pbnNpZGVXcmFwRGVsaW1pdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMucGFyc2luZ1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gTmV4dCBpdGVyYXRpb24gd2lsbCBzdWJzdHJpbmcsIGFkZCB0aGUgdmFsdWUgdG8gdGhlIGxpbmUsIGFuZCBwdXNoIHRoZSBsaW5lIG9udG8gdGhlIGFycmF5IG9mIGxpbmVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IG9wdGlvbnMuZGVsaW1pdGVyLndyYXAgJiYgKGluZGV4ID09PSAwIHx8IHV0aWxzLmdldE5DaGFyYWN0ZXJzKGNzdiwgaW5kZXggLSBlb2xEZWxpbWl0ZXJMZW5ndGgsIGVvbERlbGltaXRlckxlbmd0aCkgPT09IG9wdGlvbnMuZGVsaW1pdGVyLmVvbCAmJiAhc3RhdGVWYXJpYWJsZXMuaW5zaWRlV3JhcERlbGltaXRlcikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBzdGFydHMgd2l0aCBhIHdyYXAgZGVsaW1pdGVyIChpZS4gXCIqKVxuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLmluc2lkZVdyYXBEZWxpbWl0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLnBhcnNpbmdWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMuc3RhcnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyID09PSBvcHRpb25zLmRlbGltaXRlci53cmFwICYmIGNoYXJBZnRlciA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgd3JhcCBkZWxpbWl0ZXIgd2l0aCBhIGZpZWxkIGRlbGltaXRlciBhZnRlciBpdCAoaWUuICpcIiwpXG4gICAgICAgICAgICAgICAgc3BsaXRMaW5lLnB1c2goY3N2LnN1YnN0cmluZyhzdGF0ZVZhcmlhYmxlcy5zdGFydEluZGV4LCBpbmRleCArIDEpKTtcbiAgICAgICAgICAgICAgICBzdGF0ZVZhcmlhYmxlcy5zdGFydEluZGV4ID0gaW5kZXggKyAyOyAvLyBuZXh0IHZhbHVlIHN0YXJ0cyBhZnRlciB0aGUgZmllbGQgZGVsaW1pdGVyXG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMuaW5zaWRlV3JhcERlbGltaXRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLnBhcnNpbmdWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyID09PSBvcHRpb25zLmRlbGltaXRlci53cmFwICYmIGNoYXJCZWZvcmUgPT09IG9wdGlvbnMuZGVsaW1pdGVyLmZpZWxkICYmXG4gICAgICAgICAgICAgICAgIXN0YXRlVmFyaWFibGVzLmluc2lkZVdyYXBEZWxpbWl0ZXIgJiYgc3RhdGVWYXJpYWJsZXMucGFyc2luZ1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHdyYXAgZGVsaW1pdGVyIHdpdGggYSBmaWVsZCBkZWxpbWl0ZXIgYWZ0ZXIgaXQgKGllLiAsXCIqKVxuICAgICAgICAgICAgICAgIHNwbGl0TGluZS5wdXNoKGNzdi5zdWJzdHJpbmcoc3RhdGVWYXJpYWJsZXMuc3RhcnRJbmRleCwgaW5kZXggLSAxKSk7XG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMuaW5zaWRlV3JhcERlbGltaXRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMucGFyc2luZ1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdGF0ZVZhcmlhYmxlcy5zdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IG9wdGlvbnMuZGVsaW1pdGVyLndyYXAgJiYgY2hhckFmdGVyID09PSBvcHRpb25zLmRlbGltaXRlci53cmFwICYmIGluZGV4ICE9PSBzdGF0ZVZhcmlhYmxlcy5zdGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgcnVuIGludG8gYW4gZXNjYXBlZCBxdW90ZSAoaWUuIFwiXCIpIHNraXAgcGFzdCB0aGUgc2Vjb25kIHF1b3RlXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgICAgICBzdGF0ZVZhcmlhYmxlcy5qdXN0UGFyc2VkRG91YmxlUXVvdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyID09PSBvcHRpb25zLmRlbGltaXRlci5maWVsZCAmJiBjaGFyQmVmb3JlICE9PSBvcHRpb25zLmRlbGltaXRlci53cmFwICYmXG4gICAgICAgICAgICAgICAgY2hhckFmdGVyICE9PSBvcHRpb25zLmRlbGltaXRlci53cmFwICYmICFzdGF0ZVZhcmlhYmxlcy5pbnNpZGVXcmFwRGVsaW1pdGVyICYmXG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMucGFyc2luZ1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIGZpZWxkIGRlbGltaXRlciBhbmQgYXJlIG5vdCBpbnNpZGUgdGhlIHdyYXAgZGVsaW1pdGVycyAoaWUuICosKilcbiAgICAgICAgICAgICAgICBzcGxpdExpbmUucHVzaChjc3Yuc3Vic3RyaW5nKHN0YXRlVmFyaWFibGVzLnN0YXJ0SW5kZXgsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgc3RhdGVWYXJpYWJsZXMuc3RhcnRJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQgJiYgY2hhckJlZm9yZSA9PT0gb3B0aW9ucy5kZWxpbWl0ZXIud3JhcCAmJlxuICAgICAgICAgICAgICAgIGNoYXJBZnRlciAhPT0gb3B0aW9ucy5kZWxpbWl0ZXIud3JhcCAmJiAhc3RhdGVWYXJpYWJsZXMucGFyc2luZ1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIGZpZWxkIGRlbGltaXRlciwgdGhlIHByZXZpb3VzIGNoYXJhY3RlciB3YXMgYSB3cmFwIGRlbGltaXRlciwgYW5kIHRoZVxuICAgICAgICAgICAgICAgIC8vICAgbmV4dCBjaGFyYWN0ZXIgaXMgbm90IGEgd3JhcCBkZWxpbWl0ZXIgKGllLiBcIiwqKVxuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLmluc2lkZVdyYXBEZWxpbWl0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzdGF0ZVZhcmlhYmxlcy5wYXJzaW5nVmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLnN0YXJ0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IHRvIHRoZSBuZXh0IGNoYXJhY3RlclxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBkb3VibGUgcXVvdGUgc3RhdGUgdmFyaWFibGVcbiAgICAgICAgICAgIHN0YXRlVmFyaWFibGVzLmp1c3RQYXJzZWREb3VibGVRdW90ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSByZWNvcmQgbGluZXMgZnJvbSB0aGUgc3BsaXQgQ1NWIGxpbmVzIGFuZCBzZXRzIGl0IG9uIHRoZSBwYXJhbXMgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV0cmlldmVSZWNvcmRMaW5lcyhwYXJhbXMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVyRmllbGRzKSB7IC8vIFRoaXMgb3B0aW9uIGlzIHBhc3NlZCBmb3IgaW5zdGFuY2VzIHdoZXJlIHRoZSBDU1YgaGFzIG5vIGhlYWRlciBsaW5lXG4gICAgICAgICAgICBwYXJhbXMucmVjb3JkTGluZXMgPSBwYXJhbXMubGluZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIEFsbCBsaW5lcyBleGNlcHQgZm9yIHRoZSBoZWFkZXIgbGluZVxuICAgICAgICAgICAgcGFyYW1zLnJlY29yZExpbmVzID0gcGFyYW1zLmxpbmVzLnNwbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGZvciB0aGUgcmVjb3JkIGZyb20gdGhlIGxpbmUgYXQgdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXRyaWV2ZVJlY29yZFZhbHVlRnJvbUxpbmUoaGVhZGVyRmllbGQsIGxpbmUpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSB2YWx1ZSBhdCB0aGUga2V5J3MgaW5kZXgsIHVzZSBpdDsgb3RoZXJ3aXNlLCBudWxsXG4gICAgICAgIGNvbnN0IHZhbHVlID0gbGluZVtoZWFkZXJGaWVsZC5pbmRleF07XG4gICAgICAgIC8vIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSB2YWx1ZSBjb252ZXJzaW9ucyBvbiB0aGUgcmVjb3JkIHZhbHVlXG4gICAgICAgIHJldHVybiBwcm9jZXNzUmVjb3JkVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIHJlY29yZCdzIHZhbHVlIGJ5IHBhcnNpbmcgdGhlIGRhdGEgdG8gZW5zdXJlIHRoZSBDU1YgaXNcbiAgICAgKiBjb252ZXJ0ZWQgdG8gdGhlIEpTT04gdGhhdCBjcmVhdGVkIGl0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWNvcmRWYWx1ZShmaWVsZFZhbHVlKSB7XG4gICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSByZXByZXNlbnRhdGlvbiwgY29udmVydCBpdFxuICAgICAgICBjb25zdCBwYXJzZWRKc29uID0gcGFyc2VWYWx1ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgLy8gSWYgcGFyc2VkSnNvbiBpcyBhbnl0aGluZyBhc2lkZSBmcm9tIGFuIGVycm9yLCB0aGVuIHdlIHdhbnQgdG8gdXNlIHRoZSBwYXJzZWQgdmFsdWVcbiAgICAgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gaW50ZXJwcmV0IHZhbHVlcyBsaWtlICdudWxsJyAtLT4gbnVsbCwgJ2ZhbHNlJyAtLT4gZmFsc2VcbiAgICAgICAgaWYgKCF1dGlscy5pc0Vycm9yKHBhcnNlZEpzb24pICYmICF1dGlscy5pc0ludmFsaWQocGFyc2VkSnNvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWRKc29uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpZWxkVmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZFZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmltcyB0aGUgcmVjb3JkIHZhbHVlLCBpZiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgdmlhIHRoZSBvcHRpb25zIG9iamVjdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1SZWNvcmRWYWx1ZShmaWVsZFZhbHVlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnRyaW1GaWVsZFZhbHVlcyAmJiBmaWVsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIEpTT04gZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4ga2V5cyAoZGVzaWduYXRlZCBieSB0aGUgQ1NWIGhlYWRlcilcbiAgICAgKiAgIGFuZCB0aGUgdmFsdWVzIChmcm9tIHRoZSBnaXZlbiBsaW5lKVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGNyZWF0ZWQganNvbiBkb2N1bWVudFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50KGhlYWRlckZpZWxkcywgbGluZSkge1xuICAgICAgICAvLyBSZWR1Y2UgdGhlIGtleXMgaW50byBhIEpTT04gZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBsaW5lXG4gICAgICAgIHJldHVybiBoZWFkZXJGaWVsZHMucmVkdWNlKChkb2N1bWVudCwgaGVhZGVyRmllbGQpID0+IHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgdmFsdWUgYXQgdGhlIGtleSdzIGluZGV4IGluIHRoZSBsaW5lLCBzZXQgdGhlIHZhbHVlOyBvdGhlcndpc2UgbnVsbFxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXRyaWV2ZVJlY29yZFZhbHVlRnJvbUxpbmUoaGVhZGVyRmllbGQsIGxpbmUpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIHRoZSBrZXkgYW5kIHZhbHVlIHRvIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgIHJldHVybiAoMCwgZG9jX3BhdGhfMS5zZXRQYXRoKShkb2N1bWVudCwgaGVhZGVyRmllbGQudmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIENhdGNoIGFueSBlcnJvcnMgd2hlcmUga2V5IHBhdGhzIGFyZSBudWxsIG9yICcnIGFuZCBjb250aW51ZVxuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBvdXRlcm1vc3Qgd3JhcCBkZWxpbWl0ZXJzIGZyb20gYSB2YWx1ZSwgaWYgdGhleSBhcmUgcHJlc2VudFxuICAgICAqIE90aGVyd2lzZSwgdGhlIG5vbi13cmFwcGVkIHZhbHVlIGlzIHJldHVybmVkIGFzIGlzXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlV3JhcERlbGltaXRlcnNGcm9tVmFsdWUoZmllbGRWYWx1ZSkge1xuICAgICAgICBjb25zdCBmaXJzdENoYXIgPSBmaWVsZFZhbHVlWzBdLCBsYXN0SW5kZXggPSBmaWVsZFZhbHVlLmxlbmd0aCAtIDEsIGxhc3RDaGFyID0gZmllbGRWYWx1ZVtsYXN0SW5kZXhdO1xuICAgICAgICAvLyBJZiB0aGUgZmllbGQgc3RhcnRzIGFuZCBlbmRzIHdpdGggYSB3cmFwIGRlbGltaXRlclxuICAgICAgICBpZiAoZmlyc3RDaGFyID09PSBvcHRpb25zLmRlbGltaXRlci53cmFwICYmIGxhc3RDaGFyID09PSBvcHRpb25zLmRlbGltaXRlci53cmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS5zdWJzdHIoMSwgbGFzdEluZGV4IC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVuZXNjYXBlcyB3cmFwIGRlbGltaXRlcnMgYnkgcmVwbGFjaW5nIGR1cGxpY2F0ZXMgd2l0aCBhIHNpbmdsZSAoZWcuIFwiXCIgLT4gXCIpXG4gICAgICogVGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIHBhcnNlIFJGQyA0MTgwIGNvbXBsaWFudCBDU1YgYmFjayB0byBKU09OXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5lc2NhcGVXcmFwRGVsaW1pdGVySW5GaWVsZChmaWVsZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmaWVsZFZhbHVlLnJlcGxhY2UoZXNjYXBlZFdyYXBEZWxpbWl0ZXJSZWdleCwgb3B0aW9ucy5kZWxpbWl0ZXIud3JhcCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1haW4gaGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIENTViB0byB0aGUgSlNPTiBkb2N1bWVudCBhcnJheVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVJlY29yZExpbmVzKHBhcmFtcykge1xuICAgICAgICAvLyBGb3IgZWFjaCBsaW5lLCBjcmVhdGUgdGhlIGRvY3VtZW50IGFuZCBhZGQgaXQgdG8gdGhlIGFycmF5IG9mIGRvY3VtZW50c1xuICAgICAgICByZXR1cm4gcGFyYW1zLnJlY29yZExpbmVzLnJlZHVjZSgoZ2VuZXJhdGVkSnNvbk9iamVjdHMsIGxpbmUpID0+IHtcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLm1hcCgoZmllbGRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb25zIG9uIGVhY2ggbGluZVxuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSByZW1vdmVXcmFwRGVsaW1pdGVyc0Zyb21WYWx1ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5lc2NhcGVXcmFwRGVsaW1pdGVySW5GaWVsZChmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdHJpbVJlY29yZFZhbHVlKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBnZW5lcmF0ZWREb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KHBhcmFtcy5oZWFkZXJGaWVsZHMsIGxpbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpzb25PYmplY3RzLmNvbmNhdChnZW5lcmF0ZWREb2N1bWVudCk7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gcGFyc2UgdGhlIHByb3ZpZGVkIHZhbHVlLiBJZiBpdCBpcyBub3QgcGFyc2FibGUsIHRoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmdSZXByZXNlbnRhdGlvbih2YWx1ZSwgb3B0aW9ucykgJiYgIXV0aWxzLmlzRGF0ZVJlcHJlc2VudGF0aW9uKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEpzb24gPSB2YWx1ZVBhcnNlckZuKHZhbHVlKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBwYXJzZWQgdmFsdWUgaXMgYW4gYXJyYXksIHRoZW4gd2UgYWxzbyBuZWVkIHRvIHRyaW0gcmVjb3JkIHZhbHVlcywgaWYgc3BlY2lmaWVkXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWRKc29uKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRKc29uLm1hcCh0cmltUmVjb3JkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZEpzb247XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbGx5IGV4cG9ydGVkIGNzdjJqc29uIGZ1bmN0aW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29udmVydChkYXRhKSB7XG4gICAgICAgIC8vIFNwbGl0IHRoZSBDU1YgaW50byBsaW5lcyB1c2luZyB0aGUgc3BlY2lmaWVkIEVPTCBvcHRpb25cbiAgICAgICAgY29uc3Qgc3RyaXBwZWQgPSBzdHJpcEV4Y2VsQk9NKGRhdGEpO1xuICAgICAgICBjb25zdCBzcGxpdCA9IHNwbGl0TGluZXMoc3RyaXBwZWQpO1xuICAgICAgICBjb25zdCBoZWFkaW5nID0gcmV0cmlldmVIZWFkaW5nKHNwbGl0KTsgLy8gUmV0cmlldmUgdGhlIGhlYWRpbmdzIGZyb20gdGhlIENTViwgdW5sZXNzIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUga2V5c1xuICAgICAgICBjb25zdCBsaW5lcyA9IHJldHJpZXZlUmVjb3JkTGluZXMoaGVhZGluZyk7IC8vIFJldHJpZXZlIHRoZSByZWNvcmQgbGluZXMgZnJvbSB0aGUgQ1NWXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1SZWNvcmRMaW5lcyhsaW5lcyk7IC8vIFJldHJpZXZlIHRoZSBKU09OIGRvY3VtZW50IGFycmF5XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbnZlcnQsXG4gICAgfTtcbn07XG5leHBvcnRzLkNzdjJKc29uID0gQ3N2Mkpzb247XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///93989\n")},87389:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Json2Csv = void 0;\nconst doc_path_1 = __webpack_require__(6052);\nconst deeks_1 = __webpack_require__(12315);\nconst constants_1 = __webpack_require__(99488);\nconst utils = __importStar(__webpack_require__(26164));\nconst Json2Csv = function (options) {\n const wrapDelimiterCheckRegex = new RegExp(options.delimiter.wrap, 'g'), crlfSearchRegex = /\\r?\\n|\\r/, customValueParser = options.parseValue && typeof options.parseValue === 'function' ? options.parseValue : null, expandingWithoutUnwinding = options.expandArrayObjects && !options.unwindArrays, deeksOptions = {\n arrayIndexesAsKeys: options.arrayIndexesAsKeys,\n expandNestedObjects: options.expandNestedObjects,\n expandArrayObjects: expandingWithoutUnwinding,\n ignoreEmptyArraysWhenExpanding: expandingWithoutUnwinding,\n escapeNestedDots: true,\n };\n /** HEADER FIELD FUNCTIONS **/\n /**\n * Returns the list of data field names of all documents in the provided list\n */\n function getFieldNameList(data) {\n // If keys weren't specified, then we'll use the list of keys generated by the deeks module\n return (0, deeks_1.deepKeysFromList)(data, deeksOptions);\n }\n /**\n * Processes the schemas by checking for schema differences, if so desired.\n * If schema differences are not to be checked, then it resolves the unique\n * list of field names.\n */\n function processSchemas(documentSchemas) {\n // If the user wants to check for the same schema (regardless of schema ordering)\n if (options.checkSchemaDifferences) {\n return checkSchemaDifferences(documentSchemas);\n }\n else {\n // Otherwise, we do not care if the schemas are different, so we should get the unique list of keys\n const uniqueFieldNames = utils.unique(utils.flatten(documentSchemas));\n return uniqueFieldNames;\n }\n }\n /**\n * This function performs the schema difference check, if the user specifies that it should be checked.\n * If there are no field names, then there are no differences.\n * Otherwise, we get the first schema and the remaining list of schemas\n */\n function checkSchemaDifferences(documentSchemas) {\n // have multiple documents - ensure only one schema (regardless of field ordering)\n const firstDocSchema = documentSchemas[0], restOfDocumentSchemas = documentSchemas.slice(1), schemaDifferences = computeNumberOfSchemaDifferences(firstDocSchema, restOfDocumentSchemas);\n // If there are schema inconsistencies, throw a schema not the same error\n if (schemaDifferences) {\n throw new Error(constants_1.errors.json2csv.notSameSchema);\n }\n return firstDocSchema;\n }\n /**\n * Computes the number of schema differences\n */\n function computeNumberOfSchemaDifferences(firstDocSchema, restOfDocumentSchemas) {\n return restOfDocumentSchemas.reduce((schemaDifferences, documentSchema) => {\n // If there is a difference between the schemas, increment the counter of schema inconsistencies\n const numberOfDifferences = utils.computeSchemaDifferences(firstDocSchema, documentSchema).length;\n return numberOfDifferences > 0\n ? schemaDifferences + 1\n : schemaDifferences;\n }, 0);\n }\n /**\n * If so specified, this filters the detected key paths to exclude any keys that have been specified\n */\n function filterExcludedKeys(keyPaths) {\n if (options.excludeKeys) {\n return keyPaths.filter((keyPath) => {\n for (const excludedKey of options.excludeKeys) {\n // Only match if the excludedKey appears at the beginning of the string so we don't accidentally match a key farther down in a key path\n const regex = excludedKey instanceof RegExp ? excludedKey : new RegExp(`^${excludedKey}`);\n if (excludedKey === keyPath || keyPath.match(regex)) {\n return false; // Exclude the key\n }\n }\n return true; // Otherwise, include the key\n });\n }\n return keyPaths;\n }\n /**\n * If so specified, this sorts the header field names alphabetically\n */\n function sortHeaderFields(fieldNames) {\n if (options.sortHeader && typeof options.sortHeader === 'function') {\n return fieldNames.sort(options.sortHeader);\n }\n else if (options.sortHeader) {\n return fieldNames.sort();\n }\n return fieldNames;\n }\n /**\n * Trims the header fields, if the user desires them to be trimmed.\n */\n function trimHeaderFields(params) {\n if (options.trimHeaderFields) {\n params.headerFields = params.headerFields.map((field) => field.split('.')\n .map((component) => component.trim())\n .join('.'));\n }\n return params;\n }\n /**\n * Wrap the headings, if desired by the user.\n */\n function wrapHeaderFields(params) {\n // only perform this if we are actually prepending the header\n if (options.prependHeader) {\n params.headerFields = params.headerFields.map(function (headingKey) {\n return wrapFieldValueIfNecessary(headingKey);\n });\n }\n return params;\n }\n /**\n * Generates the CSV header string by joining the headerFields by the field delimiter\n */\n function generateCsvHeader(params) {\n // #185 - generate a keys list to avoid finding native Map() methods\n const fieldTitleMapKeys = Object.keys(options.fieldTitleMap);\n params.header = params.headerFields\n .map(function (field) {\n let headerKey = field;\n // If a custom field title was provided for this field, use that\n if (fieldTitleMapKeys.includes(field)) {\n headerKey = options.fieldTitleMap[field];\n }\n else if (!options.escapeHeaderNestedDots) {\n // Otherwise, if the user doesn't want nested dots in keys to be escaped, then unescape them\n headerKey = headerKey.replace(/\\\\\\./g, '.');\n }\n return wrapFieldValueIfNecessary(headerKey);\n })\n .join(options.delimiter.field);\n return params;\n }\n function convertKeysToHeaderFields() {\n if (!options.keys)\n return [];\n return options.keys.map((key) => {\n if (typeof key === 'object' && 'field' in key) {\n options.fieldTitleMap[key.field] = key.title ?? key.field;\n return key.field;\n }\n return key;\n });\n }\n function extractWildcardMatchKeys() {\n if (!options.keys)\n return [];\n return options.keys.flatMap(item => {\n if (typeof item === 'string') {\n // Exclude plain strings that were passed in options.keys\n return [];\n }\n else if (item?.wildcardMatch) {\n // Return \"field\" value for objects with wildcardMatch: true\n return item.field;\n }\n // Exclude other objects\n return [];\n });\n }\n /**\n * Retrieve the headings for all documents and return it.\n * This checks that all documents have the same schema.\n */\n function retrieveHeaderFields(data) {\n const wildcardMatchKeys = extractWildcardMatchKeys();\n const keyStrings = convertKeysToHeaderFields();\n const fieldNames = getFieldNameList(data);\n const processed = processSchemas(fieldNames);\n if (options.keys) {\n options.keys = keyStrings;\n const matchedKeys = keyStrings.flatMap((userProvidedKey) => {\n // If this is not a wildcard matched key, then just return and include it in the resulting key list\n if (!wildcardMatchKeys.includes(userProvidedKey)) {\n return userProvidedKey;\n }\n // Otherwise, identify all detected keys that match with the provided wildcard key:\n const matches = [];\n const regex = new RegExp(`^${userProvidedKey}`);\n for (const detectedKey of processed) {\n if (userProvidedKey === detectedKey || detectedKey.match(regex)) {\n matches.push(detectedKey);\n }\n }\n return matches;\n });\n if (!options.unwindArrays) {\n const filtered = filterExcludedKeys(matchedKeys);\n return sortHeaderFields(filtered);\n }\n }\n const filtered = filterExcludedKeys(processed);\n return sortHeaderFields(filtered);\n }\n /** RECORD FIELD FUNCTIONS **/\n /**\n * Unwinds objects in arrays within record objects if the user specifies the\n * expandArrayObjects option. If not specified, this passes the params\n * argument through to the next function in the promise chain.\n *\n * The `finalPass` parameter is used to trigger one last pass to ensure no more\n * arrays need to be expanded\n */\n function unwindRecordsIfNecessary(params, finalPass = false) {\n if (options.unwindArrays) {\n const originalRecordsLength = params.records.length;\n // Unwind each of the documents at the given headerField\n params.headerFields.forEach((headerField) => {\n params.records = utils.unwind(params.records, headerField);\n });\n const headerFields = retrieveHeaderFields(params.records);\n params.headerFields = headerFields;\n // If we were able to unwind more arrays, then try unwinding again...\n if (originalRecordsLength !== params.records.length) {\n return unwindRecordsIfNecessary(params);\n }\n // Otherwise, we didn't unwind any additional arrays, so continue...\n // Run a final time in case the earlier unwinding exposed additional\n // arrays to unwind...\n if (!finalPass) {\n return unwindRecordsIfNecessary(params, true);\n }\n // If keys were provided, set the headerFields back to the provided keys after unwinding:\n if (options.keys) {\n const userSelectedFields = convertKeysToHeaderFields();\n params.headerFields = filterExcludedKeys(userSelectedFields);\n }\n return params;\n }\n return params;\n }\n /**\n * Main function which handles the processing of a record, or document to be converted to CSV format\n * This function specifies and performs the necessary operations in the necessary order\n * in order to obtain the data and convert it to CSV form while maintaining RFC 4180 compliance.\n * * Order of operations:\n * - Get fields from provided key list (as array of actual values)\n * - Convert the values to csv/string representation [possible option here for custom converters?]\n * - Trim fields\n * - Determine if they need to be wrapped (& wrap if necessary)\n * - Combine values for each line (by joining by field delimiter)\n */\n function processRecords(params) {\n params.recordString = params.records.map((record) => {\n // Retrieve data for each of the headerFields from this record\n const recordFieldData = retrieveRecordFieldData(record, params.headerFields), \n // Process the data in this record and return the\n processedRecordData = recordFieldData.map((fieldValue) => {\n fieldValue = trimRecordFieldValue(fieldValue);\n fieldValue = preventCsvInjection(fieldValue);\n let stringified = customValueParser ? customValueParser(fieldValue, recordFieldValueToString) : recordFieldValueToString(fieldValue);\n stringified = wrapFieldValueIfNecessary(stringified);\n return stringified;\n });\n // Join the record data by the field delimiter\n return generateCsvRowFromRecord(processedRecordData);\n }).join(options.delimiter.eol);\n return params;\n }\n /**\n * Helper function intended to process *just* array values when the expandArrayObjects setting is set to true\n */\n function processRecordFieldDataForExpandedArrayObject(recordFieldValue) {\n const filteredRecordFieldValue = utils.removeEmptyFields(recordFieldValue);\n // If we have an array and it's either empty of full of empty values, then use an empty value representation\n if (!recordFieldValue.length || !filteredRecordFieldValue.length) {\n return options.emptyFieldValue || '';\n }\n else if (filteredRecordFieldValue.length === 1) {\n // Otherwise, we have an array of actual values...\n // Since we are expanding array objects, we will want to key in on values of objects.\n return filteredRecordFieldValue[0]; // Extract the single value in the array\n }\n return recordFieldValue;\n }\n /**\n * Gets all field values from a particular record for the given list of fields\n */\n function retrieveRecordFieldData(record, fields) {\n const recordValues = [];\n fields.forEach((field) => {\n let recordFieldValue = (0, doc_path_1.evaluatePath)(record, field);\n if (!utils.isUndefined(options.emptyFieldValue) && utils.isEmptyField(recordFieldValue)) {\n recordFieldValue = options.emptyFieldValue;\n }\n else if (options.expandArrayObjects && Array.isArray(recordFieldValue)) {\n recordFieldValue = processRecordFieldDataForExpandedArrayObject(recordFieldValue);\n }\n recordValues.push(recordFieldValue);\n });\n return recordValues;\n }\n /**\n * Converts a record field value to its string representation\n */\n function recordFieldValueToString(fieldValue) {\n const isDate = fieldValue instanceof Date; // store to avoid checking twice\n if (fieldValue === null || Array.isArray(fieldValue) || typeof fieldValue === 'object' && !isDate) {\n return JSON.stringify(fieldValue);\n }\n else if (typeof fieldValue === 'undefined') {\n return 'undefined';\n }\n else if (isDate && options.useDateIso8601Format) {\n return fieldValue.toISOString();\n }\n else {\n return !options.useLocaleFormat ? fieldValue.toString() : fieldValue.toLocaleString();\n }\n }\n /**\n * Trims the record field value, if specified by the user's provided options\n */\n function trimRecordFieldValue(fieldValue) {\n if (options.trimFieldValues) {\n if (Array.isArray(fieldValue)) {\n return fieldValue.map(trimRecordFieldValue);\n }\n else if (typeof fieldValue === 'string') {\n return fieldValue.trim();\n }\n return fieldValue;\n }\n return fieldValue;\n }\n /**\n * Prevent CSV injection on strings if specified by the user's provided options.\n * Mitigation will be done by ensuring that the first character doesn't being with:\n * Equals (=), Plus (+), Minus (-), At (@), Tab (0x09), Carriage return (0x0D).\n * More info: https://owasp.org/www-community/attacks/CSV_Injection\n */\n function preventCsvInjection(fieldValue) {\n if (options.preventCsvInjection) {\n if (Array.isArray(fieldValue)) {\n return fieldValue.map(preventCsvInjection);\n }\n else if (typeof fieldValue === 'string' && !utils.isNumber(fieldValue)) {\n return fieldValue.replace(/^[=+\\-@\\t\\r]+/g, '');\n }\n return fieldValue;\n }\n return fieldValue;\n }\n /**\n * Escapes quotation marks in the field value, if necessary, and appropriately\n * wraps the record field value if it contains a comma (field delimiter),\n * quotation mark (wrap delimiter), or a line break (CRLF)\n */\n function wrapFieldValueIfNecessary(fieldValue) {\n const wrapDelimiter = options.delimiter.wrap;\n // eg. includes quotation marks (default delimiter)\n if (fieldValue.includes(options.delimiter.wrap)) {\n // add an additional quotation mark before each quotation mark appearing in the field value\n fieldValue = fieldValue.replace(wrapDelimiterCheckRegex, wrapDelimiter + wrapDelimiter);\n }\n // if the field contains a comma (field delimiter), quotation mark (wrap delimiter), line break, or CRLF\n // then enclose it in quotation marks (wrap delimiter)\n if (fieldValue.includes(options.delimiter.field) ||\n fieldValue.includes(options.delimiter.wrap) ||\n fieldValue.match(crlfSearchRegex) ||\n options.wrapBooleans && (fieldValue === 'true' || fieldValue === 'false')) {\n // wrap the field's value in a wrap delimiter (quotation marks by default)\n fieldValue = wrapDelimiter + fieldValue + wrapDelimiter;\n }\n return fieldValue;\n }\n /**\n * Generates the CSV record string by joining the field values together by the field delimiter\n */\n function generateCsvRowFromRecord(recordFieldValues) {\n return recordFieldValues.join(options.delimiter.field);\n }\n /** CSV COMPONENT COMBINER/FINAL PROCESSOR **/\n /**\n * Performs the final CSV construction by combining the fields in the appropriate\n * order depending on the provided options values and sends the generated CSV\n * back to the user\n */\n function generateCsvFromComponents(params) {\n const header = params.header, records = params.recordString, \n // If we are prepending the header, then add an EOL, otherwise just return the records\n csv = (options.excelBOM ? constants_1.excelBOM : '') +\n (options.prependHeader ? header + options.delimiter.eol : '') +\n records;\n return csv;\n }\n /** MAIN CONVERTER FUNCTION **/\n /**\n * Internally exported json2csv function\n */\n function convert(data) {\n // Single document, not an array\n if (utils.isObject(data) && !data.length) {\n data = [data]; // Convert to an array of the given document\n }\n // Retrieve the heading and then generate the CSV with the keys that are identified\n const headerFields = {\n headerFields: retrieveHeaderFields(data),\n records: data,\n header: '',\n recordString: '',\n };\n const unwinded = unwindRecordsIfNecessary(headerFields);\n const processed = processRecords(unwinded);\n const wrapped = wrapHeaderFields(processed);\n const trimmed = trimHeaderFields(wrapped);\n const generated = generateCsvHeader(trimmed);\n return generateCsvFromComponents(generated);\n }\n return {\n convert,\n };\n};\nexports.Json2Csv = Json2Csv;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODczODkuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGdCQUFnQjtBQUNoQixtQkFBbUIsbUJBQU8sQ0FBQyxJQUFVO0FBQ3JDLGdCQUFnQixtQkFBTyxDQUFDLEtBQU87QUFDL0Isb0JBQW9CLG1CQUFPLENBQUMsS0FBYTtBQUN6QywyQkFBMkIsbUJBQU8sQ0FBQyxLQUFTO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0ZBQStGLFlBQVk7QUFDM0c7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsZ0JBQWdCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2pzb24tMi1jc3YvbGliL2pzb24yY3N2LmpzPzNhODgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkpzb24yQ3N2ID0gdm9pZCAwO1xuY29uc3QgZG9jX3BhdGhfMSA9IHJlcXVpcmUoXCJkb2MtcGF0aFwiKTtcbmNvbnN0IGRlZWtzXzEgPSByZXF1aXJlKFwiZGVla3NcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuL2NvbnN0YW50c1wiKTtcbmNvbnN0IHV0aWxzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3V0aWxzXCIpKTtcbmNvbnN0IEpzb24yQ3N2ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBjb25zdCB3cmFwRGVsaW1pdGVyQ2hlY2tSZWdleCA9IG5ldyBSZWdFeHAob3B0aW9ucy5kZWxpbWl0ZXIud3JhcCwgJ2cnKSwgY3JsZlNlYXJjaFJlZ2V4ID0gL1xccj9cXG58XFxyLywgY3VzdG9tVmFsdWVQYXJzZXIgPSBvcHRpb25zLnBhcnNlVmFsdWUgJiYgdHlwZW9mIG9wdGlvbnMucGFyc2VWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMucGFyc2VWYWx1ZSA6IG51bGwsIGV4cGFuZGluZ1dpdGhvdXRVbndpbmRpbmcgPSBvcHRpb25zLmV4cGFuZEFycmF5T2JqZWN0cyAmJiAhb3B0aW9ucy51bndpbmRBcnJheXMsIGRlZWtzT3B0aW9ucyA9IHtcbiAgICAgICAgYXJyYXlJbmRleGVzQXNLZXlzOiBvcHRpb25zLmFycmF5SW5kZXhlc0FzS2V5cyxcbiAgICAgICAgZXhwYW5kTmVzdGVkT2JqZWN0czogb3B0aW9ucy5leHBhbmROZXN0ZWRPYmplY3RzLFxuICAgICAgICBleHBhbmRBcnJheU9iamVjdHM6IGV4cGFuZGluZ1dpdGhvdXRVbndpbmRpbmcsXG4gICAgICAgIGlnbm9yZUVtcHR5QXJyYXlzV2hlbkV4cGFuZGluZzogZXhwYW5kaW5nV2l0aG91dFVud2luZGluZyxcbiAgICAgICAgZXNjYXBlTmVzdGVkRG90czogdHJ1ZSxcbiAgICB9O1xuICAgIC8qKiBIRUFERVIgRklFTEQgRlVOQ1RJT05TICoqL1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZGF0YSBmaWVsZCBuYW1lcyBvZiBhbGwgZG9jdW1lbnRzIGluIHRoZSBwcm92aWRlZCBsaXN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0RmllbGROYW1lTGlzdChkYXRhKSB7XG4gICAgICAgIC8vIElmIGtleXMgd2VyZW4ndCBzcGVjaWZpZWQsIHRoZW4gd2UnbGwgdXNlIHRoZSBsaXN0IG9mIGtleXMgZ2VuZXJhdGVkIGJ5IHRoZSBkZWVrcyBtb2R1bGVcbiAgICAgICAgcmV0dXJuICgwLCBkZWVrc18xLmRlZXBLZXlzRnJvbUxpc3QpKGRhdGEsIGRlZWtzT3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyB0aGUgc2NoZW1hcyBieSBjaGVja2luZyBmb3Igc2NoZW1hIGRpZmZlcmVuY2VzLCBpZiBzbyBkZXNpcmVkLlxuICAgICAqIElmIHNjaGVtYSBkaWZmZXJlbmNlcyBhcmUgbm90IHRvIGJlIGNoZWNrZWQsIHRoZW4gaXQgcmVzb2x2ZXMgdGhlIHVuaXF1ZVxuICAgICAqIGxpc3Qgb2YgZmllbGQgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1NjaGVtYXMoZG9jdW1lbnRTY2hlbWFzKSB7XG4gICAgICAgIC8vIElmIHRoZSB1c2VyIHdhbnRzIHRvIGNoZWNrIGZvciB0aGUgc2FtZSBzY2hlbWEgKHJlZ2FyZGxlc3Mgb2Ygc2NoZW1hIG9yZGVyaW5nKVxuICAgICAgICBpZiAob3B0aW9ucy5jaGVja1NjaGVtYURpZmZlcmVuY2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hlY2tTY2hlbWFEaWZmZXJlbmNlcyhkb2N1bWVudFNjaGVtYXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBkbyBub3QgY2FyZSBpZiB0aGUgc2NoZW1hcyBhcmUgZGlmZmVyZW50LCBzbyB3ZSBzaG91bGQgZ2V0IHRoZSB1bmlxdWUgbGlzdCBvZiBrZXlzXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVGaWVsZE5hbWVzID0gdXRpbHMudW5pcXVlKHV0aWxzLmZsYXR0ZW4oZG9jdW1lbnRTY2hlbWFzKSk7XG4gICAgICAgICAgICByZXR1cm4gdW5pcXVlRmllbGROYW1lcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBzY2hlbWEgZGlmZmVyZW5jZSBjaGVjaywgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIHRoYXQgaXQgc2hvdWxkIGJlIGNoZWNrZWQuXG4gICAgICogSWYgdGhlcmUgYXJlIG5vIGZpZWxkIG5hbWVzLCB0aGVuIHRoZXJlIGFyZSBubyBkaWZmZXJlbmNlcy5cbiAgICAgKiBPdGhlcndpc2UsIHdlIGdldCB0aGUgZmlyc3Qgc2NoZW1hIGFuZCB0aGUgcmVtYWluaW5nIGxpc3Qgb2Ygc2NoZW1hc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNoZWNrU2NoZW1hRGlmZmVyZW5jZXMoZG9jdW1lbnRTY2hlbWFzKSB7XG4gICAgICAgIC8vIGhhdmUgbXVsdGlwbGUgZG9jdW1lbnRzIC0gZW5zdXJlIG9ubHkgb25lIHNjaGVtYSAocmVnYXJkbGVzcyBvZiBmaWVsZCBvcmRlcmluZylcbiAgICAgICAgY29uc3QgZmlyc3REb2NTY2hlbWEgPSBkb2N1bWVudFNjaGVtYXNbMF0sIHJlc3RPZkRvY3VtZW50U2NoZW1hcyA9IGRvY3VtZW50U2NoZW1hcy5zbGljZSgxKSwgc2NoZW1hRGlmZmVyZW5jZXMgPSBjb21wdXRlTnVtYmVyT2ZTY2hlbWFEaWZmZXJlbmNlcyhmaXJzdERvY1NjaGVtYSwgcmVzdE9mRG9jdW1lbnRTY2hlbWFzKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHNjaGVtYSBpbmNvbnNpc3RlbmNpZXMsIHRocm93IGEgc2NoZW1hIG5vdCB0aGUgc2FtZSBlcnJvclxuICAgICAgICBpZiAoc2NoZW1hRGlmZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihjb25zdGFudHNfMS5lcnJvcnMuanNvbjJjc3Yubm90U2FtZVNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0RG9jU2NoZW1hO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIHNjaGVtYSBkaWZmZXJlbmNlc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXB1dGVOdW1iZXJPZlNjaGVtYURpZmZlcmVuY2VzKGZpcnN0RG9jU2NoZW1hLCByZXN0T2ZEb2N1bWVudFNjaGVtYXMpIHtcbiAgICAgICAgcmV0dXJuIHJlc3RPZkRvY3VtZW50U2NoZW1hcy5yZWR1Y2UoKHNjaGVtYURpZmZlcmVuY2VzLCBkb2N1bWVudFNjaGVtYSkgPT4ge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNjaGVtYXMsIGluY3JlbWVudCB0aGUgY291bnRlciBvZiBzY2hlbWEgaW5jb25zaXN0ZW5jaWVzXG4gICAgICAgICAgICBjb25zdCBudW1iZXJPZkRpZmZlcmVuY2VzID0gdXRpbHMuY29tcHV0ZVNjaGVtYURpZmZlcmVuY2VzKGZpcnN0RG9jU2NoZW1hLCBkb2N1bWVudFNjaGVtYSkubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlck9mRGlmZmVyZW5jZXMgPiAwXG4gICAgICAgICAgICAgICAgPyBzY2hlbWFEaWZmZXJlbmNlcyArIDFcbiAgICAgICAgICAgICAgICA6IHNjaGVtYURpZmZlcmVuY2VzO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgc28gc3BlY2lmaWVkLCB0aGlzIGZpbHRlcnMgdGhlIGRldGVjdGVkIGtleSBwYXRocyB0byBleGNsdWRlIGFueSBrZXlzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlckV4Y2x1ZGVkS2V5cyhrZXlQYXRocykge1xuICAgICAgICBpZiAob3B0aW9ucy5leGNsdWRlS2V5cykge1xuICAgICAgICAgICAgcmV0dXJuIGtleVBhdGhzLmZpbHRlcigoa2V5UGF0aCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXhjbHVkZWRLZXkgb2Ygb3B0aW9ucy5leGNsdWRlS2V5cykge1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG1hdGNoIGlmIHRoZSBleGNsdWRlZEtleSBhcHBlYXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgbWF0Y2ggYSBrZXkgZmFydGhlciBkb3duIGluIGEga2V5IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBleGNsdWRlZEtleSBpbnN0YW5jZW9mIFJlZ0V4cCA/IGV4Y2x1ZGVkS2V5IDogbmV3IFJlZ0V4cChgXiR7ZXhjbHVkZWRLZXl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZEtleSA9PT0ga2V5UGF0aCB8fCBrZXlQYXRoLm1hdGNoKHJlZ2V4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBFeGNsdWRlIHRoZSBrZXlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gT3RoZXJ3aXNlLCBpbmNsdWRlIHRoZSBrZXlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlQYXRocztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgc28gc3BlY2lmaWVkLCB0aGlzIHNvcnRzIHRoZSBoZWFkZXIgZmllbGQgbmFtZXMgYWxwaGFiZXRpY2FsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0SGVhZGVyRmllbGRzKGZpZWxkTmFtZXMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc29ydEhlYWRlciAmJiB0eXBlb2Ygb3B0aW9ucy5zb3J0SGVhZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGROYW1lcy5zb3J0KG9wdGlvbnMuc29ydEhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5zb3J0SGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGROYW1lcy5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkTmFtZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyaW1zIHRoZSBoZWFkZXIgZmllbGRzLCBpZiB0aGUgdXNlciBkZXNpcmVzIHRoZW0gdG8gYmUgdHJpbW1lZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltSGVhZGVyRmllbGRzKHBhcmFtcykge1xuICAgICAgICBpZiAob3B0aW9ucy50cmltSGVhZGVyRmllbGRzKSB7XG4gICAgICAgICAgICBwYXJhbXMuaGVhZGVyRmllbGRzID0gcGFyYW1zLmhlYWRlckZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5zcGxpdCgnLicpXG4gICAgICAgICAgICAgICAgLm1hcCgoY29tcG9uZW50KSA9PiBjb21wb25lbnQudHJpbSgpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyYXAgdGhlIGhlYWRpbmdzLCBpZiBkZXNpcmVkIGJ5IHRoZSB1c2VyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBIZWFkZXJGaWVsZHMocGFyYW1zKSB7XG4gICAgICAgIC8vIG9ubHkgcGVyZm9ybSB0aGlzIGlmIHdlIGFyZSBhY3R1YWxseSBwcmVwZW5kaW5nIHRoZSBoZWFkZXJcbiAgICAgICAgaWYgKG9wdGlvbnMucHJlcGVuZEhlYWRlcikge1xuICAgICAgICAgICAgcGFyYW1zLmhlYWRlckZpZWxkcyA9IHBhcmFtcy5oZWFkZXJGaWVsZHMubWFwKGZ1bmN0aW9uIChoZWFkaW5nS2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBGaWVsZFZhbHVlSWZOZWNlc3NhcnkoaGVhZGluZ0tleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIENTViBoZWFkZXIgc3RyaW5nIGJ5IGpvaW5pbmcgdGhlIGhlYWRlckZpZWxkcyBieSB0aGUgZmllbGQgZGVsaW1pdGVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVDc3ZIZWFkZXIocGFyYW1zKSB7XG4gICAgICAgIC8vICMxODUgLSBnZW5lcmF0ZSBhIGtleXMgbGlzdCB0byBhdm9pZCBmaW5kaW5nIG5hdGl2ZSBNYXAoKSBtZXRob2RzXG4gICAgICAgIGNvbnN0IGZpZWxkVGl0bGVNYXBLZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucy5maWVsZFRpdGxlTWFwKTtcbiAgICAgICAgcGFyYW1zLmhlYWRlciA9IHBhcmFtcy5oZWFkZXJGaWVsZHNcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgICAgICBsZXQgaGVhZGVyS2V5ID0gZmllbGQ7XG4gICAgICAgICAgICAvLyBJZiBhIGN1c3RvbSBmaWVsZCB0aXRsZSB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQsIHVzZSB0aGF0XG4gICAgICAgICAgICBpZiAoZmllbGRUaXRsZU1hcEtleXMuaW5jbHVkZXMoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyS2V5ID0gb3B0aW9ucy5maWVsZFRpdGxlTWFwW2ZpZWxkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFvcHRpb25zLmVzY2FwZUhlYWRlck5lc3RlZERvdHMpIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudCBuZXN0ZWQgZG90cyBpbiBrZXlzIHRvIGJlIGVzY2FwZWQsIHRoZW4gdW5lc2NhcGUgdGhlbVxuICAgICAgICAgICAgICAgIGhlYWRlcktleSA9IGhlYWRlcktleS5yZXBsYWNlKC9cXFxcXFwuL2csICcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd3JhcEZpZWxkVmFsdWVJZk5lY2Vzc2FyeShoZWFkZXJLZXkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4ob3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQpO1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb252ZXJ0S2V5c1RvSGVhZGVyRmllbGRzKCkge1xuICAgICAgICBpZiAoIW9wdGlvbnMua2V5cylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMua2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmICdmaWVsZCcgaW4ga2V5KSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5maWVsZFRpdGxlTWFwW2tleS5maWVsZF0gPSBrZXkudGl0bGUgPz8ga2V5LmZpZWxkO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXkuZmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZXh0cmFjdFdpbGRjYXJkTWF0Y2hLZXlzKCkge1xuICAgICAgICBpZiAoIW9wdGlvbnMua2V5cylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMua2V5cy5mbGF0TWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgcGxhaW4gc3RyaW5ncyB0aGF0IHdlcmUgcGFzc2VkIGluIG9wdGlvbnMua2V5c1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0/LndpbGRjYXJkTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gXCJmaWVsZFwiIHZhbHVlIGZvciBvYmplY3RzIHdpdGggd2lsZGNhcmRNYXRjaDogdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXhjbHVkZSBvdGhlciBvYmplY3RzXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSB0aGUgaGVhZGluZ3MgZm9yIGFsbCBkb2N1bWVudHMgYW5kIHJldHVybiBpdC5cbiAgICAgKiBUaGlzIGNoZWNrcyB0aGF0IGFsbCBkb2N1bWVudHMgaGF2ZSB0aGUgc2FtZSBzY2hlbWEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV0cmlldmVIZWFkZXJGaWVsZHMoZGF0YSkge1xuICAgICAgICBjb25zdCB3aWxkY2FyZE1hdGNoS2V5cyA9IGV4dHJhY3RXaWxkY2FyZE1hdGNoS2V5cygpO1xuICAgICAgICBjb25zdCBrZXlTdHJpbmdzID0gY29udmVydEtleXNUb0hlYWRlckZpZWxkcygpO1xuICAgICAgICBjb25zdCBmaWVsZE5hbWVzID0gZ2V0RmllbGROYW1lTGlzdChkYXRhKTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkID0gcHJvY2Vzc1NjaGVtYXMoZmllbGROYW1lcyk7XG4gICAgICAgIGlmIChvcHRpb25zLmtleXMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMua2V5cyA9IGtleVN0cmluZ3M7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkS2V5cyA9IGtleVN0cmluZ3MuZmxhdE1hcCgodXNlclByb3ZpZGVkS2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSB3aWxkY2FyZCBtYXRjaGVkIGtleSwgdGhlbiBqdXN0IHJldHVybiBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgcmVzdWx0aW5nIGtleSBsaXN0XG4gICAgICAgICAgICAgICAgaWYgKCF3aWxkY2FyZE1hdGNoS2V5cy5pbmNsdWRlcyh1c2VyUHJvdmlkZWRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VyUHJvdmlkZWRLZXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWRlbnRpZnkgYWxsIGRldGVjdGVkIGtleXMgdGhhdCBtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCB3aWxkY2FyZCBrZXk6XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7dXNlclByb3ZpZGVkS2V5fWApO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGV0ZWN0ZWRLZXkgb2YgcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyUHJvdmlkZWRLZXkgPT09IGRldGVjdGVkS2V5IHx8IGRldGVjdGVkS2V5Lm1hdGNoKHJlZ2V4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGRldGVjdGVkS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVud2luZEFycmF5cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZmlsdGVyRXhjbHVkZWRLZXlzKG1hdGNoZWRLZXlzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc29ydEhlYWRlckZpZWxkcyhmaWx0ZXJlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBmaWx0ZXJFeGNsdWRlZEtleXMocHJvY2Vzc2VkKTtcbiAgICAgICAgcmV0dXJuIHNvcnRIZWFkZXJGaWVsZHMoZmlsdGVyZWQpO1xuICAgIH1cbiAgICAvKiogUkVDT1JEIEZJRUxEIEZVTkNUSU9OUyAqKi9cbiAgICAvKipcbiAgICAgKiBVbndpbmRzIG9iamVjdHMgaW4gYXJyYXlzIHdpdGhpbiByZWNvcmQgb2JqZWN0cyBpZiB0aGUgdXNlciBzcGVjaWZpZXMgdGhlXG4gICAgICogZXhwYW5kQXJyYXlPYmplY3RzIG9wdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyBwYXNzZXMgdGhlIHBhcmFtc1xuICAgICAqIGFyZ3VtZW50IHRocm91Z2ggdG8gdGhlIG5leHQgZnVuY3Rpb24gaW4gdGhlIHByb21pc2UgY2hhaW4uXG4gICAgICpcbiAgICAgKiBUaGUgYGZpbmFsUGFzc2AgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHJpZ2dlciBvbmUgbGFzdCBwYXNzIHRvIGVuc3VyZSBubyBtb3JlXG4gICAgICogYXJyYXlzIG5lZWQgdG8gYmUgZXhwYW5kZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bndpbmRSZWNvcmRzSWZOZWNlc3NhcnkocGFyYW1zLCBmaW5hbFBhc3MgPSBmYWxzZSkge1xuICAgICAgICBpZiAob3B0aW9ucy51bndpbmRBcnJheXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmVjb3Jkc0xlbmd0aCA9IHBhcmFtcy5yZWNvcmRzLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIFVud2luZCBlYWNoIG9mIHRoZSBkb2N1bWVudHMgYXQgdGhlIGdpdmVuIGhlYWRlckZpZWxkXG4gICAgICAgICAgICBwYXJhbXMuaGVhZGVyRmllbGRzLmZvckVhY2goKGhlYWRlckZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnJlY29yZHMgPSB1dGlscy51bndpbmQocGFyYW1zLnJlY29yZHMsIGhlYWRlckZpZWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyRmllbGRzID0gcmV0cmlldmVIZWFkZXJGaWVsZHMocGFyYW1zLnJlY29yZHMpO1xuICAgICAgICAgICAgcGFyYW1zLmhlYWRlckZpZWxkcyA9IGhlYWRlckZpZWxkcztcbiAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgYWJsZSB0byB1bndpbmQgbW9yZSBhcnJheXMsIHRoZW4gdHJ5IHVud2luZGluZyBhZ2Fpbi4uLlxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsUmVjb3Jkc0xlbmd0aCAhPT0gcGFyYW1zLnJlY29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVud2luZFJlY29yZHNJZk5lY2Vzc2FyeShwYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBkaWRuJ3QgdW53aW5kIGFueSBhZGRpdGlvbmFsIGFycmF5cywgc28gY29udGludWUuLi5cbiAgICAgICAgICAgIC8vIFJ1biBhIGZpbmFsIHRpbWUgaW4gY2FzZSB0aGUgZWFybGllciB1bndpbmRpbmcgZXhwb3NlZCBhZGRpdGlvbmFsXG4gICAgICAgICAgICAvLyBhcnJheXMgdG8gdW53aW5kLi4uXG4gICAgICAgICAgICBpZiAoIWZpbmFsUGFzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bndpbmRSZWNvcmRzSWZOZWNlc3NhcnkocGFyYW1zLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGtleXMgd2VyZSBwcm92aWRlZCwgc2V0IHRoZSBoZWFkZXJGaWVsZHMgYmFjayB0byB0aGUgcHJvdmlkZWQga2V5cyBhZnRlciB1bndpbmRpbmc6XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5rZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlclNlbGVjdGVkRmllbGRzID0gY29udmVydEtleXNUb0hlYWRlckZpZWxkcygpO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5oZWFkZXJGaWVsZHMgPSBmaWx0ZXJFeGNsdWRlZEtleXModXNlclNlbGVjdGVkRmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFpbiBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIHRoZSBwcm9jZXNzaW5nIG9mIGEgcmVjb3JkLCBvciBkb2N1bWVudCB0byBiZSBjb252ZXJ0ZWQgdG8gQ1NWIGZvcm1hdFxuICAgICAqIFRoaXMgZnVuY3Rpb24gc3BlY2lmaWVzIGFuZCBwZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbnMgaW4gdGhlIG5lY2Vzc2FyeSBvcmRlclxuICAgICAqIGluIG9yZGVyIHRvIG9idGFpbiB0aGUgZGF0YSBhbmQgY29udmVydCBpdCB0byBDU1YgZm9ybSB3aGlsZSBtYWludGFpbmluZyBSRkMgNDE4MCBjb21wbGlhbmNlLlxuICAgICAqICogT3JkZXIgb2Ygb3BlcmF0aW9uczpcbiAgICAgKiAtIEdldCBmaWVsZHMgZnJvbSBwcm92aWRlZCBrZXkgbGlzdCAoYXMgYXJyYXkgb2YgYWN0dWFsIHZhbHVlcylcbiAgICAgKiAtIENvbnZlcnQgdGhlIHZhbHVlcyB0byBjc3Yvc3RyaW5nIHJlcHJlc2VudGF0aW9uIFtwb3NzaWJsZSBvcHRpb24gaGVyZSBmb3IgY3VzdG9tIGNvbnZlcnRlcnM/XVxuICAgICAqIC0gVHJpbSBmaWVsZHNcbiAgICAgKiAtIERldGVybWluZSBpZiB0aGV5IG5lZWQgdG8gYmUgd3JhcHBlZCAoJiB3cmFwIGlmIG5lY2Vzc2FyeSlcbiAgICAgKiAtIENvbWJpbmUgdmFsdWVzIGZvciBlYWNoIGxpbmUgKGJ5IGpvaW5pbmcgYnkgZmllbGQgZGVsaW1pdGVyKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWNvcmRzKHBhcmFtcykge1xuICAgICAgICBwYXJhbXMucmVjb3JkU3RyaW5nID0gcGFyYW1zLnJlY29yZHMubWFwKChyZWNvcmQpID0+IHtcbiAgICAgICAgICAgIC8vIFJldHJpZXZlIGRhdGEgZm9yIGVhY2ggb2YgdGhlIGhlYWRlckZpZWxkcyBmcm9tIHRoaXMgcmVjb3JkXG4gICAgICAgICAgICBjb25zdCByZWNvcmRGaWVsZERhdGEgPSByZXRyaWV2ZVJlY29yZEZpZWxkRGF0YShyZWNvcmQsIHBhcmFtcy5oZWFkZXJGaWVsZHMpLCBcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgaW4gdGhpcyByZWNvcmQgYW5kIHJldHVybiB0aGVcbiAgICAgICAgICAgIHByb2Nlc3NlZFJlY29yZERhdGEgPSByZWNvcmRGaWVsZERhdGEubWFwKChmaWVsZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IHRyaW1SZWNvcmRGaWVsZFZhbHVlKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBwcmV2ZW50Q3N2SW5qZWN0aW9uKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGxldCBzdHJpbmdpZmllZCA9IGN1c3RvbVZhbHVlUGFyc2VyID8gY3VzdG9tVmFsdWVQYXJzZXIoZmllbGRWYWx1ZSwgcmVjb3JkRmllbGRWYWx1ZVRvU3RyaW5nKSA6IHJlY29yZEZpZWxkVmFsdWVUb1N0cmluZyhmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICBzdHJpbmdpZmllZCA9IHdyYXBGaWVsZFZhbHVlSWZOZWNlc3Nhcnkoc3RyaW5naWZpZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZmllZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gSm9pbiB0aGUgcmVjb3JkIGRhdGEgYnkgdGhlIGZpZWxkIGRlbGltaXRlclxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ3N2Um93RnJvbVJlY29yZChwcm9jZXNzZWRSZWNvcmREYXRhKTtcbiAgICAgICAgfSkuam9pbihvcHRpb25zLmRlbGltaXRlci5lb2wpO1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gaW50ZW5kZWQgdG8gcHJvY2VzcyAqanVzdCogYXJyYXkgdmFsdWVzIHdoZW4gdGhlIGV4cGFuZEFycmF5T2JqZWN0cyBzZXR0aW5nIGlzIHNldCB0byB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlY29yZEZpZWxkRGF0YUZvckV4cGFuZGVkQXJyYXlPYmplY3QocmVjb3JkRmllbGRWYWx1ZSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZFJlY29yZEZpZWxkVmFsdWUgPSB1dGlscy5yZW1vdmVFbXB0eUZpZWxkcyhyZWNvcmRGaWVsZFZhbHVlKTtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBhcnJheSBhbmQgaXQncyBlaXRoZXIgZW1wdHkgb2YgZnVsbCBvZiBlbXB0eSB2YWx1ZXMsIHRoZW4gdXNlIGFuIGVtcHR5IHZhbHVlIHJlcHJlc2VudGF0aW9uXG4gICAgICAgIGlmICghcmVjb3JkRmllbGRWYWx1ZS5sZW5ndGggfHwgIWZpbHRlcmVkUmVjb3JkRmllbGRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmVtcHR5RmllbGRWYWx1ZSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaWx0ZXJlZFJlY29yZEZpZWxkVmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgYW4gYXJyYXkgb2YgYWN0dWFsIHZhbHVlcy4uLlxuICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIGV4cGFuZGluZyBhcnJheSBvYmplY3RzLCB3ZSB3aWxsIHdhbnQgdG8ga2V5IGluIG9uIHZhbHVlcyBvZiBvYmplY3RzLlxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUmVjb3JkRmllbGRWYWx1ZVswXTsgLy8gRXh0cmFjdCB0aGUgc2luZ2xlIHZhbHVlIGluIHRoZSBhcnJheVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmRGaWVsZFZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBmaWVsZCB2YWx1ZXMgZnJvbSBhIHBhcnRpY3VsYXIgcmVjb3JkIGZvciB0aGUgZ2l2ZW4gbGlzdCBvZiBmaWVsZHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXRyaWV2ZVJlY29yZEZpZWxkRGF0YShyZWNvcmQsIGZpZWxkcykge1xuICAgICAgICBjb25zdCByZWNvcmRWYWx1ZXMgPSBbXTtcbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVjb3JkRmllbGRWYWx1ZSA9ICgwLCBkb2NfcGF0aF8xLmV2YWx1YXRlUGF0aCkocmVjb3JkLCBmaWVsZCk7XG4gICAgICAgICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKG9wdGlvbnMuZW1wdHlGaWVsZFZhbHVlKSAmJiB1dGlscy5pc0VtcHR5RmllbGQocmVjb3JkRmllbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZWNvcmRGaWVsZFZhbHVlID0gb3B0aW9ucy5lbXB0eUZpZWxkVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmV4cGFuZEFycmF5T2JqZWN0cyAmJiBBcnJheS5pc0FycmF5KHJlY29yZEZpZWxkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkRmllbGRWYWx1ZSA9IHByb2Nlc3NSZWNvcmRGaWVsZERhdGFGb3JFeHBhbmRlZEFycmF5T2JqZWN0KHJlY29yZEZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjb3JkVmFsdWVzLnB1c2gocmVjb3JkRmllbGRWYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVjb3JkVmFsdWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIHJlY29yZCBmaWVsZCB2YWx1ZSB0byBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVjb3JkRmllbGRWYWx1ZVRvU3RyaW5nKGZpZWxkVmFsdWUpIHtcbiAgICAgICAgY29uc3QgaXNEYXRlID0gZmllbGRWYWx1ZSBpbnN0YW5jZW9mIERhdGU7IC8vIHN0b3JlIHRvIGF2b2lkIGNoZWNraW5nIHR3aWNlXG4gICAgICAgIGlmIChmaWVsZFZhbHVlID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZSkgfHwgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmICFpc0RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0RhdGUgJiYgb3B0aW9ucy51c2VEYXRlSXNvODYwMUZvcm1hdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAhb3B0aW9ucy51c2VMb2NhbGVGb3JtYXQgPyBmaWVsZFZhbHVlLnRvU3RyaW5nKCkgOiBmaWVsZFZhbHVlLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJpbXMgdGhlIHJlY29yZCBmaWVsZCB2YWx1ZSwgaWYgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyJ3MgcHJvdmlkZWQgb3B0aW9uc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1SZWNvcmRGaWVsZFZhbHVlKGZpZWxkVmFsdWUpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMudHJpbUZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZFZhbHVlLm1hcCh0cmltUmVjb3JkRmllbGRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmllbGRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJldmVudCBDU1YgaW5qZWN0aW9uIG9uIHN0cmluZ3MgaWYgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyJ3MgcHJvdmlkZWQgb3B0aW9ucy5cbiAgICAgKiBNaXRpZ2F0aW9uIHdpbGwgYmUgZG9uZSBieSBlbnN1cmluZyB0aGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgZG9lc24ndCBiZWluZyB3aXRoOlxuICAgICAqIEVxdWFscyAoPSksIFBsdXMgKCspLCBNaW51cyAoLSksIEF0IChAKSwgVGFiICgweDA5KSwgQ2FycmlhZ2UgcmV0dXJuICgweDBEKS5cbiAgICAgKiBNb3JlIGluZm86IGh0dHBzOi8vb3dhc3Aub3JnL3d3dy1jb21tdW5pdHkvYXR0YWNrcy9DU1ZfSW5qZWN0aW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJldmVudENzdkluamVjdGlvbihmaWVsZFZhbHVlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnByZXZlbnRDc3ZJbmplY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWUubWFwKHByZXZlbnRDc3ZJbmplY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnICYmICF1dGlscy5pc051bWJlcihmaWVsZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZFZhbHVlLnJlcGxhY2UoL15bPStcXC1AXFx0XFxyXSsvZywgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgcXVvdGF0aW9uIG1hcmtzIGluIHRoZSBmaWVsZCB2YWx1ZSwgaWYgbmVjZXNzYXJ5LCBhbmQgYXBwcm9wcmlhdGVseVxuICAgICAqIHdyYXBzIHRoZSByZWNvcmQgZmllbGQgdmFsdWUgaWYgaXQgY29udGFpbnMgYSBjb21tYSAoZmllbGQgZGVsaW1pdGVyKSxcbiAgICAgKiBxdW90YXRpb24gbWFyayAod3JhcCBkZWxpbWl0ZXIpLCBvciBhIGxpbmUgYnJlYWsgKENSTEYpXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcEZpZWxkVmFsdWVJZk5lY2Vzc2FyeShmaWVsZFZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHdyYXBEZWxpbWl0ZXIgPSBvcHRpb25zLmRlbGltaXRlci53cmFwO1xuICAgICAgICAvLyBlZy4gaW5jbHVkZXMgcXVvdGF0aW9uIG1hcmtzIChkZWZhdWx0IGRlbGltaXRlcilcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUuaW5jbHVkZXMob3B0aW9ucy5kZWxpbWl0ZXIud3JhcCkpIHtcbiAgICAgICAgICAgIC8vIGFkZCBhbiBhZGRpdGlvbmFsIHF1b3RhdGlvbiBtYXJrIGJlZm9yZSBlYWNoIHF1b3RhdGlvbiBtYXJrIGFwcGVhcmluZyBpbiB0aGUgZmllbGQgdmFsdWVcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlLnJlcGxhY2Uod3JhcERlbGltaXRlckNoZWNrUmVnZXgsIHdyYXBEZWxpbWl0ZXIgKyB3cmFwRGVsaW1pdGVyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0aGUgZmllbGQgY29udGFpbnMgYSBjb21tYSAoZmllbGQgZGVsaW1pdGVyKSwgcXVvdGF0aW9uIG1hcmsgKHdyYXAgZGVsaW1pdGVyKSwgbGluZSBicmVhaywgb3IgQ1JMRlxuICAgICAgICAvLyAgIHRoZW4gZW5jbG9zZSBpdCBpbiBxdW90YXRpb24gbWFya3MgKHdyYXAgZGVsaW1pdGVyKVxuICAgICAgICBpZiAoZmllbGRWYWx1ZS5pbmNsdWRlcyhvcHRpb25zLmRlbGltaXRlci5maWVsZCkgfHxcbiAgICAgICAgICAgIGZpZWxkVmFsdWUuaW5jbHVkZXMob3B0aW9ucy5kZWxpbWl0ZXIud3JhcCkgfHxcbiAgICAgICAgICAgIGZpZWxkVmFsdWUubWF0Y2goY3JsZlNlYXJjaFJlZ2V4KSB8fFxuICAgICAgICAgICAgb3B0aW9ucy53cmFwQm9vbGVhbnMgJiYgKGZpZWxkVmFsdWUgPT09ICd0cnVlJyB8fCBmaWVsZFZhbHVlID09PSAnZmFsc2UnKSkge1xuICAgICAgICAgICAgLy8gd3JhcCB0aGUgZmllbGQncyB2YWx1ZSBpbiBhIHdyYXAgZGVsaW1pdGVyIChxdW90YXRpb24gbWFya3MgYnkgZGVmYXVsdClcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSB3cmFwRGVsaW1pdGVyICsgZmllbGRWYWx1ZSArIHdyYXBEZWxpbWl0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgQ1NWIHJlY29yZCBzdHJpbmcgYnkgam9pbmluZyB0aGUgZmllbGQgdmFsdWVzIHRvZ2V0aGVyIGJ5IHRoZSBmaWVsZCBkZWxpbWl0ZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUNzdlJvd0Zyb21SZWNvcmQocmVjb3JkRmllbGRWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZEZpZWxkVmFsdWVzLmpvaW4ob3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQpO1xuICAgIH1cbiAgICAvKiogQ1NWIENPTVBPTkVOVCBDT01CSU5FUi9GSU5BTCBQUk9DRVNTT1IgKiovXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGZpbmFsIENTViBjb25zdHJ1Y3Rpb24gYnkgY29tYmluaW5nIHRoZSBmaWVsZHMgaW4gdGhlIGFwcHJvcHJpYXRlXG4gICAgICogb3JkZXIgZGVwZW5kaW5nIG9uIHRoZSBwcm92aWRlZCBvcHRpb25zIHZhbHVlcyBhbmQgc2VuZHMgdGhlIGdlbmVyYXRlZCBDU1ZcbiAgICAgKiBiYWNrIHRvIHRoZSB1c2VyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVDc3ZGcm9tQ29tcG9uZW50cyhwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gcGFyYW1zLmhlYWRlciwgcmVjb3JkcyA9IHBhcmFtcy5yZWNvcmRTdHJpbmcsIFxuICAgICAgICAvLyBJZiB3ZSBhcmUgcHJlcGVuZGluZyB0aGUgaGVhZGVyLCB0aGVuIGFkZCBhbiBFT0wsIG90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgcmVjb3Jkc1xuICAgICAgICBjc3YgPSAob3B0aW9ucy5leGNlbEJPTSA/IGNvbnN0YW50c18xLmV4Y2VsQk9NIDogJycpICtcbiAgICAgICAgICAgIChvcHRpb25zLnByZXBlbmRIZWFkZXIgPyBoZWFkZXIgKyBvcHRpb25zLmRlbGltaXRlci5lb2wgOiAnJykgK1xuICAgICAgICAgICAgcmVjb3JkcztcbiAgICAgICAgcmV0dXJuIGNzdjtcbiAgICB9XG4gICAgLyoqIE1BSU4gQ09OVkVSVEVSIEZVTkNUSU9OICoqL1xuICAgIC8qKlxuICAgICAqIEludGVybmFsbHkgZXhwb3J0ZWQganNvbjJjc3YgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb252ZXJ0KGRhdGEpIHtcbiAgICAgICAgLy8gU2luZ2xlIGRvY3VtZW50LCBub3QgYW4gYXJyYXlcbiAgICAgICAgaWYgKHV0aWxzLmlzT2JqZWN0KGRhdGEpICYmICFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsgLy8gQ29udmVydCB0byBhbiBhcnJheSBvZiB0aGUgZ2l2ZW4gZG9jdW1lbnRcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgaGVhZGluZyBhbmQgdGhlbiBnZW5lcmF0ZSB0aGUgQ1NWIHdpdGggdGhlIGtleXMgdGhhdCBhcmUgaWRlbnRpZmllZFxuICAgICAgICBjb25zdCBoZWFkZXJGaWVsZHMgPSB7XG4gICAgICAgICAgICBoZWFkZXJGaWVsZHM6IHJldHJpZXZlSGVhZGVyRmllbGRzKGRhdGEpLFxuICAgICAgICAgICAgcmVjb3JkczogZGF0YSxcbiAgICAgICAgICAgIGhlYWRlcjogJycsXG4gICAgICAgICAgICByZWNvcmRTdHJpbmc6ICcnLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB1bndpbmRlZCA9IHVud2luZFJlY29yZHNJZk5lY2Vzc2FyeShoZWFkZXJGaWVsZHMpO1xuICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBwcm9jZXNzUmVjb3Jkcyh1bndpbmRlZCk7XG4gICAgICAgIGNvbnN0IHdyYXBwZWQgPSB3cmFwSGVhZGVyRmllbGRzKHByb2Nlc3NlZCk7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSB0cmltSGVhZGVyRmllbGRzKHdyYXBwZWQpO1xuICAgICAgICBjb25zdCBnZW5lcmF0ZWQgPSBnZW5lcmF0ZUNzdkhlYWRlcih0cmltbWVkKTtcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ3N2RnJvbUNvbXBvbmVudHMoZ2VuZXJhdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29udmVydCxcbiAgICB9O1xufTtcbmV4cG9ydHMuSnNvbjJDc3YgPSBKc29uMkNzdjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///87389\n")},26164:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.isInvalid = exports.flatten = exports.unique = exports.arrayDifference = exports.isError = exports.isUndefined = exports.isNull = exports.isObject = exports.isString = exports.isNumber = exports.unwind = exports.getNCharacters = exports.removeEmptyFields = exports.isEmptyField = exports.computeSchemaDifferences = exports.isDateRepresentation = exports.isStringRepresentation = exports.deepCopy = exports.validate = exports.buildC2JOptions = exports.buildJ2COptions = void 0;\nconst doc_path_1 = __webpack_require__(6052);\nconst constants_1 = __webpack_require__(99488);\nconst dateStringRegex = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/, MAX_ARRAY_LENGTH = 100000;\n/**\n * Build the options to be passed to the appropriate function\n * If a user does not provide custom options, then we use our default\n * If options are provided, then we set each valid key that was passed\n */\nfunction buildJ2COptions(opts) {\n return {\n ...constants_1.defaultJson2CsvOptions,\n ...opts,\n delimiter: {\n field: opts?.delimiter?.field ?? constants_1.defaultJson2CsvOptions.delimiter.field,\n wrap: opts?.delimiter?.wrap || constants_1.defaultJson2CsvOptions.delimiter.wrap,\n eol: opts?.delimiter?.eol || constants_1.defaultJson2CsvOptions.delimiter.eol,\n },\n fieldTitleMap: Object.create({}),\n };\n}\nexports.buildJ2COptions = buildJ2COptions;\n/**\n * Build the options to be passed to the appropriate function\n * If a user does not provide custom options, then we use our default\n * If options are provided, then we set each valid key that was passed\n */\nfunction buildC2JOptions(opts) {\n return {\n ...constants_1.defaultCsv2JsonOptions,\n ...opts,\n delimiter: {\n field: opts?.delimiter?.field ?? constants_1.defaultCsv2JsonOptions.delimiter.field,\n wrap: opts?.delimiter?.wrap || constants_1.defaultCsv2JsonOptions.delimiter.wrap,\n eol: opts?.delimiter?.eol || constants_1.defaultCsv2JsonOptions.delimiter.eol,\n },\n };\n}\nexports.buildC2JOptions = buildC2JOptions;\nfunction validate(data, validationFn, errorMessages) {\n if (!data)\n throw new Error(`${errorMessages.cannotCallOn} ${data}.`);\n if (!validationFn(data))\n throw new Error(errorMessages.dataCheckFailure);\n return true;\n}\nexports.validate = validate;\n/**\n * Utility function to deep copy an object, used by the module tests\n */\nfunction deepCopy(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\nexports.deepCopy = deepCopy;\n/**\n * Helper function that determines whether the provided value is a representation\n * of a string. Given the RFC4180 requirements, that means that the value is\n * wrapped in value wrap delimiters (usually a quotation mark on each side).\n */\nfunction isStringRepresentation(fieldValue, options) {\n const firstChar = fieldValue[0], lastIndex = fieldValue.length - 1, lastChar = fieldValue[lastIndex];\n // If the field starts and ends with a wrap delimiter\n return firstChar === options.delimiter.wrap && lastChar === options.delimiter.wrap;\n}\nexports.isStringRepresentation = isStringRepresentation;\n/**\n * Helper function that determines whether the provided value is a representation\n * of a date.\n */\nfunction isDateRepresentation(fieldValue) {\n return dateStringRegex.test(fieldValue);\n}\nexports.isDateRepresentation = isDateRepresentation;\n/**\n * Helper function that determines the schema differences between two objects.\n */\nfunction computeSchemaDifferences(schemaA, schemaB) {\n return arrayDifference(schemaA, schemaB)\n .concat(arrayDifference(schemaB, schemaA));\n}\nexports.computeSchemaDifferences = computeSchemaDifferences;\n/**\n * Utility function to check if a field is considered empty so that the emptyFieldValue can be used instead\n */\nfunction isEmptyField(fieldValue) {\n return isUndefined(fieldValue) || isNull(fieldValue) || fieldValue === '';\n}\nexports.isEmptyField = isEmptyField;\n/**\n * Helper function that removes empty field values from an array.\n */\nfunction removeEmptyFields(fields) {\n return fields.filter((field) => !isEmptyField(field));\n}\nexports.removeEmptyFields = removeEmptyFields;\n/**\n * Helper function that retrieves the next n characters from the start index in\n * the string including the character at the start index. This is used to\n * check if are currently at an EOL value, since it could be multiple\n * characters in length (eg. '\\r\\n')\n */\nfunction getNCharacters(str, start, n) {\n return str.substring(start, start + n);\n}\nexports.getNCharacters = getNCharacters;\n/**\n * The following unwind functionality is a heavily modified version of @edwincen's\n * unwind extension for lodash. Since lodash is a large package to require in,\n * and all of the required functionality was already being imported, either\n * natively or with doc-path, I decided to rewrite the majority of the logic\n * so that an additional dependency would not be required. The original code\n * with the lodash dependency can be found here:\n *\n * https://github.com/edwincen/unwind/blob/master/index.js\n */\n/**\n * Core function that unwinds an item at the provided path\n */\nfunction unwindItem(accumulator, item, fieldPath) {\n const valueToUnwind = (0, doc_path_1.evaluatePath)(item, fieldPath);\n let cloned = deepCopy(item);\n if (Array.isArray(valueToUnwind) && valueToUnwind.length) {\n valueToUnwind.forEach((val) => {\n cloned = deepCopy(item);\n accumulator.push((0, doc_path_1.setPath)(cloned, fieldPath, val));\n });\n }\n else if (Array.isArray(valueToUnwind) && valueToUnwind.length === 0) {\n // Push an empty string so the value is empty since there are no values\n (0, doc_path_1.setPath)(cloned, fieldPath, '');\n accumulator.push(cloned);\n }\n else {\n accumulator.push(cloned);\n }\n}\n/**\n * Main unwind function which takes an array and a field to unwind.\n */\nfunction unwind(array, field) {\n const result = [];\n array.forEach((item) => {\n unwindItem(result, item, field);\n });\n return result;\n}\nexports.unwind = unwind;\n/**\n * Checks whether value can be converted to a number\n */\nfunction isNumber(value) {\n return !isNaN(Number(value));\n}\nexports.isNumber = isNumber;\n/*\n * Helper functions which were created to remove underscorejs from this package.\n */\nfunction isString(value) {\n return typeof value === 'string';\n}\nexports.isString = isString;\nfunction isObject(value) {\n return typeof value === 'object';\n}\nexports.isObject = isObject;\nfunction isNull(value) {\n return value === null;\n}\nexports.isNull = isNull;\nfunction isUndefined(value) {\n return typeof value === 'undefined';\n}\nexports.isUndefined = isUndefined;\nfunction isError(value) {\n // TODO(mrodrig): test this possible change\n // return value instanceof Error;\n return Object.prototype.toString.call(value) === '[object Error]';\n}\nexports.isError = isError;\nfunction arrayDifference(a, b) {\n return a.filter((x) => !b.includes(x));\n}\nexports.arrayDifference = arrayDifference;\nfunction unique(array) {\n return [...new Set(array)];\n}\nexports.unique = unique;\nfunction flatten(array) {\n // Node 11+ - use the native array flattening function\n if (array.flat) {\n return array.flat();\n }\n // #167 - allow browsers to flatten very long 200k+ element arrays\n if (array.length > MAX_ARRAY_LENGTH) {\n let safeArray = [];\n for (let a = 0; a < array.length; a += MAX_ARRAY_LENGTH) {\n safeArray = safeArray.concat(...array.slice(a, a + MAX_ARRAY_LENGTH));\n }\n return safeArray;\n }\n return array.reduce((accumulator, value) => accumulator.concat(value), []);\n}\nexports.flatten = flatten;\n/**\n * Used to help avoid incorrect values returned by JSON.parse when converting\n * CSV back to JSON, such as '39e1804' which JSON.parse converts to Infinity\n */\nfunction isInvalid(parsedJson) {\n return parsedJson === Infinity ||\n parsedJson === -Infinity;\n}\nexports.isInvalid = isInvalid;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYxNjQuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsaUJBQWlCLEdBQUcsZUFBZSxHQUFHLGNBQWMsR0FBRyx1QkFBdUIsR0FBRyxlQUFlLEdBQUcsbUJBQW1CLEdBQUcsY0FBYyxHQUFHLGdCQUFnQixHQUFHLGdCQUFnQixHQUFHLGdCQUFnQixHQUFHLGNBQWMsR0FBRyxzQkFBc0IsR0FBRyx5QkFBeUIsR0FBRyxvQkFBb0IsR0FBRyxnQ0FBZ0MsR0FBRyw0QkFBNEIsR0FBRyw4QkFBOEIsR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyx1QkFBdUIsR0FBRyx1QkFBdUI7QUFDMWQsbUJBQW1CLG1CQUFPLENBQUMsSUFBVTtBQUNyQyxvQkFBb0IsbUJBQU8sQ0FBQyxLQUFhO0FBQ3pDLDRCQUE0QixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULHVDQUF1QztBQUN2QztBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLDJCQUEyQiw0QkFBNEIsRUFBRSxLQUFLO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvanNvbi0yLWNzdi9saWIvdXRpbHMuanM/ODU2MCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzSW52YWxpZCA9IGV4cG9ydHMuZmxhdHRlbiA9IGV4cG9ydHMudW5pcXVlID0gZXhwb3J0cy5hcnJheURpZmZlcmVuY2UgPSBleHBvcnRzLmlzRXJyb3IgPSBleHBvcnRzLmlzVW5kZWZpbmVkID0gZXhwb3J0cy5pc051bGwgPSBleHBvcnRzLmlzT2JqZWN0ID0gZXhwb3J0cy5pc1N0cmluZyA9IGV4cG9ydHMuaXNOdW1iZXIgPSBleHBvcnRzLnVud2luZCA9IGV4cG9ydHMuZ2V0TkNoYXJhY3RlcnMgPSBleHBvcnRzLnJlbW92ZUVtcHR5RmllbGRzID0gZXhwb3J0cy5pc0VtcHR5RmllbGQgPSBleHBvcnRzLmNvbXB1dGVTY2hlbWFEaWZmZXJlbmNlcyA9IGV4cG9ydHMuaXNEYXRlUmVwcmVzZW50YXRpb24gPSBleHBvcnRzLmlzU3RyaW5nUmVwcmVzZW50YXRpb24gPSBleHBvcnRzLmRlZXBDb3B5ID0gZXhwb3J0cy52YWxpZGF0ZSA9IGV4cG9ydHMuYnVpbGRDMkpPcHRpb25zID0gZXhwb3J0cy5idWlsZEoyQ09wdGlvbnMgPSB2b2lkIDA7XG5jb25zdCBkb2NfcGF0aF8xID0gcmVxdWlyZShcImRvYy1wYXRoXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi9jb25zdGFudHNcIik7XG5jb25zdCBkYXRlU3RyaW5nUmVnZXggPSAvXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0uXFxkezN9Wi8sIE1BWF9BUlJBWV9MRU5HVEggPSAxMDAwMDA7XG4vKipcbiAqIEJ1aWxkIHRoZSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb25cbiAqIElmIGEgdXNlciBkb2VzIG5vdCBwcm92aWRlIGN1c3RvbSBvcHRpb25zLCB0aGVuIHdlIHVzZSBvdXIgZGVmYXVsdFxuICogSWYgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIHRoZW4gd2Ugc2V0IGVhY2ggdmFsaWQga2V5IHRoYXQgd2FzIHBhc3NlZFxuICovXG5mdW5jdGlvbiBidWlsZEoyQ09wdGlvbnMob3B0cykge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbnN0YW50c18xLmRlZmF1bHRKc29uMkNzdk9wdGlvbnMsXG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlbGltaXRlcjoge1xuICAgICAgICAgICAgZmllbGQ6IG9wdHM/LmRlbGltaXRlcj8uZmllbGQgPz8gY29uc3RhbnRzXzEuZGVmYXVsdEpzb24yQ3N2T3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQsXG4gICAgICAgICAgICB3cmFwOiBvcHRzPy5kZWxpbWl0ZXI/LndyYXAgfHwgY29uc3RhbnRzXzEuZGVmYXVsdEpzb24yQ3N2T3B0aW9ucy5kZWxpbWl0ZXIud3JhcCxcbiAgICAgICAgICAgIGVvbDogb3B0cz8uZGVsaW1pdGVyPy5lb2wgfHwgY29uc3RhbnRzXzEuZGVmYXVsdEpzb24yQ3N2T3B0aW9ucy5kZWxpbWl0ZXIuZW9sLFxuICAgICAgICB9LFxuICAgICAgICBmaWVsZFRpdGxlTWFwOiBPYmplY3QuY3JlYXRlKHt9KSxcbiAgICB9O1xufVxuZXhwb3J0cy5idWlsZEoyQ09wdGlvbnMgPSBidWlsZEoyQ09wdGlvbnM7XG4vKipcbiAqIEJ1aWxkIHRoZSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb25cbiAqIElmIGEgdXNlciBkb2VzIG5vdCBwcm92aWRlIGN1c3RvbSBvcHRpb25zLCB0aGVuIHdlIHVzZSBvdXIgZGVmYXVsdFxuICogSWYgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIHRoZW4gd2Ugc2V0IGVhY2ggdmFsaWQga2V5IHRoYXQgd2FzIHBhc3NlZFxuICovXG5mdW5jdGlvbiBidWlsZEMySk9wdGlvbnMob3B0cykge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbnN0YW50c18xLmRlZmF1bHRDc3YySnNvbk9wdGlvbnMsXG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlbGltaXRlcjoge1xuICAgICAgICAgICAgZmllbGQ6IG9wdHM/LmRlbGltaXRlcj8uZmllbGQgPz8gY29uc3RhbnRzXzEuZGVmYXVsdENzdjJKc29uT3B0aW9ucy5kZWxpbWl0ZXIuZmllbGQsXG4gICAgICAgICAgICB3cmFwOiBvcHRzPy5kZWxpbWl0ZXI/LndyYXAgfHwgY29uc3RhbnRzXzEuZGVmYXVsdENzdjJKc29uT3B0aW9ucy5kZWxpbWl0ZXIud3JhcCxcbiAgICAgICAgICAgIGVvbDogb3B0cz8uZGVsaW1pdGVyPy5lb2wgfHwgY29uc3RhbnRzXzEuZGVmYXVsdENzdjJKc29uT3B0aW9ucy5kZWxpbWl0ZXIuZW9sLFxuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmJ1aWxkQzJKT3B0aW9ucyA9IGJ1aWxkQzJKT3B0aW9ucztcbmZ1bmN0aW9uIHZhbGlkYXRlKGRhdGEsIHZhbGlkYXRpb25GbiwgZXJyb3JNZXNzYWdlcykge1xuICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTWVzc2FnZXMuY2Fubm90Q2FsbE9ufSAke2RhdGF9LmApO1xuICAgIGlmICghdmFsaWRhdGlvbkZuKGRhdGEpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlcy5kYXRhQ2hlY2tGYWlsdXJlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydHMudmFsaWRhdGUgPSB2YWxpZGF0ZTtcbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBkZWVwIGNvcHkgYW4gb2JqZWN0LCB1c2VkIGJ5IHRoZSBtb2R1bGUgdGVzdHNcbiAqL1xuZnVuY3Rpb24gZGVlcENvcHkob2JqKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG5leHBvcnRzLmRlZXBDb3B5ID0gZGVlcENvcHk7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgYSByZXByZXNlbnRhdGlvblxuICogICBvZiBhIHN0cmluZy4gR2l2ZW4gdGhlIFJGQzQxODAgcmVxdWlyZW1lbnRzLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGlzXG4gKiAgIHdyYXBwZWQgaW4gdmFsdWUgd3JhcCBkZWxpbWl0ZXJzICh1c3VhbGx5IGEgcXVvdGF0aW9uIG1hcmsgb24gZWFjaCBzaWRlKS5cbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmdSZXByZXNlbnRhdGlvbihmaWVsZFZhbHVlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZmlyc3RDaGFyID0gZmllbGRWYWx1ZVswXSwgbGFzdEluZGV4ID0gZmllbGRWYWx1ZS5sZW5ndGggLSAxLCBsYXN0Q2hhciA9IGZpZWxkVmFsdWVbbGFzdEluZGV4XTtcbiAgICAvLyBJZiB0aGUgZmllbGQgc3RhcnRzIGFuZCBlbmRzIHdpdGggYSB3cmFwIGRlbGltaXRlclxuICAgIHJldHVybiBmaXJzdENoYXIgPT09IG9wdGlvbnMuZGVsaW1pdGVyLndyYXAgJiYgbGFzdENoYXIgPT09IG9wdGlvbnMuZGVsaW1pdGVyLndyYXA7XG59XG5leHBvcnRzLmlzU3RyaW5nUmVwcmVzZW50YXRpb24gPSBpc1N0cmluZ1JlcHJlc2VudGF0aW9uO1xuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIGEgcmVwcmVzZW50YXRpb25cbiAqICAgb2YgYSBkYXRlLlxuICovXG5mdW5jdGlvbiBpc0RhdGVSZXByZXNlbnRhdGlvbihmaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGRhdGVTdHJpbmdSZWdleC50ZXN0KGZpZWxkVmFsdWUpO1xufVxuZXhwb3J0cy5pc0RhdGVSZXByZXNlbnRhdGlvbiA9IGlzRGF0ZVJlcHJlc2VudGF0aW9uO1xuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBzY2hlbWEgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVNjaGVtYURpZmZlcmVuY2VzKHNjaGVtYUEsIHNjaGVtYUIpIHtcbiAgICByZXR1cm4gYXJyYXlEaWZmZXJlbmNlKHNjaGVtYUEsIHNjaGVtYUIpXG4gICAgICAgIC5jb25jYXQoYXJyYXlEaWZmZXJlbmNlKHNjaGVtYUIsIHNjaGVtYUEpKTtcbn1cbmV4cG9ydHMuY29tcHV0ZVNjaGVtYURpZmZlcmVuY2VzID0gY29tcHV0ZVNjaGVtYURpZmZlcmVuY2VzO1xuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgZmllbGQgaXMgY29uc2lkZXJlZCBlbXB0eSBzbyB0aGF0IHRoZSBlbXB0eUZpZWxkVmFsdWUgY2FuIGJlIHVzZWQgaW5zdGVhZFxuICovXG5mdW5jdGlvbiBpc0VtcHR5RmllbGQoZmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBpc1VuZGVmaW5lZChmaWVsZFZhbHVlKSB8fCBpc051bGwoZmllbGRWYWx1ZSkgfHwgZmllbGRWYWx1ZSA9PT0gJyc7XG59XG5leHBvcnRzLmlzRW1wdHlGaWVsZCA9IGlzRW1wdHlGaWVsZDtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyBlbXB0eSBmaWVsZCB2YWx1ZXMgZnJvbSBhbiBhcnJheS5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRW1wdHlGaWVsZHMoZmllbGRzKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhaXNFbXB0eUZpZWxkKGZpZWxkKSk7XG59XG5leHBvcnRzLnJlbW92ZUVtcHR5RmllbGRzID0gcmVtb3ZlRW1wdHlGaWVsZHM7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHJpZXZlcyB0aGUgbmV4dCBuIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgaW5kZXggaW5cbiAqICAgdGhlIHN0cmluZyBpbmNsdWRpbmcgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3RhcnQgaW5kZXguIFRoaXMgaXMgdXNlZCB0b1xuICogICBjaGVjayBpZiBhcmUgY3VycmVudGx5IGF0IGFuIEVPTCB2YWx1ZSwgc2luY2UgaXQgY291bGQgYmUgbXVsdGlwbGVcbiAqICAgY2hhcmFjdGVycyBpbiBsZW5ndGggKGVnLiAnXFxyXFxuJylcbiAqL1xuZnVuY3Rpb24gZ2V0TkNoYXJhY3RlcnMoc3RyLCBzdGFydCwgbikge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBzdGFydCArIG4pO1xufVxuZXhwb3J0cy5nZXROQ2hhcmFjdGVycyA9IGdldE5DaGFyYWN0ZXJzO1xuLyoqXG4gKiBUaGUgZm9sbG93aW5nIHVud2luZCBmdW5jdGlvbmFsaXR5IGlzIGEgaGVhdmlseSBtb2RpZmllZCB2ZXJzaW9uIG9mIEBlZHdpbmNlbidzXG4gKiB1bndpbmQgZXh0ZW5zaW9uIGZvciBsb2Rhc2guIFNpbmNlIGxvZGFzaCBpcyBhIGxhcmdlIHBhY2thZ2UgdG8gcmVxdWlyZSBpbixcbiAqIGFuZCBhbGwgb2YgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkgd2FzIGFscmVhZHkgYmVpbmcgaW1wb3J0ZWQsIGVpdGhlclxuICogbmF0aXZlbHkgb3Igd2l0aCBkb2MtcGF0aCwgSSBkZWNpZGVkIHRvIHJld3JpdGUgdGhlIG1ham9yaXR5IG9mIHRoZSBsb2dpY1xuICogc28gdGhhdCBhbiBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgd291bGQgbm90IGJlIHJlcXVpcmVkLiBUaGUgb3JpZ2luYWwgY29kZVxuICogd2l0aCB0aGUgbG9kYXNoIGRlcGVuZGVuY3kgY2FuIGJlIGZvdW5kIGhlcmU6XG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2Vkd2luY2VuL3Vud2luZC9ibG9iL21hc3Rlci9pbmRleC5qc1xuICovXG4vKipcbiAqIENvcmUgZnVuY3Rpb24gdGhhdCB1bndpbmRzIGFuIGl0ZW0gYXQgdGhlIHByb3ZpZGVkIHBhdGhcbiAqL1xuZnVuY3Rpb24gdW53aW5kSXRlbShhY2N1bXVsYXRvciwgaXRlbSwgZmllbGRQYXRoKSB7XG4gICAgY29uc3QgdmFsdWVUb1Vud2luZCA9ICgwLCBkb2NfcGF0aF8xLmV2YWx1YXRlUGF0aCkoaXRlbSwgZmllbGRQYXRoKTtcbiAgICBsZXQgY2xvbmVkID0gZGVlcENvcHkoaXRlbSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb1Vud2luZCkgJiYgdmFsdWVUb1Vud2luZC5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWVUb1Vud2luZC5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgICAgICAgIGNsb25lZCA9IGRlZXBDb3B5KGl0ZW0pO1xuICAgICAgICAgICAgYWNjdW11bGF0b3IucHVzaCgoMCwgZG9jX3BhdGhfMS5zZXRQYXRoKShjbG9uZWQsIGZpZWxkUGF0aCwgdmFsKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlVG9VbndpbmQpICYmIHZhbHVlVG9VbndpbmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFB1c2ggYW4gZW1wdHkgc3RyaW5nIHNvIHRoZSB2YWx1ZSBpcyBlbXB0eSBzaW5jZSB0aGVyZSBhcmUgbm8gdmFsdWVzXG4gICAgICAgICgwLCBkb2NfcGF0aF8xLnNldFBhdGgpKGNsb25lZCwgZmllbGRQYXRoLCAnJyk7XG4gICAgICAgIGFjY3VtdWxhdG9yLnB1c2goY2xvbmVkKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLnB1c2goY2xvbmVkKTtcbiAgICB9XG59XG4vKipcbiAqIE1haW4gdW53aW5kIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGFuIGFycmF5IGFuZCBhIGZpZWxkIHRvIHVud2luZC5cbiAqL1xuZnVuY3Rpb24gdW53aW5kKGFycmF5LCBmaWVsZCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgdW53aW5kSXRlbShyZXN1bHQsIGl0ZW0sIGZpZWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy51bndpbmQgPSB1bndpbmQ7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHZhbHVlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBudW1iZXJcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gIWlzTmFOKE51bWJlcih2YWx1ZSkpO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hpY2ggd2VyZSBjcmVhdGVkIHRvIHJlbW92ZSB1bmRlcnNjb3JlanMgZnJvbSB0aGlzIHBhY2thZ2UuXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSkge1xuICAgIC8vIFRPRE8obXJvZHJpZyk6IHRlc3QgdGhpcyBwb3NzaWJsZSBjaGFuZ2VcbiAgICAvLyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFcnJvcjtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJztcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5mdW5jdGlvbiBhcnJheURpZmZlcmVuY2UoYSwgYikge1xuICAgIHJldHVybiBhLmZpbHRlcigoeCkgPT4gIWIuaW5jbHVkZXMoeCkpO1xufVxuZXhwb3J0cy5hcnJheURpZmZlcmVuY2UgPSBhcnJheURpZmZlcmVuY2U7XG5mdW5jdGlvbiB1bmlxdWUoYXJyYXkpIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoYXJyYXkpXTtcbn1cbmV4cG9ydHMudW5pcXVlID0gdW5pcXVlO1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICAgIC8vIE5vZGUgMTErIC0gdXNlIHRoZSBuYXRpdmUgYXJyYXkgZmxhdHRlbmluZyBmdW5jdGlvblxuICAgIGlmIChhcnJheS5mbGF0KSB7XG4gICAgICAgIHJldHVybiBhcnJheS5mbGF0KCk7XG4gICAgfVxuICAgIC8vICMxNjcgLSBhbGxvdyBicm93c2VycyB0byBmbGF0dGVuIHZlcnkgbG9uZyAyMDBrKyBlbGVtZW50IGFycmF5c1xuICAgIGlmIChhcnJheS5sZW5ndGggPiBNQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIGxldCBzYWZlQXJyYXkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCBhcnJheS5sZW5ndGg7IGEgKz0gTUFYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICAgICAgc2FmZUFycmF5ID0gc2FmZUFycmF5LmNvbmNhdCguLi5hcnJheS5zbGljZShhLCBhICsgTUFYX0FSUkFZX0xFTkdUSCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYWZlQXJyYXk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCB2YWx1ZSkgPT4gYWNjdW11bGF0b3IuY29uY2F0KHZhbHVlKSwgW10pO1xufVxuZXhwb3J0cy5mbGF0dGVuID0gZmxhdHRlbjtcbi8qKlxuICogVXNlZCB0byBoZWxwIGF2b2lkIGluY29ycmVjdCB2YWx1ZXMgcmV0dXJuZWQgYnkgSlNPTi5wYXJzZSB3aGVuIGNvbnZlcnRpbmdcbiAqIENTViBiYWNrIHRvIEpTT04sIHN1Y2ggYXMgJzM5ZTE4MDQnIHdoaWNoIEpTT04ucGFyc2UgY29udmVydHMgdG8gSW5maW5pdHlcbiAqL1xuZnVuY3Rpb24gaXNJbnZhbGlkKHBhcnNlZEpzb24pIHtcbiAgICByZXR1cm4gcGFyc2VkSnNvbiA9PT0gSW5maW5pdHkgfHxcbiAgICAgICAgcGFyc2VkSnNvbiA9PT0gLUluZmluaXR5O1xufVxuZXhwb3J0cy5pc0ludmFsaWQgPSBpc0ludmFsaWQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///26164\n")},94270:function(module,exports){eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else { var mod; }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.toXML = _exports.default = void 0;\n function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n function _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n function _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\n function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\n function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\n function _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n function _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\n function _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\n function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n var DATA_TYPES = {\n ARRAY: 'array',\n BOOLEAN: 'boolean',\n DATE: 'date',\n FUNCTION: 'function',\n JSTOXML_OBJECT: 'jstoxml-object',\n NULL: 'null',\n NUMBER: 'number',\n OBJECT: 'object',\n STRING: 'string'\n };\n var PRIMITIVE_TYPES = [DATA_TYPES.STRING, DATA_TYPES.NUMBER, DATA_TYPES.BOOLEAN];\n var DEFAULT_XML_HEADER = '';\n var PRIVATE_VARS = ['_selfCloseTag', '_attrs'];\n\n /**\n * Determines the indent string based on current tree depth.\n */\n var getIndentStr = function getIndentStr() {\n var indent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return indent.repeat(depth);\n };\n\n /**\n * Sugar function supplementing JS's quirky typeof operator, plus some extra help to detect\n * \"special objects\" expected by jstoxml.\n * @example\n * getType(new Date());\n * // -> 'date'\n */\n var getType = function getType(val) {\n return Array.isArray(val) && DATA_TYPES.ARRAY || _typeof(val) === DATA_TYPES.OBJECT && val !== null && val._name && DATA_TYPES.JSTOXML_OBJECT || val instanceof Date && DATA_TYPES.DATE || val === null && DATA_TYPES.NULL || _typeof(val);\n };\n\n /**\n * Determines if a string is CDATA and shouldn't be touched.\n * @example\n * isCDATA('test]]>');\n * // -> true\n */\n var isCDATA = function isCDATA(str) {\n return str.startsWith(' 'foo&bar'\n */\n var mapStr = function mapStr() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var replacements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var contentMap = arguments.length > 2 ? arguments[2] : undefined;\n var output = input;\n if (_typeof(input) === DATA_TYPES.STRING) {\n if (isCDATA(input)) {\n return input;\n }\n var regexp = new RegExp(\"(\".concat(Object.keys(replacements).join('|'), \")(?!(\\\\w|#)*;)\"), 'g');\n output = String(input).replace(regexp, function (str, entity) {\n return replacements[entity] || '';\n });\n }\n return typeof contentMap === 'function' ? contentMap(output) : output;\n };\n\n /**\n * Maps an object or array of arribute keyval pairs to a string.\n * @example\n * getAttributeKeyVals({ foo: 'bar', baz: 'g' });\n * // -> 'foo=\"bar\" baz=\"g\"'\n * getAttributeKeyVals([ { ⚡: true }, { foo: 'bar' } ]);\n * // -> '⚡ foo=\"bar\"'\n */\n var getAttributeKeyVals = function getAttributeKeyVals() {\n var attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var replacements = arguments.length > 1 ? arguments[1] : undefined;\n var filter = arguments.length > 2 ? arguments[2] : undefined;\n var outputExplicitTrue = arguments.length > 3 ? arguments[3] : undefined;\n // Normalizes between attributes as object and as array.\n var attributesArr = Array.isArray(attributes) ? attributes : Object.entries(attributes).map(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n val = _ref2[1];\n return _defineProperty({}, key, val);\n });\n return attributesArr.reduce(function (allAttributes, attr) {\n var key = Object.keys(attr)[0];\n var val = attr[key];\n if (_typeof(filter) === DATA_TYPES.FUNCTION) {\n var shouldFilterOut = filter(key, val);\n if (shouldFilterOut) {\n return allAttributes;\n }\n }\n var replacedVal = replacements ? mapStr(val, replacements) : val;\n var valStr = !outputExplicitTrue && replacedVal === true ? '' : \"=\\\"\".concat(replacedVal, \"\\\"\");\n allAttributes.push(\"\".concat(key).concat(valStr));\n return allAttributes;\n }, []);\n };\n\n /**\n * Converts an attributes object/array to a string of keyval pairs.\n * @example\n * formatAttributes({ a: 1, b: 2 })\n * // -> 'a=\"1\" b=\"2\"'\n */\n var formatAttributes = function formatAttributes() {\n var attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var replacements = arguments.length > 1 ? arguments[1] : undefined;\n var filter = arguments.length > 2 ? arguments[2] : undefined;\n var outputExplicitTrue = arguments.length > 3 ? arguments[3] : undefined;\n var keyVals = getAttributeKeyVals(attributes, replacements, filter, outputExplicitTrue);\n if (keyVals.length === 0) return '';\n var keysValsJoined = keyVals.join(' ');\n return \" \".concat(keysValsJoined);\n };\n\n /**\n * Converts an object into an array of jstoxml-object.\n * @example\n * objToArray({ foo: 'bar', baz: 2 });\n * ->\n * [\n * {\n * _name: 'foo',\n * _content: 'bar'\n * },\n * {\n * _name: 'baz',\n * _content: 2\n * }\n * ]\n */\n var objToArray = function objToArray() {\n var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return Object.keys(obj).map(function (key) {\n return {\n _name: key,\n _content: obj[key]\n };\n });\n };\n\n /**\n * Determines if a value is a primitive JavaScript value (not including Symbol).\n * @example\n * isPrimitive(4);\n * // -> true\n */\n var isPrimitive = function isPrimitive(val) {\n return PRIMITIVE_TYPES.includes(getType(val));\n };\n\n /**\n * Determines if an XML string is simple (doesn't contain nested XML data).\n * @example\n * isSimpleXML('');\n * // -> false\n */\n var isSimpleXML = function isSimpleXML(xmlStr) {\n return !xmlStr.match('<');\n };\n\n /**\n * Assembles an XML header as defined by the config.\n */\n var getHeaderString = function getHeaderString(_ref4) {\n var header = _ref4.header,\n isOutputStart = _ref4.isOutputStart;\n var shouldOutputHeader = header && isOutputStart;\n if (!shouldOutputHeader) return '';\n var shouldUseDefaultHeader = _typeof(header) === DATA_TYPES.BOOLEAN;\n return shouldUseDefaultHeader ? DEFAULT_XML_HEADER : header;\n };\n\n /**\n * Recursively traverses an object tree and converts the output to an XML string.\n * @example\n * toXML({ foo: 'bar' });\n * // -> bar\n */\n var defaultEntityReplacements = {\n '<': '<',\n '>': '>',\n '&': '&',\n '\"': '"'\n };\n var toXML = _exports.toXML = function toXML() {\n var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _config$depth = config.depth,\n depth = _config$depth === void 0 ? 0 : _config$depth,\n indent = config.indent,\n _isFirstItem = config._isFirstItem,\n _config$_isOutputStar = config._isOutputStart,\n _isOutputStart = _config$_isOutputStar === void 0 ? true : _config$_isOutputStar,\n header = config.header,\n _config$attributeRepl = config.attributeReplacements,\n rawAttributeReplacements = _config$attributeRepl === void 0 ? {} : _config$attributeRepl,\n attributeFilter = config.attributeFilter,\n _config$attributeExpl = config.attributeExplicitTrue,\n attributeExplicitTrue = _config$attributeExpl === void 0 ? false : _config$attributeExpl,\n _config$contentReplac = config.contentReplacements,\n rawContentReplacements = _config$contentReplac === void 0 ? {} : _config$contentReplac,\n contentMap = config.contentMap,\n _config$selfCloseTags = config.selfCloseTags,\n selfCloseTags = _config$selfCloseTags === void 0 ? true : _config$selfCloseTags;\n var shouldTurnOffAttributeReplacements = typeof rawAttributeReplacements === 'boolean' && !rawAttributeReplacements;\n var attributeReplacements = shouldTurnOffAttributeReplacements ? {} : _objectSpread(_objectSpread({}, defaultEntityReplacements), rawAttributeReplacements);\n var shouldTurnOffContentReplacements = typeof rawContentReplacements === 'boolean' && !rawContentReplacements;\n var contentReplacements = shouldTurnOffContentReplacements ? {} : _objectSpread(_objectSpread({}, defaultEntityReplacements), rawContentReplacements);\n var shouldAddNewlines = typeof indent === 'string';\n\n // Determines indent based on depth.\n var indentStr = getIndentStr(indent, depth);\n\n // For branching based on value type.\n var valType = getType(obj);\n var headerStr = getHeaderString({\n header: header,\n indent: indent,\n depth: depth,\n isOutputStart: _isOutputStart\n });\n var isOutputStart = _isOutputStart && !headerStr && _isFirstItem && depth === 0;\n var preIndentStr = shouldAddNewlines && !isOutputStart ? '\\n' : '';\n var outputStr = '';\n switch (valType) {\n case DATA_TYPES.JSTOXML_OBJECT:\n {\n // Processes a specially-formatted object used by jstoxml.\n\n var _name = obj._name,\n _content = obj._content;\n\n // Output text content without a tag wrapper.\n if (_content === null && typeof contentMap !== 'function') {\n outputStr = \"\".concat(preIndentStr).concat(indentStr).concat(_name);\n break;\n }\n\n // Handles arrays of primitive values. (#33)\n var isArrayOfPrimitives = Array.isArray(_content) && _content.every(isPrimitive);\n if (isArrayOfPrimitives) {\n var primitives = _content.map(function (a) {\n return toXML({\n _name: _name,\n _content: a\n }, _objectSpread(_objectSpread({}, config), {}, {\n depth: depth,\n _isOutputStart: false\n }));\n });\n return primitives.join('');\n }\n\n // Don't output private vars (such as _attrs).\n if (PRIVATE_VARS.includes(_name)) break;\n\n // Process the nested new value and create new config.\n var newVal = toXML(_content, _objectSpread(_objectSpread({}, config), {}, {\n depth: depth + 1,\n _isOutputStart: isOutputStart\n }));\n var newValType = getType(newVal);\n var isNewValSimple = isSimpleXML(newVal);\n var isNewValCDATA = isCDATA(newVal);\n\n // Pre-tag output (indent and line breaks).\n var preTag = \"\".concat(preIndentStr).concat(indentStr);\n\n // Special handling for comments, preserving preceding line breaks/indents.\n if (_name === '_comment') {\n outputStr += \"\".concat(preTag, \"\x3c!-- \").concat(_content, \" --\x3e\");\n break;\n }\n\n // Tag output.\n var valIsEmpty = newValType === 'undefined' || newVal === '';\n var globalSelfClose = selfCloseTags;\n var localSelfClose = obj._selfCloseTag;\n var shouldSelfClose = _typeof(localSelfClose) === DATA_TYPES.BOOLEAN ? valIsEmpty && localSelfClose : valIsEmpty && globalSelfClose;\n var selfCloseStr = shouldSelfClose ? '/' : '';\n var attributesString = formatAttributes(obj._attrs, attributeReplacements, attributeFilter, attributeExplicitTrue);\n var tag = \"<\".concat(_name).concat(attributesString).concat(selfCloseStr, \">\");\n\n // Post-tag output (closing tag, indent, line breaks).\n var preTagCloseStr = shouldAddNewlines && !isNewValSimple && !isNewValCDATA ? \"\\n\".concat(indentStr) : '';\n var postTag = !shouldSelfClose ? \"\".concat(newVal).concat(preTagCloseStr, \"\") : '';\n outputStr += \"\".concat(preTag).concat(tag).concat(postTag);\n break;\n }\n case DATA_TYPES.OBJECT:\n {\n // Iterates over keyval pairs in an object, converting each item to a special-object.\n\n var keys = Object.keys(obj);\n var outputArr = keys.map(function (key, index) {\n var newConfig = _objectSpread(_objectSpread({}, config), {}, {\n _isFirstItem: index === 0,\n _isLastItem: index + 1 === keys.length,\n _isOutputStart: isOutputStart\n });\n var outputObj = {\n _name: key\n };\n if (getType(obj[key]) === DATA_TYPES.OBJECT) {\n // Sub-object contains an object.\n\n // Move private vars up as needed. Needed to support certain types of objects\n // E.g. { foo: { _attrs: { a: 1 } } } -> \n PRIVATE_VARS.forEach(function (privateVar) {\n var val = obj[key][privateVar];\n if (typeof val !== 'undefined') {\n outputObj[privateVar] = val;\n delete obj[key][privateVar];\n }\n });\n var hasContent = typeof obj[key]._content !== 'undefined';\n if (hasContent) {\n // _content has sibling keys, so pass as an array (edge case).\n // E.g. { foo: 'bar', _content: { baz: 2 } } -> bar2\n if (Object.keys(obj[key]).length > 1) {\n var newContentObj = Object.assign({}, obj[key]);\n delete newContentObj._content;\n outputObj._content = [].concat(_toConsumableArray(objToArray(newContentObj)), [obj[key]._content]);\n }\n }\n }\n\n // Fallthrough: just pass the key as the content for the new special-object.\n if (typeof outputObj._content === 'undefined') outputObj._content = obj[key];\n var xml = toXML(outputObj, newConfig);\n return xml;\n }, config);\n outputStr = outputArr.join('');\n break;\n }\n case DATA_TYPES.FUNCTION:\n {\n // Executes a user-defined function and returns output.\n\n var fnResult = obj(config);\n outputStr = toXML(fnResult, config);\n break;\n }\n case DATA_TYPES.ARRAY:\n {\n // Iterates and converts each value in an array.\n var _outputArr = obj.map(function (singleVal, index) {\n var newConfig = _objectSpread(_objectSpread({}, config), {}, {\n _isFirstItem: index === 0,\n _isLastItem: index + 1 === obj.length,\n _isOutputStart: isOutputStart\n });\n return toXML(singleVal, newConfig);\n });\n outputStr = _outputArr.join('');\n break;\n }\n\n // fallthrough types (number, string, boolean, date, null, etc)\n default:\n {\n outputStr = mapStr(obj, contentReplacements, contentMap);\n break;\n }\n }\n return \"\".concat(headerStr).concat(outputStr);\n };\n var _default = _exports.default = {\n toXML: toXML\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsYUFBYTtBQUN2RTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2pzdG94bWwvZGlzdC9qc3RveG1sLmpzP2ZkNTIiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtcImV4cG9ydHNcIl0sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZmFjdG9yeShleHBvcnRzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbW9kID0ge1xuICAgICAgZXhwb3J0czoge31cbiAgICB9O1xuICAgIGZhY3RvcnkobW9kLmV4cG9ydHMpO1xuICAgIGdsb2JhbC5qc3RveG1sID0gbW9kLmV4cG9ydHM7XG4gIH1cbn0pKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uIChfZXhwb3J0cykge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIF9leHBvcnRzLnRvWE1MID0gX2V4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG4gIGZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbiAgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG4gIGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cbiAgZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG4gIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbiAgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBTdHJpbmcoaSk7IH1cbiAgZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbiAgZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuICBmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbiAgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gdCkgeyB2YXIgZSwgbiwgaSwgdSwgYSA9IFtdLCBmID0gITAsIG8gPSAhMTsgdHJ5IHsgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkgeyBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47IGYgPSAhMTsgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApOyB9IGNhdGNoIChyKSB7IG8gPSAhMCwgbiA9IHI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghZiAmJiBudWxsICE9IHQucmV0dXJuICYmICh1ID0gdC5yZXR1cm4oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbiAgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG4gIGZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbiAgdmFyIERBVEFfVFlQRVMgPSB7XG4gICAgQVJSQVk6ICdhcnJheScsXG4gICAgQk9PTEVBTjogJ2Jvb2xlYW4nLFxuICAgIERBVEU6ICdkYXRlJyxcbiAgICBGVU5DVElPTjogJ2Z1bmN0aW9uJyxcbiAgICBKU1RPWE1MX09CSkVDVDogJ2pzdG94bWwtb2JqZWN0JyxcbiAgICBOVUxMOiAnbnVsbCcsXG4gICAgTlVNQkVSOiAnbnVtYmVyJyxcbiAgICBPQkpFQ1Q6ICdvYmplY3QnLFxuICAgIFNUUklORzogJ3N0cmluZydcbiAgfTtcbiAgdmFyIFBSSU1JVElWRV9UWVBFUyA9IFtEQVRBX1RZUEVTLlNUUklORywgREFUQV9UWVBFUy5OVU1CRVIsIERBVEFfVFlQRVMuQk9PTEVBTl07XG4gIHZhciBERUZBVUxUX1hNTF9IRUFERVIgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+JztcbiAgdmFyIFBSSVZBVEVfVkFSUyA9IFsnX3NlbGZDbG9zZVRhZycsICdfYXR0cnMnXTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgaW5kZW50IHN0cmluZyBiYXNlZCBvbiBjdXJyZW50IHRyZWUgZGVwdGguXG4gICAqL1xuICB2YXIgZ2V0SW5kZW50U3RyID0gZnVuY3Rpb24gZ2V0SW5kZW50U3RyKCkge1xuICAgIHZhciBpbmRlbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgICByZXR1cm4gaW5kZW50LnJlcGVhdChkZXB0aCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN1Z2FyIGZ1bmN0aW9uIHN1cHBsZW1lbnRpbmcgSlMncyBxdWlya3kgdHlwZW9mIG9wZXJhdG9yLCBwbHVzIHNvbWUgZXh0cmEgaGVscCB0byBkZXRlY3RcbiAgICogXCJzcGVjaWFsIG9iamVjdHNcIiBleHBlY3RlZCBieSBqc3RveG1sLlxuICAgKiBAZXhhbXBsZVxuICAgKiBnZXRUeXBlKG5ldyBEYXRlKCkpO1xuICAgKiAvLyAtPiAnZGF0ZSdcbiAgICovXG4gIHZhciBnZXRUeXBlID0gZnVuY3Rpb24gZ2V0VHlwZSh2YWwpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpICYmIERBVEFfVFlQRVMuQVJSQVkgfHwgX3R5cGVvZih2YWwpID09PSBEQVRBX1RZUEVTLk9CSkVDVCAmJiB2YWwgIT09IG51bGwgJiYgdmFsLl9uYW1lICYmIERBVEFfVFlQRVMuSlNUT1hNTF9PQkpFQ1QgfHwgdmFsIGluc3RhbmNlb2YgRGF0ZSAmJiBEQVRBX1RZUEVTLkRBVEUgfHwgdmFsID09PSBudWxsICYmIERBVEFfVFlQRVMuTlVMTCB8fCBfdHlwZW9mKHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSBzdHJpbmcgaXMgQ0RBVEEgYW5kIHNob3VsZG4ndCBiZSB0b3VjaGVkLlxuICAgKiBAZXhhbXBsZVxuICAgKiBpc0NEQVRBKCc8IVtDREFUQVs8Yj50ZXN0PC9iPl1dPicpO1xuICAgKiAvLyAtPiB0cnVlXG4gICAqL1xuICB2YXIgaXNDREFUQSA9IGZ1bmN0aW9uIGlzQ0RBVEEoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5zdGFydHNXaXRoKCc8IVtDREFUQVsnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVwbGFjZXMgbWF0Y2hpbmcgdmFsdWVzIGluIGEgc3RyaW5nIHdpdGggYSBuZXcgdmFsdWUuXG4gICAqIEBleGFtcGxlXG4gICAqIG1hcFN0cignZm9vJmJhcicsIHsgJyYnOiAnJmFtcDsnIH0pO1xuICAgKiAvLyAtPiAnZm9vJmFtcDtiYXInXG4gICAqL1xuICB2YXIgbWFwU3RyID0gZnVuY3Rpb24gbWFwU3RyKCkge1xuICAgIHZhciBpbnB1dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgdmFyIHJlcGxhY2VtZW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdmFyIGNvbnRlbnRNYXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgb3V0cHV0ID0gaW5wdXQ7XG4gICAgaWYgKF90eXBlb2YoaW5wdXQpID09PSBEQVRBX1RZUEVTLlNUUklORykge1xuICAgICAgaWYgKGlzQ0RBVEEoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgIH1cbiAgICAgIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKFwiKFwiLmNvbmNhdChPYmplY3Qua2V5cyhyZXBsYWNlbWVudHMpLmpvaW4oJ3wnKSwgXCIpKD8hKFxcXFx3fCMpKjspXCIpLCAnZycpO1xuICAgICAgb3V0cHV0ID0gU3RyaW5nKGlucHV0KS5yZXBsYWNlKHJlZ2V4cCwgZnVuY3Rpb24gKHN0ciwgZW50aXR5KSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudHNbZW50aXR5XSB8fCAnJztcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGNvbnRlbnRNYXAgPT09ICdmdW5jdGlvbicgPyBjb250ZW50TWFwKG91dHB1dCkgOiBvdXRwdXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcHMgYW4gb2JqZWN0IG9yIGFycmF5IG9mIGFycmlidXRlIGtleXZhbCBwYWlycyB0byBhIHN0cmluZy5cbiAgICogQGV4YW1wbGVcbiAgICogZ2V0QXR0cmlidXRlS2V5VmFscyh7IGZvbzogJ2JhcicsIGJhejogJ2cnIH0pO1xuICAgKiAvLyAtPiAnZm9vPVwiYmFyXCIgYmF6PVwiZ1wiJ1xuICAgKiBnZXRBdHRyaWJ1dGVLZXlWYWxzKFsgeyDimqE6IHRydWUgfSwgeyBmb286ICdiYXInIH0gXSk7XG4gICAqIC8vIC0+ICfimqEgZm9vPVwiYmFyXCInXG4gICAqL1xuICB2YXIgZ2V0QXR0cmlidXRlS2V5VmFscyA9IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZUtleVZhbHMoKSB7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciByZXBsYWNlbWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgZmlsdGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG91dHB1dEV4cGxpY2l0VHJ1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogdW5kZWZpbmVkO1xuICAgIC8vIE5vcm1hbGl6ZXMgYmV0d2VlbiBhdHRyaWJ1dGVzIGFzIG9iamVjdCBhbmQgYXMgYXJyYXkuXG4gICAgdmFyIGF0dHJpYnV0ZXNBcnIgPSBBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpID8gYXR0cmlidXRlcyA6IE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIGtleSA9IF9yZWYyWzBdLFxuICAgICAgICB2YWwgPSBfcmVmMlsxXTtcbiAgICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkoe30sIGtleSwgdmFsKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXR0cmlidXRlc0Fyci5yZWR1Y2UoZnVuY3Rpb24gKGFsbEF0dHJpYnV0ZXMsIGF0dHIpIHtcbiAgICAgIHZhciBrZXkgPSBPYmplY3Qua2V5cyhhdHRyKVswXTtcbiAgICAgIHZhciB2YWwgPSBhdHRyW2tleV07XG4gICAgICBpZiAoX3R5cGVvZihmaWx0ZXIpID09PSBEQVRBX1RZUEVTLkZVTkNUSU9OKSB7XG4gICAgICAgIHZhciBzaG91bGRGaWx0ZXJPdXQgPSBmaWx0ZXIoa2V5LCB2YWwpO1xuICAgICAgICBpZiAoc2hvdWxkRmlsdGVyT3V0KSB7XG4gICAgICAgICAgcmV0dXJuIGFsbEF0dHJpYnV0ZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciByZXBsYWNlZFZhbCA9IHJlcGxhY2VtZW50cyA/IG1hcFN0cih2YWwsIHJlcGxhY2VtZW50cykgOiB2YWw7XG4gICAgICB2YXIgdmFsU3RyID0gIW91dHB1dEV4cGxpY2l0VHJ1ZSAmJiByZXBsYWNlZFZhbCA9PT0gdHJ1ZSA/ICcnIDogXCI9XFxcIlwiLmNvbmNhdChyZXBsYWNlZFZhbCwgXCJcXFwiXCIpO1xuICAgICAgYWxsQXR0cmlidXRlcy5wdXNoKFwiXCIuY29uY2F0KGtleSkuY29uY2F0KHZhbFN0cikpO1xuICAgICAgcmV0dXJuIGFsbEF0dHJpYnV0ZXM7XG4gICAgfSwgW10pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBhdHRyaWJ1dGVzIG9iamVjdC9hcnJheSB0byBhIHN0cmluZyBvZiBrZXl2YWwgcGFpcnMuXG4gICAqIEBleGFtcGxlXG4gICAqIGZvcm1hdEF0dHJpYnV0ZXMoeyBhOiAxLCBiOiAyIH0pXG4gICAqIC8vIC0+ICdhPVwiMVwiIGI9XCIyXCInXG4gICAqL1xuICB2YXIgZm9ybWF0QXR0cmlidXRlcyA9IGZ1bmN0aW9uIGZvcm1hdEF0dHJpYnV0ZXMoKSB7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciByZXBsYWNlbWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgZmlsdGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG91dHB1dEV4cGxpY2l0VHJ1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogdW5kZWZpbmVkO1xuICAgIHZhciBrZXlWYWxzID0gZ2V0QXR0cmlidXRlS2V5VmFscyhhdHRyaWJ1dGVzLCByZXBsYWNlbWVudHMsIGZpbHRlciwgb3V0cHV0RXhwbGljaXRUcnVlKTtcbiAgICBpZiAoa2V5VmFscy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICB2YXIga2V5c1ZhbHNKb2luZWQgPSBrZXlWYWxzLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gXCIgXCIuY29uY2F0KGtleXNWYWxzSm9pbmVkKTtcbiAgfTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gb2JqZWN0IGludG8gYW4gYXJyYXkgb2YganN0b3htbC1vYmplY3QuXG4gICAqIEBleGFtcGxlXG4gICAqIG9ialRvQXJyYXkoeyBmb286ICdiYXInLCBiYXo6IDIgfSk7XG4gICAqIC0+XG4gICAqIFtcbiAgICogICB7XG4gICAqICAgICBfbmFtZTogJ2ZvbycsXG4gICAqICAgICBfY29udGVudDogJ2JhcidcbiAgICogICB9LFxuICAgKiAgIHtcbiAgICogICAgIF9uYW1lOiAnYmF6JyxcbiAgICogICAgIF9jb250ZW50OiAyXG4gICAqICAgfVxuICAgKiBdXG4gICAqL1xuICB2YXIgb2JqVG9BcnJheSA9IGZ1bmN0aW9uIG9ialRvQXJyYXkoKSB7XG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9uYW1lOiBrZXksXG4gICAgICAgIF9jb250ZW50OiBvYmpba2V5XVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgcHJpbWl0aXZlIEphdmFTY3JpcHQgdmFsdWUgKG5vdCBpbmNsdWRpbmcgU3ltYm9sKS5cbiAgICogQGV4YW1wbGVcbiAgICogaXNQcmltaXRpdmUoNCk7XG4gICAqIC8vIC0+IHRydWVcbiAgICovXG4gIHZhciBpc1ByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbCkge1xuICAgIHJldHVybiBQUklNSVRJVkVfVFlQRVMuaW5jbHVkZXMoZ2V0VHlwZSh2YWwpKTtcbiAgfTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhbiBYTUwgc3RyaW5nIGlzIHNpbXBsZSAoZG9lc24ndCBjb250YWluIG5lc3RlZCBYTUwgZGF0YSkuXG4gICAqIEBleGFtcGxlXG4gICAqIGlzU2ltcGxlWE1MKCc8Zm9vIC8+Jyk7XG4gICAqIC8vIC0+IGZhbHNlXG4gICAqL1xuICB2YXIgaXNTaW1wbGVYTUwgPSBmdW5jdGlvbiBpc1NpbXBsZVhNTCh4bWxTdHIpIHtcbiAgICByZXR1cm4gIXhtbFN0ci5tYXRjaCgnPCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBc3NlbWJsZXMgYW4gWE1MIGhlYWRlciBhcyBkZWZpbmVkIGJ5IHRoZSBjb25maWcuXG4gICAqL1xuICB2YXIgZ2V0SGVhZGVyU3RyaW5nID0gZnVuY3Rpb24gZ2V0SGVhZGVyU3RyaW5nKF9yZWY0KSB7XG4gICAgdmFyIGhlYWRlciA9IF9yZWY0LmhlYWRlcixcbiAgICAgIGlzT3V0cHV0U3RhcnQgPSBfcmVmNC5pc091dHB1dFN0YXJ0O1xuICAgIHZhciBzaG91bGRPdXRwdXRIZWFkZXIgPSBoZWFkZXIgJiYgaXNPdXRwdXRTdGFydDtcbiAgICBpZiAoIXNob3VsZE91dHB1dEhlYWRlcikgcmV0dXJuICcnO1xuICAgIHZhciBzaG91bGRVc2VEZWZhdWx0SGVhZGVyID0gX3R5cGVvZihoZWFkZXIpID09PSBEQVRBX1RZUEVTLkJPT0xFQU47XG4gICAgcmV0dXJuIHNob3VsZFVzZURlZmF1bHRIZWFkZXIgPyBERUZBVUxUX1hNTF9IRUFERVIgOiBoZWFkZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlcyBhbiBvYmplY3QgdHJlZSBhbmQgY29udmVydHMgdGhlIG91dHB1dCB0byBhbiBYTUwgc3RyaW5nLlxuICAgKiBAZXhhbXBsZVxuICAgKiB0b1hNTCh7IGZvbzogJ2JhcicgfSk7XG4gICAqIC8vIC0+IDxmb28+YmFyPC9mb28+XG4gICAqL1xuICB2YXIgZGVmYXVsdEVudGl0eVJlcGxhY2VtZW50cyA9IHtcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJ1wiJzogJyZxdW90OydcbiAgfTtcbiAgdmFyIHRvWE1MID0gX2V4cG9ydHMudG9YTUwgPSBmdW5jdGlvbiB0b1hNTCgpIHtcbiAgICB2YXIgb2JqID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgX2NvbmZpZyRkZXB0aCA9IGNvbmZpZy5kZXB0aCxcbiAgICAgIGRlcHRoID0gX2NvbmZpZyRkZXB0aCA9PT0gdm9pZCAwID8gMCA6IF9jb25maWckZGVwdGgsXG4gICAgICBpbmRlbnQgPSBjb25maWcuaW5kZW50LFxuICAgICAgX2lzRmlyc3RJdGVtID0gY29uZmlnLl9pc0ZpcnN0SXRlbSxcbiAgICAgIF9jb25maWckX2lzT3V0cHV0U3RhciA9IGNvbmZpZy5faXNPdXRwdXRTdGFydCxcbiAgICAgIF9pc091dHB1dFN0YXJ0ID0gX2NvbmZpZyRfaXNPdXRwdXRTdGFyID09PSB2b2lkIDAgPyB0cnVlIDogX2NvbmZpZyRfaXNPdXRwdXRTdGFyLFxuICAgICAgaGVhZGVyID0gY29uZmlnLmhlYWRlcixcbiAgICAgIF9jb25maWckYXR0cmlidXRlUmVwbCA9IGNvbmZpZy5hdHRyaWJ1dGVSZXBsYWNlbWVudHMsXG4gICAgICByYXdBdHRyaWJ1dGVSZXBsYWNlbWVudHMgPSBfY29uZmlnJGF0dHJpYnV0ZVJlcGwgPT09IHZvaWQgMCA/IHt9IDogX2NvbmZpZyRhdHRyaWJ1dGVSZXBsLFxuICAgICAgYXR0cmlidXRlRmlsdGVyID0gY29uZmlnLmF0dHJpYnV0ZUZpbHRlcixcbiAgICAgIF9jb25maWckYXR0cmlidXRlRXhwbCA9IGNvbmZpZy5hdHRyaWJ1dGVFeHBsaWNpdFRydWUsXG4gICAgICBhdHRyaWJ1dGVFeHBsaWNpdFRydWUgPSBfY29uZmlnJGF0dHJpYnV0ZUV4cGwgPT09IHZvaWQgMCA/IGZhbHNlIDogX2NvbmZpZyRhdHRyaWJ1dGVFeHBsLFxuICAgICAgX2NvbmZpZyRjb250ZW50UmVwbGFjID0gY29uZmlnLmNvbnRlbnRSZXBsYWNlbWVudHMsXG4gICAgICByYXdDb250ZW50UmVwbGFjZW1lbnRzID0gX2NvbmZpZyRjb250ZW50UmVwbGFjID09PSB2b2lkIDAgPyB7fSA6IF9jb25maWckY29udGVudFJlcGxhYyxcbiAgICAgIGNvbnRlbnRNYXAgPSBjb25maWcuY29udGVudE1hcCxcbiAgICAgIF9jb25maWckc2VsZkNsb3NlVGFncyA9IGNvbmZpZy5zZWxmQ2xvc2VUYWdzLFxuICAgICAgc2VsZkNsb3NlVGFncyA9IF9jb25maWckc2VsZkNsb3NlVGFncyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9jb25maWckc2VsZkNsb3NlVGFncztcbiAgICB2YXIgc2hvdWxkVHVybk9mZkF0dHJpYnV0ZVJlcGxhY2VtZW50cyA9IHR5cGVvZiByYXdBdHRyaWJ1dGVSZXBsYWNlbWVudHMgPT09ICdib29sZWFuJyAmJiAhcmF3QXR0cmlidXRlUmVwbGFjZW1lbnRzO1xuICAgIHZhciBhdHRyaWJ1dGVSZXBsYWNlbWVudHMgPSBzaG91bGRUdXJuT2ZmQXR0cmlidXRlUmVwbGFjZW1lbnRzID8ge30gOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRFbnRpdHlSZXBsYWNlbWVudHMpLCByYXdBdHRyaWJ1dGVSZXBsYWNlbWVudHMpO1xuICAgIHZhciBzaG91bGRUdXJuT2ZmQ29udGVudFJlcGxhY2VtZW50cyA9IHR5cGVvZiByYXdDb250ZW50UmVwbGFjZW1lbnRzID09PSAnYm9vbGVhbicgJiYgIXJhd0NvbnRlbnRSZXBsYWNlbWVudHM7XG4gICAgdmFyIGNvbnRlbnRSZXBsYWNlbWVudHMgPSBzaG91bGRUdXJuT2ZmQ29udGVudFJlcGxhY2VtZW50cyA/IHt9IDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZWZhdWx0RW50aXR5UmVwbGFjZW1lbnRzKSwgcmF3Q29udGVudFJlcGxhY2VtZW50cyk7XG4gICAgdmFyIHNob3VsZEFkZE5ld2xpbmVzID0gdHlwZW9mIGluZGVudCA9PT0gJ3N0cmluZyc7XG5cbiAgICAvLyBEZXRlcm1pbmVzIGluZGVudCBiYXNlZCBvbiBkZXB0aC5cbiAgICB2YXIgaW5kZW50U3RyID0gZ2V0SW5kZW50U3RyKGluZGVudCwgZGVwdGgpO1xuXG4gICAgLy8gRm9yIGJyYW5jaGluZyBiYXNlZCBvbiB2YWx1ZSB0eXBlLlxuICAgIHZhciB2YWxUeXBlID0gZ2V0VHlwZShvYmopO1xuICAgIHZhciBoZWFkZXJTdHIgPSBnZXRIZWFkZXJTdHJpbmcoe1xuICAgICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgICBpbmRlbnQ6IGluZGVudCxcbiAgICAgIGRlcHRoOiBkZXB0aCxcbiAgICAgIGlzT3V0cHV0U3RhcnQ6IF9pc091dHB1dFN0YXJ0XG4gICAgfSk7XG4gICAgdmFyIGlzT3V0cHV0U3RhcnQgPSBfaXNPdXRwdXRTdGFydCAmJiAhaGVhZGVyU3RyICYmIF9pc0ZpcnN0SXRlbSAmJiBkZXB0aCA9PT0gMDtcbiAgICB2YXIgcHJlSW5kZW50U3RyID0gc2hvdWxkQWRkTmV3bGluZXMgJiYgIWlzT3V0cHV0U3RhcnQgPyAnXFxuJyA6ICcnO1xuICAgIHZhciBvdXRwdXRTdHIgPSAnJztcbiAgICBzd2l0Y2ggKHZhbFR5cGUpIHtcbiAgICAgIGNhc2UgREFUQV9UWVBFUy5KU1RPWE1MX09CSkVDVDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFByb2Nlc3NlcyBhIHNwZWNpYWxseS1mb3JtYXR0ZWQgb2JqZWN0IHVzZWQgYnkganN0b3htbC5cblxuICAgICAgICAgIHZhciBfbmFtZSA9IG9iai5fbmFtZSxcbiAgICAgICAgICAgIF9jb250ZW50ID0gb2JqLl9jb250ZW50O1xuXG4gICAgICAgICAgLy8gT3V0cHV0IHRleHQgY29udGVudCB3aXRob3V0IGEgdGFnIHdyYXBwZXIuXG4gICAgICAgICAgaWYgKF9jb250ZW50ID09PSBudWxsICYmIHR5cGVvZiBjb250ZW50TWFwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvdXRwdXRTdHIgPSBcIlwiLmNvbmNhdChwcmVJbmRlbnRTdHIpLmNvbmNhdChpbmRlbnRTdHIpLmNvbmNhdChfbmFtZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBIYW5kbGVzIGFycmF5cyBvZiBwcmltaXRpdmUgdmFsdWVzLiAoIzMzKVxuICAgICAgICAgIHZhciBpc0FycmF5T2ZQcmltaXRpdmVzID0gQXJyYXkuaXNBcnJheShfY29udGVudCkgJiYgX2NvbnRlbnQuZXZlcnkoaXNQcmltaXRpdmUpO1xuICAgICAgICAgIGlmIChpc0FycmF5T2ZQcmltaXRpdmVzKSB7XG4gICAgICAgICAgICB2YXIgcHJpbWl0aXZlcyA9IF9jb250ZW50Lm1hcChmdW5jdGlvbiAoYSkge1xuICAgICAgICAgICAgICByZXR1cm4gdG9YTUwoe1xuICAgICAgICAgICAgICAgIF9uYW1lOiBfbmFtZSxcbiAgICAgICAgICAgICAgICBfY29udGVudDogYVxuICAgICAgICAgICAgICB9LCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbmZpZyksIHt9LCB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgICAgIF9pc091dHB1dFN0YXJ0OiBmYWxzZVxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVzLmpvaW4oJycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERvbid0IG91dHB1dCBwcml2YXRlIHZhcnMgKHN1Y2ggYXMgX2F0dHJzKS5cbiAgICAgICAgICBpZiAoUFJJVkFURV9WQVJTLmluY2x1ZGVzKF9uYW1lKSkgYnJlYWs7XG5cbiAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBuZXN0ZWQgbmV3IHZhbHVlIGFuZCBjcmVhdGUgbmV3IGNvbmZpZy5cbiAgICAgICAgICB2YXIgbmV3VmFsID0gdG9YTUwoX2NvbnRlbnQsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29uZmlnKSwge30sIHtcbiAgICAgICAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICAgICAgICBfaXNPdXRwdXRTdGFydDogaXNPdXRwdXRTdGFydFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB2YXIgbmV3VmFsVHlwZSA9IGdldFR5cGUobmV3VmFsKTtcbiAgICAgICAgICB2YXIgaXNOZXdWYWxTaW1wbGUgPSBpc1NpbXBsZVhNTChuZXdWYWwpO1xuICAgICAgICAgIHZhciBpc05ld1ZhbENEQVRBID0gaXNDREFUQShuZXdWYWwpO1xuXG4gICAgICAgICAgLy8gUHJlLXRhZyBvdXRwdXQgKGluZGVudCBhbmQgbGluZSBicmVha3MpLlxuICAgICAgICAgIHZhciBwcmVUYWcgPSBcIlwiLmNvbmNhdChwcmVJbmRlbnRTdHIpLmNvbmNhdChpbmRlbnRTdHIpO1xuXG4gICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29tbWVudHMsIHByZXNlcnZpbmcgcHJlY2VkaW5nIGxpbmUgYnJlYWtzL2luZGVudHMuXG4gICAgICAgICAgaWYgKF9uYW1lID09PSAnX2NvbW1lbnQnKSB7XG4gICAgICAgICAgICBvdXRwdXRTdHIgKz0gXCJcIi5jb25jYXQocHJlVGFnLCBcIjwhLS0gXCIpLmNvbmNhdChfY29udGVudCwgXCIgLS0+XCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGFnIG91dHB1dC5cbiAgICAgICAgICB2YXIgdmFsSXNFbXB0eSA9IG5ld1ZhbFR5cGUgPT09ICd1bmRlZmluZWQnIHx8IG5ld1ZhbCA9PT0gJyc7XG4gICAgICAgICAgdmFyIGdsb2JhbFNlbGZDbG9zZSA9IHNlbGZDbG9zZVRhZ3M7XG4gICAgICAgICAgdmFyIGxvY2FsU2VsZkNsb3NlID0gb2JqLl9zZWxmQ2xvc2VUYWc7XG4gICAgICAgICAgdmFyIHNob3VsZFNlbGZDbG9zZSA9IF90eXBlb2YobG9jYWxTZWxmQ2xvc2UpID09PSBEQVRBX1RZUEVTLkJPT0xFQU4gPyB2YWxJc0VtcHR5ICYmIGxvY2FsU2VsZkNsb3NlIDogdmFsSXNFbXB0eSAmJiBnbG9iYWxTZWxmQ2xvc2U7XG4gICAgICAgICAgdmFyIHNlbGZDbG9zZVN0ciA9IHNob3VsZFNlbGZDbG9zZSA/ICcvJyA6ICcnO1xuICAgICAgICAgIHZhciBhdHRyaWJ1dGVzU3RyaW5nID0gZm9ybWF0QXR0cmlidXRlcyhvYmouX2F0dHJzLCBhdHRyaWJ1dGVSZXBsYWNlbWVudHMsIGF0dHJpYnV0ZUZpbHRlciwgYXR0cmlidXRlRXhwbGljaXRUcnVlKTtcbiAgICAgICAgICB2YXIgdGFnID0gXCI8XCIuY29uY2F0KF9uYW1lKS5jb25jYXQoYXR0cmlidXRlc1N0cmluZykuY29uY2F0KHNlbGZDbG9zZVN0ciwgXCI+XCIpO1xuXG4gICAgICAgICAgLy8gUG9zdC10YWcgb3V0cHV0IChjbG9zaW5nIHRhZywgaW5kZW50LCBsaW5lIGJyZWFrcykuXG4gICAgICAgICAgdmFyIHByZVRhZ0Nsb3NlU3RyID0gc2hvdWxkQWRkTmV3bGluZXMgJiYgIWlzTmV3VmFsU2ltcGxlICYmICFpc05ld1ZhbENEQVRBID8gXCJcXG5cIi5jb25jYXQoaW5kZW50U3RyKSA6ICcnO1xuICAgICAgICAgIHZhciBwb3N0VGFnID0gIXNob3VsZFNlbGZDbG9zZSA/IFwiXCIuY29uY2F0KG5ld1ZhbCkuY29uY2F0KHByZVRhZ0Nsb3NlU3RyLCBcIjwvXCIpLmNvbmNhdChfbmFtZSwgXCI+XCIpIDogJyc7XG4gICAgICAgICAgb3V0cHV0U3RyICs9IFwiXCIuY29uY2F0KHByZVRhZykuY29uY2F0KHRhZykuY29uY2F0KHBvc3RUYWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlIERBVEFfVFlQRVMuT0JKRUNUOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gSXRlcmF0ZXMgb3ZlciBrZXl2YWwgcGFpcnMgaW4gYW4gb2JqZWN0LCBjb252ZXJ0aW5nIGVhY2ggaXRlbSB0byBhIHNwZWNpYWwtb2JqZWN0LlxuXG4gICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICAgIHZhciBvdXRwdXRBcnIgPSBrZXlzLm1hcChmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIG5ld0NvbmZpZyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29uZmlnKSwge30sIHtcbiAgICAgICAgICAgICAgX2lzRmlyc3RJdGVtOiBpbmRleCA9PT0gMCxcbiAgICAgICAgICAgICAgX2lzTGFzdEl0ZW06IGluZGV4ICsgMSA9PT0ga2V5cy5sZW5ndGgsXG4gICAgICAgICAgICAgIF9pc091dHB1dFN0YXJ0OiBpc091dHB1dFN0YXJ0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBvdXRwdXRPYmogPSB7XG4gICAgICAgICAgICAgIF9uYW1lOiBrZXlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZ2V0VHlwZShvYmpba2V5XSkgPT09IERBVEFfVFlQRVMuT0JKRUNUKSB7XG4gICAgICAgICAgICAgIC8vIFN1Yi1vYmplY3QgY29udGFpbnMgYW4gb2JqZWN0LlxuXG4gICAgICAgICAgICAgIC8vIE1vdmUgcHJpdmF0ZSB2YXJzIHVwIGFzIG5lZWRlZC4gIE5lZWRlZCB0byBzdXBwb3J0IGNlcnRhaW4gdHlwZXMgb2Ygb2JqZWN0c1xuICAgICAgICAgICAgICAvLyBFLmcuIHsgZm9vOiB7IF9hdHRyczogeyBhOiAxIH0gfSB9IC0+IDxmb28gYT1cIjFcIi8+XG4gICAgICAgICAgICAgIFBSSVZBVEVfVkFSUy5mb3JFYWNoKGZ1bmN0aW9uIChwcml2YXRlVmFyKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IG9ialtrZXldW3ByaXZhdGVWYXJdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0T2JqW3ByaXZhdGVWYXJdID0gdmFsO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldW3ByaXZhdGVWYXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHZhciBoYXNDb250ZW50ID0gdHlwZW9mIG9ialtrZXldLl9jb250ZW50ICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgICAgICAgaWYgKGhhc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBfY29udGVudCBoYXMgc2libGluZyBrZXlzLCBzbyBwYXNzIGFzIGFuIGFycmF5IChlZGdlIGNhc2UpLlxuICAgICAgICAgICAgICAgIC8vIEUuZy4geyBmb286ICdiYXInLCBfY29udGVudDogeyBiYXo6IDIgfSB9IC0+IDxmb28+YmFyPC9mb28+PGJhej4yPC9iYXo+XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9ialtrZXldKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbmV3Q29udGVudE9iaiA9IE9iamVjdC5hc3NpZ24oe30sIG9ialtrZXldKTtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdDb250ZW50T2JqLl9jb250ZW50O1xuICAgICAgICAgICAgICAgICAgb3V0cHV0T2JqLl9jb250ZW50ID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShvYmpUb0FycmF5KG5ld0NvbnRlbnRPYmopKSwgW29ialtrZXldLl9jb250ZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZhbGx0aHJvdWdoOiBqdXN0IHBhc3MgdGhlIGtleSBhcyB0aGUgY29udGVudCBmb3IgdGhlIG5ldyBzcGVjaWFsLW9iamVjdC5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0T2JqLl9jb250ZW50ID09PSAndW5kZWZpbmVkJykgb3V0cHV0T2JqLl9jb250ZW50ID0gb2JqW2tleV07XG4gICAgICAgICAgICB2YXIgeG1sID0gdG9YTUwob3V0cHV0T2JqLCBuZXdDb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuIHhtbDtcbiAgICAgICAgICB9LCBjb25maWcpO1xuICAgICAgICAgIG91dHB1dFN0ciA9IG91dHB1dEFyci5qb2luKCcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSBEQVRBX1RZUEVTLkZVTkNUSU9OOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gRXhlY3V0ZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gYW5kIHJldHVybnMgb3V0cHV0LlxuXG4gICAgICAgICAgdmFyIGZuUmVzdWx0ID0gb2JqKGNvbmZpZyk7XG4gICAgICAgICAgb3V0cHV0U3RyID0gdG9YTUwoZm5SZXN1bHQsIGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgREFUQV9UWVBFUy5BUlJBWTpcbiAgICAgICAge1xuICAgICAgICAgIC8vIEl0ZXJhdGVzIGFuZCBjb252ZXJ0cyBlYWNoIHZhbHVlIGluIGFuIGFycmF5LlxuICAgICAgICAgIHZhciBfb3V0cHV0QXJyID0gb2JqLm1hcChmdW5jdGlvbiAoc2luZ2xlVmFsLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIG5ld0NvbmZpZyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29uZmlnKSwge30sIHtcbiAgICAgICAgICAgICAgX2lzRmlyc3RJdGVtOiBpbmRleCA9PT0gMCxcbiAgICAgICAgICAgICAgX2lzTGFzdEl0ZW06IGluZGV4ICsgMSA9PT0gb2JqLmxlbmd0aCxcbiAgICAgICAgICAgICAgX2lzT3V0cHV0U3RhcnQ6IGlzT3V0cHV0U3RhcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRvWE1MKHNpbmdsZVZhbCwgbmV3Q29uZmlnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRTdHIgPSBfb3V0cHV0QXJyLmpvaW4oJycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGZhbGx0aHJvdWdoIHR5cGVzIChudW1iZXIsIHN0cmluZywgYm9vbGVhbiwgZGF0ZSwgbnVsbCwgZXRjKVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dFN0ciA9IG1hcFN0cihvYmosIGNvbnRlbnRSZXBsYWNlbWVudHMsIGNvbnRlbnRNYXApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcIlwiLmNvbmNhdChoZWFkZXJTdHIpLmNvbmNhdChvdXRwdXRTdHIpO1xuICB9O1xuICB2YXIgX2RlZmF1bHQgPSBfZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAgIHRvWE1MOiB0b1hNTFxuICB9O1xufSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///94270\n")},6765:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InvalidTokenError: () => (/* binding */ n),\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction e(e){this.message=e}e.prototype=new Error,e.prototype.name="InvalidCharacterError";var r="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,"");if(t.length%4==1)throw new e("\'atob\' failed: The string to be decoded is not correctly encoded.");for(var n,o,a=0,i=0,c="";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(o);return c};function t(e){var t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw"Illegal base64url string!"}try{return function(e){return decodeURIComponent(r(e).replace(/(.)/g,(function(e,r){var t=r.charCodeAt(0).toString(16).toUpperCase();return t.length<2&&(t="0"+t),"%"+t})))}(t)}catch(e){return r(t)}}function n(e){this.message=e}function o(e,r){if("string"!=typeof e)throw new n("Invalid token specified");var o=!0===(r=r||{}).header?0:1;try{return JSON.parse(t(e.split(".")[o]))}catch(e){throw new n("Invalid token specified: "+e.message)}}n.prototype=new Error,n.prototype.name="InvalidTokenError";/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (o);\n//# sourceMappingURL=jwt-decode.esm.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc2NS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBLGNBQWMsZUFBZSwrREFBK0QscUZBQXFGLGtDQUFrQyxrR0FBa0cseUJBQXlCLGdCQUFnQixzSkFBc0osVUFBVSxjQUFjLDRDQUE0QyxtQkFBbUIsYUFBYSxlQUFlLE1BQU0sY0FBYyxNQUFNLHlDQUF5QyxJQUFJLG1CQUFtQiw2REFBNkQsaURBQWlELG1DQUFtQyxJQUFJLElBQUksU0FBUyxhQUFhLGNBQWMsZUFBZSxnQkFBZ0IsNkRBQTZELG1CQUFtQixhQUFhLElBQUksc0NBQXNDLFNBQVMsb0RBQW9ELDJEQUEyRCxpRUFBZSxDQUFDLEVBQWdDO0FBQzVzQyIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvand0LWRlY29kZS9idWlsZC9qd3QtZGVjb2RlLmVzbS5qcz8xMjMyIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGUoZSl7dGhpcy5tZXNzYWdlPWV9ZS5wcm90b3R5cGU9bmV3IEVycm9yLGUucHJvdG90eXBlLm5hbWU9XCJJbnZhbGlkQ2hhcmFjdGVyRXJyb3JcIjt2YXIgcj1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuYXRvYiYmd2luZG93LmF0b2IuYmluZCh3aW5kb3cpfHxmdW5jdGlvbihyKXt2YXIgdD1TdHJpbmcocikucmVwbGFjZSgvPSskLyxcIlwiKTtpZih0Lmxlbmd0aCU0PT0xKXRocm93IG5ldyBlKFwiJ2F0b2InIGZhaWxlZDogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC5cIik7Zm9yKHZhciBuLG8sYT0wLGk9MCxjPVwiXCI7bz10LmNoYXJBdChpKyspO35vJiYobj1hJTQ/NjQqbitvOm8sYSsrJTQpP2MrPVN0cmluZy5mcm9tQ2hhckNvZGUoMjU1Jm4+PigtMiphJjYpKTowKW89XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLmluZGV4T2Yobyk7cmV0dXJuIGN9O2Z1bmN0aW9uIHQoZSl7dmFyIHQ9ZS5yZXBsYWNlKC8tL2csXCIrXCIpLnJlcGxhY2UoL18vZyxcIi9cIik7c3dpdGNoKHQubGVuZ3RoJTQpe2Nhc2UgMDpicmVhaztjYXNlIDI6dCs9XCI9PVwiO2JyZWFrO2Nhc2UgMzp0Kz1cIj1cIjticmVhaztkZWZhdWx0OnRocm93XCJJbGxlZ2FsIGJhc2U2NHVybCBzdHJpbmchXCJ9dHJ5e3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHIoZSkucmVwbGFjZSgvKC4pL2csKGZ1bmN0aW9uKGUscil7dmFyIHQ9ci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiB0Lmxlbmd0aDwyJiYodD1cIjBcIit0KSxcIiVcIit0fSkpKX0odCl9Y2F0Y2goZSl7cmV0dXJuIHIodCl9fWZ1bmN0aW9uIG4oZSl7dGhpcy5tZXNzYWdlPWV9ZnVuY3Rpb24gbyhlLHIpe2lmKFwic3RyaW5nXCIhPXR5cGVvZiBlKXRocm93IG5ldyBuKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWRcIik7dmFyIG89ITA9PT0ocj1yfHx7fSkuaGVhZGVyPzA6MTt0cnl7cmV0dXJuIEpTT04ucGFyc2UodChlLnNwbGl0KFwiLlwiKVtvXSkpfWNhdGNoKGUpe3Rocm93IG5ldyBuKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IFwiK2UubWVzc2FnZSl9fW4ucHJvdG90eXBlPW5ldyBFcnJvcixuLnByb3RvdHlwZS5uYW1lPVwiSW52YWxpZFRva2VuRXJyb3JcIjtleHBvcnQgZGVmYXVsdCBvO2V4cG9ydHtuIGFzIEludmFsaWRUb2tlbkVycm9yfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWp3dC1kZWNvZGUuZXNtLmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6765\n')},85:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var util = __webpack_require__(39023);\nvar PassThrough = __webpack_require__(28768);\n\nmodule.exports = {\n Readable: Readable,\n Writable: Writable\n};\n\nutil.inherits(Readable, PassThrough);\nutil.inherits(Writable, PassThrough);\n\n// Patch the given method of instance so that the callback\n// is executed once, before the actual method is called the\n// first time.\nfunction beforeFirstCall(instance, method, callback) {\n instance[method] = function() {\n delete instance[method];\n callback.apply(this, arguments);\n return this[method].apply(this, arguments);\n };\n}\n\nfunction Readable(fn, options) {\n if (!(this instanceof Readable))\n return new Readable(fn, options);\n\n PassThrough.call(this, options);\n\n beforeFirstCall(this, '_read', function() {\n var source = fn.call(this, options);\n var emit = this.emit.bind(this, 'error');\n source.on('error', emit);\n source.pipe(this);\n });\n\n this.emit('readable');\n}\n\nfunction Writable(fn, options) {\n if (!(this instanceof Writable))\n return new Writable(fn, options);\n\n PassThrough.call(this, options);\n\n beforeFirstCall(this, '_write', function() {\n var destination = fn.call(this, options);\n var emit = this.emit.bind(this, 'error');\n destination.on('error', emit);\n this.pipe(destination);\n });\n\n this.emit('writable');\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxtQkFBTyxDQUFDLEtBQU07QUFDekIsa0JBQWtCLG1CQUFPLENBQUMsS0FBNkI7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbGliL2xhenlzdHJlYW0uanM/ZmZiZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBQYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUmVhZGFibGU6IFJlYWRhYmxlLFxuICBXcml0YWJsZTogV3JpdGFibGVcbn07XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFBhc3NUaHJvdWdoKTtcbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFBhc3NUaHJvdWdoKTtcblxuLy8gUGF0Y2ggdGhlIGdpdmVuIG1ldGhvZCBvZiBpbnN0YW5jZSBzbyB0aGF0IHRoZSBjYWxsYmFja1xuLy8gaXMgZXhlY3V0ZWQgb25jZSwgYmVmb3JlIHRoZSBhY3R1YWwgbWV0aG9kIGlzIGNhbGxlZCB0aGVcbi8vIGZpcnN0IHRpbWUuXG5mdW5jdGlvbiBiZWZvcmVGaXJzdENhbGwoaW5zdGFuY2UsIG1ldGhvZCwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2VbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSBpbnN0YW5jZVttZXRob2RdO1xuICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRoaXNbbWV0aG9kXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShmbiwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUoZm4sIG9wdGlvbnMpO1xuXG4gIFBhc3NUaHJvdWdoLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgYmVmb3JlRmlyc3RDYWxsKHRoaXMsICdfcmVhZCcsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3VyY2UgPSBmbi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHZhciBlbWl0ID0gdGhpcy5lbWl0LmJpbmQodGhpcywgJ2Vycm9yJyk7XG4gICAgc291cmNlLm9uKCdlcnJvcicsIGVtaXQpO1xuICAgIHNvdXJjZS5waXBlKHRoaXMpO1xuICB9KTtcblxuICB0aGlzLmVtaXQoJ3JlYWRhYmxlJyk7XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlKGZuLCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkpXG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShmbiwgb3B0aW9ucyk7XG5cbiAgUGFzc1Rocm91Z2guY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBiZWZvcmVGaXJzdENhbGwodGhpcywgJ193cml0ZScsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IGZuLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdmFyIGVtaXQgPSB0aGlzLmVtaXQuYmluZCh0aGlzLCAnZXJyb3InKTtcbiAgICBkZXN0aW5hdGlvbi5vbignZXJyb3InLCBlbWl0KTtcbiAgICB0aGlzLnBpcGUoZGVzdGluYXRpb24pO1xuICB9KTtcblxuICB0aGlzLmVtaXQoJ3dyaXRhYmxlJyk7XG59XG5cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///85\n")},30148:module=>{eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAxNDguanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanM/OWUyNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///30148\n")},42676:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n\n\n/**/\n\nvar pna = __webpack_require__(33225);\n/**/\n\n/**/\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n keys.push(key);\n }return keys;\n};\n/**/\n\nmodule.exports = Duplex;\n\n/**/\nvar util = Object.create(__webpack_require__(15622));\nutil.inherits = __webpack_require__(72017);\n/**/\n\nvar Readable = __webpack_require__(82922);\nvar Writable = __webpack_require__(34734);\n\nutil.inherits(Duplex, Readable);\n\n{\n // avoid scope creep, the keys array can then be collected\n var keys = objectKeys(Writable.prototype);\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\n\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n\n Readable.call(this, options);\n Writable.call(this, options);\n\n if (options && options.readable === false) this.readable = false;\n\n if (options && options.writable === false) this.writable = false;\n\n this.allowHalfOpen = true;\n if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n // if we allow half-open state, or if the writable side ended,\n // then we're ok.\n if (this.allowHalfOpen || this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n this.push(null);\n this.end();\n\n pna.nextTick(cb, err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI2NzYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxVQUFVLG1CQUFPLENBQUMsS0FBc0I7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0EseUJBQXlCLG1CQUFPLENBQUMsS0FBYztBQUMvQyxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUFVO0FBQ2xDOztBQUVBLGVBQWUsbUJBQU8sQ0FBQyxLQUFvQjtBQUMzQyxlQUFlLG1CQUFPLENBQUMsS0FBb0I7O0FBRTNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzPzc1ZTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1yZXR1cm4ga2V5cztcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXg7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IE9iamVjdC5jcmVhdGUocmVxdWlyZSgnY29yZS11dGlsLWlzJykpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxue1xuICAvLyBhdm9pZCBzY29wZSBjcmVlcCwgdGhlIGtleXMgYXJyYXkgY2FuIHRoZW4gYmUgY29sbGVjdGVkXG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG4gIH1cbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwbmEubmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5EdXBsZXgucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICB0aGlzLmVuZCgpO1xuXG4gIHBuYS5uZXh0VGljayhjYiwgZXJyKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///42676\n")},86462:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// "Software"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n\n\nmodule.exports = PassThrough;\n\nvar Transform = __webpack_require__(75828);\n\n/**/\nvar util = Object.create(__webpack_require__(15622));\nutil.inherits = __webpack_require__(72017);\n/**/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODY0NjIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7O0FBRUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBcUI7O0FBRTdDO0FBQ0EseUJBQXlCLG1CQUFPLENBQUMsS0FBYztBQUMvQyxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUFVO0FBQ2xDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcz8xYjQwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSBPYmplY3QuY3JlYXRlKHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///86462\n')},82922:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/**/\n\nvar pna = __webpack_require__(33225);\n/**/\n\nmodule.exports = Readable;\n\n/**/\nvar isArray = __webpack_require__(30148);\n/**/\n\n/**/\nvar Duplex;\n/**/\n\nReadable.ReadableState = ReadableState;\n\n/**/\nvar EE = (__webpack_require__(24434).EventEmitter);\n\nvar EElistenerCount = function (emitter, type) {\n return emitter.listeners(type).length;\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(57354);\n/**/\n\n/**/\n\nvar Buffer = (__webpack_require__(36347).Buffer);\nvar OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\n\n/**/\nvar util = Object.create(__webpack_require__(15622));\nutil.inherits = __webpack_require__(72017);\n/**/\n\n/**/\nvar debugUtil = __webpack_require__(39023);\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function () {};\n}\n/**/\n\nvar BufferList = __webpack_require__(14156);\nvar destroyImpl = __webpack_require__(18762);\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n Duplex = Duplex || __webpack_require__(42676);\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n var hwm = options.highWaterMark;\n var readableHwm = options.readableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(78247)/* .StringDecoder */ .I);\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\n\nfunction Readable(options) {\n Duplex = Duplex || __webpack_require__(42676);\n\n if (!(this instanceof Readable)) return new Readable(options);\n\n this._readableState = new ReadableState(options, this);\n\n // legacy\n this.readable = true;\n\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n\n Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n get: function () {\n if (this._readableState === undefined) {\n return false;\n }\n return this._readableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n }\n});\n\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n this.push(null);\n cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n var state = stream._readableState;\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n if (er) {\n stream.emit('error', er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (addToFront) {\n if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n stream.emit('error', new Error('stream.push() after EOF'));\n } else {\n state.reading = false;\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n }\n }\n\n return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n stream.emit('data', chunk);\n stream.read(0);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n if (state.needReadable) emitReadable(stream);\n }\n maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n var er;\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n return er;\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes. This is to work around cases where hwm=0,\n// such as the repl. Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(78247)/* .StringDecoder */ .I);\n this._readableState.decoder = new StringDecoder(enc);\n this._readableState.encoding = enc;\n return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = true;\n n = 0;\n } else {\n state.length -= n;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n\n return ret;\n};\n\nfunction onEofChunk(stream, state) {\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n\n // emit 'readable' now to make sure it gets picked up.\n emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n }\n}\n\nfunction emitReadable_(stream) {\n debug('emit readable');\n stream.emit('readable');\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n pna.nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n var len = state.length;\n while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;else len = state.length;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n\n dest.on('unpipe', onunpipe);\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n\n // If the user pushes more data while we're writing to dest then we'll end up\n // in ondata again. However, we only want to increase awaitDrain once because\n // dest will only emit one 'drain' event for the multiple writes.\n // => Introduce a guard on increasing awaitDrain.\n var increasedAwaitDrain = false;\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n increasedAwaitDrain = false;\n var ret = dest.write(chunk);\n if (false === ret && !increasedAwaitDrain) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', state.awaitDrain);\n state.awaitDrain++;\n increasedAwaitDrain = true;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function () {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = { hasUnpiped: false };\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var i = 0; i < len; i++) {\n dests[i].emit('unpipe', this, { hasUnpiped: false });\n }return this;\n }\n\n // try to find the right one.\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n dest.emit('unpipe', this, unpipeInfo);\n\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n\n if (ev === 'data') {\n // Start flowing on next tick if stream isn't explicitly paused\n if (this._readableState.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n var state = this._readableState;\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.emittedReadable = false;\n if (!state.reading) {\n pna.nextTick(nReadingNextTick, this);\n } else if (state.length) {\n emitReadable(this);\n }\n }\n }\n\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n state.flowing = true;\n resume(this, state);\n }\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n pna.nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n if (!state.reading) {\n debug('resume read 0');\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n state.awaitDrain = 0;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (false !== this._readableState.flowing) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n\n var state = this._readableState;\n var paused = false;\n\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n\n _this.push(null);\n });\n\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = _this.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function (method) {\n return function () {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n }\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n this._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._readableState.highWaterMark;\n }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = fromListPartial(n, state.buffer, state.decoder);\n }\n\n return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n var ret;\n if (n < list.head.data.length) {\n // slice is the same for buffers and strings\n ret = list.head.data.slice(0, n);\n list.head.data = list.head.data.slice(n);\n } else if (n === list.head.data.length) {\n // first chunk is a perfect match\n ret = list.shift();\n } else {\n // result spans more than one buffer\n ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n }\n return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n var p = list.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = str.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n var ret = Buffer.allocUnsafe(n);\n var p = list.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = buf.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState;\n\n // If we get here before consuming all the bytes, then that is a\n // bug in node. Should never happen.\n if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n if (!state.endEmitted) {\n state.ended = true;\n pna.nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n }\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDLG1EQUF3QztBQUM5RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLFNBQVM7QUFDN0Isc0NBQXNDLG1CQUFtQjtBQUN6RCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRFQUE0RTs7QUFFNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQSxtREFBbUQsaUVBQWlFO0FBQ3BIO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsT0FBTztBQUN4QztBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzP2Q5ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gT2JqZWN0LmNyZWF0ZShyZXF1aXJlKCdjb3JlLXV0aWwtaXMnKSk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHZvaWQgMDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIga1Byb3h5RXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChpc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciByZWFkYWJsZUh3bSA9IG9wdGlvbnMucmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuXG4gIGlmIChod20gfHwgaHdtID09PSAwKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod207ZWxzZSBpZiAoaXNEdXBsZXggJiYgKHJlYWRhYmxlSHdtIHx8IHJlYWRhYmxlSHdtID09PSAwKSkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gcmVhZGFibGVId207ZWxzZSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBlbmNvZGluZyA9ICcnO1xuICAgICAgfVxuICAgICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlLCBza2lwQ2h1bmtDaGVjayk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIG51bGwsIHRydWUsIGZhbHNlKTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGVyO1xuICAgIGlmICghc2tpcENodW5rQ2hlY2spIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gICAgaWYgKGVyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKSk7ZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsubGVuZ3RoICE9PSAwKSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO2Vsc2UgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gIH1cbiAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHBuYS5uZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ19yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgcG5hLm5leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgICAgICBzdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdW5waXBlSW5mbyA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB7IGhhc1VucGlwZWQ6IGZhbHNlIH0pO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpbmRleCA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBfdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBfdGhpcy5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gX3RoaXMucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBrUHJveHlFdmVudHMubGVuZ3RoOyBuKyspIHtcbiAgICBzdHJlYW0ub24oa1Byb3h5RXZlbnRzW25dLCB0aGlzLmVtaXQuYmluZCh0aGlzLCBrUHJveHlFdmVudHNbbl0pKTtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHRoaXMuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///82922\n")},75828:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n\n\nmodule.exports = Transform;\n\nvar Duplex = __webpack_require__(42676);\n\n/**/\nvar util = Object.create(__webpack_require__(15622));\nutil.inherits = __webpack_require__(72017);\n/**/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n var ts = this._transformState;\n ts.transforming = false;\n\n var cb = ts.writecb;\n\n if (!cb) {\n return this.emit('error', new Error('write callback called multiple times'));\n }\n\n ts.writechunk = null;\n ts.writecb = null;\n\n if (data != null) // single equals check for both `null` and `undefined`\n this.push(data);\n\n cb(er);\n\n var rs = this._readableState;\n rs.reading = false;\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n this._read(rs.highWaterMark);\n }\n}\n\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n\n Duplex.call(this, options);\n\n this._transformState = {\n afterTransform: afterTransform.bind(this),\n needTransform: false,\n transforming: false,\n writecb: null,\n writechunk: null,\n writeencoding: null\n };\n\n // start out asking for a readable event once data is transformed.\n this._readableState.needReadable = true;\n\n // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n\n if (typeof options.flush === 'function') this._flush = options.flush;\n }\n\n // When the writable side finishes, then flush out anything remaining.\n this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n var _this = this;\n\n if (typeof this._flush === 'function') {\n this._flush(function (er, data) {\n done(_this, er, data);\n });\n } else {\n done(this, null, null);\n }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n ts.transforming = true;\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n var _this2 = this;\n\n Duplex.prototype._destroy.call(this, err, function (err2) {\n cb(err2);\n _this2.emit('close');\n });\n};\n\nfunction done(stream, er, data) {\n if (er) return stream.emit('error', er);\n\n if (data != null) // single equals check for both `null` and `undefined`\n stream.push(data);\n\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n\n if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n\n return stream.push(null);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzU4MjguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxhQUFhO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxhQUFhLG1CQUFPLENBQUMsS0FBa0I7O0FBRXZDO0FBQ0EseUJBQXlCLG1CQUFPLENBQUMsS0FBYztBQUMvQyxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUFVO0FBQ2xDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanM/YTBhNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG52YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSBPYmplY3QuY3JlYXRlKHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShlciwgZGF0YSkge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3dyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcycpKTtcbiAgfVxuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICB0aGlzLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSB7XG4gICAgYWZ0ZXJUcmFuc2Zvcm06IGFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksXG4gICAgbmVlZFRyYW5zZm9ybTogZmFsc2UsXG4gICAgdHJhbnNmb3JtaW5nOiBmYWxzZSxcbiAgICB3cml0ZWNiOiBudWxsLFxuICAgIHdyaXRlY2h1bms6IG51bGwsXG4gICAgd3JpdGVlbmNvZGluZzogbnVsbFxuICB9O1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHRoaXMub24oJ3ByZWZpbmlzaCcsIHByZWZpbmlzaCk7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgICBkb25lKF90aGlzLCBlciwgZGF0YSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSh0aGlzLCBudWxsLCBudWxsKTtcbiAgfVxufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgZnVuY3Rpb24gKGVycjIpIHtcbiAgICBjYihlcnIyKTtcbiAgICBfdGhpczIuZW1pdCgnY2xvc2UnKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIGlmIChkYXRhICE9IG51bGwpIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmIChzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///75828\n")},34734:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n\n\n/**/\n\nvar pna = __webpack_require__(33225);\n/**/\n\nmodule.exports = Writable;\n\n/* */\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* */\n\n/**/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/**/\n\n/**/\nvar Duplex;\n/**/\n\nWritable.WritableState = WritableState;\n\n/**/\nvar util = Object.create(__webpack_require__(15622));\nutil.inherits = __webpack_require__(72017);\n/**/\n\n/**/\nvar internalUtil = {\n deprecate: __webpack_require__(27983)\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(57354);\n/**/\n\n/**/\n\nvar Buffer = (__webpack_require__(36347).Buffer);\nvar OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\n\nvar destroyImpl = __webpack_require__(18762);\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n Duplex = Duplex || __webpack_require__(42676);\n\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n var isDuplex = stream instanceof Duplex;\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n var hwm = options.highWaterMark;\n var writableHwm = options.writableHighWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;\n\n // cast to ints.\n this.highWaterMark = Math.floor(this.highWaterMark);\n\n // if _final has been called\n this.finalCalled = false;\n\n // drain event flag.\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\n\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function () {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function (object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function (object) {\n return object instanceof this;\n };\n}\n\nfunction Writable(options) {\n Duplex = Duplex || __webpack_require__(42676);\n\n // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n return new Writable(options);\n }\n\n this._writableState = new WritableState(options, this);\n\n // legacy.\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n\n if (typeof options.writev === 'function') this._writev = options.writev;\n\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n\n if (typeof options.final === 'function') this._final = options.final;\n }\n\n Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new Error('write after end');\n // TODO: defer error events consistently everywhere, not just the cb\n stream.emit('error', er);\n pna.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n var valid = true;\n var er = false;\n\n if (chunk === null) {\n er = new TypeError('May not write null values to stream');\n } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n if (er) {\n stream.emit('error', er);\n pna.nextTick(cb, er);\n valid = false;\n }\n return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n if (typeof cb !== 'function') cb = nop;\n\n if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n\n return ret;\n};\n\nWritable.prototype.cork = function () {\n var state = this._writableState;\n\n state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n\n if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function () {\n return this._writableState.highWaterMark;\n }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n var len = state.objectMode ? 1 : chunk.length;\n\n state.length += len;\n\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n pna.nextTick(cb, er);\n // this can emit finish, and it will always happen\n // after error\n pna.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n // this can emit finish, but finish must\n // always follow error\n finishMaybe(stream, state);\n }\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n\n onwriteStateUpdate(state);\n\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state);\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n /**/\n asyncWrite(afterWrite, stream, state, finished, cb);\n /**/\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n\n var count = 0;\n var allBuffers = true;\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n buffer.allBuffers = allBuffers;\n\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n if (err) {\n stream.emit('error', err);\n }\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function') {\n state.pendingcb++;\n state.finalCalled = true;\n pna.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n prefinish(stream, state);\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n }\n }\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n\n // reuse the free corkReq.\n state.corkedRequestsFree.next = corkReq;\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n get: function () {\n if (this._writableState === undefined) {\n return false;\n }\n return this._writableState.destroyed;\n },\n set: function (value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._writableState.destroyed = value;\n }\n});\n\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n this.end();\n cb(err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ3MzQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7O0FBRUEsVUFBVSxtQkFBTyxDQUFDLEtBQXNCO0FBQ3hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyxLQUFjO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLEtBQVU7QUFDbEM7O0FBRUE7QUFDQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxLQUFnQjtBQUNyQztBQUNBOztBQUVBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLEtBQTJCO0FBQ2hEOztBQUVBOztBQUVBLGFBQWEsbUNBQTZCO0FBQzFDLDhJQUE4STtBQUM5STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLG1CQUFPLENBQUMsS0FBNEI7O0FBRXREOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCLG1CQUFPLENBQUMsS0FBa0I7O0FBRS9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlEQUFpRCwwRkFBMEY7O0FBRTNJO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsSUFBSTtBQUNKLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLG1CQUFPLENBQUMsS0FBa0I7O0FBRS9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDOztBQUVBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanM/YzcyZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qIDxyZXBsYWNlbWVudD4gKi9cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgb25Db3JrZWRGaW5pc2goX3RoaXMsIHN0YXRlKTtcbiAgfTtcbn1cbi8qIDwvcmVwbGFjZW1lbnQ+ICovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYXN5bmNXcml0ZSA9ICFwcm9jZXNzLmJyb3dzZXIgJiYgWyd2MC4xMCcsICd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsIDUpKSA+IC0xID8gc2V0SW1tZWRpYXRlIDogcG5hLm5leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSBPYmplY3QuY3JlYXRlKHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcblxudXRpbC5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbS5cbiAgLy8gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgc2VwYXJhdGVseSBhcyByZWFkYWJsZVhYWCBhbmQgd3JpdGFibGVYWFguXG4gIHZhciBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgd3JpdGFibGVId20gPSBvcHRpb25zLndyaXRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmICh3cml0YWJsZUh3bSB8fCB3cml0YWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHdyaXRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBpZiBfZmluYWwgaGFzIGJlZW4gY2FsbGVkXG4gIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZTtcblxuICAvLyBkcmFpbiBldmVudCBmbGFnLlxuICB0aGlzLm5lZWREcmFpbiA9IGZhbHNlO1xuICAvLyBhdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlO1xuICAvLyB3aGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG4gIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2U7XG5cbiAgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuICB0aGlzLmNvcmtlZCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cbiAgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuICB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cblxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJywgJ0RFUDAwMDMnKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxuLy8gVGVzdCBfd3JpdGFibGVTdGF0ZSBmb3IgaW5oZXJpdGFuY2UgdG8gYWNjb3VudCBmb3IgRHVwbGV4IHN0cmVhbXMsXG4vLyB3aG9zZSBwcm90b3R5cGUgY2hhaW4gb25seSBwb2ludHMgdG8gUmVhZGFibGUuXG52YXIgcmVhbEhhc0luc3RhbmNlO1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmhhc0luc3RhbmNlICYmIHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICByZWFsSGFzSW5zdGFuY2UgPSBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgaWYgKHJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMgIT09IFdyaXRhYmxlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gIGlmICghcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB9XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZpbmFsID0gb3B0aW9ucy5maW5hbDtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHBuYS5uZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhIHVzZXItc3VwcGxpZWQgY2h1bmsgaXMgdmFsaWQsIGVzcGVjaWFsbHkgZm9yIHRoZSBwYXJ0aWN1bGFyXG4vLyBtb2RlIHRoZSBzdHJlYW0gaXMgaW4uIEN1cnJlbnRseSB0aGlzIG1lYW5zIHRoYXQgYG51bGxgIGlzIG5ldmVyIGFjY2VwdGVkXG4vLyBhbmQgdW5kZWZpbmVkL25vbi1zdHJpbmcgdmFsdWVzIGFyZSBvbmx5IGFsbG93ZWQgaW4gb2JqZWN0IG1vZGUuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZXIgPSBmYWxzZTtcblxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIHBuYS5uZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG4gIHZhciBpc0J1ZiA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIF9pc1VpbnQ4QXJyYXkoY2h1bmspO1xuXG4gIGlmIChpc0J1ZiAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoaXNCdWYpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcblxuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKGlzQnVmIHx8IHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcblxuICBpZiAoc3luYykge1xuICAgIC8vIGRlZmVyIHRoZSBjYWxsYmFjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyB0byBhdm9pZCBwaWxpbmcgdXAgdGhpbmdzIG9uIHRoZSBzdGFja1xuICAgIHBuYS5uZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwbmEubmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgYXN5bmNXcml0ZShhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS07XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ193cml0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIHBuYS5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcG5hLm5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cblxuICAvLyByZXVzZSB0aGUgZnJlZSBjb3JrUmVxLlxuICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5lbmQoKTtcbiAgY2IoZXJyKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///34734\n")},14156:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Buffer = (__webpack_require__(36347).Buffer);\nvar util = __webpack_require__(39023);\n\nfunction copyBuffer(src, target, offset) {\n src.copy(target, offset);\n}\n\nmodule.exports = function () {\n function BufferList() {\n _classCallCheck(this, BufferList);\n\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n BufferList.prototype.push = function push(v) {\n var entry = { data: v, next: null };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n };\n\n BufferList.prototype.unshift = function unshift(v) {\n var entry = { data: v, next: this.head };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n };\n\n BufferList.prototype.shift = function shift() {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n };\n\n BufferList.prototype.clear = function clear() {\n this.head = this.tail = null;\n this.length = 0;\n };\n\n BufferList.prototype.join = function join(s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n while (p = p.next) {\n ret += s + p.data;\n }return ret;\n };\n\n BufferList.prototype.concat = function concat(n) {\n if (this.length === 0) return Buffer.alloc(0);\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n while (p) {\n copyBuffer(p.data, ret, i);\n i += p.data.length;\n p = p.next;\n }\n return ret;\n };\n\n return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n module.exports.prototype[util.inspect.custom] = function () {\n var obj = util.inspect({ length: this.length });\n return this.constructor.name + ' ' + obj;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQxNTYuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0RBQWtELDBDQUEwQzs7QUFFNUYsYUFBYSxtQ0FBNkI7QUFDMUMsV0FBVyxtQkFBTyxDQUFDLEtBQU07O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEIsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSw2QkFBNkIscUJBQXFCO0FBQ2xEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QuanM/ZmU5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBjb3B5QnVmZmVyKHNyYywgdGFyZ2V0LCBvZmZzZXQpIHtcbiAgc3JjLmNvcHkodGFyZ2V0LCBvZmZzZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyTGlzdCk7XG5cbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2godikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogbnVsbCB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiB1bnNoaWZ0KHYpIHtcbiAgICB2YXIgZW50cnkgPSB7IGRhdGE6IHYsIG5leHQ6IHRoaXMuaGVhZCB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7ZWxzZSB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgICAtLXRoaXMubGVuZ3RoO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihzKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgICB9cmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQobikge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4gPj4+IDApO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAocCkge1xuICAgICAgY29weUJ1ZmZlcihwLmRhdGEsIHJldCwgaSk7XG4gICAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgICBwID0gcC5uZXh0O1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIHJldHVybiBCdWZmZXJMaXN0O1xufSgpO1xuXG5pZiAodXRpbCAmJiB1dGlsLmluc3BlY3QgJiYgdXRpbC5pbnNwZWN0LmN1c3RvbSkge1xuICBtb2R1bGUuZXhwb3J0cy5wcm90b3R5cGVbdXRpbC5pbnNwZWN0LmN1c3RvbV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9iaiA9IHV0aWwuaW5zcGVjdCh7IGxlbmd0aDogdGhpcy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSArICcgJyArIG9iajtcbiAgfTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14156\n")},18762:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\n/**/\n\nvar pna = __webpack_require__(33225);\n/**/\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n var _this = this;\n\n var readableDestroyed = this._readableState && this._readableState.destroyed;\n var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n if (readableDestroyed || writableDestroyed) {\n if (cb) {\n cb(err);\n } else if (err) {\n if (!this._writableState) {\n pna.nextTick(emitErrorNT, this, err);\n } else if (!this._writableState.errorEmitted) {\n this._writableState.errorEmitted = true;\n pna.nextTick(emitErrorNT, this, err);\n }\n }\n\n return this;\n }\n\n // we set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n\n if (this._readableState) {\n this._readableState.destroyed = true;\n }\n\n // if this is a duplex stream mark the writable part as destroyed as well\n if (this._writableState) {\n this._writableState.destroyed = true;\n }\n\n this._destroy(err || null, function (err) {\n if (!cb && err) {\n if (!_this._writableState) {\n pna.nextTick(emitErrorNT, _this, err);\n } else if (!_this._writableState.errorEmitted) {\n _this._writableState.errorEmitted = true;\n pna.nextTick(emitErrorNT, _this, err);\n }\n } else if (cb) {\n cb(err);\n }\n });\n\n return this;\n}\n\nfunction undestroy() {\n if (this._readableState) {\n this._readableState.destroyed = false;\n this._readableState.reading = false;\n this._readableState.ended = false;\n this._readableState.endEmitted = false;\n }\n\n if (this._writableState) {\n this._writableState.destroyed = false;\n this._writableState.ended = false;\n this._writableState.ending = false;\n this._writableState.finalCalled = false;\n this._writableState.prefinished = false;\n this._writableState.finished = false;\n this._writableState.errorEmitted = false;\n }\n}\n\nfunction emitErrorNT(self, err) {\n self.emit('error', err);\n}\n\nmodule.exports = {\n destroy: destroy,\n undestroy: undestroy\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg3NjIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUEsVUFBVSxtQkFBTyxDQUFDLEtBQXNCO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcz9iYzZjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcblxuICBpZiAocmVhZGFibGVEZXN0cm95ZWQgfHwgd3JpdGFibGVEZXN0cm95ZWQpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHdlIHNldCBkZXN0cm95ZWQgdG8gdHJ1ZSBiZWZvcmUgZmlyaW5nIGVycm9yIGNhbGxiYWNrcyBpbiBvcmRlclxuICAvLyB0byBtYWtlIGl0IHJlLWVudHJhbmNlIHNhZmUgaW4gY2FzZSBkZXN0cm95KCkgaXMgY2FsbGVkIHdpdGhpbiBjYWxsYmFja3NcblxuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlmIHRoaXMgaXMgYSBkdXBsZXggc3RyZWFtIG1hcmsgdGhlIHdyaXRhYmxlIHBhcnQgYXMgZGVzdHJveWVkIGFzIHdlbGxcbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICB0aGlzLl9kZXN0cm95KGVyciB8fCBudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKCFjYiAmJiBlcnIpIHtcbiAgICAgIGlmICghX3RoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULCBfdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoIV90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICBfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gdW5kZXN0cm95KCkge1xuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluYWxDYWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnByZWZpbmlzaGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///18762\n")},57354:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = __webpack_require__(2203);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTczNTQuanMiLCJtYXBwaW5ncyI6IkFBQUEsMENBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLmpzPzdhODYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdzdHJlYW0nKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///57354\n")},28768:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = __webpack_require__(13940).PassThrough\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg3NjguanMiLCJtYXBwaW5ncyI6IkFBQUEsdURBQWtEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanM/YTQ2MyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKS5QYXNzVGhyb3VnaFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///28768\n")},13940:(module,exports,__webpack_require__)=>{eval("var Stream = __webpack_require__(2203);\nif (process.env.READABLE_STREAM === 'disable' && Stream) {\n module.exports = Stream;\n exports = module.exports = Stream.Readable;\n exports.Readable = Stream.Readable;\n exports.Writable = Stream.Writable;\n exports.Duplex = Stream.Duplex;\n exports.Transform = Stream.Transform;\n exports.PassThrough = Stream.PassThrough;\n exports.Stream = Stream;\n} else {\n exports = module.exports = __webpack_require__(82922);\n exports.Stream = Stream || exports;\n exports.Readable = exports;\n exports.Writable = __webpack_require__(34734);\n exports.Duplex = __webpack_require__(42676);\n exports.Transform = __webpack_require__(75828);\n exports.PassThrough = __webpack_require__(86462);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM5NDAuanMiLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLElBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsRUFBRSxnQkFBZ0I7QUFDbEIsRUFBRSxnQkFBZ0I7QUFDbEIsRUFBRSxjQUFjO0FBQ2hCLEVBQUUsaUJBQWlCO0FBQ25CLEVBQUUsbUJBQW1CO0FBQ3JCLEVBQUUsY0FBYztBQUNoQixFQUFFO0FBQ0YsWUFBWSwyQ0FBcUQ7QUFDakUsRUFBRSxjQUFjO0FBQ2hCLEVBQUUsZ0JBQWdCO0FBQ2xCLEVBQUUsNkNBQXVEO0FBQ3pELEVBQUUsMkNBQW1EO0FBQ3JELEVBQUUsOENBQXlEO0FBQzNELEVBQUUsZ0RBQTZEO0FBQy9EIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanM/MTg3NyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5pZiAocHJvY2Vzcy5lbnYuUkVBREFCTEVfU1RSRUFNID09PSAnZGlzYWJsZScgJiYgU3RyZWFtKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBTdHJlYW0uUmVhZGFibGU7XG4gIGV4cG9ydHMuUmVhZGFibGUgPSBTdHJlYW0uUmVhZGFibGU7XG4gIGV4cG9ydHMuV3JpdGFibGUgPSBTdHJlYW0uV3JpdGFibGU7XG4gIGV4cG9ydHMuRHVwbGV4ID0gU3RyZWFtLkR1cGxleDtcbiAgZXhwb3J0cy5UcmFuc2Zvcm0gPSBTdHJlYW0uVHJhbnNmb3JtO1xuICBleHBvcnRzLlBhc3NUaHJvdWdoID0gU3RyZWFtLlBhc3NUaHJvdWdoO1xuICBleHBvcnRzLlN0cmVhbSA9IFN0cmVhbTtcbn0gZWxzZSB7XG4gIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbiAgZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0gfHwgZXhwb3J0cztcbiAgZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG4gIGV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG4gIGV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbiAgZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuICBleHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///13940\n")},36347:(module,exports,__webpack_require__)=>{eval("/* eslint-disable node/no-deprecated-api */\nvar buffer = __webpack_require__(20181)\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYzNDcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxhQUFhLG1CQUFPLENBQUMsS0FBUTtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFLGNBQWM7QUFDaEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcz8yYjNlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///36347\n")},78247:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/**/\n\nvar Buffer = (__webpack_require__(36347).Buffer);\n/**/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n encoding = '' + encoding;\n switch (encoding && encoding.toLowerCase()) {\n case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n return true;\n default:\n return false;\n }\n};\n\nfunction _normalizeEncoding(enc) {\n if (!enc) return 'utf8';\n var retried;\n while (true) {\n switch (enc) {\n case 'utf8':\n case 'utf-8':\n return 'utf8';\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return 'utf16le';\n case 'latin1':\n case 'binary':\n return 'latin1';\n case 'base64':\n case 'ascii':\n case 'hex':\n return enc;\n default:\n if (retried) return; // undefined\n enc = ('' + enc).toLowerCase();\n retried = true;\n }\n }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n var nenc = _normalizeEncoding(enc);\n if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.I = StringDecoder;\nfunction StringDecoder(encoding) {\n this.encoding = normalizeEncoding(encoding);\n var nb;\n switch (this.encoding) {\n case 'utf16le':\n this.text = utf16Text;\n this.end = utf16End;\n nb = 4;\n break;\n case 'utf8':\n this.fillLast = utf8FillLast;\n nb = 4;\n break;\n case 'base64':\n this.text = base64Text;\n this.end = base64End;\n nb = 3;\n break;\n default:\n this.write = simpleWrite;\n this.end = simpleEnd;\n return;\n }\n this.lastNeed = 0;\n this.lastTotal = 0;\n this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n if (buf.length === 0) return '';\n var r;\n var i;\n if (this.lastNeed) {\n r = this.fillLast(buf);\n if (r === undefined) return '';\n i = this.lastNeed;\n this.lastNeed = 0;\n } else {\n i = 0;\n }\n if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n var j = buf.length - 1;\n if (j < i) return 0;\n var nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 1;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 2;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) {\n if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n }\n return nb;\n }\n return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n if ((buf[0] & 0xC0) !== 0x80) {\n self.lastNeed = 0;\n return '\\ufffd';\n }\n if (self.lastNeed > 1 && buf.length > 1) {\n if ((buf[1] & 0xC0) !== 0x80) {\n self.lastNeed = 1;\n return '\\ufffd';\n }\n if (self.lastNeed > 2 && buf.length > 2) {\n if ((buf[2] & 0xC0) !== 0x80) {\n self.lastNeed = 2;\n return '\\ufffd';\n }\n }\n }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n var p = this.lastTotal - this.lastNeed;\n var r = utf8CheckExtraBytes(this, buf, p);\n if (r !== undefined) return r;\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, p, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, p, 0, buf.length);\n this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n var total = utf8CheckIncomplete(this, buf, i);\n if (!this.lastNeed) return buf.toString('utf8', i);\n this.lastTotal = total;\n var end = buf.length - (total - this.lastNeed);\n buf.copy(this.lastChar, 0, end);\n return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + '\\ufffd';\n return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n if ((buf.length - i) % 2 === 0) {\n var r = buf.toString('utf16le', i);\n if (r) {\n var c = r.charCodeAt(r.length - 1);\n if (c >= 0xD800 && c <= 0xDBFF) {\n this.lastNeed = 2;\n this.lastTotal = 4;\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n return r.slice(0, -1);\n }\n }\n return r;\n }\n this.lastNeed = 1;\n this.lastTotal = 2;\n this.lastChar[0] = buf[buf.length - 1];\n return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) {\n var end = this.lastTotal - this.lastNeed;\n return r + this.lastChar.toString('utf16le', 0, end);\n }\n return r;\n}\n\nfunction base64Text(buf, i) {\n var n = (buf.length - i) % 3;\n if (n === 0) return buf.toString('base64', i);\n this.lastNeed = 3 - n;\n this.lastTotal = 3;\n if (n === 1) {\n this.lastChar[0] = buf[buf.length - 1];\n } else {\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n }\n return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n return buf && buf.length ? this.write(buf) : '';\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzgyNDcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxhQUFhLG1DQUE2QjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixzQ0FBc0Msc0NBQXNDO0FBQ3pHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzPzI3YWEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBpc0VuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gJycgKyBlbmNvZGluZztcbiAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpjYXNlICd1dGY4JzpjYXNlICd1dGYtOCc6Y2FzZSAnYXNjaWknOmNhc2UgJ2JpbmFyeSc6Y2FzZSAnYmFzZTY0JzpjYXNlICd1Y3MyJzpjYXNlICd1Y3MtMic6Y2FzZSAndXRmMTZsZSc6Y2FzZSAndXRmLTE2bGUnOmNhc2UgJ3Jhdyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIGlmICghZW5jKSByZXR1cm4gJ3V0ZjgnO1xuICB2YXIgcmV0cmllZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuYykge1xuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiAndXRmOCc7XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gJ3V0ZjE2bGUnO1xuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiAnbGF0aW4xJztcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gZW5jO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHJldHJpZWQpIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgICAgIGVuYyA9ICgnJyArIGVuYykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0cmllZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBEbyBub3QgY2FjaGUgYEJ1ZmZlci5pc0VuY29kaW5nYCB3aGVuIGNoZWNraW5nIGVuY29kaW5nIG5hbWVzIGFzIHNvbWVcbi8vIG1vZHVsZXMgbW9ua2V5LXBhdGNoIGl0IHRvIHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3NcbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICB2YXIgbmVuYyA9IF9ub3JtYWxpemVFbmNvZGluZyhlbmMpO1xuICBpZiAodHlwZW9mIG5lbmMgIT09ICdzdHJpbmcnICYmIChCdWZmZXIuaXNFbmNvZGluZyA9PT0gaXNFbmNvZGluZyB8fCAhaXNFbmNvZGluZyhlbmMpKSkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jKTtcbiAgcmV0dXJuIG5lbmMgfHwgZW5jO1xufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuXG5leHBvcnRzLlN0cmluZ0RlY29kZXIgPSBTdHJpbmdEZWNvZGVyO1xuZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpO1xuICB2YXIgbmI7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgdGhpcy50ZXh0ID0gdXRmMTZUZXh0O1xuICAgICAgdGhpcy5lbmQgPSB1dGYxNkVuZDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgdGhpcy5maWxsTGFzdCA9IHV0ZjhGaWxsTGFzdDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICB0aGlzLnRleHQgPSBiYXNlNjRUZXh0O1xuICAgICAgdGhpcy5lbmQgPSBiYXNlNjRFbmQ7XG4gICAgICBuYiA9IDM7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHNpbXBsZVdyaXRlO1xuICAgICAgdGhpcy5lbmQgPSBzaW1wbGVFbmQ7XG4gICAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIHRoaXMubGFzdFRvdGFsID0gMDtcbiAgdGhpcy5sYXN0Q2hhciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuYik7XG59XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcjtcbiAgdmFyIGk7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgciA9IHRoaXMuZmlsbExhc3QoYnVmKTtcbiAgICBpZiAociA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaSA9IHRoaXMubGFzdE5lZWQ7XG4gICAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgaSA9IDA7XG4gIH1cbiAgaWYgKGkgPCBidWYubGVuZ3RoKSByZXR1cm4gciA/IHIgKyB0aGlzLnRleHQoYnVmLCBpKSA6IHRoaXMudGV4dChidWYsIGkpO1xuICByZXR1cm4gciB8fCAnJztcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IHV0ZjhFbmQ7XG5cbi8vIFJldHVybnMgb25seSBjb21wbGV0ZSBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0ID0gdXRmOFRleHQ7XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgcGFydGlhbCBub24tVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmZpbGxMYXN0ID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufTtcblxuLy8gQ2hlY2tzIHRoZSB0eXBlIG9mIGEgVVRGLTggYnl0ZSwgd2hldGhlciBpdCdzIEFTQ0lJLCBhIGxlYWRpbmcgYnl0ZSwgb3IgYVxuLy8gY29udGludWF0aW9uIGJ5dGUuIElmIGFuIGludmFsaWQgYnl0ZSBpcyBkZXRlY3RlZCwgLTIgaXMgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKGJ5dGUpIHtcbiAgaWYgKGJ5dGUgPD0gMHg3RikgcmV0dXJuIDA7ZWxzZSBpZiAoYnl0ZSA+PiA1ID09PSAweDA2KSByZXR1cm4gMjtlbHNlIGlmIChieXRlID4+IDQgPT09IDB4MEUpIHJldHVybiAzO2Vsc2UgaWYgKGJ5dGUgPj4gMyA9PT0gMHgxRSkgcmV0dXJuIDQ7XG4gIHJldHVybiBieXRlID4+IDYgPT09IDB4MDIgPyAtMSA6IC0yO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAyO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSB7XG4gICAgICBpZiAobmIgPT09IDIpIG5iID0gMDtlbHNlIHNlbGYubGFzdE5lZWQgPSBuYiAtIDM7XG4gICAgfVxuICAgIHJldHVybiBuYjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy8gVmFsaWRhdGVzIGFzIG1hbnkgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIGFzXG4vLyBuZWVkZWQgb3IgYXJlIGF2YWlsYWJsZS4gSWYgd2Ugc2VlIGEgbm9uLWNvbnRpbnVhdGlvbiBieXRlIHdoZXJlIHdlIGV4cGVjdFxuLy8gb25lLCB3ZSBcInJlcGxhY2VcIiB0aGUgdmFsaWRhdGVkIGNvbnRpbnVhdGlvbiBieXRlcyB3ZSd2ZSBzZWVuIHNvIGZhciB3aXRoXG4vLyBhIHNpbmdsZSBVVEYtOCByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKCdcXHVmZmZkJyksIHRvIG1hdGNoIHY4J3MgVVRGLTggZGVjb2Rpbmdcbi8vIGJlaGF2aW9yLiBUaGUgY29udGludWF0aW9uIGJ5dGUgY2hlY2sgaXMgaW5jbHVkZWQgdGhyZWUgdGltZXMgaW4gdGhlIGNhc2Vcbi8vIHdoZXJlIGFsbCBvZiB0aGUgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIGNoYXJhY3RlciBleGlzdCBpbiB0aGUgc2FtZSBidWZmZXIuXG4vLyBJdCBpcyBhbHNvIGRvbmUgdGhpcyB3YXkgYXMgYSBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UgaW5zdGVhZCBvZiB1c2luZyBhXG4vLyBsb29wLlxuZnVuY3Rpb24gdXRmOENoZWNrRXh0cmFCeXRlcyhzZWxmLCBidWYsIHApIHtcbiAgaWYgKChidWZbMF0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgIHNlbGYubGFzdE5lZWQgPSAwO1xuICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sYXN0TmVlZCA+IDIgJiYgYnVmLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICgoYnVmWzJdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgc2VsZi5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlci5cbmZ1bmN0aW9uIHV0ZjhGaWxsTGFzdChidWYpIHtcbiAgdmFyIHAgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gIHZhciByID0gdXRmOENoZWNrRXh0cmFCeXRlcyh0aGlzLCBidWYsIHApO1xuICBpZiAociAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcjtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufVxuXG4vLyBSZXR1cm5zIGFsbCBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyLiBJZiB0aGUgQnVmZmVyIGVuZGVkIG9uIGFcbi8vIHBhcnRpYWwgY2hhcmFjdGVyLCB0aGUgY2hhcmFjdGVyJ3MgYnl0ZXMgYXJlIGJ1ZmZlcmVkIHVudGlsIHRoZSByZXF1aXJlZFxuLy8gbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUuXG5mdW5jdGlvbiB1dGY4VGV4dChidWYsIGkpIHtcbiAgdmFyIHRvdGFsID0gdXRmOENoZWNrSW5jb21wbGV0ZSh0aGlzLCBidWYsIGkpO1xuICBpZiAoIXRoaXMubGFzdE5lZWQpIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpKTtcbiAgdGhpcy5sYXN0VG90YWwgPSB0b3RhbDtcbiAgdmFyIGVuZCA9IGJ1Zi5sZW5ndGggLSAodG90YWwgLSB0aGlzLmxhc3ROZWVkKTtcbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgMCwgZW5kKTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGksIGVuZCk7XG59XG5cbi8vIEZvciBVVEYtOCwgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaXMgYWRkZWQgd2hlbiBlbmRpbmcgb24gYSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIuXG5mdW5jdGlvbiB1dGY4RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArICdcXHVmZmZkJztcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFVURi0xNkxFIHR5cGljYWxseSBuZWVkcyB0d28gYnl0ZXMgcGVyIGNoYXJhY3RlciwgYnV0IGV2ZW4gaWYgd2UgaGF2ZSBhbiBldmVuXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGVuZCBvbiBhIGxlYWRpbmcvaGlnaFxuLy8gc3Vycm9nYXRlLiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgdHdvIGJ5dGVzIGluIG9yZGVyIHRvXG4vLyBkZWNvZGUgdGhlIGxhc3QgY2hhcmFjdGVyIHByb3Blcmx5LlxuZnVuY3Rpb24gdXRmMTZUZXh0KGJ1ZiwgaSkge1xuICBpZiAoKGJ1Zi5sZW5ndGggLSBpKSAlIDIgPT09IDApIHtcbiAgICB2YXIgciA9IGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGkpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgYyA9IHIuY2hhckNvZGVBdChyLmxlbmd0aCAtIDEpO1xuICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSB7XG4gICAgICAgIHRoaXMubGFzdE5lZWQgPSAyO1xuICAgICAgICB0aGlzLmxhc3RUb3RhbCA9IDQ7XG4gICAgICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMTtcbiAgdGhpcy5sYXN0VG90YWwgPSAyO1xuICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGksIGJ1Zi5sZW5ndGggLSAxKTtcbn1cblxuLy8gRm9yIFVURi0xNkxFIHdlIGRvIG5vdCBleHBsaWNpdGx5IGFwcGVuZCBzcGVjaWFsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgaWYgd2Vcbi8vIGVuZCBvbiBhIHBhcnRpYWwgY2hhcmFjdGVyLCB3ZSBzaW1wbHkgbGV0IHY4IGhhbmRsZSB0aGF0LlxuZnVuY3Rpb24gdXRmMTZFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICB2YXIgZW5kID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICAgIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygndXRmMTZsZScsIDAsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRleHQoYnVmLCBpKSB7XG4gIHZhciBuID0gKGJ1Zi5sZW5ndGggLSBpKSAlIDM7XG4gIGlmIChuID09PSAwKSByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpKTtcbiAgdGhpcy5sYXN0TmVlZCA9IDMgLSBuO1xuICB0aGlzLmxhc3RUb3RhbCA9IDM7XG4gIGlmIChuID09PSAxKSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH1cbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSwgYnVmLmxlbmd0aCAtIG4pO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygnYmFzZTY0JywgMCwgMyAtIHRoaXMubGFzdE5lZWQpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gUGFzcyBieXRlcyBvbiB0aHJvdWdoIGZvciBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKGUuZy4gYXNjaWksIGxhdGluMSwgaGV4KVxuZnVuY3Rpb24gc2ltcGxlV3JpdGUoYnVmKSB7XG4gIHJldHVybiBidWYudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVuZChidWYpIHtcbiAgcmV0dXJuIGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///78247\n")},21549:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var hashClear = __webpack_require__(22032),\n hashDelete = __webpack_require__(63862),\n hashGet = __webpack_require__(66721),\n hashHas = __webpack_require__(12749),\n hashSet = __webpack_require__(35749);\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE1NDkuanMiLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFlO0FBQ3hDLGNBQWMsbUJBQU8sQ0FBQyxLQUFZO0FBQ2xDLGNBQWMsbUJBQU8sQ0FBQyxLQUFZO0FBQ2xDLGNBQWMsbUJBQU8sQ0FBQyxLQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fSGFzaC5qcz9lMjRiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXNoQ2xlYXIgPSByZXF1aXJlKCcuL19oYXNoQ2xlYXInKSxcbiAgICBoYXNoRGVsZXRlID0gcmVxdWlyZSgnLi9faGFzaERlbGV0ZScpLFxuICAgIGhhc2hHZXQgPSByZXF1aXJlKCcuL19oYXNoR2V0JyksXG4gICAgaGFzaEhhcyA9IHJlcXVpcmUoJy4vX2hhc2hIYXMnKSxcbiAgICBoYXNoU2V0ID0gcmVxdWlyZSgnLi9faGFzaFNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbkhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5IYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///21549\n")},80079:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var listCacheClear = __webpack_require__(63702),\n listCacheDelete = __webpack_require__(70080),\n listCacheGet = __webpack_require__(24739),\n listCacheHas = __webpack_require__(48655),\n listCacheSet = __webpack_require__(31175);\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAwNzkuanMiLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCLG1CQUFPLENBQUMsS0FBbUI7QUFDaEQsc0JBQXNCLG1CQUFPLENBQUMsS0FBb0I7QUFDbEQsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7QUFDNUMsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7QUFDNUMsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19MaXN0Q2FjaGUuanM/NWUyZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///80079\n")},68223:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var getNative = __webpack_require__(56110),\n root = __webpack_require__(9325);\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjgyMjMuanMiLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxXQUFXLG1CQUFPLENBQUMsSUFBUzs7QUFFNUI7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXAuanM/NzliYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCA9IGdldE5hdGl2ZShyb290LCAnTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///68223\n")},53661:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var mapCacheClear = __webpack_require__(63040),\n mapCacheDelete = __webpack_require__(17670),\n mapCacheGet = __webpack_require__(90289),\n mapCacheHas = __webpack_require__(4509),\n mapCacheSet = __webpack_require__(72949);\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM2NjEuanMiLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CLG1CQUFPLENBQUMsS0FBa0I7QUFDOUMscUJBQXFCLG1CQUFPLENBQUMsS0FBbUI7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7QUFDMUMsa0JBQWtCLG1CQUFPLENBQUMsSUFBZ0I7QUFDMUMsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcz83YjgzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///53661\n")},76545:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var getNative = __webpack_require__(56110),\n root = __webpack_require__(9325);\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY1NDUuanMiLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxXQUFXLG1CQUFPLENBQUMsSUFBUzs7QUFFNUI7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanM/Yzg2OSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFNldCA9IGdldE5hdGl2ZShyb290LCAnU2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///76545\n")},38859:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var MapCache = __webpack_require__(53661),\n setCacheAdd = __webpack_require__(31380),\n setCacheHas = __webpack_require__(51459);\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg4NTkuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7QUFDMUMsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcz9kNjEyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///38859\n")},51873:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var root = __webpack_require__(9325);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE4NzMuanMiLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxtQkFBTyxDQUFDLElBQVM7O0FBRTVCO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3ltYm9sLmpzPzllNjkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51873\n")},91033:module=>{eval("/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEwMzMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLE9BQU87QUFDbEIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzPzg1ZTMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///91033\n")},15325:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseIndexOf = __webpack_require__(96131);\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUzMjUuanMiLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlcy5qcz84ZGIzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Jhc2VJbmRleE9mJyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlJbmNsdWRlcztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///15325\n")},29905:module=>{eval("/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk5MDUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzV2l0aC5qcz81ZWRmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///29905\n")},70695:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseTimes = __webpack_require__(78096),\n isArguments = __webpack_require__(72428),\n isArray = __webpack_require__(56449),\n isBuffer = __webpack_require__(3656),\n isIndex = __webpack_require__(30361),\n isTypedArray = __webpack_require__(37167);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA2OTUuanMiLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxrQkFBa0IsbUJBQU8sQ0FBQyxLQUFlO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxLQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxJQUFZO0FBQ25DLGNBQWMsbUJBQU8sQ0FBQyxLQUFZO0FBQ2xDLG1CQUFtQixtQkFBTyxDQUFDLEtBQWdCOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLFNBQVM7QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TGlrZUtleXMuanM/NmZjZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVRpbWVzID0gcmVxdWlyZSgnLi9fYmFzZVRpbWVzJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TGlrZUtleXM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///70695\n")},34932:module=>{eval("/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ5MzIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcz83OTQ4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///34932\n")},14528:module=>{eval("/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ1MjguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzPzA4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14528\n")},26025:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var eq = __webpack_require__(75288);\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYwMjUuanMiLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxtQkFBTyxDQUFDLEtBQU07O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanM/Y2I1YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///26025\n")},83915:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var SetCache = __webpack_require__(38859),\n arrayIncludes = __webpack_require__(15325),\n arrayIncludesWith = __webpack_require__(29905),\n arrayMap = __webpack_require__(34932),\n baseUnary = __webpack_require__(27301),\n cacheHas = __webpack_require__(19219);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseDifference;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODM5MTUuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsb0JBQW9CLG1CQUFPLENBQUMsS0FBa0I7QUFDOUMsd0JBQXdCLG1CQUFPLENBQUMsS0FBc0I7QUFDdEQsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxlQUFlLG1CQUFPLENBQUMsS0FBYTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VEaWZmZXJlbmNlLmpzPzJlYWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBbXSxcbiAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChpdGVyYXRlZSkge1xuICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gIH1cbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gIH1cbiAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA9PSBudWxsID8gdmFsdWUgOiBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRGlmZmVyZW5jZTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///83915\n")},2523:module=>{eval("/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUyMy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmluZEluZGV4LmpzPzJiMDMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZpbmRJbmRleDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2523\n")},83120:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var arrayPush = __webpack_require__(14528),\n isFlattenable = __webpack_require__(45891);\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMxMjAuanMiLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxvQkFBb0IsbUJBQU8sQ0FBQyxLQUFrQjs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZsYXR0ZW4uanM/NWM2OSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNGbGF0dGVuYWJsZSA9IHJlcXVpcmUoJy4vX2lzRmxhdHRlbmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZsYXR0ZW47XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///83120\n")},72552:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Symbol = __webpack_require__(51873),\n getRawTag = __webpack_require__(659),\n objectToString = __webpack_require__(59350);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzI1NTIuanMiLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLEtBQVc7QUFDaEMsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxxQkFBcUIsbUJBQU8sQ0FBQyxLQUFtQjs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanM/MzcyOSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///72552\n")},96131:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseFindIndex = __webpack_require__(2523),\n baseIsNaN = __webpack_require__(85463),\n strictIndexOf = __webpack_require__(76959);\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYxMzEuanMiLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CLG1CQUFPLENBQUMsSUFBa0I7QUFDOUMsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxvQkFBb0IsbUJBQU8sQ0FBQyxLQUFrQjs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUluZGV4T2YuanM/NDdmNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUZpbmRJbmRleCA9IHJlcXVpcmUoJy4vX2Jhc2VGaW5kSW5kZXgnKSxcbiAgICBiYXNlSXNOYU4gPSByZXF1aXJlKCcuL19iYXNlSXNOYU4nKSxcbiAgICBzdHJpY3RJbmRleE9mID0gcmVxdWlyZSgnLi9fc3RyaWN0SW5kZXhPZicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgYGZyb21JbmRleGAgYm91bmRzIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJbmRleE9mO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///96131\n")},27534:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseGetTag = __webpack_require__(72552),\n isObjectLike = __webpack_require__(40346);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc1MzQuanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsS0FBZTtBQUN4QyxtQkFBbUIsbUJBQU8sQ0FBQyxLQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanM/MjUzYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///27534\n")},85463:module=>{eval("/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODU0NjMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmFOLmpzP2Q5YTgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYU47XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///85463\n")},45083:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var isFunction = __webpack_require__(1882),\n isMasked = __webpack_require__(87296),\n isObject = __webpack_require__(23805),\n toSource = __webpack_require__(47473);\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUwODMuanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsSUFBYztBQUN2QyxlQUFlLG1CQUFPLENBQUMsS0FBYTtBQUNwQyxlQUFlLG1CQUFPLENBQUMsS0FBWTtBQUNuQyxlQUFlLG1CQUFPLENBQUMsS0FBYTs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanM/MzRhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTWFza2VkID0gcmVxdWlyZSgnLi9faXNNYXNrZWQnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmF0aXZlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///45083\n")},4901:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseGetTag = __webpack_require__(72552),\n isLength = __webpack_require__(30294),\n isObjectLike = __webpack_require__(40346);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkwMS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFlO0FBQ3hDLGVBQWUsbUJBQU8sQ0FBQyxLQUFZO0FBQ25DLG1CQUFtQixtQkFBTyxDQUFDLEtBQWdCOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcz83NDNmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNUeXBlZEFycmF5O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4901\n")},72903:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var isObject = __webpack_require__(23805),\n isPrototype = __webpack_require__(55527),\n nativeKeysIn = __webpack_require__(90181);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzI5MDMuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQVk7QUFDbkMsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7QUFDMUMsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXNJbi5qcz80MWMzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5c0luID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5c0luJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgfVxuICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXNJbjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///72903\n")},69302:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var identity = __webpack_require__(83488),\n overRest = __webpack_require__(56757),\n setToString = __webpack_require__(32865);\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkzMDIuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQVk7QUFDbkMsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanM/MTAwZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///69302\n")},19570:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var constant = __webpack_require__(37334),\n defineProperty = __webpack_require__(93243),\n identity = __webpack_require__(83488);\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk1NzAuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQVk7QUFDbkMscUJBQXFCLG1CQUFPLENBQUMsS0FBbUI7QUFDaEQsZUFBZSxtQkFBTyxDQUFDLEtBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldFRvU3RyaW5nLmpzP2E0NTQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvbnN0YW50ID0gcmVxdWlyZSgnLi9jb25zdGFudCcpLFxuICAgIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHtcbiAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksXG4gICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldFRvU3RyaW5nO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///19570\n")},78096:module=>{eval("/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzgwOTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzPzUwZDgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///78096\n")},27301:module=>{eval("/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjczMDEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanM/YjA0NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///27301\n")},55765:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var SetCache = __webpack_require__(38859),\n arrayIncludes = __webpack_require__(15325),\n arrayIncludesWith = __webpack_require__(29905),\n cacheHas = __webpack_require__(19219),\n createSet = __webpack_require__(44517),\n setToArray = __webpack_require__(84247);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU3NjUuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsb0JBQW9CLG1CQUFPLENBQUMsS0FBa0I7QUFDOUMsd0JBQXdCLG1CQUFPLENBQUMsS0FBc0I7QUFDdEQsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFlOztBQUV4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5pcS5qcz8yYzY2Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5SW5jbHVkZXMnKSxcbiAgICBhcnJheUluY2x1ZGVzV2l0aCA9IHJlcXVpcmUoJy4vX2FycmF5SW5jbHVkZXNXaXRoJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpLFxuICAgIGNyZWF0ZVNldCA9IHJlcXVpcmUoJy4vX2NyZWF0ZVNldCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgfVxuICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgIGlmIChzZXQpIHtcbiAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgfVxuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICB9XG4gIGVsc2Uge1xuICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuaXE7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///55765\n")},19219:module=>{eval("/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkyMTkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcz9jNTg0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhY2hlSGFzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///19219\n")},55481:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var root = __webpack_require__(9325);\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU0ODEuanMiLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxtQkFBTyxDQUFDLElBQVM7O0FBRTVCO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29yZUpzRGF0YS5qcz9kYTAzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcmVKc0RhdGE7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///55481\n")},44517:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Set = __webpack_require__(76545),\n noop = __webpack_require__(63950),\n setToArray = __webpack_require__(84247);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ1MTcuanMiLCJtYXBwaW5ncyI6IkFBQUEsVUFBVSxtQkFBTyxDQUFDLEtBQVE7QUFDMUIsV0FBVyxtQkFBTyxDQUFDLEtBQVE7QUFDM0IsaUJBQWlCLG1CQUFPLENBQUMsS0FBZTs7QUFFeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlU2V0LmpzPzc1MGEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFNldCA9IHJlcXVpcmUoJy4vX1NldCcpLFxuICAgIG5vb3AgPSByZXF1aXJlKCcuL25vb3AnKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBzZXQuXG4gKi9cbnZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gIHJldHVybiBuZXcgU2V0KHZhbHVlcyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVNldDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///44517\n")},93243:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var getNative = __webpack_require__(56110);\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMyNDMuanMiLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsSUFBSTtBQUNKLENBQUM7O0FBRUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVmaW5lUHJvcGVydHkuanM/M2I0YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZVByb3BlcnR5O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///93243\n")},34840:module=>{eval("/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ4NDAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzPzU4NWEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmcmVlR2xvYmFsO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///34840\n")},12651:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var isKeyable = __webpack_require__(74218);\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI2NTEuanMiLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXBEYXRhLmpzPzQyNDUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzS2V5YWJsZSA9IHJlcXVpcmUoJy4vX2lzS2V5YWJsZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFwRGF0YTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///12651\n")},56110:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseIsNative = __webpack_require__(45083),\n getValue = __webpack_require__(10392);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYxMTAuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7QUFDNUMsZUFBZSxtQkFBTyxDQUFDLEtBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXROYXRpdmUuanM/MGIwNyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUlzTmF0aXZlID0gcmVxdWlyZSgnLi9fYmFzZUlzTmF0aXZlJyksXG4gICAgZ2V0VmFsdWUgPSByZXF1aXJlKCcuL19nZXRWYWx1ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5hdGl2ZTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56110\n")},28879:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var overArg = __webpack_require__(74335);\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg4NzkuanMiLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEtBQVk7O0FBRWxDO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzPzJkY2IiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///28879\n")},659:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Symbol = __webpack_require__(51873);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU5LmpzIiwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxLQUFXOztBQUVoQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcz8wMGZkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///659\n")},10392:module=>{eval("/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzOTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcz8zNjk4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10392\n")},22032:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var nativeCreate = __webpack_require__(81042);\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIwMzIuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaENsZWFyLmpzPzQ5ZjQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///22032\n")},63862:module=>{eval("/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM4NjIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanM/MWVmYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///63862\n")},66721:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var nativeCreate = __webpack_require__(81042);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjY3MjEuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hHZXQuanM/YmJjMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///66721\n")},12749:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var nativeCreate = __webpack_require__(81042);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI3NDkuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcz83YTQ4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hIYXM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///12749\n")},35749:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var nativeCreate = __webpack_require__(81042);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU3NDkuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoU2V0LmpzPzI1MjQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///35749\n")},45891:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Symbol = __webpack_require__(51873),\n isArguments = __webpack_require__(72428),\n isArray = __webpack_require__(56449);\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU4OTEuanMiLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLEtBQVc7QUFDaEMsa0JBQWtCLG1CQUFPLENBQUMsS0FBZTtBQUN6QyxjQUFjLG1CQUFPLENBQUMsS0FBVzs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzRmxhdHRlbmFibGUuanM/MDYyMSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZsYXR0ZW5hYmxlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///45891\n")},30361:module=>{eval("/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAzNjEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSW5kZXguanM/YzA5OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbmRleDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///30361\n")},36800:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var eq = __webpack_require__(75288),\n isArrayLike = __webpack_require__(64894),\n isIndex = __webpack_require__(30361),\n isObject = __webpack_require__(23805);\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY4MDAuanMiLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxtQkFBTyxDQUFDLEtBQU07QUFDdkIsa0JBQWtCLG1CQUFPLENBQUMsS0FBZTtBQUN6QyxjQUFjLG1CQUFPLENBQUMsS0FBWTtBQUNsQyxlQUFlLG1CQUFPLENBQUMsS0FBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzPzlhZmYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///36800\n")},74218:module=>{eval("/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQyMTguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXlhYmxlLmpzPzEyOTAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5YWJsZTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///74218\n")},87296:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var coreJsData = __webpack_require__(55481);\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODcyOTYuanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsS0FBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcz8xMzY4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb3JlSnNEYXRhID0gcmVxdWlyZSgnLi9fY29yZUpzRGF0YScpO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFza2VkO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///87296\n")},55527:module=>{eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1MjcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzP2VhYzUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XG4gIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUHJvdG90eXBlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///55527\n")},63702:module=>{eval("/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM3MDIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVDbGVhci5qcz8yOGM5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///63702\n")},70080:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var assocIndexOf = __webpack_require__(26025);\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAwODAuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZURlbGV0ZS5qcz82OWQ1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///70080\n")},24739:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var assocIndexOf = __webpack_require__(26025);\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ3MzkuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVHZXQuanM/YjRjMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlR2V0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///24739\n")},48655:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var assocIndexOf = __webpack_require__(26025);\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg2NTUuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzP2ZiYTUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVIYXM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///48655\n")},31175:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var assocIndexOf = __webpack_require__(26025);\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzExNzUuanMiLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsS0FBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZVNldC5qcz82N2NhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///31175\n")},63040:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var Hash = __webpack_require__(21549),\n ListCache = __webpack_require__(80079),\n Map = __webpack_require__(68223);\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMwNDAuanMiLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxtQkFBTyxDQUFDLEtBQVM7QUFDNUIsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxVQUFVLG1CQUFPLENBQUMsS0FBUTs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlQ2xlYXIuanM/N2M2NCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgSGFzaCA9IHJlcXVpcmUoJy4vX0hhc2gnKSxcbiAgICBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlQ2xlYXI7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///63040\n")},17670:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var getMapData = __webpack_require__(12651);\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc2NzAuanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsS0FBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVEZWxldGUuanM/OTNlZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVEZWxldGU7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17670\n")},90289:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var getMapData = __webpack_require__(12651);\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAyODkuanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsS0FBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUdldC5qcz8yNDc4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///90289\n")},4509:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var getMapData = __webpack_require__(12651);\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUwOS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFlOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlSGFzLmpzP2E1MjQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4509\n")},72949:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var getMapData = __webpack_require__(12651);\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzI5NDkuanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsS0FBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZVNldC5qcz8xZmM4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///72949\n")},81042:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var getNative = __webpack_require__(56110);\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEwNDIuanMiLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYzs7QUFFdEM7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanM/NjA0NCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlQ3JlYXRlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///81042\n")},90181:module=>{eval("/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAxODEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanM/ZWM4YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///90181\n")},86009:(module,exports,__webpack_require__)=>{eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar freeGlobal = __webpack_require__(34840);\n\n/** Detect free variable `exports`. */\nvar freeExports = true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && \"object\" == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYwMDkuanMiLCJtYXBwaW5ncyI6IjtBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEtBQWU7O0FBRXhDO0FBQ0Esa0JBQWtCLEtBQTBCOztBQUU1QztBQUNBLGdDQUFnQyxRQUFhOztBQUU3QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSixDQUFDOztBQUVEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzPzk5ZDMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG52YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICBpZiAodHlwZXMpIHtcbiAgICAgIHJldHVybiB0eXBlcztcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbm9kZVV0aWw7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///86009\n")},59350:module=>{eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkzNTAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanM/MjlmMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///59350\n")},74335:module=>{eval("/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQzMzUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcz85MWU5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJBcmc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///74335\n")},56757:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var apply = __webpack_require__(91033);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY3NTcuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxtQkFBTyxDQUFDLEtBQVU7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlclJlc3QuanM/MjI4NiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBwbHkgPSByZXF1aXJlKCcuL19hcHBseScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJSZXN0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///56757\n")},9325:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var freeGlobal = __webpack_require__(34840);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMyNS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFlOztBQUV4QztBQUNBOztBQUVBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcz8yYjNlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9325\n")},31380:module=>{eval("/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEzODAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzPzdlZDIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///31380\n")},51459:module=>{eval("/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE0NTkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzP2RjMGYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///51459\n")},84247:module=>{eval("/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQyNDcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb0FycmF5LmpzP2FjNDEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///84247\n")},32865:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseSetToString = __webpack_require__(19570),\n shortOut = __webpack_require__(51811);\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI4NjUuanMiLCJtYXBwaW5ncyI6IkFBQUEsc0JBQXNCLG1CQUFPLENBQUMsS0FBb0I7QUFDbEQsZUFBZSxtQkFBTyxDQUFDLEtBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcz9jMWM5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlU2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlU2V0VG9TdHJpbmcnKSxcbiAgICBzaG9ydE91dCA9IHJlcXVpcmUoJy4vX3Nob3J0T3V0Jyk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9TdHJpbmc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///32865\n")},51811:module=>{eval("/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE4MTEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Nob3J0T3V0LmpzP2YzYzEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3J0T3V0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///51811\n")},76959:module=>{eval("/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY5NTkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLEdBQUc7QUFDZCxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmljdEluZGV4T2YuanM/MDk5YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWN0SW5kZXhPZjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///76959\n")},47473:module=>{eval("/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc0NzMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvU291cmNlLmpzP2RjNTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU291cmNlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///47473\n")},37334:module=>{eval("/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzczMzQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQSxZQUFZLFFBQVEsSUFBSSxRQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2NvbnN0YW50LmpzPzcyZjAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///37334\n")},84684:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseRest = __webpack_require__(69302),\n eq = __webpack_require__(75288),\n isIterateeCall = __webpack_require__(36800),\n keysIn = __webpack_require__(37241);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQ2ODQuanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsU0FBUyxtQkFBTyxDQUFDLEtBQU07QUFDdkIscUJBQXFCLG1CQUFPLENBQUMsS0FBbUI7QUFDaEQsYUFBYSxtQkFBTyxDQUFDLEtBQVU7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxXQUFXO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUSxJQUFJLFFBQVEsSUFBSSxRQUFRO0FBQ2hELFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZGVmYXVsdHMuanM/OTVhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbnZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgbGVuZ3RoID0gMTtcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///84684\n")},66245:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseDifference = __webpack_require__(83915),\n baseFlatten = __webpack_require__(83120),\n baseRest = __webpack_require__(69302),\n isArrayLikeObject = __webpack_require__(83693);\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nmodule.exports = difference;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYyNDUuanMiLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCLG1CQUFPLENBQUMsS0FBbUI7QUFDaEQsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7QUFDMUMsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsd0JBQXdCLG1CQUFPLENBQUMsS0FBcUI7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2RpZmZlcmVuY2UuanM/Y2VhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZURpZmZlcmVuY2UgPSByZXF1aXJlKCcuL19iYXNlRGlmZmVyZW5jZScpLFxuICAgIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgaXNBcnJheUxpa2VPYmplY3QgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlT2JqZWN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAqIEBleGFtcGxlXG4gKlxuICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAqIC8vID0+IFsxXVxuICovXG52YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKVxuICAgIDogW107XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmZXJlbmNlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///66245\n")},75288:module=>{eval("/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUyODguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanM/OTYzOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///75288\n")},35970:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseFlatten = __webpack_require__(83120);\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU5NzAuanMiLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mbGF0dGVuLmpzPzRkOGMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///35970\n")},83488:module=>{eval("/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODM0ODguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lkZW50aXR5LmpzP2NkOWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqXG4gKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///83488\n")},72428:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseIsArguments = __webpack_require__(27534),\n isObjectLike = __webpack_require__(40346);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzI0MjguanMiLCJtYXBwaW5ncyI6IkFBQUEsc0JBQXNCLG1CQUFPLENBQUMsS0FBb0I7QUFDbEQsbUJBQW1CLG1CQUFPLENBQUMsS0FBZ0I7O0FBRTNDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixtQkFBbUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxtQkFBbUI7QUFDbEU7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanM/ZDM3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///72428\n")},56449:module=>{eval("/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY0NDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheS5qcz82NzQ3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///56449\n")},64894:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var isFunction = __webpack_require__(1882),\n isLength = __webpack_require__(30294);\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ4OTQuanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsSUFBYztBQUN2QyxlQUFlLG1CQUFPLENBQUMsS0FBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcz8zMGM5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///64894\n")},83693:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var isArrayLike = __webpack_require__(64894),\n isObjectLike = __webpack_require__(40346);\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODM2OTMuanMiLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsS0FBZTtBQUN6QyxtQkFBbUIsbUJBQU8sQ0FBQyxLQUFnQjs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZU9iamVjdC5qcz9kY2JlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2VPYmplY3Q7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///83693\n")},3656:(module,exports,__webpack_require__)=>{eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar root = __webpack_require__(9325),\n stubFalse = __webpack_require__(89935);\n\n/** Detect free variable `exports`. */\nvar freeExports = true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && \"object\" == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY1Ni5qcyIsIm1hcHBpbmdzIjoiO0FBQUEsV0FBVyxtQkFBTyxDQUFDLElBQVM7QUFDNUIsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYTs7QUFFckM7QUFDQSxrQkFBa0IsS0FBMEI7O0FBRTVDO0FBQ0EsZ0NBQWdDLFFBQWE7O0FBRTdDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzPzBkMjQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3656\n")},1882:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseGetTag = __webpack_require__(72552),\n isObject = __webpack_require__(23805);\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg4Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFlO0FBQ3hDLGVBQWUsbUJBQU8sQ0FBQyxLQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzPzk1MjAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1882\n")},30294:module=>{eval("/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAyOTQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcz9iMjE4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///30294\n")},23805:module=>{eval("/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM4MDUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanM/MWE4YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///23805\n")},40346:module=>{eval("/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAzNDYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanM/MTMxMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///40346\n")},11331:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseGetTag = __webpack_require__(72552),\n getPrototype = __webpack_require__(28879),\n isObjectLike = __webpack_require__(40346);\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzMzEuanMiLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsS0FBZTtBQUN4QyxtQkFBbUIsbUJBQU8sQ0FBQyxLQUFpQjtBQUM1QyxtQkFBbUIsbUJBQU8sQ0FBQyxLQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsZ0JBQWdCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzPzYwZWQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///11331\n")},37167:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseIsTypedArray = __webpack_require__(4901),\n baseUnary = __webpack_require__(27301),\n nodeUtil = __webpack_require__(86009);\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcxNjcuanMiLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsSUFBcUI7QUFDcEQsZ0JBQWdCLG1CQUFPLENBQUMsS0FBYztBQUN0QyxlQUFlLG1CQUFPLENBQUMsS0FBYTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1R5cGVkQXJyYXkuanM/NzNhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///37167\n")},37241:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var arrayLikeKeys = __webpack_require__(70695),\n baseKeysIn = __webpack_require__(72903),\n isArrayLike = __webpack_require__(64894);\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcyNDEuanMiLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CLG1CQUFPLENBQUMsS0FBa0I7QUFDOUMsaUJBQWlCLG1CQUFPLENBQUMsS0FBZTtBQUN4QyxrQkFBa0IsbUJBQU8sQ0FBQyxLQUFlOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXNJbi5qcz85OTM0Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///37241\n")},63950:module=>{eval("/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM5NTAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm9vcC5qcz9iY2RmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8ubm9vcCk7XG4gKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbm9vcDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///63950\n")},89935:module=>{eval("/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODk5MzUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcz8wN2M3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///89935\n")},80299:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var baseFlatten = __webpack_require__(83120),\n baseRest = __webpack_require__(69302),\n baseUniq = __webpack_require__(55765),\n isArrayLikeObject = __webpack_require__(83693);\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nmodule.exports = union;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAyOTkuanMiLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsS0FBZ0I7QUFDMUMsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsZUFBZSxtQkFBTyxDQUFDLEtBQWE7QUFDcEMsd0JBQXdCLG1CQUFPLENBQUMsS0FBcUI7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pb24uanM/YmZjNyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpLFxuICAgIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBiYXNlVW5pcSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmlxJyksXG4gICAgaXNBcnJheUxpa2VPYmplY3QgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlT2JqZWN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgZnJvbSBhbGwgZ2l2ZW4gYXJyYXlzIHVzaW5nXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaW9uKFsyXSwgWzEsIDJdKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG52YXIgdW5pb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaW9uO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///80299\n")},7598:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/*!\n * mime-db\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2015-2022 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n/**\n * Module exports.\n */\n\nmodule.exports = __webpack_require__(81813)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzU5OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDJDQUFxQyIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvbWltZS1kYi9pbmRleC5qcz9iNGY1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogbWltZS1kYlxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNS0yMDIyIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kYi5qc29uJylcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7598\n")},86049:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("/*!\n * mime-types\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n\n\n/**\n * Module dependencies.\n * @private\n */\n\nvar db = __webpack_require__(7598)\nvar extname = (__webpack_require__(16928).extname)\n\n/**\n * Module variables.\n * @private\n */\n\nvar EXTRACT_TYPE_REGEXP = /^\\s*([^;\\s]*)(?:;|\\s|$)/\nvar TEXT_TYPE_REGEXP = /^text\\//i\n\n/**\n * Module exports.\n * @public\n */\n\nexports.charset = charset\nexports.charsets = { lookup: charset }\nexports.contentType = contentType\nexports.extension = extension\nexports.extensions = Object.create(null)\nexports.lookup = lookup\nexports.types = Object.create(null)\n\n// Populate the extensions/types maps\npopulateMaps(exports.extensions, exports.types)\n\n/**\n * Get the default charset for a MIME type.\n *\n * @param {string} type\n * @return {boolean|string}\n */\n\nfunction charset (type) {\n if (!type || typeof type !== 'string') {\n return false\n }\n\n // TODO: use media-typer\n var match = EXTRACT_TYPE_REGEXP.exec(type)\n var mime = match && db[match[1].toLowerCase()]\n\n if (mime && mime.charset) {\n return mime.charset\n }\n\n // default text/* to utf-8\n if (match && TEXT_TYPE_REGEXP.test(match[1])) {\n return 'UTF-8'\n }\n\n return false\n}\n\n/**\n * Create a full Content-Type header given a MIME type or extension.\n *\n * @param {string} str\n * @return {boolean|string}\n */\n\nfunction contentType (str) {\n // TODO: should this even be in this module?\n if (!str || typeof str !== 'string') {\n return false\n }\n\n var mime = str.indexOf('/') === -1\n ? exports.lookup(str)\n : str\n\n if (!mime) {\n return false\n }\n\n // TODO: use content-type or other module\n if (mime.indexOf('charset') === -1) {\n var charset = exports.charset(mime)\n if (charset) mime += '; charset=' + charset.toLowerCase()\n }\n\n return mime\n}\n\n/**\n * Get the default extension for a MIME type.\n *\n * @param {string} type\n * @return {boolean|string}\n */\n\nfunction extension (type) {\n if (!type || typeof type !== 'string') {\n return false\n }\n\n // TODO: use media-typer\n var match = EXTRACT_TYPE_REGEXP.exec(type)\n\n // get extensions\n var exts = match && exports.extensions[match[1].toLowerCase()]\n\n if (!exts || !exts.length) {\n return false\n }\n\n return exts[0]\n}\n\n/**\n * Lookup the MIME type for a file path/extension.\n *\n * @param {string} path\n * @return {boolean|string}\n */\n\nfunction lookup (path) {\n if (!path || typeof path !== 'string') {\n return false\n }\n\n // get the extension (\"ext\" or \".ext\" or full path)\n var extension = extname('x.' + path)\n .toLowerCase()\n .substr(1)\n\n if (!extension) {\n return false\n }\n\n return exports.types[extension] || false\n}\n\n/**\n * Populate the extensions and types maps.\n * @private\n */\n\nfunction populateMaps (extensions, types) {\n // source preference (least -> most)\n var preference = ['nginx', 'apache', undefined, 'iana']\n\n Object.keys(db).forEach(function forEachMimeType (type) {\n var mime = db[type]\n var exts = mime.extensions\n\n if (!exts || !exts.length) {\n return\n }\n\n // mime -> extensions\n extensions[type] = exts\n\n // extension -> mime\n for (var i = 0; i < exts.length; i++) {\n var extension = exts[i]\n\n if (types[extension]) {\n var from = preference.indexOf(db[types[extension]].source)\n var to = preference.indexOf(mime.source)\n\n if (types[extension] !== 'application/octet-stream' &&\n (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {\n // skip the remapping\n continue\n }\n }\n\n // set the extension -> mime\n types[extension] = type\n }\n })\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYwNDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVZOztBQUVaO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsbUJBQU8sQ0FBQyxJQUFTO0FBQzFCLGNBQWMsb0NBQXVCOztBQUVyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsU0FBUztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlO0FBQ2YsZ0JBQWdCLEtBQUs7QUFDckIsbUJBQW1CO0FBQ25CLGlCQUFpQjtBQUNqQixrQkFBa0I7QUFDbEIsY0FBYztBQUNkLGFBQWE7O0FBRWI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9taW1lLXR5cGVzL2luZGV4LmpzP2NjMWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBtaW1lLXR5cGVzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGIgPSByZXF1aXJlKCdtaW1lLWRiJylcbnZhciBleHRuYW1lID0gcmVxdWlyZSgncGF0aCcpLmV4dG5hbWVcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRVhUUkFDVF9UWVBFX1JFR0VYUCA9IC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS9cbnZhciBURVhUX1RZUEVfUkVHRVhQID0gL150ZXh0XFwvL2lcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNoYXJzZXQgPSBjaGFyc2V0XG5leHBvcnRzLmNoYXJzZXRzID0geyBsb29rdXA6IGNoYXJzZXQgfVxuZXhwb3J0cy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG5leHBvcnRzLmV4dGVuc2lvbiA9IGV4dGVuc2lvblxuZXhwb3J0cy5leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuZXhwb3J0cy5sb29rdXAgPSBsb29rdXBcbmV4cG9ydHMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIFBvcHVsYXRlIHRoZSBleHRlbnNpb25zL3R5cGVzIG1hcHNcbnBvcHVsYXRlTWFwcyhleHBvcnRzLmV4dGVuc2lvbnMsIGV4cG9ydHMudHlwZXMpXG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGEgTUlNRSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjaGFyc2V0ICh0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBFWFRSQUNUX1RZUEVfUkVHRVhQLmV4ZWModHlwZSlcbiAgdmFyIG1pbWUgPSBtYXRjaCAmJiBkYlttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmIChtaW1lICYmIG1pbWUuY2hhcnNldCkge1xuICAgIHJldHVybiBtaW1lLmNoYXJzZXRcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdGV4dC8qIHRvIHV0Zi04XG4gIGlmIChtYXRjaCAmJiBURVhUX1RZUEVfUkVHRVhQLnRlc3QobWF0Y2hbMV0pKSB7XG4gICAgcmV0dXJuICdVVEYtOCdcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bGwgQ29udGVudC1UeXBlIGhlYWRlciBnaXZlbiBhIE1JTUUgdHlwZSBvciBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY29udGVudFR5cGUgKHN0cikge1xuICAvLyBUT0RPOiBzaG91bGQgdGhpcyBldmVuIGJlIGluIHRoaXMgbW9kdWxlP1xuICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIG1pbWUgPSBzdHIuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gZXhwb3J0cy5sb29rdXAoc3RyKVxuICAgIDogc3RyXG5cbiAgaWYgKCFtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgY29udGVudC10eXBlIG9yIG90aGVyIG1vZHVsZVxuICBpZiAobWltZS5pbmRleE9mKCdjaGFyc2V0JykgPT09IC0xKSB7XG4gICAgdmFyIGNoYXJzZXQgPSBleHBvcnRzLmNoYXJzZXQobWltZSlcbiAgICBpZiAoY2hhcnNldCkgbWltZSArPSAnOyBjaGFyc2V0PScgKyBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIHJldHVybiBtaW1lXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuc2lvbiAodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgbWVkaWEtdHlwZXJcbiAgdmFyIG1hdGNoID0gRVhUUkFDVF9UWVBFX1JFR0VYUC5leGVjKHR5cGUpXG5cbiAgLy8gZ2V0IGV4dGVuc2lvbnNcbiAgdmFyIGV4dHMgPSBtYXRjaCAmJiBleHBvcnRzLmV4dGVuc2lvbnNbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKV1cblxuICBpZiAoIWV4dHMgfHwgIWV4dHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXh0c1swXVxufVxuXG4vKipcbiAqIExvb2t1cCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgcGF0aC9leHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGxvb2t1cCAocGF0aCkge1xuICBpZiAoIXBhdGggfHwgdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBnZXQgdGhlIGV4dGVuc2lvbiAoXCJleHRcIiBvciBcIi5leHRcIiBvciBmdWxsIHBhdGgpXG4gIHZhciBleHRlbnNpb24gPSBleHRuYW1lKCd4LicgKyBwYXRoKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnN1YnN0cigxKVxuXG4gIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy50eXBlc1tleHRlbnNpb25dIHx8IGZhbHNlXG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGV4dGVuc2lvbnMgYW5kIHR5cGVzIG1hcHMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBvcHVsYXRlTWFwcyAoZXh0ZW5zaW9ucywgdHlwZXMpIHtcbiAgLy8gc291cmNlIHByZWZlcmVuY2UgKGxlYXN0IC0+IG1vc3QpXG4gIHZhciBwcmVmZXJlbmNlID0gWyduZ2lueCcsICdhcGFjaGUnLCB1bmRlZmluZWQsICdpYW5hJ11cblxuICBPYmplY3Qua2V5cyhkYikuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoTWltZVR5cGUgKHR5cGUpIHtcbiAgICB2YXIgbWltZSA9IGRiW3R5cGVdXG4gICAgdmFyIGV4dHMgPSBtaW1lLmV4dGVuc2lvbnNcblxuICAgIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIG1pbWUgLT4gZXh0ZW5zaW9uc1xuICAgIGV4dGVuc2lvbnNbdHlwZV0gPSBleHRzXG5cbiAgICAvLyBleHRlbnNpb24gLT4gbWltZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dHNbaV1cblxuICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0pIHtcbiAgICAgICAgdmFyIGZyb20gPSBwcmVmZXJlbmNlLmluZGV4T2YoZGJbdHlwZXNbZXh0ZW5zaW9uXV0uc291cmNlKVxuICAgICAgICB2YXIgdG8gPSBwcmVmZXJlbmNlLmluZGV4T2YobWltZS5zb3VyY2UpXG5cbiAgICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0gIT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nICYmXG4gICAgICAgICAgKGZyb20gPiB0byB8fCAoZnJvbSA9PT0gdG8gJiYgdHlwZXNbZXh0ZW5zaW9uXS5zdWJzdHIoMCwgMTIpID09PSAnYXBwbGljYXRpb24vJykpKSB7XG4gICAgICAgICAgLy8gc2tpcCB0aGUgcmVtYXBwaW5nXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGV4dGVuc2lvbiAtPiBtaW1lXG4gICAgICB0eXBlc1tleHRlbnNpb25dID0gdHlwZVxuICAgIH1cbiAgfSlcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///86049\n")},14100:module=>{eval("/*!\n * normalize-path \n *\n * Copyright (c) 2014-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nmodule.exports = function(path, stripTrailing) {\n if (typeof path !== 'string') {\n throw new TypeError('expected path to be a string');\n }\n\n if (path === '\\\\' || path === '/') return '/';\n\n var len = path.length;\n if (len <= 1) return path;\n\n // ensure that win32 namespaces has two leading slashes, so that the path is\n // handled properly by the win32 version of path.parse() after being normalized\n // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces\n var prefix = '';\n if (len > 4 && path[3] === '\\\\') {\n var ch = path[2];\n if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\\\\\') {\n path = path.slice(2);\n prefix = '//';\n }\n }\n\n var segs = path.split(/[/\\\\]+/);\n if (stripTrailing !== false && segs[segs.length - 1] === '') {\n segs.pop();\n }\n return prefix + segs.join('/');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQxMDAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL25vcm1hbGl6ZS1wYXRoL2luZGV4LmpzPzc0YjMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBub3JtYWxpemUtcGF0aCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvbm9ybWFsaXplLXBhdGg+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocGF0aCwgc3RyaXBUcmFpbGluZykge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgcGF0aCB0byBiZSBhIHN0cmluZycpO1xuICB9XG5cbiAgaWYgKHBhdGggPT09ICdcXFxcJyB8fCBwYXRoID09PSAnLycpIHJldHVybiAnLyc7XG5cbiAgdmFyIGxlbiA9IHBhdGgubGVuZ3RoO1xuICBpZiAobGVuIDw9IDEpIHJldHVybiBwYXRoO1xuXG4gIC8vIGVuc3VyZSB0aGF0IHdpbjMyIG5hbWVzcGFjZXMgaGFzIHR3byBsZWFkaW5nIHNsYXNoZXMsIHNvIHRoYXQgdGhlIHBhdGggaXNcbiAgLy8gaGFuZGxlZCBwcm9wZXJseSBieSB0aGUgd2luMzIgdmVyc2lvbiBvZiBwYXRoLnBhcnNlKCkgYWZ0ZXIgYmVpbmcgbm9ybWFsaXplZFxuICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM2NTI0Nyh2PXZzLjg1KS5hc3B4I25hbWVzcGFjZXNcbiAgdmFyIHByZWZpeCA9ICcnO1xuICBpZiAobGVuID4gNCAmJiBwYXRoWzNdID09PSAnXFxcXCcpIHtcbiAgICB2YXIgY2ggPSBwYXRoWzJdO1xuICAgIGlmICgoY2ggPT09ICc/JyB8fCBjaCA9PT0gJy4nKSAmJiBwYXRoLnNsaWNlKDAsIDIpID09PSAnXFxcXFxcXFwnKSB7XG4gICAgICBwYXRoID0gcGF0aC5zbGljZSgyKTtcbiAgICAgIHByZWZpeCA9ICcvLyc7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNlZ3MgPSBwYXRoLnNwbGl0KC9bL1xcXFxdKy8pO1xuICBpZiAoc3RyaXBUcmFpbGluZyAhPT0gZmFsc2UgJiYgc2Vnc1tzZWdzLmxlbmd0aCAtIDFdID09PSAnJykge1xuICAgIHNlZ3MucG9wKCk7XG4gIH1cbiAgcmV0dXJuIHByZWZpeCArIHNlZ3Muam9pbignLycpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14100\n")},83519:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var wrappy = __webpack_require__(86587)\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODM1MTkuanMiLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLEtBQVE7QUFDN0I7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9vbmNlL29uY2UuanM/NTY2YiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgd3JhcHB5ID0gcmVxdWlyZSgnd3JhcHB5Jylcbm1vZHVsZS5leHBvcnRzID0gd3JhcHB5KG9uY2UpXG5tb2R1bGUuZXhwb3J0cy5zdHJpY3QgPSB3cmFwcHkob25jZVN0cmljdClcblxub25jZS5wcm90byA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZScsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2UodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlU3RyaWN0Jywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZVN0cmljdCh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG59KVxuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpIHJldHVybiBmLnZhbHVlXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuXG5mdW5jdGlvbiBvbmNlU3RyaWN0IChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZi5vbmNlRXJyb3IpXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgdmFyIG5hbWUgPSBmbi5uYW1lIHx8ICdGdW5jdGlvbiB3cmFwcGVkIHdpdGggYG9uY2VgJ1xuICBmLm9uY2VFcnJvciA9IG5hbWUgKyBcIiBzaG91bGRuJ3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXCJcbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///83519\n")},33225:module=>{"use strict";eval("\n\nif (typeof process === 'undefined' ||\n !process.version ||\n process.version.indexOf('v0.') === 0 ||\n process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n module.exports = { nextTick: nextTick };\n} else {\n module.exports = process\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n if (typeof fn !== 'function') {\n throw new TypeError('\"callback\" argument must be a function');\n }\n var len = arguments.length;\n var args, i;\n switch (len) {\n case 0:\n case 1:\n return process.nextTick(fn);\n case 2:\n return process.nextTick(function afterTickOne() {\n fn.call(null, arg1);\n });\n case 3:\n return process.nextTick(function afterTickTwo() {\n fn.call(null, arg1, arg2);\n });\n case 4:\n return process.nextTick(function afterTickThree() {\n fn.call(null, arg1, arg2, arg3);\n });\n default:\n args = new Array(len - 1);\n i = 0;\n while (i < args.length) {\n args[i++] = arguments[i];\n }\n return process.nextTick(function afterTick() {\n fn.apply(null, args);\n });\n }\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMyMjUuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzPzk2NmQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHsgbmV4dFRpY2s6IG5leHRUaWNrIH07XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3Ncbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///33225\n")},54422:module=>{eval("// for now just expose the builtin process global from node.js\nmodule.exports = global.process;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ0MjIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9pbmRleC5qcz83NTBmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZvciBub3cganVzdCBleHBvc2UgdGhlIGJ1aWx0aW4gcHJvY2VzcyBnbG9iYWwgZnJvbSBub2RlLmpzXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5wcm9jZXNzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///54422\n")},4111:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = (typeof process !== 'undefined' && typeof process.nextTick === 'function')\n ? process.nextTick.bind(process)\n : __webpack_require__(92133)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDExMS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EsSUFBSSxtQkFBTyxDQUFDLEtBQW1CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9xdWV1ZS10aWNrL3Byb2Nlc3MtbmV4dC10aWNrLmpzPzc0NTMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzLm5leHRUaWNrID09PSAnZnVuY3Rpb24nKVxuICA/IHByb2Nlc3MubmV4dFRpY2suYmluZChwcm9jZXNzKVxuICA6IHJlcXVpcmUoJy4vcXVldWUtbWljcm90YXNrJylcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4111\n")},92133:module=>{eval("module.exports = typeof queueMicrotask === 'function' ? queueMicrotask : (fn) => Promise.resolve().then(fn)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIxMzMuanMiLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3F1ZXVlLXRpY2svcXVldWUtbWljcm90YXNrLmpzPzZkMzUiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IChmbikgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbilcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///92133\n")},4147:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { SymbolDispose } = __webpack_require__(24134)\nconst { AbortError, codes } = __webpack_require__(76371)\nconst { isNodeStream, isWebStream, kControllerErrorFunction } = __webpack_require__(16115)\nconst eos = __webpack_require__(86238)\nconst { ERR_INVALID_ARG_TYPE } = codes\nlet addAbortListener\n\n// This method is inlined here for readable-stream\n// It also does not allow for signal to not exist on the stream\n// https://github.com/nodejs/node/pull/36061#discussion_r533718029\nconst validateAbortSignal = (signal, name) => {\n if (typeof signal !== 'object' || !('aborted' in signal)) {\n throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)\n }\n}\nmodule.exports.addAbortSignal = function addAbortSignal(signal, stream) {\n validateAbortSignal(signal, 'signal')\n if (!isNodeStream(stream) && !isWebStream(stream)) {\n throw new ERR_INVALID_ARG_TYPE('stream', ['ReadableStream', 'WritableStream', 'Stream'], stream)\n }\n return module.exports.addAbortSignalNoValidate(signal, stream)\n}\nmodule.exports.addAbortSignalNoValidate = function (signal, stream) {\n if (typeof signal !== 'object' || !('aborted' in signal)) {\n return stream\n }\n const onAbort = isNodeStream(stream)\n ? () => {\n stream.destroy(\n new AbortError(undefined, {\n cause: signal.reason\n })\n )\n }\n : () => {\n stream[kControllerErrorFunction](\n new AbortError(undefined, {\n cause: signal.reason\n })\n )\n }\n if (signal.aborted) {\n onAbort()\n } else {\n addAbortListener = addAbortListener || (__webpack_require__(57760).addAbortListener)\n const disposable = addAbortListener(signal, onAbort)\n eos(stream, disposable[SymbolDispose])\n }\n return stream\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0Ny5qcyIsIm1hcHBpbmdzIjoiQUFBWTs7QUFFWixRQUFRLGdCQUFnQixFQUFFLG1CQUFPLENBQUMsS0FBd0I7QUFDMUQsUUFBUSxvQkFBb0IsRUFBRSxtQkFBTyxDQUFDLEtBQW1CO0FBQ3pELFFBQVEsc0RBQXNELEVBQUUsbUJBQU8sQ0FBQyxLQUFTO0FBQ2pGLFlBQVksbUJBQU8sQ0FBQyxLQUFpQjtBQUNyQyxRQUFRLHVCQUF1QjtBQUMvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSiwyQ0FBMkMsNkNBQTJDO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9hZGQtYWJvcnQtc2lnbmFsLmpzPzljMjQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgU3ltYm9sRGlzcG9zZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IEFib3J0RXJyb3IsIGNvZGVzIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCB7IGlzTm9kZVN0cmVhbSwgaXNXZWJTdHJlYW0sIGtDb250cm9sbGVyRXJyb3JGdW5jdGlvbiB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSB9ID0gY29kZXNcbmxldCBhZGRBYm9ydExpc3RlbmVyXG5cbi8vIFRoaXMgbWV0aG9kIGlzIGlubGluZWQgaGVyZSBmb3IgcmVhZGFibGUtc3RyZWFtXG4vLyBJdCBhbHNvIGRvZXMgbm90IGFsbG93IGZvciBzaWduYWwgdG8gbm90IGV4aXN0IG9uIHRoZSBzdHJlYW1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM2MDYxI2Rpc2N1c3Npb25fcjUzMzcxODAyOVxuY29uc3QgdmFsaWRhdGVBYm9ydFNpZ25hbCA9IChzaWduYWwsIG5hbWUpID0+IHtcbiAgaWYgKHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IGZ1bmN0aW9uIGFkZEFib3J0U2lnbmFsKHNpZ25hbCwgc3RyZWFtKSB7XG4gIHZhbGlkYXRlQWJvcnRTaWduYWwoc2lnbmFsLCAnc2lnbmFsJylcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSAmJiAhaXNXZWJTdHJlYW0oc3RyZWFtKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc3RyZWFtJywgWydSZWFkYWJsZVN0cmVhbScsICdXcml0YWJsZVN0cmVhbScsICdTdHJlYW0nXSwgc3RyZWFtKVxuICB9XG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbE5vVmFsaWRhdGUoc2lnbmFsLCBzdHJlYW0pXG59XG5tb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbE5vVmFsaWRhdGUgPSBmdW5jdGlvbiAoc2lnbmFsLCBzdHJlYW0pIHtcbiAgaWYgKHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpIHtcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cbiAgY29uc3Qgb25BYm9ydCA9IGlzTm9kZVN0cmVhbShzdHJlYW0pXG4gICAgPyAoKSA9PiB7XG4gICAgICAgIHN0cmVhbS5kZXN0cm95KFxuICAgICAgICAgIG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgY2F1c2U6IHNpZ25hbC5yZWFzb25cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgOiAoKSA9PiB7XG4gICAgICAgIHN0cmVhbVtrQ29udHJvbGxlckVycm9yRnVuY3Rpb25dKFxuICAgICAgICAgIG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgY2F1c2U6IHNpZ25hbC5yZWFzb25cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIG9uQWJvcnQoKVxuICB9IGVsc2Uge1xuICAgIGFkZEFib3J0TGlzdGVuZXIgPSBhZGRBYm9ydExpc3RlbmVyIHx8IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpLmFkZEFib3J0TGlzdGVuZXJcbiAgICBjb25zdCBkaXNwb3NhYmxlID0gYWRkQWJvcnRMaXN0ZW5lcihzaWduYWwsIG9uQWJvcnQpXG4gICAgZW9zKHN0cmVhbSwgZGlzcG9zYWJsZVtTeW1ib2xEaXNwb3NlXSlcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4147\n")},80345:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { StringPrototypeSlice, SymbolIterator, TypedArrayPrototypeSet, Uint8Array } = __webpack_require__(24134)\nconst { Buffer } = __webpack_require__(20181)\nconst { inspect } = __webpack_require__(57760)\nmodule.exports = class BufferList {\n constructor() {\n this.head = null\n this.tail = null\n this.length = 0\n }\n push(v) {\n const entry = {\n data: v,\n next: null\n }\n if (this.length > 0) this.tail.next = entry\n else this.head = entry\n this.tail = entry\n ++this.length\n }\n unshift(v) {\n const entry = {\n data: v,\n next: this.head\n }\n if (this.length === 0) this.tail = entry\n this.head = entry\n ++this.length\n }\n shift() {\n if (this.length === 0) return\n const ret = this.head.data\n if (this.length === 1) this.head = this.tail = null\n else this.head = this.head.next\n --this.length\n return ret\n }\n clear() {\n this.head = this.tail = null\n this.length = 0\n }\n join(s) {\n if (this.length === 0) return ''\n let p = this.head\n let ret = '' + p.data\n while ((p = p.next) !== null) ret += s + p.data\n return ret\n }\n concat(n) {\n if (this.length === 0) return Buffer.alloc(0)\n const ret = Buffer.allocUnsafe(n >>> 0)\n let p = this.head\n let i = 0\n while (p) {\n TypedArrayPrototypeSet(ret, p.data, i)\n i += p.data.length\n p = p.next\n }\n return ret\n }\n\n // Consumes a specified amount of bytes or characters from the buffered data.\n consume(n, hasStrings) {\n const data = this.head.data\n if (n < data.length) {\n // `slice` is the same for buffers and strings.\n const slice = data.slice(0, n)\n this.head.data = data.slice(n)\n return slice\n }\n if (n === data.length) {\n // First chunk is a perfect match.\n return this.shift()\n }\n // Result spans more than one buffer.\n return hasStrings ? this._getString(n) : this._getBuffer(n)\n }\n first() {\n return this.head.data\n }\n *[SymbolIterator]() {\n for (let p = this.head; p; p = p.next) {\n yield p.data\n }\n }\n\n // Consumes a specified amount of characters from the buffered data.\n _getString(n) {\n let ret = ''\n let p = this.head\n let c = 0\n do {\n const str = p.data\n if (n > str.length) {\n ret += str\n n -= str.length\n } else {\n if (n === str.length) {\n ret += str\n ++c\n if (p.next) this.head = p.next\n else this.head = this.tail = null\n } else {\n ret += StringPrototypeSlice(str, 0, n)\n this.head = p\n p.data = StringPrototypeSlice(str, n)\n }\n break\n }\n ++c\n } while ((p = p.next) !== null)\n this.length -= c\n return ret\n }\n\n // Consumes a specified amount of bytes from the buffered data.\n _getBuffer(n) {\n const ret = Buffer.allocUnsafe(n)\n const retLen = n\n let p = this.head\n let c = 0\n do {\n const buf = p.data\n if (n > buf.length) {\n TypedArrayPrototypeSet(ret, buf, retLen - n)\n n -= buf.length\n } else {\n if (n === buf.length) {\n TypedArrayPrototypeSet(ret, buf, retLen - n)\n ++c\n if (p.next) this.head = p.next\n else this.head = this.tail = null\n } else {\n TypedArrayPrototypeSet(ret, new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n)\n this.head = p\n p.data = buf.slice(n)\n }\n break\n }\n ++c\n } while ((p = p.next) !== null)\n this.length -= c\n return ret\n }\n\n // Make sure the linked list only shows the minimal necessary information.\n [Symbol.for('nodejs.util.inspect.custom')](_, options) {\n return inspect(this, {\n ...options,\n // Only inspect one level.\n depth: 0,\n // It should not recurse.\n customInspect: false\n })\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAzNDUuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosUUFBUSwyRUFBMkUsRUFBRSxtQkFBTyxDQUFDLEtBQXdCO0FBQ3JILFFBQVEsU0FBUyxFQUFFLG1CQUFPLENBQUMsS0FBUTtBQUNuQyxRQUFRLFVBQVUsRUFBRSxtQkFBTyxDQUFDLEtBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixHQUFHO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2J1ZmZlcl9saXN0LmpzP2M2YWUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgU3RyaW5nUHJvdG90eXBlU2xpY2UsIFN5bWJvbEl0ZXJhdG9yLCBUeXBlZEFycmF5UHJvdG90eXBlU2V0LCBVaW50OEFycmF5IH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHsgQnVmZmVyIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3QgeyBpbnNwZWN0IH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBCdWZmZXJMaXN0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWFkID0gbnVsbFxuICAgIHRoaXMudGFpbCA9IG51bGxcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuICBwdXNoKHYpIHtcbiAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgIGRhdGE6IHYsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnlcbiAgICBlbHNlIHRoaXMuaGVhZCA9IGVudHJ5XG4gICAgdGhpcy50YWlsID0gZW50cnlcbiAgICArK3RoaXMubGVuZ3RoXG4gIH1cbiAgdW5zaGlmdCh2KSB7XG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICBkYXRhOiB2LFxuICAgICAgbmV4dDogdGhpcy5oZWFkXG4gICAgfVxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnlcbiAgICB0aGlzLmhlYWQgPSBlbnRyeVxuICAgICsrdGhpcy5sZW5ndGhcbiAgfVxuICBzaGlmdCgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVyblxuICAgIGNvbnN0IHJldCA9IHRoaXMuaGVhZC5kYXRhXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsXG4gICAgZWxzZSB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dFxuICAgIC0tdGhpcy5sZW5ndGhcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG4gIGpvaW4ocykge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gICAgbGV0IHAgPSB0aGlzLmhlYWRcbiAgICBsZXQgcmV0ID0gJycgKyBwLmRhdGFcbiAgICB3aGlsZSAoKHAgPSBwLm5leHQpICE9PSBudWxsKSByZXQgKz0gcyArIHAuZGF0YVxuICAgIHJldHVybiByZXRcbiAgfVxuICBjb25jYXQobikge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICAgIGNvbnN0IHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuID4+PiAwKVxuICAgIGxldCBwID0gdGhpcy5oZWFkXG4gICAgbGV0IGkgPSAwXG4gICAgd2hpbGUgKHApIHtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBwLmRhdGEsIGkpXG4gICAgICBpICs9IHAuZGF0YS5sZW5ndGhcbiAgICAgIHAgPSBwLm5leHRcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIG9yIGNoYXJhY3RlcnMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgY29uc3VtZShuLCBoYXNTdHJpbmdzKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuaGVhZC5kYXRhXG4gICAgaWYgKG4gPCBkYXRhLmxlbmd0aCkge1xuICAgICAgLy8gYHNsaWNlYCBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIGNvbnN0IHNsaWNlID0gZGF0YS5zbGljZSgwLCBuKVxuICAgICAgdGhpcy5oZWFkLmRhdGEgPSBkYXRhLnNsaWNlKG4pXG4gICAgICByZXR1cm4gc2xpY2VcbiAgICB9XG4gICAgaWYgKG4gPT09IGRhdGEubGVuZ3RoKSB7XG4gICAgICAvLyBGaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2guXG4gICAgICByZXR1cm4gdGhpcy5zaGlmdCgpXG4gICAgfVxuICAgIC8vIFJlc3VsdCBzcGFucyBtb3JlIHRoYW4gb25lIGJ1ZmZlci5cbiAgICByZXR1cm4gaGFzU3RyaW5ncyA/IHRoaXMuX2dldFN0cmluZyhuKSA6IHRoaXMuX2dldEJ1ZmZlcihuKVxuICB9XG4gIGZpcnN0KCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuZGF0YVxuICB9XG4gICpbU3ltYm9sSXRlcmF0b3JdKCkge1xuICAgIGZvciAobGV0IHAgPSB0aGlzLmhlYWQ7IHA7IHAgPSBwLm5leHQpIHtcbiAgICAgIHlpZWxkIHAuZGF0YVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIF9nZXRTdHJpbmcobikge1xuICAgIGxldCByZXQgPSAnJ1xuICAgIGxldCBwID0gdGhpcy5oZWFkXG4gICAgbGV0IGMgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3Qgc3RyID0gcC5kYXRhXG4gICAgICBpZiAobiA+IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgcmV0ICs9IHN0clxuICAgICAgICBuIC09IHN0ci5sZW5ndGhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0ICs9IHN0clxuICAgICAgICAgICsrY1xuICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dFxuICAgICAgICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCArPSBTdHJpbmdQcm90b3R5cGVTbGljZShzdHIsIDAsIG4pXG4gICAgICAgICAgdGhpcy5oZWFkID0gcFxuICAgICAgICAgIHAuZGF0YSA9IFN0cmluZ1Byb3RvdHlwZVNsaWNlKHN0ciwgbilcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgKytjXG4gICAgfSB3aGlsZSAoKHAgPSBwLm5leHQpICE9PSBudWxsKVxuICAgIHRoaXMubGVuZ3RoIC09IGNcbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgX2dldEJ1ZmZlcihuKSB7XG4gICAgY29uc3QgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pXG4gICAgY29uc3QgcmV0TGVuID0gblxuICAgIGxldCBwID0gdGhpcy5oZWFkXG4gICAgbGV0IGMgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYnVmID0gcC5kYXRhXG4gICAgICBpZiAobiA+IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgVHlwZWRBcnJheVByb3RvdHlwZVNldChyZXQsIGJ1ZiwgcmV0TGVuIC0gbilcbiAgICAgICAgbiAtPSBidWYubGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBidWYsIHJldExlbiAtIG4pXG4gICAgICAgICAgKytjXG4gICAgICAgICAgaWYgKHAubmV4dCkgdGhpcy5oZWFkID0gcC5uZXh0XG4gICAgICAgICAgZWxzZSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgVHlwZWRBcnJheVByb3RvdHlwZVNldChyZXQsIG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGJ1Zi5ieXRlT2Zmc2V0LCBuKSwgcmV0TGVuIC0gbilcbiAgICAgICAgICB0aGlzLmhlYWQgPSBwXG4gICAgICAgICAgcC5kYXRhID0gYnVmLnNsaWNlKG4pXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgICsrY1xuICAgIH0gd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbClcbiAgICB0aGlzLmxlbmd0aCAtPSBjXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHRoZSBsaW5rZWQgbGlzdCBvbmx5IHNob3dzIHRoZSBtaW5pbWFsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi5cbiAgW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldKF8sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gaW5zcGVjdCh0aGlzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLy8gT25seSBpbnNwZWN0IG9uZSBsZXZlbC5cbiAgICAgIGRlcHRoOiAwLFxuICAgICAgLy8gSXQgc2hvdWxkIG5vdCByZWN1cnNlLlxuICAgICAgY3VzdG9tSW5zcGVjdDogZmFsc2VcbiAgICB9KVxuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///80345\n")},47830:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { pipeline } = __webpack_require__(57758)\nconst Duplex = __webpack_require__(93370)\nconst { destroyer } = __webpack_require__(75896)\nconst {\n isNodeStream,\n isReadable,\n isWritable,\n isWebStream,\n isTransformStream,\n isWritableStream,\n isReadableStream\n} = __webpack_require__(16115)\nconst {\n AbortError,\n codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS }\n} = __webpack_require__(76371)\nconst eos = __webpack_require__(86238)\nmodule.exports = function compose(...streams) {\n if (streams.length === 0) {\n throw new ERR_MISSING_ARGS('streams')\n }\n if (streams.length === 1) {\n return Duplex.from(streams[0])\n }\n const orgStreams = [...streams]\n if (typeof streams[0] === 'function') {\n streams[0] = Duplex.from(streams[0])\n }\n if (typeof streams[streams.length - 1] === 'function') {\n const idx = streams.length - 1\n streams[idx] = Duplex.from(streams[idx])\n }\n for (let n = 0; n < streams.length; ++n) {\n if (!isNodeStream(streams[n]) && !isWebStream(streams[n])) {\n // TODO(ronag): Add checks for non streams.\n continue\n }\n if (\n n < streams.length - 1 &&\n !(isReadable(streams[n]) || isReadableStream(streams[n]) || isTransformStream(streams[n]))\n ) {\n throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be readable')\n }\n if (n > 0 && !(isWritable(streams[n]) || isWritableStream(streams[n]) || isTransformStream(streams[n]))) {\n throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be writable')\n }\n }\n let ondrain\n let onfinish\n let onreadable\n let onclose\n let d\n function onfinished(err) {\n const cb = onclose\n onclose = null\n if (cb) {\n cb(err)\n } else if (err) {\n d.destroy(err)\n } else if (!readable && !writable) {\n d.destroy()\n }\n }\n const head = streams[0]\n const tail = pipeline(streams, onfinished)\n const writable = !!(isWritable(head) || isWritableStream(head) || isTransformStream(head))\n const readable = !!(isReadable(tail) || isReadableStream(tail) || isTransformStream(tail))\n\n // TODO(ronag): Avoid double buffering.\n // Implement Writable/Readable/Duplex traits.\n // See, https://github.com/nodejs/node/pull/33515.\n d = new Duplex({\n // TODO (ronag): highWaterMark?\n writableObjectMode: !!(head !== null && head !== undefined && head.writableObjectMode),\n readableObjectMode: !!(tail !== null && tail !== undefined && tail.readableObjectMode),\n writable,\n readable\n })\n if (writable) {\n if (isNodeStream(head)) {\n d._write = function (chunk, encoding, callback) {\n if (head.write(chunk, encoding)) {\n callback()\n } else {\n ondrain = callback\n }\n }\n d._final = function (callback) {\n head.end()\n onfinish = callback\n }\n head.on('drain', function () {\n if (ondrain) {\n const cb = ondrain\n ondrain = null\n cb()\n }\n })\n } else if (isWebStream(head)) {\n const writable = isTransformStream(head) ? head.writable : head\n const writer = writable.getWriter()\n d._write = async function (chunk, encoding, callback) {\n try {\n await writer.ready\n writer.write(chunk).catch(() => {})\n callback()\n } catch (err) {\n callback(err)\n }\n }\n d._final = async function (callback) {\n try {\n await writer.ready\n writer.close().catch(() => {})\n onfinish = callback\n } catch (err) {\n callback(err)\n }\n }\n }\n const toRead = isTransformStream(tail) ? tail.readable : tail\n eos(toRead, () => {\n if (onfinish) {\n const cb = onfinish\n onfinish = null\n cb()\n }\n })\n }\n if (readable) {\n if (isNodeStream(tail)) {\n tail.on('readable', function () {\n if (onreadable) {\n const cb = onreadable\n onreadable = null\n cb()\n }\n })\n tail.on('end', function () {\n d.push(null)\n })\n d._read = function () {\n while (true) {\n const buf = tail.read()\n if (buf === null) {\n onreadable = d._read\n return\n }\n if (!d.push(buf)) {\n return\n }\n }\n }\n } else if (isWebStream(tail)) {\n const readable = isTransformStream(tail) ? tail.readable : tail\n const reader = readable.getReader()\n d._read = async function () {\n while (true) {\n try {\n const { value, done } = await reader.read()\n if (!d.push(value)) {\n return\n }\n if (done) {\n d.push(null)\n return\n }\n } catch {\n return\n }\n }\n }\n }\n }\n d._destroy = function (err, callback) {\n if (!err && onclose !== null) {\n err = new AbortError()\n }\n onreadable = null\n ondrain = null\n onfinish = null\n if (onclose === null) {\n callback(err)\n } else {\n onclose = callback\n if (isNodeStream(tail)) {\n destroyer(tail, err)\n }\n }\n }\n return d\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc4MzAuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosUUFBUSxXQUFXLEVBQUUsbUJBQU8sQ0FBQyxLQUFZO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyxLQUFVO0FBQ2pDLFFBQVEsWUFBWSxFQUFFLG1CQUFPLENBQUMsS0FBVztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLG1CQUFPLENBQUMsS0FBUztBQUNyQjtBQUNBO0FBQ0EsV0FBVztBQUNYLEVBQUUsRUFBRSxtQkFBTyxDQUFDLEtBQW1CO0FBQy9CLFlBQVksbUJBQU8sQ0FBQyxLQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsRUFBRTtBQUNuRDtBQUNBO0FBQ0EsaURBQWlELEVBQUU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9jb21wb3NlLmpzP2UyMjAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcGlwZWxpbmUgfSA9IHJlcXVpcmUoJy4vcGlwZWxpbmUnKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgeyBkZXN0cm95ZXIgfSA9IHJlcXVpcmUoJy4vZGVzdHJveScpXG5jb25zdCB7XG4gIGlzTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZSxcbiAgaXNXcml0YWJsZSxcbiAgaXNXZWJTdHJlYW0sXG4gIGlzVHJhbnNmb3JtU3RyZWFtLFxuICBpc1dyaXRhYmxlU3RyZWFtLFxuICBpc1JlYWRhYmxlU3RyZWFtXG59ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCB7XG4gIEFib3J0RXJyb3IsXG4gIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19WQUxVRSwgRVJSX01JU1NJTkdfQVJHUyB9XG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgZW9zID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJylcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tcG9zZSguLi5zdHJlYW1zKSB7XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCdzdHJlYW1zJylcbiAgfVxuICBpZiAoc3RyZWFtcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gRHVwbGV4LmZyb20oc3RyZWFtc1swXSlcbiAgfVxuICBjb25zdCBvcmdTdHJlYW1zID0gWy4uLnN0cmVhbXNdXG4gIGlmICh0eXBlb2Ygc3RyZWFtc1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0cmVhbXNbMF0gPSBEdXBsZXguZnJvbShzdHJlYW1zWzBdKVxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgaWR4ID0gc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgc3RyZWFtc1tpZHhdID0gRHVwbGV4LmZyb20oc3RyZWFtc1tpZHhdKVxuICB9XG4gIGZvciAobGV0IG4gPSAwOyBuIDwgc3RyZWFtcy5sZW5ndGg7ICsrbikge1xuICAgIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbXNbbl0pICYmICFpc1dlYlN0cmVhbShzdHJlYW1zW25dKSkge1xuICAgICAgLy8gVE9ETyhyb25hZyk6IEFkZCBjaGVja3MgZm9yIG5vbiBzdHJlYW1zLlxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbiA8IHN0cmVhbXMubGVuZ3RoIC0gMSAmJlxuICAgICAgIShpc1JlYWRhYmxlKHN0cmVhbXNbbl0pIHx8IGlzUmVhZGFibGVTdHJlYW0oc3RyZWFtc1tuXSkgfHwgaXNUcmFuc2Zvcm1TdHJlYW0oc3RyZWFtc1tuXSkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKGBzdHJlYW1zWyR7bn1dYCwgb3JnU3RyZWFtc1tuXSwgJ211c3QgYmUgcmVhZGFibGUnKVxuICAgIH1cbiAgICBpZiAobiA+IDAgJiYgIShpc1dyaXRhYmxlKHN0cmVhbXNbbl0pIHx8IGlzV3JpdGFibGVTdHJlYW0oc3RyZWFtc1tuXSkgfHwgaXNUcmFuc2Zvcm1TdHJlYW0oc3RyZWFtc1tuXSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKGBzdHJlYW1zWyR7bn1dYCwgb3JnU3RyZWFtc1tuXSwgJ211c3QgYmUgd3JpdGFibGUnKVxuICAgIH1cbiAgfVxuICBsZXQgb25kcmFpblxuICBsZXQgb25maW5pc2hcbiAgbGV0IG9ucmVhZGFibGVcbiAgbGV0IG9uY2xvc2VcbiAgbGV0IGRcbiAgZnVuY3Rpb24gb25maW5pc2hlZChlcnIpIHtcbiAgICBjb25zdCBjYiA9IG9uY2xvc2VcbiAgICBvbmNsb3NlID0gbnVsbFxuICAgIGlmIChjYikge1xuICAgICAgY2IoZXJyKVxuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBkLmRlc3Ryb3koZXJyKVxuICAgIH0gZWxzZSBpZiAoIXJlYWRhYmxlICYmICF3cml0YWJsZSkge1xuICAgICAgZC5kZXN0cm95KClcbiAgICB9XG4gIH1cbiAgY29uc3QgaGVhZCA9IHN0cmVhbXNbMF1cbiAgY29uc3QgdGFpbCA9IHBpcGVsaW5lKHN0cmVhbXMsIG9uZmluaXNoZWQpXG4gIGNvbnN0IHdyaXRhYmxlID0gISEoaXNXcml0YWJsZShoZWFkKSB8fCBpc1dyaXRhYmxlU3RyZWFtKGhlYWQpIHx8IGlzVHJhbnNmb3JtU3RyZWFtKGhlYWQpKVxuICBjb25zdCByZWFkYWJsZSA9ICEhKGlzUmVhZGFibGUodGFpbCkgfHwgaXNSZWFkYWJsZVN0cmVhbSh0YWlsKSB8fCBpc1RyYW5zZm9ybVN0cmVhbSh0YWlsKSlcblxuICAvLyBUT0RPKHJvbmFnKTogQXZvaWQgZG91YmxlIGJ1ZmZlcmluZy5cbiAgLy8gSW1wbGVtZW50IFdyaXRhYmxlL1JlYWRhYmxlL0R1cGxleCB0cmFpdHMuXG4gIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzM1MTUuXG4gIGQgPSBuZXcgRHVwbGV4KHtcbiAgICAvLyBUT0RPIChyb25hZyk6IGhpZ2hXYXRlck1hcms/XG4gICAgd3JpdGFibGVPYmplY3RNb2RlOiAhIShoZWFkICE9PSBudWxsICYmIGhlYWQgIT09IHVuZGVmaW5lZCAmJiBoZWFkLndyaXRhYmxlT2JqZWN0TW9kZSksXG4gICAgcmVhZGFibGVPYmplY3RNb2RlOiAhISh0YWlsICE9PSBudWxsICYmIHRhaWwgIT09IHVuZGVmaW5lZCAmJiB0YWlsLnJlYWRhYmxlT2JqZWN0TW9kZSksXG4gICAgd3JpdGFibGUsXG4gICAgcmVhZGFibGVcbiAgfSlcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgaWYgKGlzTm9kZVN0cmVhbShoZWFkKSkge1xuICAgICAgZC5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoaGVhZC53cml0ZShjaHVuaywgZW5jb2RpbmcpKSB7XG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uZHJhaW4gPSBjYWxsYmFja1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkLl9maW5hbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBoZWFkLmVuZCgpXG4gICAgICAgIG9uZmluaXNoID0gY2FsbGJhY2tcbiAgICAgIH1cbiAgICAgIGhlYWQub24oJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAob25kcmFpbikge1xuICAgICAgICAgIGNvbnN0IGNiID0gb25kcmFpblxuICAgICAgICAgIG9uZHJhaW4gPSBudWxsXG4gICAgICAgICAgY2IoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoaXNXZWJTdHJlYW0oaGVhZCkpIHtcbiAgICAgIGNvbnN0IHdyaXRhYmxlID0gaXNUcmFuc2Zvcm1TdHJlYW0oaGVhZCkgPyBoZWFkLndyaXRhYmxlIDogaGVhZFxuICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKClcbiAgICAgIGQuX3dyaXRlID0gYXN5bmMgZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIucmVhZHlcbiAgICAgICAgICB3cml0ZXIud3JpdGUoY2h1bmspLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkLl9maW5hbCA9IGFzeW5jIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5yZWFkeVxuICAgICAgICAgIHdyaXRlci5jbG9zZSgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgIG9uZmluaXNoID0gY2FsbGJhY2tcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRvUmVhZCA9IGlzVHJhbnNmb3JtU3RyZWFtKHRhaWwpID8gdGFpbC5yZWFkYWJsZSA6IHRhaWxcbiAgICBlb3ModG9SZWFkLCAoKSA9PiB7XG4gICAgICBpZiAob25maW5pc2gpIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbmZpbmlzaFxuICAgICAgICBvbmZpbmlzaCA9IG51bGxcbiAgICAgICAgY2IoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgaWYgKHJlYWRhYmxlKSB7XG4gICAgaWYgKGlzTm9kZVN0cmVhbSh0YWlsKSkge1xuICAgICAgdGFpbC5vbigncmVhZGFibGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvbnJlYWRhYmxlKSB7XG4gICAgICAgICAgY29uc3QgY2IgPSBvbnJlYWRhYmxlXG4gICAgICAgICAgb25yZWFkYWJsZSA9IG51bGxcbiAgICAgICAgICBjYigpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICB0YWlsLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQucHVzaChudWxsKVxuICAgICAgfSlcbiAgICAgIGQuX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3QgYnVmID0gdGFpbC5yZWFkKClcbiAgICAgICAgICBpZiAoYnVmID09PSBudWxsKSB7XG4gICAgICAgICAgICBvbnJlYWRhYmxlID0gZC5fcmVhZFxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZC5wdXNoKGJ1ZikpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNXZWJTdHJlYW0odGFpbCkpIHtcbiAgICAgIGNvbnN0IHJlYWRhYmxlID0gaXNUcmFuc2Zvcm1TdHJlYW0odGFpbCkgPyB0YWlsLnJlYWRhYmxlIDogdGFpbFxuICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKClcbiAgICAgIGQuX3JlYWQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICAgICAgICAgIGlmICghZC5wdXNoKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIGQucHVzaChudWxsKVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBkLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWVyciAmJiBvbmNsb3NlICE9PSBudWxsKSB7XG4gICAgICBlcnIgPSBuZXcgQWJvcnRFcnJvcigpXG4gICAgfVxuICAgIG9ucmVhZGFibGUgPSBudWxsXG4gICAgb25kcmFpbiA9IG51bGxcbiAgICBvbmZpbmlzaCA9IG51bGxcbiAgICBpZiAob25jbG9zZSA9PT0gbnVsbCkge1xuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbmNsb3NlID0gY2FsbGJhY2tcbiAgICAgIGlmIChpc05vZGVTdHJlYW0odGFpbCkpIHtcbiAgICAgICAgZGVzdHJveWVyKHRhaWwsIGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///47830\n")},75896:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\n/* replacement start */\n\nconst process = __webpack_require__(54422)\n\n/* replacement end */\n\nconst {\n aggregateTwoErrors,\n codes: { ERR_MULTIPLE_CALLBACK },\n AbortError\n} = __webpack_require__(76371)\nconst { Symbol } = __webpack_require__(24134)\nconst { kIsDestroyed, isDestroyed, isFinished, isServerRequest } = __webpack_require__(16115)\nconst kDestroy = Symbol('kDestroy')\nconst kConstruct = Symbol('kConstruct')\nfunction checkError(err, w, r) {\n if (err) {\n // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364\n err.stack // eslint-disable-line no-unused-expressions\n\n if (w && !w.errored) {\n w.errored = err\n }\n if (r && !r.errored) {\n r.errored = err\n }\n }\n}\n\n// Backwards compat. cb() is undocumented and unused in core but\n// unfortunately might be used by modules.\nfunction destroy(err, cb) {\n const r = this._readableState\n const w = this._writableState\n // With duplex streams we use the writable side for state.\n const s = w || r\n if ((w !== null && w !== undefined && w.destroyed) || (r !== null && r !== undefined && r.destroyed)) {\n if (typeof cb === 'function') {\n cb()\n }\n return this\n }\n\n // We set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n checkError(err, w, r)\n if (w) {\n w.destroyed = true\n }\n if (r) {\n r.destroyed = true\n }\n\n // If still constructing then defer calling _destroy.\n if (!s.constructed) {\n this.once(kDestroy, function (er) {\n _destroy(this, aggregateTwoErrors(er, err), cb)\n })\n } else {\n _destroy(this, err, cb)\n }\n return this\n}\nfunction _destroy(self, err, cb) {\n let called = false\n function onDestroy(err) {\n if (called) {\n return\n }\n called = true\n const r = self._readableState\n const w = self._writableState\n checkError(err, w, r)\n if (w) {\n w.closed = true\n }\n if (r) {\n r.closed = true\n }\n if (typeof cb === 'function') {\n cb(err)\n }\n if (err) {\n process.nextTick(emitErrorCloseNT, self, err)\n } else {\n process.nextTick(emitCloseNT, self)\n }\n }\n try {\n self._destroy(err || null, onDestroy)\n } catch (err) {\n onDestroy(err)\n }\n}\nfunction emitErrorCloseNT(self, err) {\n emitErrorNT(self, err)\n emitCloseNT(self)\n}\nfunction emitCloseNT(self) {\n const r = self._readableState\n const w = self._writableState\n if (w) {\n w.closeEmitted = true\n }\n if (r) {\n r.closeEmitted = true\n }\n if ((w !== null && w !== undefined && w.emitClose) || (r !== null && r !== undefined && r.emitClose)) {\n self.emit('close')\n }\n}\nfunction emitErrorNT(self, err) {\n const r = self._readableState\n const w = self._writableState\n if ((w !== null && w !== undefined && w.errorEmitted) || (r !== null && r !== undefined && r.errorEmitted)) {\n return\n }\n if (w) {\n w.errorEmitted = true\n }\n if (r) {\n r.errorEmitted = true\n }\n self.emit('error', err)\n}\nfunction undestroy() {\n const r = this._readableState\n const w = this._writableState\n if (r) {\n r.constructed = true\n r.closed = false\n r.closeEmitted = false\n r.destroyed = false\n r.errored = null\n r.errorEmitted = false\n r.reading = false\n r.ended = r.readable === false\n r.endEmitted = r.readable === false\n }\n if (w) {\n w.constructed = true\n w.destroyed = false\n w.closed = false\n w.closeEmitted = false\n w.errored = null\n w.errorEmitted = false\n w.finalCalled = false\n w.prefinished = false\n w.ended = w.writable === false\n w.ending = w.writable === false\n w.finished = w.writable === false\n }\n}\nfunction errorOrDestroy(stream, err, sync) {\n // We have tests that rely on errors being emitted\n // in the same tick, so changing this is semver major.\n // For now when you opt-in to autoDestroy we allow\n // the error to be emitted nextTick. In a future\n // semver major update we should change the default to this.\n\n const r = stream._readableState\n const w = stream._writableState\n if ((w !== null && w !== undefined && w.destroyed) || (r !== null && r !== undefined && r.destroyed)) {\n return this\n }\n if ((r !== null && r !== undefined && r.autoDestroy) || (w !== null && w !== undefined && w.autoDestroy))\n stream.destroy(err)\n else if (err) {\n // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364\n err.stack // eslint-disable-line no-unused-expressions\n\n if (w && !w.errored) {\n w.errored = err\n }\n if (r && !r.errored) {\n r.errored = err\n }\n if (sync) {\n process.nextTick(emitErrorNT, stream, err)\n } else {\n emitErrorNT(stream, err)\n }\n }\n}\nfunction construct(stream, cb) {\n if (typeof stream._construct !== 'function') {\n return\n }\n const r = stream._readableState\n const w = stream._writableState\n if (r) {\n r.constructed = false\n }\n if (w) {\n w.constructed = false\n }\n stream.once(kConstruct, cb)\n if (stream.listenerCount(kConstruct) > 1) {\n // Duplex\n return\n }\n process.nextTick(constructNT, stream)\n}\nfunction constructNT(stream) {\n let called = false\n function onConstruct(err) {\n if (called) {\n errorOrDestroy(stream, err !== null && err !== undefined ? err : new ERR_MULTIPLE_CALLBACK())\n return\n }\n called = true\n const r = stream._readableState\n const w = stream._writableState\n const s = w || r\n if (r) {\n r.constructed = true\n }\n if (w) {\n w.constructed = true\n }\n if (s.destroyed) {\n stream.emit(kDestroy, err)\n } else if (err) {\n errorOrDestroy(stream, err, true)\n } else {\n process.nextTick(emitConstructNT, stream)\n }\n }\n try {\n stream._construct((err) => {\n process.nextTick(onConstruct, err)\n })\n } catch (err) {\n process.nextTick(onConstruct, err)\n }\n}\nfunction emitConstructNT(stream) {\n stream.emit(kConstruct)\n}\nfunction isRequest(stream) {\n return (stream === null || stream === undefined ? undefined : stream.setHeader) && typeof stream.abort === 'function'\n}\nfunction emitCloseLegacy(stream) {\n stream.emit('close')\n}\nfunction emitErrorCloseLegacy(stream, err) {\n stream.emit('error', err)\n process.nextTick(emitCloseLegacy, stream)\n}\n\n// Normalize destroy for legacy.\nfunction destroyer(stream, err) {\n if (!stream || isDestroyed(stream)) {\n return\n }\n if (!err && !isFinished(stream)) {\n err = new AbortError()\n }\n\n // TODO: Remove isRequest branches.\n if (isServerRequest(stream)) {\n stream.socket = null\n stream.destroy(err)\n } else if (isRequest(stream)) {\n stream.abort()\n } else if (isRequest(stream.req)) {\n stream.req.abort()\n } else if (typeof stream.destroy === 'function') {\n stream.destroy(err)\n } else if (typeof stream.close === 'function') {\n // TODO: Don't lose err?\n stream.close()\n } else if (err) {\n process.nextTick(emitErrorCloseLegacy, stream, err)\n } else {\n process.nextTick(emitCloseLegacy, stream)\n }\n if (!stream.destroyed) {\n stream[kIsDestroyed] = true\n }\n}\nmodule.exports = {\n construct,\n destroyer,\n destroy,\n undestroy,\n errorOrDestroy\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzU4OTYuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVo7O0FBRUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBVTs7QUFFbEM7O0FBRUE7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDO0FBQ0EsRUFBRSxFQUFFLG1CQUFPLENBQUMsS0FBbUI7QUFDL0IsUUFBUSxTQUFTLEVBQUUsbUJBQU8sQ0FBQyxLQUF3QjtBQUNuRCxRQUFRLHlEQUF5RCxFQUFFLG1CQUFPLENBQUMsS0FBUztBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanM/NDY4MSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ3Byb2Nlc3MvJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG5cbmNvbnN0IHtcbiAgYWdncmVnYXRlVHdvRXJyb3JzLFxuICBjb2RlczogeyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0sgfSxcbiAgQWJvcnRFcnJvclxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgU3ltYm9sIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHsga0lzRGVzdHJveWVkLCBpc0Rlc3Ryb3llZCwgaXNGaW5pc2hlZCwgaXNTZXJ2ZXJSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IGtEZXN0cm95ID0gU3ltYm9sKCdrRGVzdHJveScpXG5jb25zdCBrQ29uc3RydWN0ID0gU3ltYm9sKCdrQ29uc3RydWN0JylcbmZ1bmN0aW9uIGNoZWNrRXJyb3IoZXJyLCB3LCByKSB7XG4gIGlmIChlcnIpIHtcbiAgICAvLyBBdm9pZCBWOCBsZWFrLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDEwMyNpc3N1ZWNvbW1lbnQtNjUyMDAyMzY0XG4gICAgZXJyLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cbiAgICBpZiAodyAmJiAhdy5lcnJvcmVkKSB7XG4gICAgICB3LmVycm9yZWQgPSBlcnJcbiAgICB9XG4gICAgaWYgKHIgJiYgIXIuZXJyb3JlZCkge1xuICAgICAgci5lcnJvcmVkID0gZXJyXG4gICAgfVxuICB9XG59XG5cbi8vIEJhY2t3YXJkcyBjb21wYXQuIGNiKCkgaXMgdW5kb2N1bWVudGVkIGFuZCB1bnVzZWQgaW4gY29yZSBidXRcbi8vIHVuZm9ydHVuYXRlbHkgbWlnaHQgYmUgdXNlZCBieSBtb2R1bGVzLlxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIGNvbnN0IHIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gIC8vIFdpdGggZHVwbGV4IHN0cmVhbXMgd2UgdXNlIHRoZSB3cml0YWJsZSBzaWRlIGZvciBzdGF0ZS5cbiAgY29uc3QgcyA9IHcgfHwgclxuICBpZiAoKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcuZGVzdHJveWVkKSB8fCAociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5kZXN0cm95ZWQpKSB7XG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gV2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuICBjaGVja0Vycm9yKGVyciwgdywgcilcbiAgaWYgKHcpIHtcbiAgICB3LmRlc3Ryb3llZCA9IHRydWVcbiAgfVxuICBpZiAocikge1xuICAgIHIuZGVzdHJveWVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gSWYgc3RpbGwgY29uc3RydWN0aW5nIHRoZW4gZGVmZXIgY2FsbGluZyBfZGVzdHJveS5cbiAgaWYgKCFzLmNvbnN0cnVjdGVkKSB7XG4gICAgdGhpcy5vbmNlKGtEZXN0cm95LCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgIF9kZXN0cm95KHRoaXMsIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlciwgZXJyKSwgY2IpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBfZGVzdHJveSh0aGlzLCBlcnIsIGNiKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5mdW5jdGlvbiBfZGVzdHJveShzZWxmLCBlcnIsIGNiKSB7XG4gIGxldCBjYWxsZWQgPSBmYWxzZVxuICBmdW5jdGlvbiBvbkRlc3Ryb3koZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWVcbiAgICBjb25zdCByID0gc2VsZi5fcmVhZGFibGVTdGF0ZVxuICAgIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gICAgY2hlY2tFcnJvcihlcnIsIHcsIHIpXG4gICAgaWYgKHcpIHtcbiAgICAgIHcuY2xvc2VkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAocikge1xuICAgICAgci5jbG9zZWQgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiKGVycilcbiAgICB9XG4gICAgaWYgKGVycikge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JDbG9zZU5ULCBzZWxmLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIHNlbGYpXG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgc2VsZi5fZGVzdHJveShlcnIgfHwgbnVsbCwgb25EZXN0cm95KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBvbkRlc3Ryb3koZXJyKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JDbG9zZU5UKHNlbGYsIGVycikge1xuICBlbWl0RXJyb3JOVChzZWxmLCBlcnIpXG4gIGVtaXRDbG9zZU5UKHNlbGYpXG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIGNvbnN0IHIgPSBzZWxmLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gIGlmICh3KSB7XG4gICAgdy5jbG9zZUVtaXR0ZWQgPSB0cnVlXG4gIH1cbiAgaWYgKHIpIHtcbiAgICByLmNsb3NlRW1pdHRlZCA9IHRydWVcbiAgfVxuICBpZiAoKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcuZW1pdENsb3NlKSB8fCAociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5lbWl0Q2xvc2UpKSB7XG4gICAgc2VsZi5lbWl0KCdjbG9zZScpXG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRFcnJvck5UKHNlbGYsIGVycikge1xuICBjb25zdCByID0gc2VsZi5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3ID0gc2VsZi5fd3JpdGFibGVTdGF0ZVxuICBpZiAoKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcuZXJyb3JFbWl0dGVkKSB8fCAociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5lcnJvckVtaXR0ZWQpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHcpIHtcbiAgICB3LmVycm9yRW1pdHRlZCA9IHRydWVcbiAgfVxuICBpZiAocikge1xuICAgIHIuZXJyb3JFbWl0dGVkID0gdHJ1ZVxuICB9XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG59XG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGNvbnN0IHIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gIGlmIChyKSB7XG4gICAgci5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICByLmNsb3NlZCA9IGZhbHNlXG4gICAgci5jbG9zZUVtaXR0ZWQgPSBmYWxzZVxuICAgIHIuZGVzdHJveWVkID0gZmFsc2VcbiAgICByLmVycm9yZWQgPSBudWxsXG4gICAgci5lcnJvckVtaXR0ZWQgPSBmYWxzZVxuICAgIHIucmVhZGluZyA9IGZhbHNlXG4gICAgci5lbmRlZCA9IHIucmVhZGFibGUgPT09IGZhbHNlXG4gICAgci5lbmRFbWl0dGVkID0gci5yZWFkYWJsZSA9PT0gZmFsc2VcbiAgfVxuICBpZiAodykge1xuICAgIHcuY29uc3RydWN0ZWQgPSB0cnVlXG4gICAgdy5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIHcuY2xvc2VkID0gZmFsc2VcbiAgICB3LmNsb3NlRW1pdHRlZCA9IGZhbHNlXG4gICAgdy5lcnJvcmVkID0gbnVsbFxuICAgIHcuZXJyb3JFbWl0dGVkID0gZmFsc2VcbiAgICB3LmZpbmFsQ2FsbGVkID0gZmFsc2VcbiAgICB3LnByZWZpbmlzaGVkID0gZmFsc2VcbiAgICB3LmVuZGVkID0gdy53cml0YWJsZSA9PT0gZmFsc2VcbiAgICB3LmVuZGluZyA9IHcud3JpdGFibGUgPT09IGZhbHNlXG4gICAgdy5maW5pc2hlZCA9IHcud3JpdGFibGUgPT09IGZhbHNlXG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyLCBzeW5jKSB7XG4gIC8vIFdlIGhhdmUgdGVzdHMgdGhhdCByZWx5IG9uIGVycm9ycyBiZWluZyBlbWl0dGVkXG4gIC8vIGluIHRoZSBzYW1lIHRpY2ssIHNvIGNoYW5naW5nIHRoaXMgaXMgc2VtdmVyIG1ham9yLlxuICAvLyBGb3Igbm93IHdoZW4geW91IG9wdC1pbiB0byBhdXRvRGVzdHJveSB3ZSBhbGxvd1xuICAvLyB0aGUgZXJyb3IgdG8gYmUgZW1pdHRlZCBuZXh0VGljay4gSW4gYSBmdXR1cmVcbiAgLy8gc2VtdmVyIG1ham9yIHVwZGF0ZSB3ZSBzaG91bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHRvIHRoaXMuXG5cbiAgY29uc3QgciA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICgodyAhPT0gbnVsbCAmJiB3ICE9PSB1bmRlZmluZWQgJiYgdy5kZXN0cm95ZWQpIHx8IChyICE9PSBudWxsICYmIHIgIT09IHVuZGVmaW5lZCAmJiByLmRlc3Ryb3llZCkpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIGlmICgociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5hdXRvRGVzdHJveSkgfHwgKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcuYXV0b0Rlc3Ryb3kpKVxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgZWxzZSBpZiAoZXJyKSB7XG4gICAgLy8gQXZvaWQgVjggbGVhaywgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzQxMDMjaXNzdWVjb21tZW50LTY1MjAwMjM2NFxuICAgIGVyci5zdGFjayAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXG4gICAgaWYgKHcgJiYgIXcuZXJyb3JlZCkge1xuICAgICAgdy5lcnJvcmVkID0gZXJyXG4gICAgfVxuICAgIGlmIChyICYmICFyLmVycm9yZWQpIHtcbiAgICAgIHIuZXJyb3JlZCA9IGVyclxuICAgIH1cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JOVCwgc3RyZWFtLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXRFcnJvck5UKHN0cmVhbSwgZXJyKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY29uc3RydWN0KHN0cmVhbSwgY2IpIHtcbiAgaWYgKHR5cGVvZiBzdHJlYW0uX2NvbnN0cnVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHIgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBpZiAocikge1xuICAgIHIuY29uc3RydWN0ZWQgPSBmYWxzZVxuICB9XG4gIGlmICh3KSB7XG4gICAgdy5jb25zdHJ1Y3RlZCA9IGZhbHNlXG4gIH1cbiAgc3RyZWFtLm9uY2Uoa0NvbnN0cnVjdCwgY2IpXG4gIGlmIChzdHJlYW0ubGlzdGVuZXJDb3VudChrQ29uc3RydWN0KSA+IDEpIHtcbiAgICAvLyBEdXBsZXhcbiAgICByZXR1cm5cbiAgfVxuICBwcm9jZXNzLm5leHRUaWNrKGNvbnN0cnVjdE5ULCBzdHJlYW0pXG59XG5mdW5jdGlvbiBjb25zdHJ1Y3ROVChzdHJlYW0pIHtcbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uQ29uc3RydWN0KGVycikge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyICE9PSBudWxsICYmIGVyciAhPT0gdW5kZWZpbmVkID8gZXJyIDogbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSygpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWVcbiAgICBjb25zdCByID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gICAgY29uc3QgdyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICAgIGNvbnN0IHMgPSB3IHx8IHJcbiAgICBpZiAocikge1xuICAgICAgci5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKHcpIHtcbiAgICAgIHcuY29uc3RydWN0ZWQgPSB0cnVlXG4gICAgfVxuICAgIGlmIChzLmRlc3Ryb3llZCkge1xuICAgICAgc3RyZWFtLmVtaXQoa0Rlc3Ryb3ksIGVycilcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIsIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENvbnN0cnVjdE5ULCBzdHJlYW0pXG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgc3RyZWFtLl9jb25zdHJ1Y3QoKGVycikgPT4ge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhvbkNvbnN0cnVjdCwgZXJyKVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2sob25Db25zdHJ1Y3QsIGVycilcbiAgfVxufVxuZnVuY3Rpb24gZW1pdENvbnN0cnVjdE5UKHN0cmVhbSkge1xuICBzdHJlYW0uZW1pdChrQ29uc3RydWN0KVxufVxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gKHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHN0cmVhbS5zZXRIZWFkZXIpICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICdmdW5jdGlvbidcbn1cbmZ1bmN0aW9uIGVtaXRDbG9zZUxlZ2FjeShzdHJlYW0pIHtcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbn1cbmZ1bmN0aW9uIGVtaXRFcnJvckNsb3NlTGVnYWN5KHN0cmVhbSwgZXJyKSB7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VMZWdhY3ksIHN0cmVhbSlcbn1cblxuLy8gTm9ybWFsaXplIGRlc3Ryb3kgZm9yIGxlZ2FjeS5cbmZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0sIGVycikge1xuICBpZiAoIXN0cmVhbSB8fCBpc0Rlc3Ryb3llZChzdHJlYW0pKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKCFlcnIgJiYgIWlzRmluaXNoZWQoc3RyZWFtKSkge1xuICAgIGVyciA9IG5ldyBBYm9ydEVycm9yKClcbiAgfVxuXG4gIC8vIFRPRE86IFJlbW92ZSBpc1JlcXVlc3QgYnJhbmNoZXMuXG4gIGlmIChpc1NlcnZlclJlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5zb2NrZXQgPSBudWxsXG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB9IGVsc2UgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG4gICAgc3RyZWFtLmFib3J0KClcbiAgfSBlbHNlIGlmIChpc1JlcXVlc3Qoc3RyZWFtLnJlcSkpIHtcbiAgICBzdHJlYW0ucmVxLmFib3J0KClcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyZWFtLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHJlYW0uZGVzdHJveShlcnIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHN0cmVhbS5jbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRPRE86IERvbid0IGxvc2UgZXJyP1xuICAgIHN0cmVhbS5jbG9zZSgpXG4gIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JDbG9zZUxlZ2FjeSwgc3RyZWFtLCBlcnIpXG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VMZWdhY3ksIHN0cmVhbSlcbiAgfVxuICBpZiAoIXN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICBzdHJlYW1ba0lzRGVzdHJveWVkXSA9IHRydWVcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbnN0cnVjdCxcbiAgZGVzdHJveWVyLFxuICBkZXN0cm95LFxuICB1bmRlc3Ryb3ksXG4gIGVycm9yT3JEZXN0cm95XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///75896\n")},93370:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototype inheritance, this class\n// prototypically inherits from Readable, and then parasitically from\n// Writable.\n\n\n\nconst {\n ObjectDefineProperties,\n ObjectGetOwnPropertyDescriptor,\n ObjectKeys,\n ObjectSetPrototypeOf\n} = __webpack_require__(24134)\nmodule.exports = Duplex\nconst Readable = __webpack_require__(57576)\nconst Writable = __webpack_require__(78584)\nObjectSetPrototypeOf(Duplex.prototype, Readable.prototype)\nObjectSetPrototypeOf(Duplex, Readable)\n{\n const keys = ObjectKeys(Writable.prototype)\n // Allow the keys array to be GC'ed.\n for (let i = 0; i < keys.length; i++) {\n const method = keys[i]\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]\n }\n}\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options)\n Readable.call(this, options)\n Writable.call(this, options)\n if (options) {\n this.allowHalfOpen = options.allowHalfOpen !== false\n if (options.readable === false) {\n this._readableState.readable = false\n this._readableState.ended = true\n this._readableState.endEmitted = true\n }\n if (options.writable === false) {\n this._writableState.writable = false\n this._writableState.ending = true\n this._writableState.ended = true\n this._writableState.finished = true\n }\n } else {\n this.allowHalfOpen = true\n }\n}\nObjectDefineProperties(Duplex.prototype, {\n writable: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writable')\n },\n writableHighWaterMark: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableHighWaterMark')\n },\n writableObjectMode: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableObjectMode')\n },\n writableBuffer: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableBuffer')\n },\n writableLength: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableLength')\n },\n writableFinished: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableFinished')\n },\n writableCorked: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableCorked')\n },\n writableEnded: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableEnded')\n },\n writableNeedDrain: {\n __proto__: null,\n ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableNeedDrain')\n },\n destroyed: {\n __proto__: null,\n get() {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false\n }\n return this._readableState.destroyed && this._writableState.destroyed\n },\n set(value) {\n // Backward compatibility, the user is explicitly\n // managing destroyed.\n if (this._readableState && this._writableState) {\n this._readableState.destroyed = value\n this._writableState.destroyed = value\n }\n }\n }\n})\nlet webStreamsAdapters\n\n// Lazy to avoid circular references\nfunction lazyWebStreams() {\n if (webStreamsAdapters === undefined) webStreamsAdapters = {}\n return webStreamsAdapters\n}\nDuplex.fromWeb = function (pair, options) {\n return lazyWebStreams().newStreamDuplexFromReadableWritablePair(pair, options)\n}\nDuplex.toWeb = function (duplex) {\n return lazyWebStreams().newReadableWritablePairFromDuplex(duplex)\n}\nlet duplexify\nDuplex.from = function (body) {\n if (!duplexify) {\n duplexify = __webpack_require__(46706)\n }\n return duplexify(body, 'body')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMzNzAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLG1CQUFPLENBQUMsS0FBd0I7QUFDcEM7QUFDQSxpQkFBaUIsbUJBQU8sQ0FBQyxLQUFZO0FBQ3JDLGlCQUFpQixtQkFBTyxDQUFDLEtBQVk7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsbUJBQU8sQ0FBQyxLQUFhO0FBQ3JDO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2R1cGxleC5qcz85Y2M3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwZSBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBpY2FsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgT2JqZWN0RGVmaW5lUHJvcGVydGllcyxcbiAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBPYmplY3RLZXlzLFxuICBPYmplY3RTZXRQcm90b3R5cGVPZlxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXhcbmNvbnN0IFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG5jb25zdCBXcml0YWJsZSA9IHJlcXVpcmUoJy4vd3JpdGFibGUnKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LnByb3RvdHlwZSwgUmVhZGFibGUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LCBSZWFkYWJsZSlcbntcbiAgY29uc3Qga2V5cyA9IE9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKVxuICAvLyBBbGxvdyB0aGUga2V5cyBhcnJheSB0byBiZSBHQydlZC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWV0aG9kID0ga2V5c1tpXVxuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXVxuICB9XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucylcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKVxuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gb3B0aW9ucy5hbGxvd0hhbGZPcGVuICE9PSBmYWxzZVxuICAgIGlmIChvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZVxuICB9XG59XG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKER1cGxleC5wcm90b3R5cGUsIHtcbiAgd3JpdGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlJylcbiAgfSxcbiAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnKVxuICB9LFxuICB3cml0YWJsZU9iamVjdE1vZGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlT2JqZWN0TW9kZScpXG4gIH0sXG4gIHdyaXRhYmxlQnVmZmVyOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicpXG4gIH0sXG4gIHdyaXRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUxlbmd0aCcpXG4gIH0sXG4gIHdyaXRhYmxlRmluaXNoZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlRmluaXNoZWQnKVxuICB9LFxuICB3cml0YWJsZUNvcmtlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAuLi5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVDb3JrZWQnKVxuICB9LFxuICB3cml0YWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUVuZGVkJylcbiAgfSxcbiAgd3JpdGFibGVOZWVkRHJhaW46IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlTmVlZERyYWluJylcbiAgfSxcbiAgZGVzdHJveWVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZC5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cbkR1cGxleC5mcm9tV2ViID0gZnVuY3Rpb24gKHBhaXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtRHVwbGV4RnJvbVJlYWRhYmxlV3JpdGFibGVQYWlyKHBhaXIsIG9wdGlvbnMpXG59XG5EdXBsZXgudG9XZWIgPSBmdW5jdGlvbiAoZHVwbGV4KSB7XG4gIHJldHVybiBsYXp5V2ViU3RyZWFtcygpLm5ld1JlYWRhYmxlV3JpdGFibGVQYWlyRnJvbUR1cGxleChkdXBsZXgpXG59XG5sZXQgZHVwbGV4aWZ5XG5EdXBsZXguZnJvbSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gIGlmICghZHVwbGV4aWZ5KSB7XG4gICAgZHVwbGV4aWZ5ID0gcmVxdWlyZSgnLi9kdXBsZXhpZnknKVxuICB9XG4gIHJldHVybiBkdXBsZXhpZnkoYm9keSwgJ2JvZHknKVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///93370\n")},46706:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/* replacement start */\n\nconst process = __webpack_require__(54422)\n\n/* replacement end */\n\n;('use strict')\nconst bufferModule = __webpack_require__(20181)\nconst {\n isReadable,\n isWritable,\n isIterable,\n isNodeStream,\n isReadableNodeStream,\n isWritableNodeStream,\n isDuplexNodeStream,\n isReadableStream,\n isWritableStream\n} = __webpack_require__(16115)\nconst eos = __webpack_require__(86238)\nconst {\n AbortError,\n codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_RETURN_VALUE }\n} = __webpack_require__(76371)\nconst { destroyer } = __webpack_require__(75896)\nconst Duplex = __webpack_require__(93370)\nconst Readable = __webpack_require__(57576)\nconst Writable = __webpack_require__(78584)\nconst { createDeferredPromise } = __webpack_require__(57760)\nconst from = __webpack_require__(96532)\nconst Blob = globalThis.Blob || bufferModule.Blob\nconst isBlob =\n typeof Blob !== 'undefined'\n ? function isBlob(b) {\n return b instanceof Blob\n }\n : function isBlob(b) {\n return false\n }\nconst AbortController = globalThis.AbortController || (__webpack_require__(66584).AbortController)\nconst { FunctionPrototypeCall } = __webpack_require__(24134)\n\n// This is needed for pre node 17.\nclass Duplexify extends Duplex {\n constructor(options) {\n super(options)\n\n // https://github.com/nodejs/node/pull/34385\n\n if ((options === null || options === undefined ? undefined : options.readable) === false) {\n this._readableState.readable = false\n this._readableState.ended = true\n this._readableState.endEmitted = true\n }\n if ((options === null || options === undefined ? undefined : options.writable) === false) {\n this._writableState.writable = false\n this._writableState.ending = true\n this._writableState.ended = true\n this._writableState.finished = true\n }\n }\n}\nmodule.exports = function duplexify(body, name) {\n if (isDuplexNodeStream(body)) {\n return body\n }\n if (isReadableNodeStream(body)) {\n return _duplexify({\n readable: body\n })\n }\n if (isWritableNodeStream(body)) {\n return _duplexify({\n writable: body\n })\n }\n if (isNodeStream(body)) {\n return _duplexify({\n writable: false,\n readable: false\n })\n }\n if (isReadableStream(body)) {\n return _duplexify({\n readable: Readable.fromWeb(body)\n })\n }\n if (isWritableStream(body)) {\n return _duplexify({\n writable: Writable.fromWeb(body)\n })\n }\n if (typeof body === 'function') {\n const { value, write, final, destroy } = fromAsyncGen(body)\n if (isIterable(value)) {\n return from(Duplexify, value, {\n // TODO (ronag): highWaterMark?\n objectMode: true,\n write,\n final,\n destroy\n })\n }\n const then = value === null || value === undefined ? undefined : value.then\n if (typeof then === 'function') {\n let d\n const promise = FunctionPrototypeCall(\n then,\n value,\n (val) => {\n if (val != null) {\n throw new ERR_INVALID_RETURN_VALUE('nully', 'body', val)\n }\n },\n (err) => {\n destroyer(d, err)\n }\n )\n return (d = new Duplexify({\n // TODO (ronag): highWaterMark?\n objectMode: true,\n readable: false,\n write,\n final(cb) {\n final(async () => {\n try {\n await promise\n process.nextTick(cb, null)\n } catch (err) {\n process.nextTick(cb, err)\n }\n })\n },\n destroy\n }))\n }\n throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or AsyncFunction', name, value)\n }\n if (isBlob(body)) {\n return duplexify(body.arrayBuffer())\n }\n if (isIterable(body)) {\n return from(Duplexify, body, {\n // TODO (ronag): highWaterMark?\n objectMode: true,\n writable: false\n })\n }\n if (\n isReadableStream(body === null || body === undefined ? undefined : body.readable) &&\n isWritableStream(body === null || body === undefined ? undefined : body.writable)\n ) {\n return Duplexify.fromWeb(body)\n }\n if (\n typeof (body === null || body === undefined ? undefined : body.writable) === 'object' ||\n typeof (body === null || body === undefined ? undefined : body.readable) === 'object'\n ) {\n const readable =\n body !== null && body !== undefined && body.readable\n ? isReadableNodeStream(body === null || body === undefined ? undefined : body.readable)\n ? body === null || body === undefined\n ? undefined\n : body.readable\n : duplexify(body.readable)\n : undefined\n const writable =\n body !== null && body !== undefined && body.writable\n ? isWritableNodeStream(body === null || body === undefined ? undefined : body.writable)\n ? body === null || body === undefined\n ? undefined\n : body.writable\n : duplexify(body.writable)\n : undefined\n return _duplexify({\n readable,\n writable\n })\n }\n const then = body === null || body === undefined ? undefined : body.then\n if (typeof then === 'function') {\n let d\n FunctionPrototypeCall(\n then,\n body,\n (val) => {\n if (val != null) {\n d.push(val)\n }\n d.push(null)\n },\n (err) => {\n destroyer(d, err)\n }\n )\n return (d = new Duplexify({\n objectMode: true,\n writable: false,\n read() {}\n }))\n }\n throw new ERR_INVALID_ARG_TYPE(\n name,\n [\n 'Blob',\n 'ReadableStream',\n 'WritableStream',\n 'Stream',\n 'Iterable',\n 'AsyncIterable',\n 'Function',\n '{ readable, writable } pair',\n 'Promise'\n ],\n body\n )\n}\nfunction fromAsyncGen(fn) {\n let { promise, resolve } = createDeferredPromise()\n const ac = new AbortController()\n const signal = ac.signal\n const value = fn(\n (async function* () {\n while (true) {\n const _promise = promise\n promise = null\n const { chunk, done, cb } = await _promise\n process.nextTick(cb)\n if (done) return\n if (signal.aborted)\n throw new AbortError(undefined, {\n cause: signal.reason\n })\n ;({ promise, resolve } = createDeferredPromise())\n yield chunk\n }\n })(),\n {\n signal\n }\n )\n return {\n value,\n write(chunk, encoding, cb) {\n const _resolve = resolve\n resolve = null\n _resolve({\n chunk,\n done: false,\n cb\n })\n },\n final(cb) {\n const _resolve = resolve\n resolve = null\n _resolve({\n done: true,\n cb\n })\n },\n destroy(err, cb) {\n ac.abort()\n cb(err)\n }\n }\n}\nfunction _duplexify(pair) {\n const r = pair.readable && typeof pair.readable.read !== 'function' ? Readable.wrap(pair.readable) : pair.readable\n const w = pair.writable\n let readable = !!isReadable(r)\n let writable = !!isWritable(w)\n let ondrain\n let onfinish\n let onreadable\n let onclose\n let d\n function onfinished(err) {\n const cb = onclose\n onclose = null\n if (cb) {\n cb(err)\n } else if (err) {\n d.destroy(err)\n }\n }\n\n // TODO(ronag): Avoid double buffering.\n // Implement Writable/Readable/Duplex traits.\n // See, https://github.com/nodejs/node/pull/33515.\n d = new Duplexify({\n // TODO (ronag): highWaterMark?\n readableObjectMode: !!(r !== null && r !== undefined && r.readableObjectMode),\n writableObjectMode: !!(w !== null && w !== undefined && w.writableObjectMode),\n readable,\n writable\n })\n if (writable) {\n eos(w, (err) => {\n writable = false\n if (err) {\n destroyer(r, err)\n }\n onfinished(err)\n })\n d._write = function (chunk, encoding, callback) {\n if (w.write(chunk, encoding)) {\n callback()\n } else {\n ondrain = callback\n }\n }\n d._final = function (callback) {\n w.end()\n onfinish = callback\n }\n w.on('drain', function () {\n if (ondrain) {\n const cb = ondrain\n ondrain = null\n cb()\n }\n })\n w.on('finish', function () {\n if (onfinish) {\n const cb = onfinish\n onfinish = null\n cb()\n }\n })\n }\n if (readable) {\n eos(r, (err) => {\n readable = false\n if (err) {\n destroyer(r, err)\n }\n onfinished(err)\n })\n r.on('readable', function () {\n if (onreadable) {\n const cb = onreadable\n onreadable = null\n cb()\n }\n })\n r.on('end', function () {\n d.push(null)\n })\n d._read = function () {\n while (true) {\n const buf = r.read()\n if (buf === null) {\n onreadable = d._read\n return\n }\n if (!d.push(buf)) {\n return\n }\n }\n }\n }\n d._destroy = function (err, callback) {\n if (!err && onclose !== null) {\n err = new AbortError()\n }\n onreadable = null\n ondrain = null\n onfinish = null\n if (onclose === null) {\n callback(err)\n } else {\n onclose = callback\n destroyer(w, err)\n destroyer(r, err)\n }\n }\n return d\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2R1cGxleGlmeS5qcz8wYTMxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuXG47KCd1c2Ugc3RyaWN0JylcbmNvbnN0IGJ1ZmZlck1vZHVsZSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7XG4gIGlzUmVhZGFibGUsXG4gIGlzV3JpdGFibGUsXG4gIGlzSXRlcmFibGUsXG4gIGlzTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZU5vZGVTdHJlYW0sXG4gIGlzV3JpdGFibGVOb2RlU3RyZWFtLFxuICBpc0R1cGxleE5vZGVTdHJlYW0sXG4gIGlzUmVhZGFibGVTdHJlYW0sXG4gIGlzV3JpdGFibGVTdHJlYW1cbn0gPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5jb25zdCB7XG4gIEFib3J0RXJyb3IsXG4gIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUgfVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgZGVzdHJveWVyIH0gPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgUmVhZGFibGUgPSByZXF1aXJlKCcuL3JlYWRhYmxlJylcbmNvbnN0IFdyaXRhYmxlID0gcmVxdWlyZSgnLi93cml0YWJsZScpXG5jb25zdCB7IGNyZWF0ZURlZmVycmVkUHJvbWlzZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbmNvbnN0IGZyb20gPSByZXF1aXJlKCcuL2Zyb20nKVxuY29uc3QgQmxvYiA9IGdsb2JhbFRoaXMuQmxvYiB8fCBidWZmZXJNb2R1bGUuQmxvYlxuY29uc3QgaXNCbG9iID1cbiAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnXG4gICAgPyBmdW5jdGlvbiBpc0Jsb2IoYikge1xuICAgICAgICByZXR1cm4gYiBpbnN0YW5jZW9mIEJsb2JcbiAgICAgIH1cbiAgICA6IGZ1bmN0aW9uIGlzQmxvYihiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuY29uc3QgQWJvcnRDb250cm9sbGVyID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0Q29udHJvbGxlclxuY29uc3QgeyBGdW5jdGlvblByb3RvdHlwZUNhbGwgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuXG4vLyBUaGlzIGlzIG5lZWRlZCBmb3IgcHJlIG5vZGUgMTcuXG5jbGFzcyBEdXBsZXhpZnkgZXh0ZW5kcyBEdXBsZXgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucylcblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM0Mzg1XG5cbiAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5yZWFkYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRhYmxlID0gZmFsc2VcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQgPSB0cnVlXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlXG4gICAgfVxuICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLndyaXRhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IHRydWVcbiAgICB9XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZHVwbGV4aWZ5KGJvZHksIG5hbWUpIHtcbiAgaWYgKGlzRHVwbGV4Tm9kZVN0cmVhbShib2R5KSkge1xuICAgIHJldHVybiBib2R5XG4gIH1cbiAgaWYgKGlzUmVhZGFibGVOb2RlU3RyZWFtKGJvZHkpKSB7XG4gICAgcmV0dXJuIF9kdXBsZXhpZnkoe1xuICAgICAgcmVhZGFibGU6IGJvZHlcbiAgICB9KVxuICB9XG4gIGlmIChpc1dyaXRhYmxlTm9kZVN0cmVhbShib2R5KSkge1xuICAgIHJldHVybiBfZHVwbGV4aWZ5KHtcbiAgICAgIHdyaXRhYmxlOiBib2R5XG4gICAgfSlcbiAgfVxuICBpZiAoaXNOb2RlU3RyZWFtKGJvZHkpKSB7XG4gICAgcmV0dXJuIF9kdXBsZXhpZnkoe1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgcmVhZGFibGU6IGZhbHNlXG4gICAgfSlcbiAgfVxuICBpZiAoaXNSZWFkYWJsZVN0cmVhbShib2R5KSkge1xuICAgIHJldHVybiBfZHVwbGV4aWZ5KHtcbiAgICAgIHJlYWRhYmxlOiBSZWFkYWJsZS5mcm9tV2ViKGJvZHkpXG4gICAgfSlcbiAgfVxuICBpZiAoaXNXcml0YWJsZVN0cmVhbShib2R5KSkge1xuICAgIHJldHVybiBfZHVwbGV4aWZ5KHtcbiAgICAgIHdyaXRhYmxlOiBXcml0YWJsZS5mcm9tV2ViKGJvZHkpXG4gICAgfSlcbiAgfVxuICBpZiAodHlwZW9mIGJvZHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCB7IHZhbHVlLCB3cml0ZSwgZmluYWwsIGRlc3Ryb3kgfSA9IGZyb21Bc3luY0dlbihib2R5KVxuICAgIGlmIChpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZyb20oRHVwbGV4aWZ5LCB2YWx1ZSwge1xuICAgICAgICAvLyBUT0RPIChyb25hZyk6IGhpZ2hXYXRlck1hcms/XG4gICAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAgIHdyaXRlLFxuICAgICAgICBmaW5hbCxcbiAgICAgICAgZGVzdHJveVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgdGhlbiA9IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB2YWx1ZS50aGVuXG4gICAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBsZXQgZFxuICAgICAgY29uc3QgcHJvbWlzZSA9IEZ1bmN0aW9uUHJvdG90eXBlQ2FsbChcbiAgICAgICAgdGhlbixcbiAgICAgICAgdmFsdWUsXG4gICAgICAgICh2YWwpID0+IHtcbiAgICAgICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ251bGx5JywgJ2JvZHknLCB2YWwpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgZGVzdHJveWVyKGQsIGVycilcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgcmV0dXJuIChkID0gbmV3IER1cGxleGlmeSh7XG4gICAgICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgICB3cml0ZSxcbiAgICAgICAgZmluYWwoY2IpIHtcbiAgICAgICAgICBmaW5hbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBwcm9taXNlXG4gICAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIG51bGwpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGRlc3Ryb3lcbiAgICAgIH0pKVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdJdGVyYWJsZSwgQXN5bmNJdGVyYWJsZSBvciBBc3luY0Z1bmN0aW9uJywgbmFtZSwgdmFsdWUpXG4gIH1cbiAgaWYgKGlzQmxvYihib2R5KSkge1xuICAgIHJldHVybiBkdXBsZXhpZnkoYm9keS5hcnJheUJ1ZmZlcigpKVxuICB9XG4gIGlmIChpc0l0ZXJhYmxlKGJvZHkpKSB7XG4gICAgcmV0dXJuIGZyb20oRHVwbGV4aWZ5LCBib2R5LCB7XG4gICAgICAvLyBUT0RPIChyb25hZyk6IGhpZ2hXYXRlck1hcms/XG4gICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgfSlcbiAgfVxuICBpZiAoXG4gICAgaXNSZWFkYWJsZVN0cmVhbShib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkucmVhZGFibGUpICYmXG4gICAgaXNXcml0YWJsZVN0cmVhbShib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkud3JpdGFibGUpXG4gICkge1xuICAgIHJldHVybiBEdXBsZXhpZnkuZnJvbVdlYihib2R5KVxuICB9XG4gIGlmIChcbiAgICB0eXBlb2YgKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS53cml0YWJsZSkgPT09ICdvYmplY3QnIHx8XG4gICAgdHlwZW9mIChib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkucmVhZGFibGUpID09PSAnb2JqZWN0J1xuICApIHtcbiAgICBjb25zdCByZWFkYWJsZSA9XG4gICAgICBib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCAmJiBib2R5LnJlYWRhYmxlXG4gICAgICAgID8gaXNSZWFkYWJsZU5vZGVTdHJlYW0oYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LnJlYWRhYmxlKVxuICAgICAgICAgID8gYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGJvZHkucmVhZGFibGVcbiAgICAgICAgICA6IGR1cGxleGlmeShib2R5LnJlYWRhYmxlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IHdyaXRhYmxlID1cbiAgICAgIGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkICYmIGJvZHkud3JpdGFibGVcbiAgICAgICAgPyBpc1dyaXRhYmxlTm9kZVN0cmVhbShib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkud3JpdGFibGUpXG4gICAgICAgICAgPyBib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogYm9keS53cml0YWJsZVxuICAgICAgICAgIDogZHVwbGV4aWZ5KGJvZHkud3JpdGFibGUpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgcmV0dXJuIF9kdXBsZXhpZnkoe1xuICAgICAgcmVhZGFibGUsXG4gICAgICB3cml0YWJsZVxuICAgIH0pXG4gIH1cbiAgY29uc3QgdGhlbiA9IGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS50aGVuXG4gIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxldCBkXG4gICAgRnVuY3Rpb25Qcm90b3R5cGVDYWxsKFxuICAgICAgdGhlbixcbiAgICAgIGJvZHksXG4gICAgICAodmFsKSA9PiB7XG4gICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgIGQucHVzaCh2YWwpXG4gICAgICAgIH1cbiAgICAgICAgZC5wdXNoKG51bGwpXG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBkZXN0cm95ZXIoZCwgZXJyKVxuICAgICAgfVxuICAgIClcbiAgICByZXR1cm4gKGQgPSBuZXcgRHVwbGV4aWZ5KHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICByZWFkKCkge31cbiAgICB9KSlcbiAgfVxuICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoXG4gICAgbmFtZSxcbiAgICBbXG4gICAgICAnQmxvYicsXG4gICAgICAnUmVhZGFibGVTdHJlYW0nLFxuICAgICAgJ1dyaXRhYmxlU3RyZWFtJyxcbiAgICAgICdTdHJlYW0nLFxuICAgICAgJ0l0ZXJhYmxlJyxcbiAgICAgICdBc3luY0l0ZXJhYmxlJyxcbiAgICAgICdGdW5jdGlvbicsXG4gICAgICAneyByZWFkYWJsZSwgd3JpdGFibGUgfSBwYWlyJyxcbiAgICAgICdQcm9taXNlJ1xuICAgIF0sXG4gICAgYm9keVxuICApXG59XG5mdW5jdGlvbiBmcm9tQXN5bmNHZW4oZm4pIHtcbiAgbGV0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcbiAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgY29uc3Qgc2lnbmFsID0gYWMuc2lnbmFsXG4gIGNvbnN0IHZhbHVlID0gZm4oXG4gICAgKGFzeW5jIGZ1bmN0aW9uKiAoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBfcHJvbWlzZSA9IHByb21pc2VcbiAgICAgICAgcHJvbWlzZSA9IG51bGxcbiAgICAgICAgY29uc3QgeyBjaHVuaywgZG9uZSwgY2IgfSA9IGF3YWl0IF9wcm9taXNlXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gICAgICAgIGlmIChkb25lKSByZXR1cm5cbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKVxuICAgICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgY2F1c2U6IHNpZ25hbC5yZWFzb25cbiAgICAgICAgICB9KVxuICAgICAgICA7KHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKCkpXG4gICAgICAgIHlpZWxkIGNodW5rXG4gICAgICB9XG4gICAgfSkoKSxcbiAgICB7XG4gICAgICBzaWduYWxcbiAgICB9XG4gIClcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZSxcbiAgICB3cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gICAgICBjb25zdCBfcmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIHJlc29sdmUgPSBudWxsXG4gICAgICBfcmVzb2x2ZSh7XG4gICAgICAgIGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgY2JcbiAgICAgIH0pXG4gICAgfSxcbiAgICBmaW5hbChjYikge1xuICAgICAgY29uc3QgX3Jlc29sdmUgPSByZXNvbHZlXG4gICAgICByZXNvbHZlID0gbnVsbFxuICAgICAgX3Jlc29sdmUoe1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICBjYlxuICAgICAgfSlcbiAgICB9LFxuICAgIGRlc3Ryb3koZXJyLCBjYikge1xuICAgICAgYWMuYWJvcnQoKVxuICAgICAgY2IoZXJyKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gX2R1cGxleGlmeShwYWlyKSB7XG4gIGNvbnN0IHIgPSBwYWlyLnJlYWRhYmxlICYmIHR5cGVvZiBwYWlyLnJlYWRhYmxlLnJlYWQgIT09ICdmdW5jdGlvbicgPyBSZWFkYWJsZS53cmFwKHBhaXIucmVhZGFibGUpIDogcGFpci5yZWFkYWJsZVxuICBjb25zdCB3ID0gcGFpci53cml0YWJsZVxuICBsZXQgcmVhZGFibGUgPSAhIWlzUmVhZGFibGUocilcbiAgbGV0IHdyaXRhYmxlID0gISFpc1dyaXRhYmxlKHcpXG4gIGxldCBvbmRyYWluXG4gIGxldCBvbmZpbmlzaFxuICBsZXQgb25yZWFkYWJsZVxuICBsZXQgb25jbG9zZVxuICBsZXQgZFxuICBmdW5jdGlvbiBvbmZpbmlzaGVkKGVycikge1xuICAgIGNvbnN0IGNiID0gb25jbG9zZVxuICAgIG9uY2xvc2UgPSBudWxsXG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpXG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIGQuZGVzdHJveShlcnIpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyhyb25hZyk6IEF2b2lkIGRvdWJsZSBidWZmZXJpbmcuXG4gIC8vIEltcGxlbWVudCBXcml0YWJsZS9SZWFkYWJsZS9EdXBsZXggdHJhaXRzLlxuICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMzNTE1LlxuICBkID0gbmV3IER1cGxleGlmeSh7XG4gICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgIHJlYWRhYmxlT2JqZWN0TW9kZTogISEociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5yZWFkYWJsZU9iamVjdE1vZGUpLFxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogISEodyAhPT0gbnVsbCAmJiB3ICE9PSB1bmRlZmluZWQgJiYgdy53cml0YWJsZU9iamVjdE1vZGUpLFxuICAgIHJlYWRhYmxlLFxuICAgIHdyaXRhYmxlXG4gIH0pXG4gIGlmICh3cml0YWJsZSkge1xuICAgIGVvcyh3LCAoZXJyKSA9PiB7XG4gICAgICB3cml0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGRlc3Ryb3llcihyLCBlcnIpXG4gICAgICB9XG4gICAgICBvbmZpbmlzaGVkKGVycilcbiAgICB9KVxuICAgIGQuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgIGlmICh3LndyaXRlKGNodW5rLCBlbmNvZGluZykpIHtcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25kcmFpbiA9IGNhbGxiYWNrXG4gICAgICB9XG4gICAgfVxuICAgIGQuX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICB3LmVuZCgpXG4gICAgICBvbmZpbmlzaCA9IGNhbGxiYWNrXG4gICAgfVxuICAgIHcub24oJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9uZHJhaW4pIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbmRyYWluXG4gICAgICAgIG9uZHJhaW4gPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHcub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbmZpbmlzaCkge1xuICAgICAgICBjb25zdCBjYiA9IG9uZmluaXNoXG4gICAgICAgIG9uZmluaXNoID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBpZiAocmVhZGFibGUpIHtcbiAgICBlb3MociwgKGVycikgPT4ge1xuICAgICAgcmVhZGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBkZXN0cm95ZXIociwgZXJyKVxuICAgICAgfVxuICAgICAgb25maW5pc2hlZChlcnIpXG4gICAgfSlcbiAgICByLm9uKCdyZWFkYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbnJlYWRhYmxlKSB7XG4gICAgICAgIGNvbnN0IGNiID0gb25yZWFkYWJsZVxuICAgICAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgICByLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkLnB1c2gobnVsbClcbiAgICB9KVxuICAgIGQuX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBidWYgPSByLnJlYWQoKVxuICAgICAgICBpZiAoYnVmID09PSBudWxsKSB7XG4gICAgICAgICAgb25yZWFkYWJsZSA9IGQuX3JlYWRcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWQucHVzaChidWYpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZC5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFlcnIgJiYgb25jbG9zZSAhPT0gbnVsbCkge1xuICAgICAgZXJyID0gbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgIG9uZHJhaW4gPSBudWxsXG4gICAgb25maW5pc2ggPSBudWxsXG4gICAgaWYgKG9uY2xvc2UgPT09IG51bGwpIHtcbiAgICAgIGNhbGxiYWNrKGVycilcbiAgICB9IGVsc2Uge1xuICAgICAgb25jbG9zZSA9IGNhbGxiYWNrXG4gICAgICBkZXN0cm95ZXIodywgZXJyKVxuICAgICAgZGVzdHJveWVyKHIsIGVycilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///46706\n")},86238:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/* replacement start */\n\nconst process = __webpack_require__(54422)\n\n/* replacement end */\n// Ported from https://github.com/mafintosh/end-of-stream with\n// permission from the author, Mathias Buus (@mafintosh).\n\n;('use strict')\nconst { AbortError, codes } = __webpack_require__(76371)\nconst { ERR_INVALID_ARG_TYPE, ERR_STREAM_PREMATURE_CLOSE } = codes\nconst { kEmptyObject, once } = __webpack_require__(57760)\nconst { validateAbortSignal, validateFunction, validateObject, validateBoolean } = __webpack_require__(277)\nconst { Promise, PromisePrototypeThen, SymbolDispose } = __webpack_require__(24134)\nconst {\n isClosed,\n isReadable,\n isReadableNodeStream,\n isReadableStream,\n isReadableFinished,\n isReadableErrored,\n isWritable,\n isWritableNodeStream,\n isWritableStream,\n isWritableFinished,\n isWritableErrored,\n isNodeStream,\n willEmitClose: _willEmitClose,\n kIsClosedPromise\n} = __webpack_require__(16115)\nlet addAbortListener\nfunction isRequest(stream) {\n return stream.setHeader && typeof stream.abort === 'function'\n}\nconst nop = () => {}\nfunction eos(stream, options, callback) {\n var _options$readable, _options$writable\n if (arguments.length === 2) {\n callback = options\n options = kEmptyObject\n } else if (options == null) {\n options = kEmptyObject\n } else {\n validateObject(options, 'options')\n }\n validateFunction(callback, 'callback')\n validateAbortSignal(options.signal, 'options.signal')\n callback = once(callback)\n if (isReadableStream(stream) || isWritableStream(stream)) {\n return eosWeb(stream, options, callback)\n }\n if (!isNodeStream(stream)) {\n throw new ERR_INVALID_ARG_TYPE('stream', ['ReadableStream', 'WritableStream', 'Stream'], stream)\n }\n const readable =\n (_options$readable = options.readable) !== null && _options$readable !== undefined\n ? _options$readable\n : isReadableNodeStream(stream)\n const writable =\n (_options$writable = options.writable) !== null && _options$writable !== undefined\n ? _options$writable\n : isWritableNodeStream(stream)\n const wState = stream._writableState\n const rState = stream._readableState\n const onlegacyfinish = () => {\n if (!stream.writable) {\n onfinish()\n }\n }\n\n // TODO (ronag): Improve soft detection to include core modules and\n // common ecosystem modules that do properly emit 'close' but fail\n // this generic check.\n let willEmitClose =\n _willEmitClose(stream) && isReadableNodeStream(stream) === readable && isWritableNodeStream(stream) === writable\n let writableFinished = isWritableFinished(stream, false)\n const onfinish = () => {\n writableFinished = true\n // Stream should not be destroyed here. If it is that\n // means that user space is doing something differently and\n // we cannot trust willEmitClose.\n if (stream.destroyed) {\n willEmitClose = false\n }\n if (willEmitClose && (!stream.readable || readable)) {\n return\n }\n if (!readable || readableFinished) {\n callback.call(stream)\n }\n }\n let readableFinished = isReadableFinished(stream, false)\n const onend = () => {\n readableFinished = true\n // Stream should not be destroyed here. If it is that\n // means that user space is doing something differently and\n // we cannot trust willEmitClose.\n if (stream.destroyed) {\n willEmitClose = false\n }\n if (willEmitClose && (!stream.writable || writable)) {\n return\n }\n if (!writable || writableFinished) {\n callback.call(stream)\n }\n }\n const onerror = (err) => {\n callback.call(stream, err)\n }\n let closed = isClosed(stream)\n const onclose = () => {\n closed = true\n const errored = isWritableErrored(stream) || isReadableErrored(stream)\n if (errored && typeof errored !== 'boolean') {\n return callback.call(stream, errored)\n }\n if (readable && !readableFinished && isReadableNodeStream(stream, true)) {\n if (!isReadableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())\n }\n if (writable && !writableFinished) {\n if (!isWritableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())\n }\n callback.call(stream)\n }\n const onclosed = () => {\n closed = true\n const errored = isWritableErrored(stream) || isReadableErrored(stream)\n if (errored && typeof errored !== 'boolean') {\n return callback.call(stream, errored)\n }\n callback.call(stream)\n }\n const onrequest = () => {\n stream.req.on('finish', onfinish)\n }\n if (isRequest(stream)) {\n stream.on('complete', onfinish)\n if (!willEmitClose) {\n stream.on('abort', onclose)\n }\n if (stream.req) {\n onrequest()\n } else {\n stream.on('request', onrequest)\n }\n } else if (writable && !wState) {\n // legacy streams\n stream.on('end', onlegacyfinish)\n stream.on('close', onlegacyfinish)\n }\n\n // Not all streams will emit 'close' after 'aborted'.\n if (!willEmitClose && typeof stream.aborted === 'boolean') {\n stream.on('aborted', onclose)\n }\n stream.on('end', onend)\n stream.on('finish', onfinish)\n if (options.error !== false) {\n stream.on('error', onerror)\n }\n stream.on('close', onclose)\n if (closed) {\n process.nextTick(onclose)\n } else if (\n (wState !== null && wState !== undefined && wState.errorEmitted) ||\n (rState !== null && rState !== undefined && rState.errorEmitted)\n ) {\n if (!willEmitClose) {\n process.nextTick(onclosed)\n }\n } else if (\n !readable &&\n (!willEmitClose || isReadable(stream)) &&\n (writableFinished || isWritable(stream) === false)\n ) {\n process.nextTick(onclosed)\n } else if (\n !writable &&\n (!willEmitClose || isWritable(stream)) &&\n (readableFinished || isReadable(stream) === false)\n ) {\n process.nextTick(onclosed)\n } else if (rState && stream.req && stream.aborted) {\n process.nextTick(onclosed)\n }\n const cleanup = () => {\n callback = nop\n stream.removeListener('aborted', onclose)\n stream.removeListener('complete', onfinish)\n stream.removeListener('abort', onclose)\n stream.removeListener('request', onrequest)\n if (stream.req) stream.req.removeListener('finish', onfinish)\n stream.removeListener('end', onlegacyfinish)\n stream.removeListener('close', onlegacyfinish)\n stream.removeListener('finish', onfinish)\n stream.removeListener('end', onend)\n stream.removeListener('error', onerror)\n stream.removeListener('close', onclose)\n }\n if (options.signal && !closed) {\n const abort = () => {\n // Keep it because cleanup removes it.\n const endCallback = callback\n cleanup()\n endCallback.call(\n stream,\n new AbortError(undefined, {\n cause: options.signal.reason\n })\n )\n }\n if (options.signal.aborted) {\n process.nextTick(abort)\n } else {\n addAbortListener = addAbortListener || (__webpack_require__(57760).addAbortListener)\n const disposable = addAbortListener(options.signal, abort)\n const originalCallback = callback\n callback = once((...args) => {\n disposable[SymbolDispose]()\n originalCallback.apply(stream, args)\n })\n }\n }\n return cleanup\n}\nfunction eosWeb(stream, options, callback) {\n let isAborted = false\n let abort = nop\n if (options.signal) {\n abort = () => {\n isAborted = true\n callback.call(\n stream,\n new AbortError(undefined, {\n cause: options.signal.reason\n })\n )\n }\n if (options.signal.aborted) {\n process.nextTick(abort)\n } else {\n addAbortListener = addAbortListener || (__webpack_require__(57760).addAbortListener)\n const disposable = addAbortListener(options.signal, abort)\n const originalCallback = callback\n callback = once((...args) => {\n disposable[SymbolDispose]()\n originalCallback.apply(stream, args)\n })\n }\n }\n const resolverFn = (...args) => {\n if (!isAborted) {\n process.nextTick(() => callback.apply(stream, args))\n }\n }\n PromisePrototypeThen(stream[kIsClosedPromise].promise, resolverFn, resolverFn)\n return nop\n}\nfunction finished(stream, opts) {\n var _opts\n let autoCleanup = false\n if (opts === null) {\n opts = kEmptyObject\n }\n if ((_opts = opts) !== null && _opts !== undefined && _opts.cleanup) {\n validateBoolean(opts.cleanup, 'cleanup')\n autoCleanup = opts.cleanup\n }\n return new Promise((resolve, reject) => {\n const cleanup = eos(stream, opts, (err) => {\n if (autoCleanup) {\n cleanup()\n }\n if (err) {\n reject(err)\n } else {\n resolve()\n }\n })\n })\n}\nmodule.exports = eos\nmodule.exports.finished = finished\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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bG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtLmpzPzkwM2MiXSwic291cmNlc0NvbnRlbnQiOlsiLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ3Byb2Nlc3MvJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWFmaW50b3NoL2VuZC1vZi1zdHJlYW0gd2l0aFxuLy8gcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IsIE1hdGhpYXMgQnV1cyAoQG1hZmludG9zaCkuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3QgeyBBYm9ydEVycm9yLCBjb2RlcyB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UgfSA9IGNvZGVzXG5jb25zdCB7IGtFbXB0eU9iamVjdCwgb25jZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbmNvbnN0IHsgdmFsaWRhdGVBYm9ydFNpZ25hbCwgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVPYmplY3QsIHZhbGlkYXRlQm9vbGVhbiB9ID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9ycycpXG5jb25zdCB7IFByb21pc2UsIFByb21pc2VQcm90b3R5cGVUaGVuLCBTeW1ib2xEaXNwb3NlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHtcbiAgaXNDbG9zZWQsXG4gIGlzUmVhZGFibGUsXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc1dyaXRhYmxlLFxuICBpc1dyaXRhYmxlTm9kZVN0cmVhbSxcbiAgaXNXcml0YWJsZVN0cmVhbSxcbiAgaXNXcml0YWJsZUZpbmlzaGVkLFxuICBpc1dyaXRhYmxlRXJyb3JlZCxcbiAgaXNOb2RlU3RyZWFtLFxuICB3aWxsRW1pdENsb3NlOiBfd2lsbEVtaXRDbG9zZSxcbiAga0lzQ2xvc2VkUHJvbWlzZVxufSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxubGV0IGFkZEFib3J0TGlzdGVuZXJcbmZ1bmN0aW9uIGlzUmVxdWVzdChzdHJlYW0pIHtcbiAgcmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJ1xufVxuY29uc3Qgbm9wID0gKCkgPT4ge31cbmZ1bmN0aW9uIGVvcyhzdHJlYW0sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBfb3B0aW9ucyRyZWFkYWJsZSwgX29wdGlvbnMkd3JpdGFibGVcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICBvcHRpb25zID0ga0VtcHR5T2JqZWN0XG4gIH0gZWxzZSBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IGtFbXB0eU9iamVjdFxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICB2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrLCAnY2FsbGJhY2snKVxuICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spXG4gIGlmIChpc1JlYWRhYmxlU3RyZWFtKHN0cmVhbSkgfHwgaXNXcml0YWJsZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIGVvc1dlYihzdHJlYW0sIG9wdGlvbnMsIGNhbGxiYWNrKVxuICB9XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3N0cmVhbScsIFsnUmVhZGFibGVTdHJlYW0nLCAnV3JpdGFibGVTdHJlYW0nLCAnU3RyZWFtJ10sIHN0cmVhbSlcbiAgfVxuICBjb25zdCByZWFkYWJsZSA9XG4gICAgKF9vcHRpb25zJHJlYWRhYmxlID0gb3B0aW9ucy5yZWFkYWJsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkcmVhZGFibGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfb3B0aW9ucyRyZWFkYWJsZVxuICAgICAgOiBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pXG4gIGNvbnN0IHdyaXRhYmxlID1cbiAgICAoX29wdGlvbnMkd3JpdGFibGUgPSBvcHRpb25zLndyaXRhYmxlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyR3cml0YWJsZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IF9vcHRpb25zJHdyaXRhYmxlXG4gICAgICA6IGlzV3JpdGFibGVOb2RlU3RyZWFtKHN0cmVhbSlcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCBvbmxlZ2FjeWZpbmlzaCA9ICgpID0+IHtcbiAgICBpZiAoIXN0cmVhbS53cml0YWJsZSkge1xuICAgICAgb25maW5pc2goKVxuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gKHJvbmFnKTogSW1wcm92ZSBzb2Z0IGRldGVjdGlvbiB0byBpbmNsdWRlIGNvcmUgbW9kdWxlcyBhbmRcbiAgLy8gY29tbW9uIGVjb3N5c3RlbSBtb2R1bGVzIHRoYXQgZG8gcHJvcGVybHkgZW1pdCAnY2xvc2UnIGJ1dCBmYWlsXG4gIC8vIHRoaXMgZ2VuZXJpYyBjaGVjay5cbiAgbGV0IHdpbGxFbWl0Q2xvc2UgPVxuICAgIF93aWxsRW1pdENsb3NlKHN0cmVhbSkgJiYgaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSA9PT0gcmVhZGFibGUgJiYgaXNXcml0YWJsZU5vZGVTdHJlYW0oc3RyZWFtKSA9PT0gd3JpdGFibGVcbiAgbGV0IHdyaXRhYmxlRmluaXNoZWQgPSBpc1dyaXRhYmxlRmluaXNoZWQoc3RyZWFtLCBmYWxzZSlcbiAgY29uc3Qgb25maW5pc2ggPSAoKSA9PiB7XG4gICAgd3JpdGFibGVGaW5pc2hlZCA9IHRydWVcbiAgICAvLyBTdHJlYW0gc2hvdWxkIG5vdCBiZSBkZXN0cm95ZWQgaGVyZS4gSWYgaXQgaXMgdGhhdFxuICAgIC8vIG1lYW5zIHRoYXQgdXNlciBzcGFjZSBpcyBkb2luZyBzb21ldGhpbmcgZGlmZmVyZW50bHkgYW5kXG4gICAgLy8gd2UgY2Fubm90IHRydXN0IHdpbGxFbWl0Q2xvc2UuXG4gICAgaWYgKHN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgIHdpbGxFbWl0Q2xvc2UgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAod2lsbEVtaXRDbG9zZSAmJiAoIXN0cmVhbS5yZWFkYWJsZSB8fCByZWFkYWJsZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXJlYWRhYmxlIHx8IHJlYWRhYmxlRmluaXNoZWQpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoc3RyZWFtKVxuICAgIH1cbiAgfVxuICBsZXQgcmVhZGFibGVGaW5pc2hlZCA9IGlzUmVhZGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKVxuICBjb25zdCBvbmVuZCA9ICgpID0+IHtcbiAgICByZWFkYWJsZUZpbmlzaGVkID0gdHJ1ZVxuICAgIC8vIFN0cmVhbSBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCBoZXJlLiBJZiBpdCBpcyB0aGF0XG4gICAgLy8gbWVhbnMgdGhhdCB1c2VyIHNwYWNlIGlzIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnRseSBhbmRcbiAgICAvLyB3ZSBjYW5ub3QgdHJ1c3Qgd2lsbEVtaXRDbG9zZS5cbiAgICBpZiAoc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgd2lsbEVtaXRDbG9zZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICh3aWxsRW1pdENsb3NlICYmICghc3RyZWFtLndyaXRhYmxlIHx8IHdyaXRhYmxlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghd3JpdGFibGUgfHwgd3JpdGFibGVGaW5pc2hlZCkge1xuICAgICAgY2FsbGJhY2suY2FsbChzdHJlYW0pXG4gICAgfVxuICB9XG4gIGNvbnN0IG9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycilcbiAgfVxuICBsZXQgY2xvc2VkID0gaXNDbG9zZWQoc3RyZWFtKVxuICBjb25zdCBvbmNsb3NlID0gKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWVcbiAgICBjb25zdCBlcnJvcmVkID0gaXNXcml0YWJsZUVycm9yZWQoc3RyZWFtKSB8fCBpc1JlYWRhYmxlRXJyb3JlZChzdHJlYW0pXG4gICAgaWYgKGVycm9yZWQgJiYgdHlwZW9mIGVycm9yZWQgIT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnJvcmVkKVxuICAgIH1cbiAgICBpZiAocmVhZGFibGUgJiYgIXJlYWRhYmxlRmluaXNoZWQgJiYgaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtLCB0cnVlKSkge1xuICAgICAgaWYgKCFpc1JlYWRhYmxlRmluaXNoZWQoc3RyZWFtLCBmYWxzZSkpIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCkpXG4gICAgfVxuICAgIGlmICh3cml0YWJsZSAmJiAhd3JpdGFibGVGaW5pc2hlZCkge1xuICAgICAgaWYgKCFpc1dyaXRhYmxlRmluaXNoZWQoc3RyZWFtLCBmYWxzZSkpIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCkpXG4gICAgfVxuICAgIGNhbGxiYWNrLmNhbGwoc3RyZWFtKVxuICB9XG4gIGNvbnN0IG9uY2xvc2VkID0gKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWVcbiAgICBjb25zdCBlcnJvcmVkID0gaXNXcml0YWJsZUVycm9yZWQoc3RyZWFtKSB8fCBpc1JlYWRhYmxlRXJyb3JlZChzdHJlYW0pXG4gICAgaWYgKGVycm9yZWQgJiYgdHlwZW9mIGVycm9yZWQgIT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnJvcmVkKVxuICAgIH1cbiAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSlcbiAgfVxuICBjb25zdCBvbnJlcXVlc3QgPSAoKSA9PiB7XG4gICAgc3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpXG4gIH1cbiAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG4gICAgc3RyZWFtLm9uKCdjb21wbGV0ZScsIG9uZmluaXNoKVxuICAgIGlmICghd2lsbEVtaXRDbG9zZSkge1xuICAgICAgc3RyZWFtLm9uKCdhYm9ydCcsIG9uY2xvc2UpXG4gICAgfVxuICAgIGlmIChzdHJlYW0ucmVxKSB7XG4gICAgICBvbnJlcXVlc3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0ub24oJ3JlcXVlc3QnLCBvbnJlcXVlc3QpXG4gICAgfVxuICB9IGVsc2UgaWYgKHdyaXRhYmxlICYmICF3U3RhdGUpIHtcbiAgICAvLyBsZWdhY3kgc3RyZWFtc1xuICAgIHN0cmVhbS5vbignZW5kJywgb25sZWdhY3lmaW5pc2gpXG4gICAgc3RyZWFtLm9uKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKVxuICB9XG5cbiAgLy8gTm90IGFsbCBzdHJlYW1zIHdpbGwgZW1pdCAnY2xvc2UnIGFmdGVyICdhYm9ydGVkJy5cbiAgaWYgKCF3aWxsRW1pdENsb3NlICYmIHR5cGVvZiBzdHJlYW0uYWJvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgc3RyZWFtLm9uKCdhYm9ydGVkJywgb25jbG9zZSlcbiAgfVxuICBzdHJlYW0ub24oJ2VuZCcsIG9uZW5kKVxuICBzdHJlYW0ub24oJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICBpZiAob3B0aW9ucy5lcnJvciAhPT0gZmFsc2UpIHtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgfVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgb25jbG9zZSlcbiAgaWYgKGNsb3NlZCkge1xuICAgIHByb2Nlc3MubmV4dFRpY2sob25jbG9zZSlcbiAgfSBlbHNlIGlmIChcbiAgICAod1N0YXRlICE9PSBudWxsICYmIHdTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHdTdGF0ZS5lcnJvckVtaXR0ZWQpIHx8XG4gICAgKHJTdGF0ZSAhPT0gbnVsbCAmJiByU3RhdGUgIT09IHVuZGVmaW5lZCAmJiByU3RhdGUuZXJyb3JFbWl0dGVkKVxuICApIHtcbiAgICBpZiAoIXdpbGxFbWl0Q2xvc2UpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2sob25jbG9zZWQpXG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAgICFyZWFkYWJsZSAmJlxuICAgICghd2lsbEVtaXRDbG9zZSB8fCBpc1JlYWRhYmxlKHN0cmVhbSkpICYmXG4gICAgKHdyaXRhYmxlRmluaXNoZWQgfHwgaXNXcml0YWJsZShzdHJlYW0pID09PSBmYWxzZSlcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlZClcbiAgfSBlbHNlIGlmIChcbiAgICAhd3JpdGFibGUgJiZcbiAgICAoIXdpbGxFbWl0Q2xvc2UgfHwgaXNXcml0YWJsZShzdHJlYW0pKSAmJlxuICAgIChyZWFkYWJsZUZpbmlzaGVkIHx8IGlzUmVhZGFibGUoc3RyZWFtKSA9PT0gZmFsc2UpXG4gICkge1xuICAgIHByb2Nlc3MubmV4dFRpY2sob25jbG9zZWQpXG4gIH0gZWxzZSBpZiAoclN0YXRlICYmIHN0cmVhbS5yZXEgJiYgc3RyZWFtLmFib3J0ZWQpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2VkKVxuICB9XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY2FsbGJhY2sgPSBub3BcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0ZWQnLCBvbmNsb3NlKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0Jywgb25jbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpXG4gICAgaWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25sZWdhY3lmaW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgfVxuICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWNsb3NlZCkge1xuICAgIGNvbnN0IGFib3J0ID0gKCkgPT4ge1xuICAgICAgLy8gS2VlcCBpdCBiZWNhdXNlIGNsZWFudXAgcmVtb3ZlcyBpdC5cbiAgICAgIGNvbnN0IGVuZENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNsZWFudXAoKVxuICAgICAgZW5kQ2FsbGJhY2suY2FsbChcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBuZXcgQWJvcnRFcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGFib3J0KVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRBYm9ydExpc3RlbmVyID0gYWRkQWJvcnRMaXN0ZW5lciB8fCByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKS5hZGRBYm9ydExpc3RlbmVyXG4gICAgICBjb25zdCBkaXNwb3NhYmxlID0gYWRkQWJvcnRMaXN0ZW5lcihvcHRpb25zLnNpZ25hbCwgYWJvcnQpXG4gICAgICBjb25zdCBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNhbGxiYWNrID0gb25jZSgoLi4uYXJncykgPT4ge1xuICAgICAgICBkaXNwb3NhYmxlW1N5bWJvbERpc3Bvc2VdKClcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5hcHBseShzdHJlYW0sIGFyZ3MpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xlYW51cFxufVxuZnVuY3Rpb24gZW9zV2ViKHN0cmVhbSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgbGV0IGlzQWJvcnRlZCA9IGZhbHNlXG4gIGxldCBhYm9ydCA9IG5vcFxuICBpZiAob3B0aW9ucy5zaWduYWwpIHtcbiAgICBhYm9ydCA9ICgpID0+IHtcbiAgICAgIGlzQWJvcnRlZCA9IHRydWVcbiAgICAgIGNhbGxiYWNrLmNhbGwoXG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgICAgY2F1c2U6IG9wdGlvbnMuc2lnbmFsLnJlYXNvblxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhhYm9ydClcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkQWJvcnRMaXN0ZW5lciA9IGFkZEFib3J0TGlzdGVuZXIgfHwgcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJykuYWRkQWJvcnRMaXN0ZW5lclxuICAgICAgY29uc3QgZGlzcG9zYWJsZSA9IGFkZEFib3J0TGlzdGVuZXIob3B0aW9ucy5zaWduYWwsIGFib3J0KVxuICAgICAgY29uc3Qgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgICBjYWxsYmFjayA9IG9uY2UoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgZGlzcG9zYWJsZVtTeW1ib2xEaXNwb3NlXSgpXG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suYXBwbHkoc3RyZWFtLCBhcmdzKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzb2x2ZXJGbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCFpc0Fib3J0ZWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4gY2FsbGJhY2suYXBwbHkoc3RyZWFtLCBhcmdzKSlcbiAgICB9XG4gIH1cbiAgUHJvbWlzZVByb3RvdHlwZVRoZW4oc3RyZWFtW2tJc0Nsb3NlZFByb21pc2VdLnByb21pc2UsIHJlc29sdmVyRm4sIHJlc29sdmVyRm4pXG4gIHJldHVybiBub3Bcbn1cbmZ1bmN0aW9uIGZpbmlzaGVkKHN0cmVhbSwgb3B0cykge1xuICB2YXIgX29wdHNcbiAgbGV0IGF1dG9DbGVhbnVwID0gZmFsc2VcbiAgaWYgKG9wdHMgPT09IG51bGwpIHtcbiAgICBvcHRzID0ga0VtcHR5T2JqZWN0XG4gIH1cbiAgaWYgKChfb3B0cyA9IG9wdHMpICE9PSBudWxsICYmIF9vcHRzICE9PSB1bmRlZmluZWQgJiYgX29wdHMuY2xlYW51cCkge1xuICAgIHZhbGlkYXRlQm9vbGVhbihvcHRzLmNsZWFudXAsICdjbGVhbnVwJylcbiAgICBhdXRvQ2xlYW51cCA9IG9wdHMuY2xlYW51cFxuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2xlYW51cCA9IGVvcyhzdHJlYW0sIG9wdHMsIChlcnIpID0+IHtcbiAgICAgIGlmIChhdXRvQ2xlYW51cCkge1xuICAgICAgICBjbGVhbnVwKClcbiAgICAgIH1cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG59XG5tb2R1bGUuZXhwb3J0cyA9IGVvc1xubW9kdWxlLmV4cG9ydHMuZmluaXNoZWQgPSBmaW5pc2hlZFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///86238\n")},96532:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\n/* replacement start */\n\nconst process = __webpack_require__(54422)\n\n/* replacement end */\n\nconst { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = __webpack_require__(24134)\nconst { Buffer } = __webpack_require__(20181)\nconst { ERR_INVALID_ARG_TYPE, ERR_STREAM_NULL_VALUES } = (__webpack_require__(76371).codes)\nfunction from(Readable, iterable, opts) {\n let iterator\n if (typeof iterable === 'string' || iterable instanceof Buffer) {\n return new Readable({\n objectMode: true,\n ...opts,\n read() {\n this.push(iterable)\n this.push(null)\n }\n })\n }\n let isAsync\n if (iterable && iterable[SymbolAsyncIterator]) {\n isAsync = true\n iterator = iterable[SymbolAsyncIterator]()\n } else if (iterable && iterable[SymbolIterator]) {\n isAsync = false\n iterator = iterable[SymbolIterator]()\n } else {\n throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable)\n }\n const readable = new Readable({\n objectMode: true,\n highWaterMark: 1,\n // TODO(ronag): What options should be allowed?\n ...opts\n })\n\n // Flag to protect against _read\n // being called before last iteration completion.\n let reading = false\n readable._read = function () {\n if (!reading) {\n reading = true\n next()\n }\n }\n readable._destroy = function (error, cb) {\n PromisePrototypeThen(\n close(error),\n () => process.nextTick(cb, error),\n // nextTick is here in case cb throws\n (e) => process.nextTick(cb, e || error)\n )\n }\n async function close(error) {\n const hadError = error !== undefined && error !== null\n const hasThrow = typeof iterator.throw === 'function'\n if (hadError && hasThrow) {\n const { value, done } = await iterator.throw(error)\n await value\n if (done) {\n return\n }\n }\n if (typeof iterator.return === 'function') {\n const { value } = await iterator.return()\n await value\n }\n }\n async function next() {\n for (;;) {\n try {\n const { value, done } = isAsync ? await iterator.next() : iterator.next()\n if (done) {\n readable.push(null)\n } else {\n const res = value && typeof value.then === 'function' ? await value : value\n if (res === null) {\n reading = false\n throw new ERR_STREAM_NULL_VALUES()\n } else if (readable.push(res)) {\n continue\n } else {\n reading = false\n }\n }\n } catch (err) {\n readable.destroy(err)\n }\n break\n }\n }\n return readable\n}\nmodule.exports = from\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTY1MzIuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVo7O0FBRUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBVTs7QUFFbEM7O0FBRUEsUUFBUSw0REFBNEQsRUFBRSxtQkFBTyxDQUFDLEtBQXdCO0FBQ3RHLFFBQVEsU0FBUyxFQUFFLG1CQUFPLENBQUMsS0FBUTtBQUNuQyxRQUFRLCtDQUErQyxFQUFFLGtDQUFrQztBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsY0FBYztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxnQkFBZ0IsY0FBYztBQUM5QjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZnJvbS5qcz8xZWNmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG4vKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cblxuY29uc3QgeyBQcm9taXNlUHJvdG90eXBlVGhlbiwgU3ltYm9sQXN5bmNJdGVyYXRvciwgU3ltYm9sSXRlcmF0b3IgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfU1RSRUFNX05VTExfVkFMVUVTIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpLmNvZGVzXG5mdW5jdGlvbiBmcm9tKFJlYWRhYmxlLCBpdGVyYWJsZSwgb3B0cykge1xuICBsZXQgaXRlcmF0b3JcbiAgaWYgKHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycgfHwgaXRlcmFibGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKGl0ZXJhYmxlKVxuICAgICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGxldCBpc0FzeW5jXG4gIGlmIChpdGVyYWJsZSAmJiBpdGVyYWJsZVtTeW1ib2xBc3luY0l0ZXJhdG9yXSkge1xuICAgIGlzQXN5bmMgPSB0cnVlXG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2xBc3luY0l0ZXJhdG9yXSgpXG4gIH0gZWxzZSBpZiAoaXRlcmFibGUgJiYgaXRlcmFibGVbU3ltYm9sSXRlcmF0b3JdKSB7XG4gICAgaXNBc3luYyA9IGZhbHNlXG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2xJdGVyYXRvcl0oKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnaXRlcmFibGUnLCBbJ0l0ZXJhYmxlJ10sIGl0ZXJhYmxlKVxuICB9XG4gIGNvbnN0IHJlYWRhYmxlID0gbmV3IFJlYWRhYmxlKHtcbiAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgIGhpZ2hXYXRlck1hcms6IDEsXG4gICAgLy8gVE9ETyhyb25hZyk6IFdoYXQgb3B0aW9ucyBzaG91bGQgYmUgYWxsb3dlZD9cbiAgICAuLi5vcHRzXG4gIH0pXG5cbiAgLy8gRmxhZyB0byBwcm90ZWN0IGFnYWluc3QgX3JlYWRcbiAgLy8gYmVpbmcgY2FsbGVkIGJlZm9yZSBsYXN0IGl0ZXJhdGlvbiBjb21wbGV0aW9uLlxuICBsZXQgcmVhZGluZyA9IGZhbHNlXG4gIHJlYWRhYmxlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcmVhZGluZykge1xuICAgICAgcmVhZGluZyA9IHRydWVcbiAgICAgIG5leHQoKVxuICAgIH1cbiAgfVxuICByZWFkYWJsZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnJvciwgY2IpIHtcbiAgICBQcm9taXNlUHJvdG90eXBlVGhlbihcbiAgICAgIGNsb3NlKGVycm9yKSxcbiAgICAgICgpID0+IHByb2Nlc3MubmV4dFRpY2soY2IsIGVycm9yKSxcbiAgICAgIC8vIG5leHRUaWNrIGlzIGhlcmUgaW4gY2FzZSBjYiB0aHJvd3NcbiAgICAgIChlKSA9PiBwcm9jZXNzLm5leHRUaWNrKGNiLCBlIHx8IGVycm9yKVxuICAgIClcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjbG9zZShlcnJvcikge1xuICAgIGNvbnN0IGhhZEVycm9yID0gZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBlcnJvciAhPT0gbnVsbFxuICAgIGNvbnN0IGhhc1Rocm93ID0gdHlwZW9mIGl0ZXJhdG9yLnRocm93ID09PSAnZnVuY3Rpb24nXG4gICAgaWYgKGhhZEVycm9yICYmIGhhc1Rocm93KSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnJvcilcbiAgICAgIGF3YWl0IHZhbHVlXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICBhd2FpdCB2YWx1ZVxuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBuZXh0KCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlzQXN5bmMgPyBhd2FpdCBpdGVyYXRvci5uZXh0KCkgOiBpdGVyYXRvci5uZXh0KClcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICByZWFkYWJsZS5wdXNoKG51bGwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicgPyBhd2FpdCB2YWx1ZSA6IHZhbHVlXG4gICAgICAgICAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpXG4gICAgICAgICAgfSBlbHNlIGlmIChyZWFkYWJsZS5wdXNoKHJlcykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlYWRhYmxlLmRlc3Ryb3koZXJyKVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlYWRhYmxlXG59XG5tb2R1bGUuZXhwb3J0cyA9IGZyb21cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///96532\n")},94259:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { ArrayIsArray, ObjectSetPrototypeOf } = __webpack_require__(24134)\nconst { EventEmitter: EE } = __webpack_require__(24434)\nfunction Stream(opts) {\n EE.call(this, opts)\n}\nObjectSetPrototypeOf(Stream.prototype, EE.prototype)\nObjectSetPrototypeOf(Stream, EE)\nStream.prototype.pipe = function (dest, options) {\n const source = this\n function ondata(chunk) {\n if (dest.writable && dest.write(chunk) === false && source.pause) {\n source.pause()\n }\n }\n source.on('data', ondata)\n function ondrain() {\n if (source.readable && source.resume) {\n source.resume()\n }\n }\n dest.on('drain', ondrain)\n\n // If the 'end' option is not supplied, dest.end() will be called when\n // source gets the 'end' or 'close' events. Only dest.end() once.\n if (!dest._isStdio && (!options || options.end !== false)) {\n source.on('end', onend)\n source.on('close', onclose)\n }\n let didOnEnd = false\n function onend() {\n if (didOnEnd) return\n didOnEnd = true\n dest.end()\n }\n function onclose() {\n if (didOnEnd) return\n didOnEnd = true\n if (typeof dest.destroy === 'function') dest.destroy()\n }\n\n // Don't leave dangling pipes when there are errors.\n function onerror(er) {\n cleanup()\n if (EE.listenerCount(this, 'error') === 0) {\n this.emit('error', er)\n }\n }\n prependListener(source, 'error', onerror)\n prependListener(dest, 'error', onerror)\n\n // Remove all the event listeners that were added.\n function cleanup() {\n source.removeListener('data', ondata)\n dest.removeListener('drain', ondrain)\n source.removeListener('end', onend)\n source.removeListener('close', onclose)\n source.removeListener('error', onerror)\n dest.removeListener('error', onerror)\n source.removeListener('end', cleanup)\n source.removeListener('close', cleanup)\n dest.removeListener('close', cleanup)\n }\n source.on('end', cleanup)\n source.on('close', cleanup)\n dest.on('close', cleanup)\n dest.emit('pipe', source)\n\n // Allow for unix-like usage: A.pipe(B).pipe(C)\n return dest\n}\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn)\n\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn)\n else if (ArrayIsArray(emitter._events[event])) emitter._events[event].unshift(fn)\n else emitter._events[event] = [fn, emitter._events[event]]\n}\nmodule.exports = {\n Stream,\n prependListener\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQyNTkuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosUUFBUSxxQ0FBcUMsRUFBRSxtQkFBTyxDQUFDLEtBQXdCO0FBQy9FLFFBQVEsbUJBQW1CLEVBQUUsbUJBQU8sQ0FBQyxLQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2xlZ2FjeS5qcz8xMDVkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFycmF5SXNBcnJheSwgT2JqZWN0U2V0UHJvdG90eXBlT2YgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuZnVuY3Rpb24gU3RyZWFtKG9wdHMpIHtcbiAgRUUuY2FsbCh0aGlzLCBvcHRzKVxufVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLnByb3RvdHlwZSwgRUUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLCBFRSlcblN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHRoaXNcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgaWYgKGRlc3Qud3JpdGFibGUgJiYgZGVzdC53cml0ZShjaHVuaykgPT09IGZhbHNlICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgc291cmNlLnBhdXNlKClcbiAgICB9XG4gIH1cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpXG4gICAgfVxuICB9XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5vbignY2xvc2UnLCBvbmNsb3NlKVxuICB9XG4gIGxldCBkaWRPbkVuZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuXG4gICAgZGlkT25FbmQgPSB0cnVlXG4gICAgZGVzdC5lbmQoKVxuICB9XG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm5cbiAgICBkaWRPbkVuZCA9IHRydWVcbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KClcbiAgfVxuXG4gIC8vIERvbid0IGxlYXZlIGRhbmdsaW5nIHBpcGVzIHdoZW4gdGhlcmUgYXJlIGVycm9ycy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGNsZWFudXAoKVxuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXIpXG4gICAgfVxuICB9XG4gIHByZXBlbmRMaXN0ZW5lcihzb3VyY2UsICdlcnJvcicsIG9uZXJyb3IpXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKVxuXG4gIC8vIFJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKVxuICB9XG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cClcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cClcbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKVxuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0XG59XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKVxuXG4gIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkgZW1pdHRlci5vbihldmVudCwgZm4pXG4gIGVsc2UgaWYgKEFycmF5SXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKVxuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU3RyZWFtLFxuICBwcmVwZW5kTGlzdGVuZXJcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///94259\n")},60823:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst AbortController = globalThis.AbortController || (__webpack_require__(66584).AbortController)\nconst {\n codes: { ERR_INVALID_ARG_VALUE, ERR_INVALID_ARG_TYPE, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE },\n AbortError\n} = __webpack_require__(76371)\nconst { validateAbortSignal, validateInteger, validateObject } = __webpack_require__(277)\nconst kWeakHandler = (__webpack_require__(24134).Symbol)('kWeak')\nconst kResistStopPropagation = (__webpack_require__(24134).Symbol)('kResistStopPropagation')\nconst { finished } = __webpack_require__(86238)\nconst staticCompose = __webpack_require__(47830)\nconst { addAbortSignalNoValidate } = __webpack_require__(4147)\nconst { isWritable, isNodeStream } = __webpack_require__(16115)\nconst { deprecate } = __webpack_require__(57760)\nconst {\n ArrayPrototypePush,\n Boolean,\n MathFloor,\n Number,\n NumberIsNaN,\n Promise,\n PromiseReject,\n PromiseResolve,\n PromisePrototypeThen,\n Symbol\n} = __webpack_require__(24134)\nconst kEmpty = Symbol('kEmpty')\nconst kEof = Symbol('kEof')\nfunction compose(stream, options) {\n if (options != null) {\n validateObject(options, 'options')\n }\n if ((options === null || options === undefined ? undefined : options.signal) != null) {\n validateAbortSignal(options.signal, 'options.signal')\n }\n if (isNodeStream(stream) && !isWritable(stream)) {\n throw new ERR_INVALID_ARG_VALUE('stream', stream, 'must be writable')\n }\n const composedStream = staticCompose(this, stream)\n if (options !== null && options !== undefined && options.signal) {\n // Not validating as we already validated before\n addAbortSignalNoValidate(options.signal, composedStream)\n }\n return composedStream\n}\nfunction map(fn, options) {\n if (typeof fn !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)\n }\n if (options != null) {\n validateObject(options, 'options')\n }\n if ((options === null || options === undefined ? undefined : options.signal) != null) {\n validateAbortSignal(options.signal, 'options.signal')\n }\n let concurrency = 1\n if ((options === null || options === undefined ? undefined : options.concurrency) != null) {\n concurrency = MathFloor(options.concurrency)\n }\n let highWaterMark = concurrency - 1\n if ((options === null || options === undefined ? undefined : options.highWaterMark) != null) {\n highWaterMark = MathFloor(options.highWaterMark)\n }\n validateInteger(concurrency, 'options.concurrency', 1)\n validateInteger(highWaterMark, 'options.highWaterMark', 0)\n highWaterMark += concurrency\n return async function* map() {\n const signal = (__webpack_require__(57760).AbortSignalAny)(\n [options === null || options === undefined ? undefined : options.signal].filter(Boolean)\n )\n const stream = this\n const queue = []\n const signalOpt = {\n signal\n }\n let next\n let resume\n let done = false\n let cnt = 0\n function onCatch() {\n done = true\n afterItemProcessed()\n }\n function afterItemProcessed() {\n cnt -= 1\n maybeResume()\n }\n function maybeResume() {\n if (resume && !done && cnt < concurrency && queue.length < highWaterMark) {\n resume()\n resume = null\n }\n }\n async function pump() {\n try {\n for await (let val of stream) {\n if (done) {\n return\n }\n if (signal.aborted) {\n throw new AbortError()\n }\n try {\n val = fn(val, signalOpt)\n if (val === kEmpty) {\n continue\n }\n val = PromiseResolve(val)\n } catch (err) {\n val = PromiseReject(err)\n }\n cnt += 1\n PromisePrototypeThen(val, afterItemProcessed, onCatch)\n queue.push(val)\n if (next) {\n next()\n next = null\n }\n if (!done && (queue.length >= highWaterMark || cnt >= concurrency)) {\n await new Promise((resolve) => {\n resume = resolve\n })\n }\n }\n queue.push(kEof)\n } catch (err) {\n const val = PromiseReject(err)\n PromisePrototypeThen(val, afterItemProcessed, onCatch)\n queue.push(val)\n } finally {\n done = true\n if (next) {\n next()\n next = null\n }\n }\n }\n pump()\n try {\n while (true) {\n while (queue.length > 0) {\n const val = await queue[0]\n if (val === kEof) {\n return\n }\n if (signal.aborted) {\n throw new AbortError()\n }\n if (val !== kEmpty) {\n yield val\n }\n queue.shift()\n maybeResume()\n }\n await new Promise((resolve) => {\n next = resolve\n })\n }\n } finally {\n done = true\n if (resume) {\n resume()\n resume = null\n }\n }\n }.call(this)\n}\nfunction asIndexedPairs(options = undefined) {\n if (options != null) {\n validateObject(options, 'options')\n }\n if ((options === null || options === undefined ? undefined : options.signal) != null) {\n validateAbortSignal(options.signal, 'options.signal')\n }\n return async function* asIndexedPairs() {\n let index = 0\n for await (const val of this) {\n var _options$signal\n if (\n options !== null &&\n options !== undefined &&\n (_options$signal = options.signal) !== null &&\n _options$signal !== undefined &&\n _options$signal.aborted\n ) {\n throw new AbortError({\n cause: options.signal.reason\n })\n }\n yield [index++, val]\n }\n }.call(this)\n}\nasync function some(fn, options = undefined) {\n for await (const unused of filter.call(this, fn, options)) {\n return true\n }\n return false\n}\nasync function every(fn, options = undefined) {\n if (typeof fn !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)\n }\n // https://en.wikipedia.org/wiki/De_Morgan%27s_laws\n return !(await some.call(\n this,\n async (...args) => {\n return !(await fn(...args))\n },\n options\n ))\n}\nasync function find(fn, options) {\n for await (const result of filter.call(this, fn, options)) {\n return result\n }\n return undefined\n}\nasync function forEach(fn, options) {\n if (typeof fn !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)\n }\n async function forEachFn(value, options) {\n await fn(value, options)\n return kEmpty\n }\n // eslint-disable-next-line no-unused-vars\n for await (const unused of map.call(this, forEachFn, options));\n}\nfunction filter(fn, options) {\n if (typeof fn !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)\n }\n async function filterFn(value, options) {\n if (await fn(value, options)) {\n return value\n }\n return kEmpty\n }\n return map.call(this, filterFn, options)\n}\n\n// Specific to provide better error to reduce since the argument is only\n// missing if the stream has no items in it - but the code is still appropriate\nclass ReduceAwareErrMissingArgs extends ERR_MISSING_ARGS {\n constructor() {\n super('reduce')\n this.message = 'Reduce of an empty stream requires an initial value'\n }\n}\nasync function reduce(reducer, initialValue, options) {\n var _options$signal2\n if (typeof reducer !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('reducer', ['Function', 'AsyncFunction'], reducer)\n }\n if (options != null) {\n validateObject(options, 'options')\n }\n if ((options === null || options === undefined ? undefined : options.signal) != null) {\n validateAbortSignal(options.signal, 'options.signal')\n }\n let hasInitialValue = arguments.length > 1\n if (\n options !== null &&\n options !== undefined &&\n (_options$signal2 = options.signal) !== null &&\n _options$signal2 !== undefined &&\n _options$signal2.aborted\n ) {\n const err = new AbortError(undefined, {\n cause: options.signal.reason\n })\n this.once('error', () => {}) // The error is already propagated\n await finished(this.destroy(err))\n throw err\n }\n const ac = new AbortController()\n const signal = ac.signal\n if (options !== null && options !== undefined && options.signal) {\n const opts = {\n once: true,\n [kWeakHandler]: this,\n [kResistStopPropagation]: true\n }\n options.signal.addEventListener('abort', () => ac.abort(), opts)\n }\n let gotAnyItemFromStream = false\n try {\n for await (const value of this) {\n var _options$signal3\n gotAnyItemFromStream = true\n if (\n options !== null &&\n options !== undefined &&\n (_options$signal3 = options.signal) !== null &&\n _options$signal3 !== undefined &&\n _options$signal3.aborted\n ) {\n throw new AbortError()\n }\n if (!hasInitialValue) {\n initialValue = value\n hasInitialValue = true\n } else {\n initialValue = await reducer(initialValue, value, {\n signal\n })\n }\n }\n if (!gotAnyItemFromStream && !hasInitialValue) {\n throw new ReduceAwareErrMissingArgs()\n }\n } finally {\n ac.abort()\n }\n return initialValue\n}\nasync function toArray(options) {\n if (options != null) {\n validateObject(options, 'options')\n }\n if ((options === null || options === undefined ? undefined : options.signal) != null) {\n validateAbortSignal(options.signal, 'options.signal')\n }\n const result = []\n for await (const val of this) {\n var _options$signal4\n if (\n options !== null &&\n options !== undefined &&\n (_options$signal4 = options.signal) !== null &&\n _options$signal4 !== undefined &&\n _options$signal4.aborted\n ) {\n throw new AbortError(undefined, {\n cause: options.signal.reason\n })\n }\n ArrayPrototypePush(result, val)\n }\n return result\n}\nfunction flatMap(fn, options) {\n const values = map.call(this, fn, options)\n return async function* flatMap() {\n for await (const val of values) {\n yield* val\n }\n }.call(this)\n}\nfunction toIntegerOrInfinity(number) {\n // We coerce here to align with the spec\n // https://github.com/tc39/proposal-iterator-helpers/issues/169\n number = Number(number)\n if (NumberIsNaN(number)) {\n return 0\n }\n if (number < 0) {\n throw new ERR_OUT_OF_RANGE('number', '>= 0', number)\n }\n return number\n}\nfunction drop(number, options = undefined) {\n if (options != null) {\n validateObject(options, 'options')\n }\n if ((options === null || options === undefined ? undefined : options.signal) != null) {\n validateAbortSignal(options.signal, 'options.signal')\n }\n number = toIntegerOrInfinity(number)\n return async function* drop() {\n var _options$signal5\n if (\n options !== null &&\n options !== undefined &&\n (_options$signal5 = options.signal) !== null &&\n _options$signal5 !== undefined &&\n _options$signal5.aborted\n ) {\n throw new AbortError()\n }\n for await (const val of this) {\n var _options$signal6\n if (\n options !== null &&\n options !== undefined &&\n (_options$signal6 = options.signal) !== null &&\n _options$signal6 !== undefined &&\n _options$signal6.aborted\n ) {\n throw new AbortError()\n }\n if (number-- <= 0) {\n yield val\n }\n }\n }.call(this)\n}\nfunction take(number, options = undefined) {\n if (options != null) {\n validateObject(options, 'options')\n }\n if ((options === null || options === undefined ? undefined : options.signal) != null) {\n validateAbortSignal(options.signal, 'options.signal')\n }\n number = toIntegerOrInfinity(number)\n return async function* take() {\n var _options$signal7\n if (\n options !== null &&\n options !== undefined &&\n (_options$signal7 = options.signal) !== null &&\n _options$signal7 !== undefined &&\n _options$signal7.aborted\n ) {\n throw new AbortError()\n }\n for await (const val of this) {\n var _options$signal8\n if (\n options !== null &&\n options !== undefined &&\n (_options$signal8 = options.signal) !== null &&\n _options$signal8 !== undefined &&\n _options$signal8.aborted\n ) {\n throw new AbortError()\n }\n if (number-- > 0) {\n yield val\n }\n\n // Don't get another item from iterator in case we reached the end\n if (number <= 0) {\n return\n }\n }\n }.call(this)\n}\nmodule.exports.streamReturningOperators = {\n asIndexedPairs: deprecate(asIndexedPairs, 'readable.asIndexedPairs will be removed in a future version.'),\n drop,\n filter,\n flatMap,\n map,\n take,\n compose\n}\nmodule.exports.promiseReturningOperators = {\n every,\n forEach,\n reduce,\n toArray,\n some,\n find\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA4MjMuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosc0RBQXNELDRDQUEyQztBQUNqRztBQUNBLFdBQVcsaUZBQWlGO0FBQzVGO0FBQ0EsRUFBRSxFQUFFLG1CQUFPLENBQUMsS0FBbUI7QUFDL0IsUUFBUSx1REFBdUQsRUFBRSxtQkFBTyxDQUFDLEdBQWU7QUFDeEYscUJBQXFCLG1DQUF3QztBQUM3RCwrQkFBK0IsbUNBQXdDO0FBQ3ZFLFFBQVEsV0FBVyxFQUFFLG1CQUFPLENBQUMsS0FBaUI7QUFDOUMsc0JBQXNCLG1CQUFPLENBQUMsS0FBVztBQUN6QyxRQUFRLDJCQUEyQixFQUFFLG1CQUFPLENBQUMsSUFBb0I7QUFDakUsUUFBUSwyQkFBMkIsRUFBRSxtQkFBTyxDQUFDLEtBQVM7QUFDdEQsUUFBUSxZQUFZLEVBQUUsbUJBQU8sQ0FBQyxLQUFpQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLG1CQUFPLENBQUMsS0FBd0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQ0FBeUM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvb3BlcmF0b3JzLmpzP2VmYWEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IEFib3J0Q29udHJvbGxlciA9IGdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyIHx8IHJlcXVpcmUoJ2Fib3J0LWNvbnRyb2xsZXInKS5BYm9ydENvbnRyb2xsZXJcbmNvbnN0IHtcbiAgY29kZXM6IHsgRVJSX0lOVkFMSURfQVJHX1ZBTFVFLCBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX01JU1NJTkdfQVJHUywgRVJSX09VVF9PRl9SQU5HRSB9LFxuICBBYm9ydEVycm9yXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyB2YWxpZGF0ZUFib3J0U2lnbmFsLCB2YWxpZGF0ZUludGVnZXIsIHZhbGlkYXRlT2JqZWN0IH0gPSByZXF1aXJlKCcuLi92YWxpZGF0b3JzJylcbmNvbnN0IGtXZWFrSGFuZGxlciA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKS5TeW1ib2woJ2tXZWFrJylcbmNvbnN0IGtSZXNpc3RTdG9wUHJvcGFnYXRpb24gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJykuU3ltYm9sKCdrUmVzaXN0U3RvcFByb3BhZ2F0aW9uJylcbmNvbnN0IHsgZmluaXNoZWQgfSA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5jb25zdCBzdGF0aWNDb21wb3NlID0gcmVxdWlyZSgnLi9jb21wb3NlJylcbmNvbnN0IHsgYWRkQWJvcnRTaWduYWxOb1ZhbGlkYXRlIH0gPSByZXF1aXJlKCcuL2FkZC1hYm9ydC1zaWduYWwnKVxuY29uc3QgeyBpc1dyaXRhYmxlLCBpc05vZGVTdHJlYW0gfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuY29uc3QgeyBkZXByZWNhdGUgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpXG5jb25zdCB7XG4gIEFycmF5UHJvdG90eXBlUHVzaCxcbiAgQm9vbGVhbixcbiAgTWF0aEZsb29yLFxuICBOdW1iZXIsXG4gIE51bWJlcklzTmFOLFxuICBQcm9taXNlLFxuICBQcm9taXNlUmVqZWN0LFxuICBQcm9taXNlUmVzb2x2ZSxcbiAgUHJvbWlzZVByb3RvdHlwZVRoZW4sXG4gIFN5bWJvbFxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3Qga0VtcHR5ID0gU3ltYm9sKCdrRW1wdHknKVxuY29uc3Qga0VvZiA9IFN5bWJvbCgna0VvZicpXG5mdW5jdGlvbiBjb21wb3NlKHN0cmVhbSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pICYmICFpc1dyaXRhYmxlKHN0cmVhbSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKCdzdHJlYW0nLCBzdHJlYW0sICdtdXN0IGJlIHdyaXRhYmxlJylcbiAgfVxuICBjb25zdCBjb21wb3NlZFN0cmVhbSA9IHN0YXRpY0NvbXBvc2UodGhpcywgc3RyZWFtKVxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zaWduYWwpIHtcbiAgICAvLyBOb3QgdmFsaWRhdGluZyBhcyB3ZSBhbHJlYWR5IHZhbGlkYXRlZCBiZWZvcmVcbiAgICBhZGRBYm9ydFNpZ25hbE5vVmFsaWRhdGUob3B0aW9ucy5zaWduYWwsIGNvbXBvc2VkU3RyZWFtKVxuICB9XG4gIHJldHVybiBjb21wb3NlZFN0cmVhbVxufVxuZnVuY3Rpb24gbWFwKGZuLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2ZuJywgWydGdW5jdGlvbicsICdBc3luY0Z1bmN0aW9uJ10sIGZuKVxuICB9XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICBsZXQgY29uY3VycmVuY3kgPSAxXG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLmNvbmN1cnJlbmN5KSAhPSBudWxsKSB7XG4gICAgY29uY3VycmVuY3kgPSBNYXRoRmxvb3Iob3B0aW9ucy5jb25jdXJyZW5jeSlcbiAgfVxuICBsZXQgaGlnaFdhdGVyTWFyayA9IGNvbmN1cnJlbmN5IC0gMVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5oaWdoV2F0ZXJNYXJrKSAhPSBudWxsKSB7XG4gICAgaGlnaFdhdGVyTWFyayA9IE1hdGhGbG9vcihvcHRpb25zLmhpZ2hXYXRlck1hcmspXG4gIH1cbiAgdmFsaWRhdGVJbnRlZ2VyKGNvbmN1cnJlbmN5LCAnb3B0aW9ucy5jb25jdXJyZW5jeScsIDEpXG4gIHZhbGlkYXRlSW50ZWdlcihoaWdoV2F0ZXJNYXJrLCAnb3B0aW9ucy5oaWdoV2F0ZXJNYXJrJywgMClcbiAgaGlnaFdhdGVyTWFyayArPSBjb25jdXJyZW5jeVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIG1hcCgpIHtcbiAgICBjb25zdCBzaWduYWwgPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKS5BYm9ydFNpZ25hbEFueShcbiAgICAgIFtvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsXS5maWx0ZXIoQm9vbGVhbilcbiAgICApXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpc1xuICAgIGNvbnN0IHF1ZXVlID0gW11cbiAgICBjb25zdCBzaWduYWxPcHQgPSB7XG4gICAgICBzaWduYWxcbiAgICB9XG4gICAgbGV0IG5leHRcbiAgICBsZXQgcmVzdW1lXG4gICAgbGV0IGRvbmUgPSBmYWxzZVxuICAgIGxldCBjbnQgPSAwXG4gICAgZnVuY3Rpb24gb25DYXRjaCgpIHtcbiAgICAgIGRvbmUgPSB0cnVlXG4gICAgICBhZnRlckl0ZW1Qcm9jZXNzZWQoKVxuICAgIH1cbiAgICBmdW5jdGlvbiBhZnRlckl0ZW1Qcm9jZXNzZWQoKSB7XG4gICAgICBjbnQgLT0gMVxuICAgICAgbWF5YmVSZXN1bWUoKVxuICAgIH1cbiAgICBmdW5jdGlvbiBtYXliZVJlc3VtZSgpIHtcbiAgICAgIGlmIChyZXN1bWUgJiYgIWRvbmUgJiYgY250IDwgY29uY3VycmVuY3kgJiYgcXVldWUubGVuZ3RoIDwgaGlnaFdhdGVyTWFyaykge1xuICAgICAgICByZXN1bWUoKVxuICAgICAgICByZXN1bWUgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGxldCB2YWwgb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKClcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbCA9IGZuKHZhbCwgc2lnbmFsT3B0KVxuICAgICAgICAgICAgaWYgKHZhbCA9PT0ga0VtcHR5KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWwgPSBQcm9taXNlUmVzb2x2ZSh2YWwpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB2YWwgPSBQcm9taXNlUmVqZWN0KGVycilcbiAgICAgICAgICB9XG4gICAgICAgICAgY250ICs9IDFcbiAgICAgICAgICBQcm9taXNlUHJvdG90eXBlVGhlbih2YWwsIGFmdGVySXRlbVByb2Nlc3NlZCwgb25DYXRjaClcbiAgICAgICAgICBxdWV1ZS5wdXNoKHZhbClcbiAgICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgICAgbmV4dCgpXG4gICAgICAgICAgICBuZXh0ID0gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRvbmUgJiYgKHF1ZXVlLmxlbmd0aCA+PSBoaWdoV2F0ZXJNYXJrIHx8IGNudCA+PSBjb25jdXJyZW5jeSkpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgIHJlc3VtZSA9IHJlc29sdmVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlLnB1c2goa0VvZilcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCB2YWwgPSBQcm9taXNlUmVqZWN0KGVycilcbiAgICAgICAgUHJvbWlzZVByb3RvdHlwZVRoZW4odmFsLCBhZnRlckl0ZW1Qcm9jZXNzZWQsIG9uQ2F0Y2gpXG4gICAgICAgIHF1ZXVlLnB1c2godmFsKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICBuZXh0KClcbiAgICAgICAgICBuZXh0ID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHB1bXAoKVxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGF3YWl0IHF1ZXVlWzBdXG4gICAgICAgICAgaWYgKHZhbCA9PT0ga0VvZikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsICE9PSBrRW1wdHkpIHtcbiAgICAgICAgICAgIHlpZWxkIHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgbWF5YmVSZXN1bWUoKVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgbmV4dCA9IHJlc29sdmVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZG9uZSA9IHRydWVcbiAgICAgIGlmIChyZXN1bWUpIHtcbiAgICAgICAgcmVzdW1lKClcbiAgICAgICAgcmVzdW1lID0gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5mdW5jdGlvbiBhc0luZGV4ZWRQYWlycyhvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIGFzSW5kZXhlZFBhaXJzKCkge1xuICAgIGxldCBpbmRleCA9IDBcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbCBvZiB0aGlzKSB7XG4gICAgICB2YXIgX29wdGlvbnMkc2lnbmFsXG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChfb3B0aW9ucyRzaWduYWwgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsLmFib3J0ZWRcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcih7XG4gICAgICAgICAgY2F1c2U6IG9wdGlvbnMuc2lnbmFsLnJlYXNvblxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgeWllbGQgW2luZGV4KyssIHZhbF1cbiAgICB9XG4gIH0uY2FsbCh0aGlzKVxufVxuYXN5bmMgZnVuY3Rpb24gc29tZShmbiwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICBmb3IgYXdhaXQgKGNvbnN0IHVudXNlZCBvZiBmaWx0ZXIuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuYXN5bmMgZnVuY3Rpb24gZXZlcnkoZm4sIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVfTW9yZ2FuJTI3c19sYXdzXG4gIHJldHVybiAhKGF3YWl0IHNvbWUuY2FsbChcbiAgICB0aGlzLFxuICAgIGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICByZXR1cm4gIShhd2FpdCBmbiguLi5hcmdzKSlcbiAgICB9LFxuICAgIG9wdGlvbnNcbiAgKSlcbn1cbmFzeW5jIGZ1bmN0aW9uIGZpbmQoZm4sIG9wdGlvbnMpIHtcbiAgZm9yIGF3YWl0IChjb25zdCByZXN1bHQgb2YgZmlsdGVyLmNhbGwodGhpcywgZm4sIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cbmFzeW5jIGZ1bmN0aW9uIGZvckVhY2goZm4sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gZm9yRWFjaEZuKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgYXdhaXQgZm4odmFsdWUsIG9wdGlvbnMpXG4gICAgcmV0dXJuIGtFbXB0eVxuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBmb3IgYXdhaXQgKGNvbnN0IHVudXNlZCBvZiBtYXAuY2FsbCh0aGlzLCBmb3JFYWNoRm4sIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIGZpbHRlcihmbiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBmaWx0ZXJGbih2YWx1ZSwgb3B0aW9ucykge1xuICAgIGlmIChhd2FpdCBmbih2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICByZXR1cm4ga0VtcHR5XG4gIH1cbiAgcmV0dXJuIG1hcC5jYWxsKHRoaXMsIGZpbHRlckZuLCBvcHRpb25zKVxufVxuXG4vLyBTcGVjaWZpYyB0byBwcm92aWRlIGJldHRlciBlcnJvciB0byByZWR1Y2Ugc2luY2UgdGhlIGFyZ3VtZW50IGlzIG9ubHlcbi8vIG1pc3NpbmcgaWYgdGhlIHN0cmVhbSBoYXMgbm8gaXRlbXMgaW4gaXQgLSBidXQgdGhlIGNvZGUgaXMgc3RpbGwgYXBwcm9wcmlhdGVcbmNsYXNzIFJlZHVjZUF3YXJlRXJyTWlzc2luZ0FyZ3MgZXh0ZW5kcyBFUlJfTUlTU0lOR19BUkdTIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ3JlZHVjZScpXG4gICAgdGhpcy5tZXNzYWdlID0gJ1JlZHVjZSBvZiBhbiBlbXB0eSBzdHJlYW0gcmVxdWlyZXMgYW4gaW5pdGlhbCB2YWx1ZSdcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcmVkdWNlKHJlZHVjZXIsIGluaXRpYWxWYWx1ZSwgb3B0aW9ucykge1xuICB2YXIgX29wdGlvbnMkc2lnbmFsMlxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3JlZHVjZXInLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgcmVkdWNlcilcbiAgfVxuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgbGV0IGhhc0luaXRpYWxWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gIGlmIChcbiAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgKF9vcHRpb25zJHNpZ25hbDIgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICBfb3B0aW9ucyRzaWduYWwyICE9PSB1bmRlZmluZWQgJiZcbiAgICBfb3B0aW9ucyRzaWduYWwyLmFib3J0ZWRcbiAgKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgfSlcbiAgICB0aGlzLm9uY2UoJ2Vycm9yJywgKCkgPT4ge30pIC8vIFRoZSBlcnJvciBpcyBhbHJlYWR5IHByb3BhZ2F0ZWRcbiAgICBhd2FpdCBmaW5pc2hlZCh0aGlzLmRlc3Ryb3koZXJyKSlcbiAgICB0aHJvdyBlcnJcbiAgfVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuc2lnbmFsKSB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBba1dlYWtIYW5kbGVyXTogdGhpcyxcbiAgICAgIFtrUmVzaXN0U3RvcFByb3BhZ2F0aW9uXTogdHJ1ZVxuICAgIH1cbiAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGFjLmFib3J0KCksIG9wdHMpXG4gIH1cbiAgbGV0IGdvdEFueUl0ZW1Gcm9tU3RyZWFtID0gZmFsc2VcbiAgdHJ5IHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWwzXG4gICAgICBnb3RBbnlJdGVtRnJvbVN0cmVhbSA9IHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKF9vcHRpb25zJHNpZ25hbDMgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsMyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDMuYWJvcnRlZFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKClcbiAgICAgIH1cbiAgICAgIGlmICghaGFzSW5pdGlhbFZhbHVlKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IHZhbHVlXG4gICAgICAgIGhhc0luaXRpYWxWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IGF3YWl0IHJlZHVjZXIoaW5pdGlhbFZhbHVlLCB2YWx1ZSwge1xuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWdvdEFueUl0ZW1Gcm9tU3RyZWFtICYmICFoYXNJbml0aWFsVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBSZWR1Y2VBd2FyZUVyck1pc3NpbmdBcmdzKClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYWMuYWJvcnQoKVxuICB9XG4gIHJldHVybiBpbml0aWFsVmFsdWVcbn1cbmFzeW5jIGZ1bmN0aW9uIHRvQXJyYXkob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgZm9yIGF3YWl0IChjb25zdCB2YWwgb2YgdGhpcykge1xuICAgIHZhciBfb3B0aW9ucyRzaWduYWw0XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX29wdGlvbnMkc2lnbmFsNCA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgX29wdGlvbnMkc2lnbmFsNCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw0LmFib3J0ZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICB9KVxuICAgIH1cbiAgICBBcnJheVByb3RvdHlwZVB1c2gocmVzdWx0LCB2YWwpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuZnVuY3Rpb24gZmxhdE1hcChmbiwgb3B0aW9ucykge1xuICBjb25zdCB2YWx1ZXMgPSBtYXAuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucylcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiBmbGF0TWFwKCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHZhbHVlcykge1xuICAgICAgeWllbGQqIHZhbFxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5mdW5jdGlvbiB0b0ludGVnZXJPckluZmluaXR5KG51bWJlcikge1xuICAvLyBXZSBjb2VyY2UgaGVyZSB0byBhbGlnbiB3aXRoIHRoZSBzcGVjXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMvaXNzdWVzLzE2OVxuICBudW1iZXIgPSBOdW1iZXIobnVtYmVyKVxuICBpZiAoTnVtYmVySXNOYU4obnVtYmVyKSkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKG51bWJlciA8IDApIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRSgnbnVtYmVyJywgJz49IDAnLCBudW1iZXIpXG4gIH1cbiAgcmV0dXJuIG51bWJlclxufVxuZnVuY3Rpb24gZHJvcChudW1iZXIsIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIG51bWJlciA9IHRvSW50ZWdlck9ySW5maW5pdHkobnVtYmVyKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIGRyb3AoKSB7XG4gICAgdmFyIF9vcHRpb25zJHNpZ25hbDVcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWw1ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw1ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbDUuYWJvcnRlZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbCBvZiB0aGlzKSB7XG4gICAgICB2YXIgX29wdGlvbnMkc2lnbmFsNlxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsNiA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw2ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsNi5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKG51bWJlci0tIDw9IDApIHtcbiAgICAgICAgeWllbGQgdmFsXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIHRha2UobnVtYmVyLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICBudW1iZXIgPSB0b0ludGVnZXJPckluZmluaXR5KG51bWJlcilcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiB0YWtlKCkge1xuICAgIHZhciBfb3B0aW9ucyRzaWduYWw3XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX29wdGlvbnMkc2lnbmFsNyA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgX29wdGlvbnMkc2lnbmFsNyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw3LmFib3J0ZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKClcbiAgICB9XG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWwgb2YgdGhpcykge1xuICAgICAgdmFyIF9vcHRpb25zJHNpZ25hbDhcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKF9vcHRpb25zJHNpZ25hbDggPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsOCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDguYWJvcnRlZFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKClcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXItLSA+IDApIHtcbiAgICAgICAgeWllbGQgdmFsXG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IGdldCBhbm90aGVyIGl0ZW0gZnJvbSBpdGVyYXRvciBpbiBjYXNlIHdlIHJlYWNoZWQgdGhlIGVuZFxuICAgICAgaWYgKG51bWJlciA8PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5tb2R1bGUuZXhwb3J0cy5zdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMgPSB7XG4gIGFzSW5kZXhlZFBhaXJzOiBkZXByZWNhdGUoYXNJbmRleGVkUGFpcnMsICdyZWFkYWJsZS5hc0luZGV4ZWRQYWlycyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4nKSxcbiAgZHJvcCxcbiAgZmlsdGVyLFxuICBmbGF0TWFwLFxuICBtYXAsXG4gIHRha2UsXG4gIGNvbXBvc2Vcbn1cbm1vZHVsZS5leHBvcnRzLnByb21pc2VSZXR1cm5pbmdPcGVyYXRvcnMgPSB7XG4gIGV2ZXJ5LFxuICBmb3JFYWNoLFxuICByZWR1Y2UsXG4gIHRvQXJyYXksXG4gIHNvbWUsXG4gIGZpbmRcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///60823\n")},86524:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// "Software"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n\n\nconst { ObjectSetPrototypeOf } = __webpack_require__(24134)\nmodule.exports = PassThrough\nconst Transform = __webpack_require__(17382)\nObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype)\nObjectSetPrototypeOf(PassThrough, Transform)\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options)\n Transform.call(this, options)\n}\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODY1MjQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRVk7O0FBRVosUUFBUSx1QkFBdUIsRUFBRSxtQkFBTyxDQUFDLEtBQXdCO0FBQ2pFO0FBQ0Esa0JBQWtCLG1CQUFPLENBQUMsS0FBYTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9wYXNzdGhyb3VnaC5qcz9hY2RkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgT2JqZWN0U2V0UHJvdG90eXBlT2YgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaFxuY29uc3QgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi90cmFuc2Zvcm0nKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUGFzc1Rocm91Z2gucHJvdG90eXBlLCBUcmFuc2Zvcm0ucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSlcbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKVxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKVxufVxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuaylcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///86524\n')},57758:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/* replacement start */\n\nconst process = __webpack_require__(54422)\n\n/* replacement end */\n// Ported from https://github.com/mafintosh/pump with\n// permission from the author, Mathias Buus (@mafintosh).\n\n;('use strict')\nconst { ArrayIsArray, Promise, SymbolAsyncIterator, SymbolDispose } = __webpack_require__(24134)\nconst eos = __webpack_require__(86238)\nconst { once } = __webpack_require__(57760)\nconst destroyImpl = __webpack_require__(75896)\nconst Duplex = __webpack_require__(93370)\nconst {\n aggregateTwoErrors,\n codes: {\n ERR_INVALID_ARG_TYPE,\n ERR_INVALID_RETURN_VALUE,\n ERR_MISSING_ARGS,\n ERR_STREAM_DESTROYED,\n ERR_STREAM_PREMATURE_CLOSE\n },\n AbortError\n} = __webpack_require__(76371)\nconst { validateFunction, validateAbortSignal } = __webpack_require__(277)\nconst {\n isIterable,\n isReadable,\n isReadableNodeStream,\n isNodeStream,\n isTransformStream,\n isWebStream,\n isReadableStream,\n isReadableFinished\n} = __webpack_require__(16115)\nconst AbortController = globalThis.AbortController || (__webpack_require__(66584).AbortController)\nlet PassThrough\nlet Readable\nlet addAbortListener\nfunction destroyer(stream, reading, writing) {\n let finished = false\n stream.on('close', () => {\n finished = true\n })\n const cleanup = eos(\n stream,\n {\n readable: reading,\n writable: writing\n },\n (err) => {\n finished = !err\n }\n )\n return {\n destroy: (err) => {\n if (finished) return\n finished = true\n destroyImpl.destroyer(stream, err || new ERR_STREAM_DESTROYED('pipe'))\n },\n cleanup\n }\n}\nfunction popCallback(streams) {\n // Streams should never be an empty array. It should always contain at least\n // a single stream. Therefore optimize for the average case instead of\n // checking for length === 0 as well.\n validateFunction(streams[streams.length - 1], 'streams[stream.length - 1]')\n return streams.pop()\n}\nfunction makeAsyncIterable(val) {\n if (isIterable(val)) {\n return val\n } else if (isReadableNodeStream(val)) {\n // Legacy streams are not Iterable.\n return fromReadable(val)\n }\n throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], val)\n}\nasync function* fromReadable(val) {\n if (!Readable) {\n Readable = __webpack_require__(57576)\n }\n yield* Readable.prototype[SymbolAsyncIterator].call(val)\n}\nasync function pumpToNode(iterable, writable, finish, { end }) {\n let error\n let onresolve = null\n const resume = (err) => {\n if (err) {\n error = err\n }\n if (onresolve) {\n const callback = onresolve\n onresolve = null\n callback()\n }\n }\n const wait = () =>\n new Promise((resolve, reject) => {\n if (error) {\n reject(error)\n } else {\n onresolve = () => {\n if (error) {\n reject(error)\n } else {\n resolve()\n }\n }\n }\n })\n writable.on('drain', resume)\n const cleanup = eos(\n writable,\n {\n readable: false\n },\n resume\n )\n try {\n if (writable.writableNeedDrain) {\n await wait()\n }\n for await (const chunk of iterable) {\n if (!writable.write(chunk)) {\n await wait()\n }\n }\n if (end) {\n writable.end()\n await wait()\n }\n finish()\n } catch (err) {\n finish(error !== err ? aggregateTwoErrors(error, err) : err)\n } finally {\n cleanup()\n writable.off('drain', resume)\n }\n}\nasync function pumpToWeb(readable, writable, finish, { end }) {\n if (isTransformStream(writable)) {\n writable = writable.writable\n }\n // https://streams.spec.whatwg.org/#example-manual-write-with-backpressure\n const writer = writable.getWriter()\n try {\n for await (const chunk of readable) {\n await writer.ready\n writer.write(chunk).catch(() => {})\n }\n await writer.ready\n if (end) {\n await writer.close()\n }\n finish()\n } catch (err) {\n try {\n await writer.abort(err)\n finish(err)\n } catch (err) {\n finish(err)\n }\n }\n}\nfunction pipeline(...streams) {\n return pipelineImpl(streams, once(popCallback(streams)))\n}\nfunction pipelineImpl(streams, callback, opts) {\n if (streams.length === 1 && ArrayIsArray(streams[0])) {\n streams = streams[0]\n }\n if (streams.length < 2) {\n throw new ERR_MISSING_ARGS('streams')\n }\n const ac = new AbortController()\n const signal = ac.signal\n const outerSignal = opts === null || opts === undefined ? undefined : opts.signal\n\n // Need to cleanup event listeners if last stream is readable\n // https://github.com/nodejs/node/issues/35452\n const lastStreamCleanup = []\n validateAbortSignal(outerSignal, 'options.signal')\n function abort() {\n finishImpl(new AbortError())\n }\n addAbortListener = addAbortListener || (__webpack_require__(57760).addAbortListener)\n let disposable\n if (outerSignal) {\n disposable = addAbortListener(outerSignal, abort)\n }\n let error\n let value\n const destroys = []\n let finishCount = 0\n function finish(err) {\n finishImpl(err, --finishCount === 0)\n }\n function finishImpl(err, final) {\n var _disposable\n if (err && (!error || error.code === 'ERR_STREAM_PREMATURE_CLOSE')) {\n error = err\n }\n if (!error && !final) {\n return\n }\n while (destroys.length) {\n destroys.shift()(error)\n }\n ;(_disposable = disposable) === null || _disposable === undefined ? undefined : _disposable[SymbolDispose]()\n ac.abort()\n if (final) {\n if (!error) {\n lastStreamCleanup.forEach((fn) => fn())\n }\n process.nextTick(callback, error, value)\n }\n }\n let ret\n for (let i = 0; i < streams.length; i++) {\n const stream = streams[i]\n const reading = i < streams.length - 1\n const writing = i > 0\n const end = reading || (opts === null || opts === undefined ? undefined : opts.end) !== false\n const isLastStream = i === streams.length - 1\n if (isNodeStream(stream)) {\n if (end) {\n const { destroy, cleanup } = destroyer(stream, reading, writing)\n destroys.push(destroy)\n if (isReadable(stream) && isLastStream) {\n lastStreamCleanup.push(cleanup)\n }\n }\n\n // Catch stream errors that occur after pipe/pump has completed.\n function onError(err) {\n if (err && err.name !== 'AbortError' && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {\n finish(err)\n }\n }\n stream.on('error', onError)\n if (isReadable(stream) && isLastStream) {\n lastStreamCleanup.push(() => {\n stream.removeListener('error', onError)\n })\n }\n }\n if (i === 0) {\n if (typeof stream === 'function') {\n ret = stream({\n signal\n })\n if (!isIterable(ret)) {\n throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or Stream', 'source', ret)\n }\n } else if (isIterable(stream) || isReadableNodeStream(stream) || isTransformStream(stream)) {\n ret = stream\n } else {\n ret = Duplex.from(stream)\n }\n } else if (typeof stream === 'function') {\n if (isTransformStream(ret)) {\n var _ret\n ret = makeAsyncIterable((_ret = ret) === null || _ret === undefined ? undefined : _ret.readable)\n } else {\n ret = makeAsyncIterable(ret)\n }\n ret = stream(ret, {\n signal\n })\n if (reading) {\n if (!isIterable(ret, true)) {\n throw new ERR_INVALID_RETURN_VALUE('AsyncIterable', `transform[${i - 1}]`, ret)\n }\n } else {\n var _ret2\n if (!PassThrough) {\n PassThrough = __webpack_require__(86524)\n }\n\n // If the last argument to pipeline is not a stream\n // we must create a proxy stream so that pipeline(...)\n // always returns a stream which can be further\n // composed through `.pipe(stream)`.\n\n const pt = new PassThrough({\n objectMode: true\n })\n\n // Handle Promises/A+ spec, `then` could be a getter that throws on\n // second use.\n const then = (_ret2 = ret) === null || _ret2 === undefined ? undefined : _ret2.then\n if (typeof then === 'function') {\n finishCount++\n then.call(\n ret,\n (val) => {\n value = val\n if (val != null) {\n pt.write(val)\n }\n if (end) {\n pt.end()\n }\n process.nextTick(finish)\n },\n (err) => {\n pt.destroy(err)\n process.nextTick(finish, err)\n }\n )\n } else if (isIterable(ret, true)) {\n finishCount++\n pumpToNode(ret, pt, finish, {\n end\n })\n } else if (isReadableStream(ret) || isTransformStream(ret)) {\n const toRead = ret.readable || ret\n finishCount++\n pumpToNode(toRead, pt, finish, {\n end\n })\n } else {\n throw new ERR_INVALID_RETURN_VALUE('AsyncIterable or Promise', 'destination', ret)\n }\n ret = pt\n const { destroy, cleanup } = destroyer(ret, false, true)\n destroys.push(destroy)\n if (isLastStream) {\n lastStreamCleanup.push(cleanup)\n }\n }\n } else if (isNodeStream(stream)) {\n if (isReadableNodeStream(ret)) {\n finishCount += 2\n const cleanup = pipe(ret, stream, finish, {\n end\n })\n if (isReadable(stream) && isLastStream) {\n lastStreamCleanup.push(cleanup)\n }\n } else if (isTransformStream(ret) || isReadableStream(ret)) {\n const toRead = ret.readable || ret\n finishCount++\n pumpToNode(toRead, stream, finish, {\n end\n })\n } else if (isIterable(ret)) {\n finishCount++\n pumpToNode(ret, stream, finish, {\n end\n })\n } else {\n throw new ERR_INVALID_ARG_TYPE(\n 'val',\n ['Readable', 'Iterable', 'AsyncIterable', 'ReadableStream', 'TransformStream'],\n ret\n )\n }\n ret = stream\n } else if (isWebStream(stream)) {\n if (isReadableNodeStream(ret)) {\n finishCount++\n pumpToWeb(makeAsyncIterable(ret), stream, finish, {\n end\n })\n } else if (isReadableStream(ret) || isIterable(ret)) {\n finishCount++\n pumpToWeb(ret, stream, finish, {\n end\n })\n } else if (isTransformStream(ret)) {\n finishCount++\n pumpToWeb(ret.readable, stream, finish, {\n end\n })\n } else {\n throw new ERR_INVALID_ARG_TYPE(\n 'val',\n ['Readable', 'Iterable', 'AsyncIterable', 'ReadableStream', 'TransformStream'],\n ret\n )\n }\n ret = stream\n } else {\n ret = Duplex.from(stream)\n }\n }\n if (\n (signal !== null && signal !== undefined && signal.aborted) ||\n (outerSignal !== null && outerSignal !== undefined && outerSignal.aborted)\n ) {\n process.nextTick(abort)\n }\n return ret\n}\nfunction pipe(src, dst, finish, { end }) {\n let ended = false\n dst.on('close', () => {\n if (!ended) {\n // Finish if the destination closes before the source has completed.\n finish(new ERR_STREAM_PREMATURE_CLOSE())\n }\n })\n src.pipe(dst, {\n end: false\n }) // If end is true we already will have a listener to end dst.\n\n if (end) {\n // Compat. Before node v10.12.0 stdio used to throw an error so\n // pipe() did/does not end() stdio destinations.\n // Now they allow it but \"secretly\" don't close the underlying fd.\n\n function endFn() {\n ended = true\n dst.end()\n }\n if (isReadableFinished(src)) {\n // End the destination if the source has already ended.\n process.nextTick(endFn)\n } else {\n src.once('end', endFn)\n }\n } else {\n finish()\n }\n eos(\n src,\n {\n readable: true,\n writable: false\n },\n (err) => {\n const rState = src._readableState\n if (\n err &&\n err.code === 'ERR_STREAM_PREMATURE_CLOSE' &&\n rState &&\n rState.ended &&\n !rState.errored &&\n !rState.errorEmitted\n ) {\n // Some readable streams will emit 'close' before 'end'. However, since\n // this is on the readable side 'end' should still be emitted if the\n // stream has been ended and no error emitted. This should be allowed in\n // favor of backwards compatibility. Since the stream is piped to a\n // destination this should not result in any observable difference.\n // We don't need to check if this is a writable premature close since\n // eos will only fail with premature close on the reading side for\n // duplex streams.\n src.once('end', finish).once('error', finish)\n } else {\n finish(err)\n }\n }\n )\n return eos(\n dst,\n {\n readable: false,\n writable: true\n },\n finish\n )\n}\nmodule.exports = {\n pipelineImpl,\n pipeline\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUuanM/NWQxYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IEFycmF5SXNBcnJheSwgUHJvbWlzZSwgU3ltYm9sQXN5bmNJdGVyYXRvciwgU3ltYm9sRGlzcG9zZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBvbmNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxuY29uc3QgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFLFxuICAgIEVSUl9NSVNTSU5HX0FSR1MsXG4gICAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gICAgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcbiAgfSxcbiAgQWJvcnRFcnJvclxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9ycycpXG5jb25zdCB7XG4gIGlzSXRlcmFibGUsXG4gIGlzUmVhZGFibGUsXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc05vZGVTdHJlYW0sXG4gIGlzVHJhbnNmb3JtU3RyZWFtLFxuICBpc1dlYlN0cmVhbSxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZWFkYWJsZUZpbmlzaGVkXG59ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCBBYm9ydENvbnRyb2xsZXIgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciB8fCByZXF1aXJlKCdhYm9ydC1jb250cm9sbGVyJykuQWJvcnRDb250cm9sbGVyXG5sZXQgUGFzc1Rocm91Z2hcbmxldCBSZWFkYWJsZVxubGV0IGFkZEFib3J0TGlzdGVuZXJcbmZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcpIHtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2VcbiAgc3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgfSlcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgICB3cml0YWJsZTogd3JpdGluZ1xuICAgIH0sXG4gICAgKGVycikgPT4ge1xuICAgICAgZmluaXNoZWQgPSAhZXJyXG4gICAgfVxuICApXG4gIHJldHVybiB7XG4gICAgZGVzdHJveTogKGVycikgPT4ge1xuICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm5cbiAgICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgZXJyIHx8IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgncGlwZScpKVxuICAgIH0sXG4gICAgY2xlYW51cFxuICB9XG59XG5mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKSB7XG4gIC8vIFN0cmVhbXMgc2hvdWxkIG5ldmVyIGJlIGFuIGVtcHR5IGFycmF5LiBJdCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gYXQgbGVhc3RcbiAgLy8gYSBzaW5nbGUgc3RyZWFtLiBUaGVyZWZvcmUgb3B0aW1pemUgZm9yIHRoZSBhdmVyYWdlIGNhc2UgaW5zdGVhZCBvZlxuICAvLyBjaGVja2luZyBmb3IgbGVuZ3RoID09PSAwIGFzIHdlbGwuXG4gIHZhbGlkYXRlRnVuY3Rpb24oc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdLCAnc3RyZWFtc1tzdHJlYW0ubGVuZ3RoIC0gMV0nKVxuICByZXR1cm4gc3RyZWFtcy5wb3AoKVxufVxuZnVuY3Rpb24gbWFrZUFzeW5jSXRlcmFibGUodmFsKSB7XG4gIGlmIChpc0l0ZXJhYmxlKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsXG4gIH0gZWxzZSBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0odmFsKSkge1xuICAgIC8vIExlZ2FjeSBzdHJlYW1zIGFyZSBub3QgSXRlcmFibGUuXG4gICAgcmV0dXJuIGZyb21SZWFkYWJsZSh2YWwpXG4gIH1cbiAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCd2YWwnLCBbJ1JlYWRhYmxlJywgJ0l0ZXJhYmxlJywgJ0FzeW5jSXRlcmFibGUnXSwgdmFsKVxufVxuYXN5bmMgZnVuY3Rpb24qIGZyb21SZWFkYWJsZSh2YWwpIHtcbiAgaWYgKCFSZWFkYWJsZSkge1xuICAgIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG4gIH1cbiAgeWllbGQqIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2xBc3luY0l0ZXJhdG9yXS5jYWxsKHZhbClcbn1cbmFzeW5jIGZ1bmN0aW9uIHB1bXBUb05vZGUoaXRlcmFibGUsIHdyaXRhYmxlLCBmaW5pc2gsIHsgZW5kIH0pIHtcbiAgbGV0IGVycm9yXG4gIGxldCBvbnJlc29sdmUgPSBudWxsXG4gIGNvbnN0IHJlc3VtZSA9IChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAob25yZXNvbHZlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IG9ucmVzb2x2ZVxuICAgICAgb25yZXNvbHZlID0gbnVsbFxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuICBjb25zdCB3YWl0ID0gKCkgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25yZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB3cml0YWJsZS5vbignZHJhaW4nLCByZXN1bWUpXG4gIGNvbnN0IGNsZWFudXAgPSBlb3MoXG4gICAgd3JpdGFibGUsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICByZXN1bWVcbiAgKVxuICB0cnkge1xuICAgIGlmICh3cml0YWJsZS53cml0YWJsZU5lZWREcmFpbikge1xuICAgICAgYXdhaXQgd2FpdCgpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICAgIGlmICghd3JpdGFibGUud3JpdGUoY2h1bmspKSB7XG4gICAgICAgIGF3YWl0IHdhaXQoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICB3cml0YWJsZS5lbmQoKVxuICAgICAgYXdhaXQgd2FpdCgpXG4gICAgfVxuICAgIGZpbmlzaCgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZpbmlzaChlcnJvciAhPT0gZXJyID8gYWdncmVnYXRlVHdvRXJyb3JzKGVycm9yLCBlcnIpIDogZXJyKVxuICB9IGZpbmFsbHkge1xuICAgIGNsZWFudXAoKVxuICAgIHdyaXRhYmxlLm9mZignZHJhaW4nLCByZXN1bWUpXG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHB1bXBUb1dlYihyZWFkYWJsZSwgd3JpdGFibGUsIGZpbmlzaCwgeyBlbmQgfSkge1xuICBpZiAoaXNUcmFuc2Zvcm1TdHJlYW0od3JpdGFibGUpKSB7XG4gICAgd3JpdGFibGUgPSB3cml0YWJsZS53cml0YWJsZVxuICB9XG4gIC8vIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI2V4YW1wbGUtbWFudWFsLXdyaXRlLXdpdGgtYmFja3ByZXNzdXJlXG4gIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpXG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiByZWFkYWJsZSkge1xuICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5XG4gICAgICB3cml0ZXIud3JpdGUoY2h1bmspLmNhdGNoKCgpID0+IHt9KVxuICAgIH1cbiAgICBhd2FpdCB3cml0ZXIucmVhZHlcbiAgICBpZiAoZW5kKSB7XG4gICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKVxuICAgIH1cbiAgICBmaW5pc2goKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVyLmFib3J0KGVycilcbiAgICAgIGZpbmlzaChlcnIpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBmaW5pc2goZXJyKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcGlwZWxpbmUoLi4uc3RyZWFtcykge1xuICByZXR1cm4gcGlwZWxpbmVJbXBsKHN0cmVhbXMsIG9uY2UocG9wQ2FsbGJhY2soc3RyZWFtcykpKVxufVxuZnVuY3Rpb24gcGlwZWxpbmVJbXBsKHN0cmVhbXMsIGNhbGxiYWNrLCBvcHRzKSB7XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMSAmJiBBcnJheUlzQXJyYXkoc3RyZWFtc1swXSkpIHtcbiAgICBzdHJlYW1zID0gc3RyZWFtc1swXVxuICB9XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRVJSX01JU1NJTkdfQVJHUygnc3RyZWFtcycpXG4gIH1cbiAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgY29uc3Qgc2lnbmFsID0gYWMuc2lnbmFsXG4gIGNvbnN0IG91dGVyU2lnbmFsID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLnNpZ25hbFxuXG4gIC8vIE5lZWQgdG8gY2xlYW51cCBldmVudCBsaXN0ZW5lcnMgaWYgbGFzdCBzdHJlYW0gaXMgcmVhZGFibGVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8zNTQ1MlxuICBjb25zdCBsYXN0U3RyZWFtQ2xlYW51cCA9IFtdXG4gIHZhbGlkYXRlQWJvcnRTaWduYWwob3V0ZXJTaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIGZ1bmN0aW9uIGFib3J0KCkge1xuICAgIGZpbmlzaEltcGwobmV3IEFib3J0RXJyb3IoKSlcbiAgfVxuICBhZGRBYm9ydExpc3RlbmVyID0gYWRkQWJvcnRMaXN0ZW5lciB8fCByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKS5hZGRBYm9ydExpc3RlbmVyXG4gIGxldCBkaXNwb3NhYmxlXG4gIGlmIChvdXRlclNpZ25hbCkge1xuICAgIGRpc3Bvc2FibGUgPSBhZGRBYm9ydExpc3RlbmVyKG91dGVyU2lnbmFsLCBhYm9ydClcbiAgfVxuICBsZXQgZXJyb3JcbiAgbGV0IHZhbHVlXG4gIGNvbnN0IGRlc3Ryb3lzID0gW11cbiAgbGV0IGZpbmlzaENvdW50ID0gMFxuICBmdW5jdGlvbiBmaW5pc2goZXJyKSB7XG4gICAgZmluaXNoSW1wbChlcnIsIC0tZmluaXNoQ291bnQgPT09IDApXG4gIH1cbiAgZnVuY3Rpb24gZmluaXNoSW1wbChlcnIsIGZpbmFsKSB7XG4gICAgdmFyIF9kaXNwb3NhYmxlXG4gICAgaWYgKGVyciAmJiAoIWVycm9yIHx8IGVycm9yLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAoIWVycm9yICYmICFmaW5hbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdoaWxlIChkZXN0cm95cy5sZW5ndGgpIHtcbiAgICAgIGRlc3Ryb3lzLnNoaWZ0KCkoZXJyb3IpXG4gICAgfVxuICAgIDsoX2Rpc3Bvc2FibGUgPSBkaXNwb3NhYmxlKSA9PT0gbnVsbCB8fCBfZGlzcG9zYWJsZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX2Rpc3Bvc2FibGVbU3ltYm9sRGlzcG9zZV0oKVxuICAgIGFjLmFib3J0KClcbiAgICBpZiAoZmluYWwpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgbGFzdFN0cmVhbUNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpXG4gICAgICB9XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBlcnJvciwgdmFsdWUpXG4gICAgfVxuICB9XG4gIGxldCByZXRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJlYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1tpXVxuICAgIGNvbnN0IHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgY29uc3Qgd3JpdGluZyA9IGkgPiAwXG4gICAgY29uc3QgZW5kID0gcmVhZGluZyB8fCAob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLmVuZCkgIT09IGZhbHNlXG4gICAgY29uc3QgaXNMYXN0U3RyZWFtID0gaSA9PT0gc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgZGVzdHJveSwgY2xlYW51cCB9ID0gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZylcbiAgICAgICAgZGVzdHJveXMucHVzaChkZXN0cm95KVxuICAgICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pICYmIGlzTGFzdFN0cmVhbSkge1xuICAgICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goY2xlYW51cClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYXRjaCBzdHJlYW0gZXJyb3JzIHRoYXQgb2NjdXIgYWZ0ZXIgcGlwZS9wdW1wIGhhcyBjb21wbGV0ZWQuXG4gICAgICBmdW5jdGlvbiBvbkVycm9yKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lICE9PSAnQWJvcnRFcnJvcicgJiYgZXJyLmNvZGUgIT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpIHtcbiAgICAgICAgICBmaW5pc2goZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25FcnJvcilcbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkgJiYgaXNMYXN0U3RyZWFtKSB7XG4gICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goKCkgPT4ge1xuICAgICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgaWYgKHR5cGVvZiBzdHJlYW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0ID0gc3RyZWFtKHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKCFpc0l0ZXJhYmxlKHJldCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdJdGVyYWJsZSwgQXN5bmNJdGVyYWJsZSBvciBTdHJlYW0nLCAnc291cmNlJywgcmV0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUoc3RyZWFtKSB8fCBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pIHx8IGlzVHJhbnNmb3JtU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAgICAgcmV0ID0gc3RyZWFtXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBEdXBsZXguZnJvbShzdHJlYW0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyZWFtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoaXNUcmFuc2Zvcm1TdHJlYW0ocmV0KSkge1xuICAgICAgICB2YXIgX3JldFxuICAgICAgICByZXQgPSBtYWtlQXN5bmNJdGVyYWJsZSgoX3JldCA9IHJldCkgPT09IG51bGwgfHwgX3JldCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX3JldC5yZWFkYWJsZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IG1ha2VBc3luY0l0ZXJhYmxlKHJldClcbiAgICAgIH1cbiAgICAgIHJldCA9IHN0cmVhbShyZXQsIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KVxuICAgICAgaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgaWYgKCFpc0l0ZXJhYmxlKHJldCwgdHJ1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdBc3luY0l0ZXJhYmxlJywgYHRyYW5zZm9ybVske2kgLSAxfV1gLCByZXQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBfcmV0MlxuICAgICAgICBpZiAoIVBhc3NUaHJvdWdoKSB7XG4gICAgICAgICAgUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL3Bhc3N0aHJvdWdoJylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBsYXN0IGFyZ3VtZW50IHRvIHBpcGVsaW5lIGlzIG5vdCBhIHN0cmVhbVxuICAgICAgICAvLyB3ZSBtdXN0IGNyZWF0ZSBhIHByb3h5IHN0cmVhbSBzbyB0aGF0IHBpcGVsaW5lKC4uLilcbiAgICAgICAgLy8gYWx3YXlzIHJldHVybnMgYSBzdHJlYW0gd2hpY2ggY2FuIGJlIGZ1cnRoZXJcbiAgICAgICAgLy8gY29tcG9zZWQgdGhyb3VnaCBgLnBpcGUoc3RyZWFtKWAuXG5cbiAgICAgICAgY29uc3QgcHQgPSBuZXcgUGFzc1Rocm91Z2goe1xuICAgICAgICAgIG9iamVjdE1vZGU6IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBIYW5kbGUgUHJvbWlzZXMvQSsgc3BlYywgYHRoZW5gIGNvdWxkIGJlIGEgZ2V0dGVyIHRoYXQgdGhyb3dzIG9uXG4gICAgICAgIC8vIHNlY29uZCB1c2UuXG4gICAgICAgIGNvbnN0IHRoZW4gPSAoX3JldDIgPSByZXQpID09PSBudWxsIHx8IF9yZXQyID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBfcmV0Mi50aGVuXG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGZpbmlzaENvdW50KytcbiAgICAgICAgICB0aGVuLmNhbGwoXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICAodmFsKSA9PiB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsXG4gICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHB0LndyaXRlKHZhbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgcHQuZW5kKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZpbmlzaClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHB0LmRlc3Ryb3koZXJyKVxuICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZpbmlzaCwgZXJyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKHJldCwgdHJ1ZSkpIHtcbiAgICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgICAgcHVtcFRvTm9kZShyZXQsIHB0LCBmaW5pc2gsIHtcbiAgICAgICAgICAgIGVuZFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWFkYWJsZVN0cmVhbShyZXQpIHx8IGlzVHJhbnNmb3JtU3RyZWFtKHJldCkpIHtcbiAgICAgICAgICBjb25zdCB0b1JlYWQgPSByZXQucmVhZGFibGUgfHwgcmV0XG4gICAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICAgIHB1bXBUb05vZGUodG9SZWFkLCBwdCwgZmluaXNoLCB7XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0FzeW5jSXRlcmFibGUgb3IgUHJvbWlzZScsICdkZXN0aW5hdGlvbicsIHJldClcbiAgICAgICAgfVxuICAgICAgICByZXQgPSBwdFxuICAgICAgICBjb25zdCB7IGRlc3Ryb3ksIGNsZWFudXAgfSA9IGRlc3Ryb3llcihyZXQsIGZhbHNlLCB0cnVlKVxuICAgICAgICBkZXN0cm95cy5wdXNoKGRlc3Ryb3kpXG4gICAgICAgIGlmIChpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0ocmV0KSkge1xuICAgICAgICBmaW5pc2hDb3VudCArPSAyXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSBwaXBlKHJldCwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGlzUmVhZGFibGUoc3RyZWFtKSAmJiBpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNUcmFuc2Zvcm1TdHJlYW0ocmV0KSB8fCBpc1JlYWRhYmxlU3RyZWFtKHJldCkpIHtcbiAgICAgICAgY29uc3QgdG9SZWFkID0gcmV0LnJlYWRhYmxlIHx8IHJldFxuICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgIHB1bXBUb05vZGUodG9SZWFkLCBzdHJlYW0sIGZpbmlzaCwge1xuICAgICAgICAgIGVuZFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKHJldCkpIHtcbiAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICBwdW1wVG9Ob2RlKHJldCwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShcbiAgICAgICAgICAndmFsJyxcbiAgICAgICAgICBbJ1JlYWRhYmxlJywgJ0l0ZXJhYmxlJywgJ0FzeW5jSXRlcmFibGUnLCAnUmVhZGFibGVTdHJlYW0nLCAnVHJhbnNmb3JtU3RyZWFtJ10sXG4gICAgICAgICAgcmV0XG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldCA9IHN0cmVhbVxuICAgIH0gZWxzZSBpZiAoaXNXZWJTdHJlYW0oc3RyZWFtKSkge1xuICAgICAgaWYgKGlzUmVhZGFibGVOb2RlU3RyZWFtKHJldCkpIHtcbiAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICBwdW1wVG9XZWIobWFrZUFzeW5jSXRlcmFibGUocmV0KSwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFkYWJsZVN0cmVhbShyZXQpIHx8IGlzSXRlcmFibGUocmV0KSkge1xuICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgIHB1bXBUb1dlYihyZXQsIHN0cmVhbSwgZmluaXNoLCB7XG4gICAgICAgICAgZW5kXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGlzVHJhbnNmb3JtU3RyZWFtKHJldCkpIHtcbiAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICBwdW1wVG9XZWIocmV0LnJlYWRhYmxlLCBzdHJlYW0sIGZpbmlzaCwge1xuICAgICAgICAgIGVuZFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKFxuICAgICAgICAgICd2YWwnLFxuICAgICAgICAgIFsnUmVhZGFibGUnLCAnSXRlcmFibGUnLCAnQXN5bmNJdGVyYWJsZScsICdSZWFkYWJsZVN0cmVhbScsICdUcmFuc2Zvcm1TdHJlYW0nXSxcbiAgICAgICAgICByZXRcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0ID0gc3RyZWFtXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldCA9IER1cGxleC5mcm9tKHN0cmVhbSlcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChzaWduYWwgIT09IG51bGwgJiYgc2lnbmFsICE9PSB1bmRlZmluZWQgJiYgc2lnbmFsLmFib3J0ZWQpIHx8XG4gICAgKG91dGVyU2lnbmFsICE9PSBudWxsICYmIG91dGVyU2lnbmFsICE9PSB1bmRlZmluZWQgJiYgb3V0ZXJTaWduYWwuYWJvcnRlZClcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhhYm9ydClcbiAgfVxuICByZXR1cm4gcmV0XG59XG5mdW5jdGlvbiBwaXBlKHNyYywgZHN0LCBmaW5pc2gsIHsgZW5kIH0pIHtcbiAgbGV0IGVuZGVkID0gZmFsc2VcbiAgZHN0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBpZiAoIWVuZGVkKSB7XG4gICAgICAvLyBGaW5pc2ggaWYgdGhlIGRlc3RpbmF0aW9uIGNsb3NlcyBiZWZvcmUgdGhlIHNvdXJjZSBoYXMgY29tcGxldGVkLlxuICAgICAgZmluaXNoKG5ldyBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSgpKVxuICAgIH1cbiAgfSlcbiAgc3JjLnBpcGUoZHN0LCB7XG4gICAgZW5kOiBmYWxzZVxuICB9KSAvLyBJZiBlbmQgaXMgdHJ1ZSB3ZSBhbHJlYWR5IHdpbGwgaGF2ZSBhIGxpc3RlbmVyIHRvIGVuZCBkc3QuXG5cbiAgaWYgKGVuZCkge1xuICAgIC8vIENvbXBhdC4gQmVmb3JlIG5vZGUgdjEwLjEyLjAgc3RkaW8gdXNlZCB0byB0aHJvdyBhbiBlcnJvciBzb1xuICAgIC8vIHBpcGUoKSBkaWQvZG9lcyBub3QgZW5kKCkgc3RkaW8gZGVzdGluYXRpb25zLlxuICAgIC8vIE5vdyB0aGV5IGFsbG93IGl0IGJ1dCBcInNlY3JldGx5XCIgZG9uJ3QgY2xvc2UgdGhlIHVuZGVybHlpbmcgZmQuXG5cbiAgICBmdW5jdGlvbiBlbmRGbigpIHtcbiAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgZHN0LmVuZCgpXG4gICAgfVxuICAgIGlmIChpc1JlYWRhYmxlRmluaXNoZWQoc3JjKSkge1xuICAgICAgLy8gRW5kIHRoZSBkZXN0aW5hdGlvbiBpZiB0aGUgc291cmNlIGhhcyBhbHJlYWR5IGVuZGVkLlxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRGbilcbiAgICB9IGVsc2Uge1xuICAgICAgc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaW5pc2goKVxuICB9XG4gIGVvcyhcbiAgICBzcmMsXG4gICAge1xuICAgICAgcmVhZGFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9LFxuICAgIChlcnIpID0+IHtcbiAgICAgIGNvbnN0IHJTdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKFxuICAgICAgICBlcnIgJiZcbiAgICAgICAgZXJyLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScgJiZcbiAgICAgICAgclN0YXRlICYmXG4gICAgICAgIHJTdGF0ZS5lbmRlZCAmJlxuICAgICAgICAhclN0YXRlLmVycm9yZWQgJiZcbiAgICAgICAgIXJTdGF0ZS5lcnJvckVtaXR0ZWRcbiAgICAgICkge1xuICAgICAgICAvLyBTb21lIHJlYWRhYmxlIHN0cmVhbXMgd2lsbCBlbWl0ICdjbG9zZScgYmVmb3JlICdlbmQnLiBIb3dldmVyLCBzaW5jZVxuICAgICAgICAvLyB0aGlzIGlzIG9uIHRoZSByZWFkYWJsZSBzaWRlICdlbmQnIHNob3VsZCBzdGlsbCBiZSBlbWl0dGVkIGlmIHRoZVxuICAgICAgICAvLyBzdHJlYW0gaGFzIGJlZW4gZW5kZWQgYW5kIG5vIGVycm9yIGVtaXR0ZWQuIFRoaXMgc2hvdWxkIGJlIGFsbG93ZWQgaW5cbiAgICAgICAgLy8gZmF2b3Igb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNpbmNlIHRoZSBzdHJlYW0gaXMgcGlwZWQgdG8gYVxuICAgICAgICAvLyBkZXN0aW5hdGlvbiB0aGlzIHNob3VsZCBub3QgcmVzdWx0IGluIGFueSBvYnNlcnZhYmxlIGRpZmZlcmVuY2UuXG4gICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBhIHdyaXRhYmxlIHByZW1hdHVyZSBjbG9zZSBzaW5jZVxuICAgICAgICAvLyBlb3Mgd2lsbCBvbmx5IGZhaWwgd2l0aCBwcmVtYXR1cmUgY2xvc2Ugb24gdGhlIHJlYWRpbmcgc2lkZSBmb3JcbiAgICAgICAgLy8gZHVwbGV4IHN0cmVhbXMuXG4gICAgICAgIHNyYy5vbmNlKCdlbmQnLCBmaW5pc2gpLm9uY2UoJ2Vycm9yJywgZmluaXNoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluaXNoKGVycilcbiAgICAgIH1cbiAgICB9XG4gIClcbiAgcmV0dXJuIGVvcyhcbiAgICBkc3QsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9LFxuICAgIGZpbmlzaFxuICApXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGlwZWxpbmVJbXBsLFxuICBwaXBlbGluZVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///57758\n")},57576:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/* replacement start */\n\nconst process = __webpack_require__(54422)\n\n/* replacement end */\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n;('use strict')\nconst {\n ArrayPrototypeIndexOf,\n NumberIsInteger,\n NumberIsNaN,\n NumberParseInt,\n ObjectDefineProperties,\n ObjectKeys,\n ObjectSetPrototypeOf,\n Promise,\n SafeSet,\n SymbolAsyncDispose,\n SymbolAsyncIterator,\n Symbol\n} = __webpack_require__(24134)\nmodule.exports = Readable\nReadable.ReadableState = ReadableState\nconst { EventEmitter: EE } = __webpack_require__(24434)\nconst { Stream, prependListener } = __webpack_require__(94259)\nconst { Buffer } = __webpack_require__(20181)\nconst { addAbortSignal } = __webpack_require__(4147)\nconst eos = __webpack_require__(86238)\nlet debug = (__webpack_require__(57760).debuglog)('stream', (fn) => {\n debug = fn\n})\nconst BufferList = __webpack_require__(80345)\nconst destroyImpl = __webpack_require__(75896)\nconst { getHighWaterMark, getDefaultHighWaterMark } = __webpack_require__(65291)\nconst {\n aggregateTwoErrors,\n codes: {\n ERR_INVALID_ARG_TYPE,\n ERR_METHOD_NOT_IMPLEMENTED,\n ERR_OUT_OF_RANGE,\n ERR_STREAM_PUSH_AFTER_EOF,\n ERR_STREAM_UNSHIFT_AFTER_END_EVENT\n },\n AbortError\n} = __webpack_require__(76371)\nconst { validateObject } = __webpack_require__(277)\nconst kPaused = Symbol('kPaused')\nconst { StringDecoder } = __webpack_require__(13193)\nconst from = __webpack_require__(96532)\nObjectSetPrototypeOf(Readable.prototype, Stream.prototype)\nObjectSetPrototypeOf(Readable, Stream)\nconst nop = () => {}\nconst { errorOrDestroy } = destroyImpl\nconst kObjectMode = 1 << 0\nconst kEnded = 1 << 1\nconst kEndEmitted = 1 << 2\nconst kReading = 1 << 3\nconst kConstructed = 1 << 4\nconst kSync = 1 << 5\nconst kNeedReadable = 1 << 6\nconst kEmittedReadable = 1 << 7\nconst kReadableListening = 1 << 8\nconst kResumeScheduled = 1 << 9\nconst kErrorEmitted = 1 << 10\nconst kEmitClose = 1 << 11\nconst kAutoDestroy = 1 << 12\nconst kDestroyed = 1 << 13\nconst kClosed = 1 << 14\nconst kCloseEmitted = 1 << 15\nconst kMultiAwaitDrain = 1 << 16\nconst kReadingMore = 1 << 17\nconst kDataEmitted = 1 << 18\n\n// TODO(benjamingr) it is likely slower to do it this way than with free functions\nfunction makeBitMapDescriptor(bit) {\n return {\n enumerable: false,\n get() {\n return (this.state & bit) !== 0\n },\n set(value) {\n if (value) this.state |= bit\n else this.state &= ~bit\n }\n }\n}\nObjectDefineProperties(ReadableState.prototype, {\n objectMode: makeBitMapDescriptor(kObjectMode),\n ended: makeBitMapDescriptor(kEnded),\n endEmitted: makeBitMapDescriptor(kEndEmitted),\n reading: makeBitMapDescriptor(kReading),\n // Stream is still being constructed and cannot be\n // destroyed until construction finished or failed.\n // Async construction is opt in, therefore we start as\n // constructed.\n constructed: makeBitMapDescriptor(kConstructed),\n // A flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n sync: makeBitMapDescriptor(kSync),\n // Whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n needReadable: makeBitMapDescriptor(kNeedReadable),\n emittedReadable: makeBitMapDescriptor(kEmittedReadable),\n readableListening: makeBitMapDescriptor(kReadableListening),\n resumeScheduled: makeBitMapDescriptor(kResumeScheduled),\n // True if the error was already emitted and should not be thrown again.\n errorEmitted: makeBitMapDescriptor(kErrorEmitted),\n emitClose: makeBitMapDescriptor(kEmitClose),\n autoDestroy: makeBitMapDescriptor(kAutoDestroy),\n // Has it been destroyed.\n destroyed: makeBitMapDescriptor(kDestroyed),\n // Indicates whether the stream has finished destroying.\n closed: makeBitMapDescriptor(kClosed),\n // True if close has been emitted or would have been emitted\n // depending on emitClose.\n closeEmitted: makeBitMapDescriptor(kCloseEmitted),\n multiAwaitDrain: makeBitMapDescriptor(kMultiAwaitDrain),\n // If true, a maybeReadMore has been scheduled.\n readingMore: makeBitMapDescriptor(kReadingMore),\n dataEmitted: makeBitMapDescriptor(kDataEmitted)\n})\nfunction ReadableState(options, stream, isDuplex) {\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof __webpack_require__(93370)\n\n // Bit map field to store ReadableState more effciently with 1 bit per field\n // instead of a V8 slot per field.\n this.state = kEmitClose | kAutoDestroy | kConstructed | kSync\n // Object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away.\n if (options && options.objectMode) this.state |= kObjectMode\n if (isDuplex && options && options.readableObjectMode) this.state |= kObjectMode\n\n // The point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n this.highWaterMark = options\n ? getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex)\n : getDefaultHighWaterMark(false)\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift().\n this.buffer = new BufferList()\n this.length = 0\n this.pipes = []\n this.flowing = null\n this[kPaused] = null\n\n // Should close be emitted on destroy. Defaults to true.\n if (options && options.emitClose === false) this.state &= ~kEmitClose\n\n // Should .destroy() be called after 'end' (and potentially 'finish').\n if (options && options.autoDestroy === false) this.state &= ~kAutoDestroy\n\n // Indicates whether the stream has errored. When true no further\n // _read calls, 'data' or 'readable' events should occur. This is needed\n // since when autoDestroy is disabled we need a way to tell whether the\n // stream has failed.\n this.errored = null\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = (options && options.defaultEncoding) || 'utf8'\n\n // Ref the piped dest which we need a drain event on it\n // type: null | Writable | Set.\n this.awaitDrainWriters = null\n this.decoder = null\n this.encoding = null\n if (options && options.encoding) {\n this.decoder = new StringDecoder(options.encoding)\n this.encoding = options.encoding\n }\n}\nfunction Readable(options) {\n if (!(this instanceof Readable)) return new Readable(options)\n\n // Checking for a Stream.Duplex instance is faster here instead of inside\n // the ReadableState constructor, at least with V8 6.5.\n const isDuplex = this instanceof __webpack_require__(93370)\n this._readableState = new ReadableState(options, this, isDuplex)\n if (options) {\n if (typeof options.read === 'function') this._read = options.read\n if (typeof options.destroy === 'function') this._destroy = options.destroy\n if (typeof options.construct === 'function') this._construct = options.construct\n if (options.signal && !isDuplex) addAbortSignal(options.signal, this)\n }\n Stream.call(this, options)\n destroyImpl.construct(this, () => {\n if (this._readableState.needReadable) {\n maybeReadMore(this, this._readableState)\n }\n })\n}\nReadable.prototype.destroy = destroyImpl.destroy\nReadable.prototype._undestroy = destroyImpl.undestroy\nReadable.prototype._destroy = function (err, cb) {\n cb(err)\n}\nReadable.prototype[EE.captureRejectionSymbol] = function (err) {\n this.destroy(err)\n}\nReadable.prototype[SymbolAsyncDispose] = function () {\n let error\n if (!this.destroyed) {\n error = this.readableEnded ? null : new AbortError()\n this.destroy(error)\n }\n return new Promise((resolve, reject) => eos(this, (err) => (err && err !== error ? reject(err) : resolve(null))))\n}\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n return readableAddChunk(this, chunk, encoding, false)\n}\n\n// Unshift should *always* be something directly out of read().\nReadable.prototype.unshift = function (chunk, encoding) {\n return readableAddChunk(this, chunk, encoding, true)\n}\nfunction readableAddChunk(stream, chunk, encoding, addToFront) {\n debug('readableAddChunk', chunk)\n const state = stream._readableState\n let err\n if ((state.state & kObjectMode) === 0) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding\n if (state.encoding !== encoding) {\n if (addToFront && state.encoding) {\n // When unshifting, if state.encoding is set, we have to save\n // the string in the BufferList with the state encoding.\n chunk = Buffer.from(chunk, encoding).toString(state.encoding)\n } else {\n chunk = Buffer.from(chunk, encoding)\n encoding = ''\n }\n }\n } else if (chunk instanceof Buffer) {\n encoding = ''\n } else if (Stream._isUint8Array(chunk)) {\n chunk = Stream._uint8ArrayToBuffer(chunk)\n encoding = ''\n } else if (chunk != null) {\n err = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk)\n }\n }\n if (err) {\n errorOrDestroy(stream, err)\n } else if (chunk === null) {\n state.state &= ~kReading\n onEofChunk(stream, state)\n } else if ((state.state & kObjectMode) !== 0 || (chunk && chunk.length > 0)) {\n if (addToFront) {\n if ((state.state & kEndEmitted) !== 0) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT())\n else if (state.destroyed || state.errored) return false\n else addChunk(stream, state, chunk, true)\n } else if (state.ended) {\n errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF())\n } else if (state.destroyed || state.errored) {\n return false\n } else {\n state.state &= ~kReading\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk)\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false)\n else maybeReadMore(stream, state)\n } else {\n addChunk(stream, state, chunk, false)\n }\n }\n } else if (!addToFront) {\n state.state &= ~kReading\n maybeReadMore(stream, state)\n }\n\n // We can push more data if we are below the highWaterMark.\n // Also, if we have no data yet, we can stand some more bytes.\n // This is to work around cases where hwm=0, such as the repl.\n return !state.ended && (state.length < state.highWaterMark || state.length === 0)\n}\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync && stream.listenerCount('data') > 0) {\n // Use the guard to avoid creating `Set()` repeatedly\n // when we have multiple pipes.\n if ((state.state & kMultiAwaitDrain) !== 0) {\n state.awaitDrainWriters.clear()\n } else {\n state.awaitDrainWriters = null\n }\n state.dataEmitted = true\n stream.emit('data', chunk)\n } else {\n // Update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length\n if (addToFront) state.buffer.unshift(chunk)\n else state.buffer.push(chunk)\n if ((state.state & kNeedReadable) !== 0) emitReadable(stream)\n }\n maybeReadMore(stream, state)\n}\nReadable.prototype.isPaused = function () {\n const state = this._readableState\n return state[kPaused] === true || state.flowing === false\n}\n\n// Backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n const decoder = new StringDecoder(enc)\n this._readableState.decoder = decoder\n // If setEncoding(null), decoder.encoding equals utf8.\n this._readableState.encoding = this._readableState.decoder.encoding\n const buffer = this._readableState.buffer\n // Iterate over current buffer to convert already stored Buffers:\n let content = ''\n for (const data of buffer) {\n content += decoder.write(data)\n }\n buffer.clear()\n if (content !== '') buffer.push(content)\n this._readableState.length = content.length\n return this\n}\n\n// Don't raise the hwm > 1GB.\nconst MAX_HWM = 0x40000000\nfunction computeNewHighWaterMark(n) {\n if (n > MAX_HWM) {\n throw new ERR_OUT_OF_RANGE('size', '<= 1GiB', n)\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts.\n n--\n n |= n >>> 1\n n |= n >>> 2\n n |= n >>> 4\n n |= n >>> 8\n n |= n >>> 16\n n++\n }\n return n\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || (state.length === 0 && state.ended)) return 0\n if ((state.state & kObjectMode) !== 0) return 1\n if (NumberIsNaN(n)) {\n // Only flow one buffer at a time.\n if (state.flowing && state.length) return state.buffer.first().length\n return state.length\n }\n if (n <= state.length) return n\n return state.ended ? state.length : 0\n}\n\n// You can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n)\n // Same as parseInt(undefined, 10), however V8 7.3 performance regressed\n // in this scenario, so we are doing it manually.\n if (n === undefined) {\n n = NaN\n } else if (!NumberIsInteger(n)) {\n n = NumberParseInt(n, 10)\n }\n const state = this._readableState\n const nOrig = n\n\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n)\n if (n !== 0) state.state &= ~kEmittedReadable\n\n // If we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (\n n === 0 &&\n state.needReadable &&\n ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)\n ) {\n debug('read: emitReadable', state.length, state.ended)\n if (state.length === 0 && state.ended) endReadable(this)\n else emitReadable(this)\n return null\n }\n n = howMuchToRead(n, state)\n\n // If we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this)\n return null\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n let doRead = (state.state & kNeedReadable) !== 0\n debug('need readable', doRead)\n\n // If we currently have less than the highWaterMark, then also read some.\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true\n debug('length less than watermark', doRead)\n }\n\n // However, if we've ended, then there's no point, if we're already\n // reading, then it's unnecessary, if we're constructing we have to wait,\n // and if we're destroyed or errored, then it's not allowed,\n if (state.ended || state.reading || state.destroyed || state.errored || !state.constructed) {\n doRead = false\n debug('reading, ended or constructing', doRead)\n } else if (doRead) {\n debug('do read')\n state.state |= kReading | kSync\n // If the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.state |= kNeedReadable\n\n // Call internal read method\n try {\n this._read(state.highWaterMark)\n } catch (err) {\n errorOrDestroy(this, err)\n }\n state.state &= ~kSync\n\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state)\n }\n let ret\n if (n > 0) ret = fromList(n, state)\n else ret = null\n if (ret === null) {\n state.needReadable = state.length <= state.highWaterMark\n n = 0\n } else {\n state.length -= n\n if (state.multiAwaitDrain) {\n state.awaitDrainWriters.clear()\n } else {\n state.awaitDrainWriters = null\n }\n }\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this)\n }\n if (ret !== null && !state.errorEmitted && !state.closeEmitted) {\n state.dataEmitted = true\n this.emit('data', ret)\n }\n return ret\n}\nfunction onEofChunk(stream, state) {\n debug('onEofChunk')\n if (state.ended) return\n if (state.decoder) {\n const chunk = state.decoder.end()\n if (chunk && chunk.length) {\n state.buffer.push(chunk)\n state.length += state.objectMode ? 1 : chunk.length\n }\n }\n state.ended = true\n if (state.sync) {\n // If we are sync, wait until next tick to emit the data.\n // Otherwise we risk emitting data in the flow()\n // the readable code triggers during a read() call.\n emitReadable(stream)\n } else {\n // Emit 'readable' now to make sure it gets picked up.\n state.needReadable = false\n state.emittedReadable = true\n // We have to emit readable now that we are EOF. Modules\n // in the ecosystem (e.g. dicer) rely on this event being sync.\n emitReadable_(stream)\n }\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n const state = stream._readableState\n debug('emitReadable', state.needReadable, state.emittedReadable)\n state.needReadable = false\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing)\n state.emittedReadable = true\n process.nextTick(emitReadable_, stream)\n }\n}\nfunction emitReadable_(stream) {\n const state = stream._readableState\n debug('emitReadable_', state.destroyed, state.length, state.ended)\n if (!state.destroyed && !state.errored && (state.length || state.ended)) {\n stream.emit('readable')\n state.emittedReadable = false\n }\n\n // The stream needs another readable event if:\n // 1. It is not flowing, as the flow mechanism will take\n // care of it.\n // 2. It is not ended.\n // 3. It is below the highWaterMark, so we can schedule\n // another readable later.\n state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark\n flow(stream)\n}\n\n// At this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore && state.constructed) {\n state.readingMore = true\n process.nextTick(maybeReadMore_, stream, state)\n }\n}\nfunction maybeReadMore_(stream, state) {\n // Attempt to read more data if we should.\n //\n // The conditions for reading more data are (one of):\n // - Not enough data buffered (state.length < state.highWaterMark). The loop\n // is responsible for filling the buffer with enough data if such data\n // is available. If highWaterMark is 0 and we are not in the flowing mode\n // we should _not_ attempt to buffer any extra data. We'll get more data\n // when the stream consumer calls read() instead.\n // - No data in the buffer, and the stream is in flowing mode. In this mode\n // the loop below is responsible for ensuring read() is called. Failing to\n // call read here would abort the flow and there's no other mechanism for\n // continuing the flow if the stream consumer has just subscribed to the\n // 'data' event.\n //\n // In addition to the above conditions to keep reading data, the following\n // conditions prevent the data from being read:\n // - The stream has ended (state.ended).\n // - There is already a pending 'read' operation (state.reading). This is a\n // case where the stream has called the implementation defined _read()\n // method, but they are processing the call asynchronously and have _not_\n // called push() with new data. In this case we skip performing more\n // read()s. The execution ends in this method again after the _read() ends\n // up calling push() with more data.\n while (\n !state.reading &&\n !state.ended &&\n (state.length < state.highWaterMark || (state.flowing && state.length === 0))\n ) {\n const len = state.length\n debug('maybeReadMore read 0')\n stream.read(0)\n if (len === state.length)\n // Didn't get any data, stop spinning.\n break\n }\n state.readingMore = false\n}\n\n// Abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n throw new ERR_METHOD_NOT_IMPLEMENTED('_read()')\n}\nReadable.prototype.pipe = function (dest, pipeOpts) {\n const src = this\n const state = this._readableState\n if (state.pipes.length === 1) {\n if (!state.multiAwaitDrain) {\n state.multiAwaitDrain = true\n state.awaitDrainWriters = new SafeSet(state.awaitDrainWriters ? [state.awaitDrainWriters] : [])\n }\n }\n state.pipes.push(dest)\n debug('pipe count=%d opts=%j', state.pipes.length, pipeOpts)\n const doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr\n const endFn = doEnd ? onend : unpipe\n if (state.endEmitted) process.nextTick(endFn)\n else src.once('end', endFn)\n dest.on('unpipe', onunpipe)\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe')\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true\n cleanup()\n }\n }\n }\n function onend() {\n debug('onend')\n dest.end()\n }\n let ondrain\n let cleanedUp = false\n function cleanup() {\n debug('cleanup')\n // Cleanup event handlers once the pipe is broken.\n dest.removeListener('close', onclose)\n dest.removeListener('finish', onfinish)\n if (ondrain) {\n dest.removeListener('drain', ondrain)\n }\n dest.removeListener('error', onerror)\n dest.removeListener('unpipe', onunpipe)\n src.removeListener('end', onend)\n src.removeListener('end', unpipe)\n src.removeListener('data', ondata)\n cleanedUp = true\n\n // If the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (ondrain && state.awaitDrainWriters && (!dest._writableState || dest._writableState.needDrain)) ondrain()\n }\n function pause() {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if (!cleanedUp) {\n if (state.pipes.length === 1 && state.pipes[0] === dest) {\n debug('false write response, pause', 0)\n state.awaitDrainWriters = dest\n state.multiAwaitDrain = false\n } else if (state.pipes.length > 1 && state.pipes.includes(dest)) {\n debug('false write response, pause', state.awaitDrainWriters.size)\n state.awaitDrainWriters.add(dest)\n }\n src.pause()\n }\n if (!ondrain) {\n // When the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n ondrain = pipeOnDrain(src, dest)\n dest.on('drain', ondrain)\n }\n }\n src.on('data', ondata)\n function ondata(chunk) {\n debug('ondata')\n const ret = dest.write(chunk)\n debug('dest.write', ret)\n if (ret === false) {\n pause()\n }\n }\n\n // If the dest has an error, then stop piping into it.\n // However, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er)\n unpipe()\n dest.removeListener('error', onerror)\n if (dest.listenerCount('error') === 0) {\n const s = dest._writableState || dest._readableState\n if (s && !s.errorEmitted) {\n // User incorrectly emitted 'error' directly on the stream.\n errorOrDestroy(dest, er)\n } else {\n dest.emit('error', er)\n }\n }\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror)\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish)\n unpipe()\n }\n dest.once('close', onclose)\n function onfinish() {\n debug('onfinish')\n dest.removeListener('close', onclose)\n unpipe()\n }\n dest.once('finish', onfinish)\n function unpipe() {\n debug('unpipe')\n src.unpipe(dest)\n }\n\n // Tell the dest that it's being piped to.\n dest.emit('pipe', src)\n\n // Start the flow if it hasn't been started already.\n\n if (dest.writableNeedDrain === true) {\n pause()\n } else if (!state.flowing) {\n debug('pipe resume')\n src.resume()\n }\n return dest\n}\nfunction pipeOnDrain(src, dest) {\n return function pipeOnDrainFunctionResult() {\n const state = src._readableState\n\n // `ondrain` will call directly,\n // `this` maybe not a reference to dest,\n // so we use the real dest here.\n if (state.awaitDrainWriters === dest) {\n debug('pipeOnDrain', 1)\n state.awaitDrainWriters = null\n } else if (state.multiAwaitDrain) {\n debug('pipeOnDrain', state.awaitDrainWriters.size)\n state.awaitDrainWriters.delete(dest)\n }\n if ((!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && src.listenerCount('data')) {\n src.resume()\n }\n }\n}\nReadable.prototype.unpipe = function (dest) {\n const state = this._readableState\n const unpipeInfo = {\n hasUnpiped: false\n }\n\n // If we're not piping anywhere, then do nothing.\n if (state.pipes.length === 0) return this\n if (!dest) {\n // remove all.\n const dests = state.pipes\n state.pipes = []\n this.pause()\n for (let i = 0; i < dests.length; i++)\n dests[i].emit('unpipe', this, {\n hasUnpiped: false\n })\n return this\n }\n\n // Try to find the right one.\n const index = ArrayPrototypeIndexOf(state.pipes, dest)\n if (index === -1) return this\n state.pipes.splice(index, 1)\n if (state.pipes.length === 0) this.pause()\n dest.emit('unpipe', this, unpipeInfo)\n return this\n}\n\n// Set up data events if they are asked for\n// Ensure readable listeners eventually get something.\nReadable.prototype.on = function (ev, fn) {\n const res = Stream.prototype.on.call(this, ev, fn)\n const state = this._readableState\n if (ev === 'data') {\n // Update readableListening so that resume() may be a no-op\n // a few lines down. This is needed to support once('readable').\n state.readableListening = this.listenerCount('readable') > 0\n\n // Try start flowing on next tick if stream isn't explicitly paused.\n if (state.flowing !== false) this.resume()\n } else if (ev === 'readable') {\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true\n state.flowing = false\n state.emittedReadable = false\n debug('on readable', state.length, state.reading)\n if (state.length) {\n emitReadable(this)\n } else if (!state.reading) {\n process.nextTick(nReadingNextTick, this)\n }\n }\n }\n return res\n}\nReadable.prototype.addListener = Readable.prototype.on\nReadable.prototype.removeListener = function (ev, fn) {\n const res = Stream.prototype.removeListener.call(this, ev, fn)\n if (ev === 'readable') {\n // We need to check if there is someone still listening to\n // readable and reset the state. However this needs to happen\n // after readable has been emitted but before I/O (nextTick) to\n // support once('readable', fn) cycles. This means that calling\n // resume within the same tick will have no\n // effect.\n process.nextTick(updateReadableListening, this)\n }\n return res\n}\nReadable.prototype.off = Readable.prototype.removeListener\nReadable.prototype.removeAllListeners = function (ev) {\n const res = Stream.prototype.removeAllListeners.apply(this, arguments)\n if (ev === 'readable' || ev === undefined) {\n // We need to check if there is someone still listening to\n // readable and reset the state. However this needs to happen\n // after readable has been emitted but before I/O (nextTick) to\n // support once('readable', fn) cycles. This means that calling\n // resume within the same tick will have no\n // effect.\n process.nextTick(updateReadableListening, this)\n }\n return res\n}\nfunction updateReadableListening(self) {\n const state = self._readableState\n state.readableListening = self.listenerCount('readable') > 0\n if (state.resumeScheduled && state[kPaused] === false) {\n // Flowing needs to be set to true now, otherwise\n // the upcoming resume will not flow.\n state.flowing = true\n\n // Crude way to check if we should resume.\n } else if (self.listenerCount('data') > 0) {\n self.resume()\n } else if (!state.readableListening) {\n state.flowing = null\n }\n}\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0')\n self.read(0)\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n const state = this._readableState\n if (!state.flowing) {\n debug('resume')\n // We flow only if there is no one listening\n // for readable, but we still have to call\n // resume().\n state.flowing = !state.readableListening\n resume(this, state)\n }\n state[kPaused] = false\n return this\n}\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true\n process.nextTick(resume_, stream, state)\n }\n}\nfunction resume_(stream, state) {\n debug('resume', state.reading)\n if (!state.reading) {\n stream.read(0)\n }\n state.resumeScheduled = false\n stream.emit('resume')\n flow(stream)\n if (state.flowing && !state.reading) stream.read(0)\n}\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing)\n if (this._readableState.flowing !== false) {\n debug('pause')\n this._readableState.flowing = false\n this.emit('pause')\n }\n this._readableState[kPaused] = true\n return this\n}\nfunction flow(stream) {\n const state = stream._readableState\n debug('flow', state.flowing)\n while (state.flowing && stream.read() !== null);\n}\n\n// Wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n let paused = false\n\n // TODO (ronag): Should this.destroy(err) emit\n // 'error' on the wrapped stream? Would require\n // a static factory method, e.g. Readable.wrap(stream).\n\n stream.on('data', (chunk) => {\n if (!this.push(chunk) && stream.pause) {\n paused = true\n stream.pause()\n }\n })\n stream.on('end', () => {\n this.push(null)\n })\n stream.on('error', (err) => {\n errorOrDestroy(this, err)\n })\n stream.on('close', () => {\n this.destroy()\n })\n stream.on('destroy', () => {\n this.destroy()\n })\n this._read = () => {\n if (paused && stream.resume) {\n paused = false\n stream.resume()\n }\n }\n\n // Proxy all the other methods. Important when wrapping filters and duplexes.\n const streamKeys = ObjectKeys(stream)\n for (let j = 1; j < streamKeys.length; j++) {\n const i = streamKeys[j]\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = stream[i].bind(stream)\n }\n }\n return this\n}\nReadable.prototype[SymbolAsyncIterator] = function () {\n return streamToAsyncIterator(this)\n}\nReadable.prototype.iterator = function (options) {\n if (options !== undefined) {\n validateObject(options, 'options')\n }\n return streamToAsyncIterator(this, options)\n}\nfunction streamToAsyncIterator(stream, options) {\n if (typeof stream.read !== 'function') {\n stream = Readable.wrap(stream, {\n objectMode: true\n })\n }\n const iter = createAsyncIterator(stream, options)\n iter.stream = stream\n return iter\n}\nasync function* createAsyncIterator(stream, options) {\n let callback = nop\n function next(resolve) {\n if (this === stream) {\n callback()\n callback = nop\n } else {\n callback = resolve\n }\n }\n stream.on('readable', next)\n let error\n const cleanup = eos(\n stream,\n {\n writable: false\n },\n (err) => {\n error = err ? aggregateTwoErrors(error, err) : null\n callback()\n callback = nop\n }\n )\n try {\n while (true) {\n const chunk = stream.destroyed ? null : stream.read()\n if (chunk !== null) {\n yield chunk\n } else if (error) {\n throw error\n } else if (error === null) {\n return\n } else {\n await new Promise(next)\n }\n }\n } catch (err) {\n error = aggregateTwoErrors(error, err)\n throw error\n } finally {\n if (\n (error || (options === null || options === undefined ? undefined : options.destroyOnReturn) !== false) &&\n (error === undefined || stream._readableState.autoDestroy)\n ) {\n destroyImpl.destroyer(stream, null)\n } else {\n stream.off('readable', next)\n cleanup()\n }\n }\n}\n\n// Making it explicit these properties are not enumerable\n// because otherwise some prototype manipulation in\n// userland will fail.\nObjectDefineProperties(Readable.prototype, {\n readable: {\n __proto__: null,\n get() {\n const r = this._readableState\n // r.readable === false means that this is part of a Duplex stream\n // where the readable side was disabled upon construction.\n // Compat. The user might manually disable readable side through\n // deprecated setter.\n return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted\n },\n set(val) {\n // Backwards compat.\n if (this._readableState) {\n this._readableState.readable = !!val\n }\n }\n },\n readableDidRead: {\n __proto__: null,\n enumerable: false,\n get: function () {\n return this._readableState.dataEmitted\n }\n },\n readableAborted: {\n __proto__: null,\n enumerable: false,\n get: function () {\n return !!(\n this._readableState.readable !== false &&\n (this._readableState.destroyed || this._readableState.errored) &&\n !this._readableState.endEmitted\n )\n }\n },\n readableHighWaterMark: {\n __proto__: null,\n enumerable: false,\n get: function () {\n return this._readableState.highWaterMark\n }\n },\n readableBuffer: {\n __proto__: null,\n enumerable: false,\n get: function () {\n return this._readableState && this._readableState.buffer\n }\n },\n readableFlowing: {\n __proto__: null,\n enumerable: false,\n get: function () {\n return this._readableState.flowing\n },\n set: function (state) {\n if (this._readableState) {\n this._readableState.flowing = state\n }\n }\n },\n readableLength: {\n __proto__: null,\n enumerable: false,\n get() {\n return this._readableState.length\n }\n },\n readableObjectMode: {\n __proto__: null,\n enumerable: false,\n get() {\n return this._readableState ? this._readableState.objectMode : false\n }\n },\n readableEncoding: {\n __proto__: null,\n enumerable: false,\n get() {\n return this._readableState ? this._readableState.encoding : null\n }\n },\n errored: {\n __proto__: null,\n enumerable: false,\n get() {\n return this._readableState ? this._readableState.errored : null\n }\n },\n closed: {\n __proto__: null,\n get() {\n return this._readableState ? this._readableState.closed : false\n }\n },\n destroyed: {\n __proto__: null,\n enumerable: false,\n get() {\n return this._readableState ? this._readableState.destroyed : false\n },\n set(value) {\n // We ignore the value if the stream\n // has not been initialized yet.\n if (!this._readableState) {\n return\n }\n\n // Backward compatibility, the user is explicitly\n // managing destroyed.\n this._readableState.destroyed = value\n }\n },\n readableEnded: {\n __proto__: null,\n enumerable: false,\n get() {\n return this._readableState ? this._readableState.endEmitted : false\n }\n }\n})\nObjectDefineProperties(ReadableState.prototype, {\n // Legacy getter for `pipesCount`.\n pipesCount: {\n __proto__: null,\n get() {\n return this.pipes.length\n }\n },\n // Legacy property for `paused`.\n paused: {\n __proto__: null,\n get() {\n return this[kPaused] !== false\n },\n set(value) {\n this[kPaused] = !!value\n }\n }\n})\n\n// Exposed for testing purposes only.\nReadable._fromList = fromList\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered.\n if (state.length === 0) return null\n let ret\n if (state.objectMode) ret = state.buffer.shift()\n else if (!n || n >= state.length) {\n // Read it all, truncate the list.\n if (state.decoder) ret = state.buffer.join('')\n else if (state.buffer.length === 1) ret = state.buffer.first()\n else ret = state.buffer.concat(state.length)\n state.buffer.clear()\n } else {\n // read part of list.\n ret = state.buffer.consume(n, state.decoder)\n }\n return ret\n}\nfunction endReadable(stream) {\n const state = stream._readableState\n debug('endReadable', state.endEmitted)\n if (!state.endEmitted) {\n state.ended = true\n process.nextTick(endReadableNT, state, stream)\n }\n}\nfunction endReadableNT(state, stream) {\n debug('endReadableNT', state.endEmitted, state.length)\n\n // Check that we didn't get one last unshift.\n if (!state.errored && !state.closeEmitted && !state.endEmitted && state.length === 0) {\n state.endEmitted = true\n stream.emit('end')\n if (stream.writable && stream.allowHalfOpen === false) {\n process.nextTick(endWritableNT, stream)\n } else if (state.autoDestroy) {\n // In case of duplex streams we need a way to detect\n // if the writable side is ready for autoDestroy as well.\n const wState = stream._writableState\n const autoDestroy =\n !wState ||\n (wState.autoDestroy &&\n // We don't expect the writable to ever 'finish'\n // if writable is explicitly set to false.\n (wState.finished || wState.writable === false))\n if (autoDestroy) {\n stream.destroy()\n }\n }\n }\n}\nfunction endWritableNT(stream) {\n const writable = stream.writable && !stream.writableEnded && !stream.destroyed\n if (writable) {\n stream.end()\n }\n}\nReadable.from = function (iterable, opts) {\n return from(Readable, iterable, opts)\n}\nlet webStreamsAdapters\n\n// Lazy to avoid circular references\nfunction lazyWebStreams() {\n if (webStreamsAdapters === undefined) webStreamsAdapters = {}\n return webStreamsAdapters\n}\nReadable.fromWeb = function (readableStream, options) {\n return lazyWebStreams().newStreamReadableFromReadableStream(readableStream, options)\n}\nReadable.toWeb = function (streamReadable, options) {\n return lazyWebStreams().newReadableStreamFromStreamReadable(streamReadable, options)\n}\nReadable.wrap = function (src, options) {\n var _ref, _src$readableObjectMo\n return new Readable({\n objectMode:\n (_ref =\n (_src$readableObjectMo = src.readableObjectMode) !== null && _src$readableObjectMo !== undefined\n ? _src$readableObjectMo\n : src.objectMode) !== null && _ref !== undefined\n ? _ref\n : true,\n ...options,\n destroy(err, callback) {\n destroyImpl.destroyer(src, err)\n callback(err)\n }\n }).wrap(src)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc1NzYuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBVTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsRUFBRSxtQkFBTyxDQUFDLEtBQXdCO0FBQ3BDO0FBQ0E7QUFDQSxRQUFRLG1CQUFtQixFQUFFLG1CQUFPLENBQUMsS0FBUTtBQUM3QyxRQUFRLDBCQUEwQixFQUFFLG1CQUFPLENBQUMsS0FBVTtBQUN0RCxRQUFRLFNBQVMsRUFBRSxtQkFBTyxDQUFDLEtBQVE7QUFDbkMsUUFBUSxpQkFBaUIsRUFBRSxtQkFBTyxDQUFDLElBQW9CO0FBQ3ZELFlBQVksbUJBQU8sQ0FBQyxLQUFpQjtBQUNyQyxZQUFZLHFDQUFtQztBQUMvQztBQUNBLENBQUM7QUFDRCxtQkFBbUIsbUJBQU8sQ0FBQyxLQUFlO0FBQzFDLG9CQUFvQixtQkFBTyxDQUFDLEtBQVc7QUFDdkMsUUFBUSw0Q0FBNEMsRUFBRSxtQkFBTyxDQUFDLEtBQVM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUUsRUFBRSxtQkFBTyxDQUFDLEtBQW1CO0FBQy9CLFFBQVEsaUJBQWlCLEVBQUUsbUJBQU8sQ0FBQyxHQUFlO0FBQ2xEO0FBQ0EsUUFBUSxnQkFBZ0IsRUFBRSxtQkFBTyxDQUFDLEtBQWdCO0FBQ2xELGFBQWEsbUJBQU8sQ0FBQyxLQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaUJBQWlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLG1CQUFPLENBQUMsS0FBVTs7QUFFcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DLG1CQUFPLENBQUMsS0FBVTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3JlYWRhYmxlLmpzPzA2NmQiXSwic291cmNlc0NvbnRlbnQiOlsiLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ3Byb2Nlc3MvJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7XG4gIEFycmF5UHJvdG90eXBlSW5kZXhPZixcbiAgTnVtYmVySXNJbnRlZ2VyLFxuICBOdW1iZXJJc05hTixcbiAgTnVtYmVyUGFyc2VJbnQsXG4gIE9iamVjdERlZmluZVByb3BlcnRpZXMsXG4gIE9iamVjdEtleXMsXG4gIE9iamVjdFNldFByb3RvdHlwZU9mLFxuICBQcm9taXNlLFxuICBTYWZlU2V0LFxuICBTeW1ib2xBc3luY0Rpc3Bvc2UsXG4gIFN5bWJvbEFzeW5jSXRlcmF0b3IsXG4gIFN5bWJvbFxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZVxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGVcbmNvbnN0IHsgRXZlbnRFbWl0dGVyOiBFRSB9ID0gcmVxdWlyZSgnZXZlbnRzJylcbmNvbnN0IHsgU3RyZWFtLCBwcmVwZW5kTGlzdGVuZXIgfSA9IHJlcXVpcmUoJy4vbGVnYWN5JylcbmNvbnN0IHsgQnVmZmVyIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3QgeyBhZGRBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi9hZGQtYWJvcnQtc2lnbmFsJylcbmNvbnN0IGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5sZXQgZGVidWcgPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKS5kZWJ1Z2xvZygnc3RyZWFtJywgKGZuKSA9PiB7XG4gIGRlYnVnID0gZm5cbn0pXG5jb25zdCBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9idWZmZXJfbGlzdCcpXG5jb25zdCBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vZGVzdHJveScpXG5jb25zdCB7IGdldEhpZ2hXYXRlck1hcmssIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrIH0gPSByZXF1aXJlKCcuL3N0YXRlJylcbmNvbnN0IHtcbiAgYWdncmVnYXRlVHdvRXJyb3JzLFxuICBjb2Rlczoge1xuICAgIEVSUl9JTlZBTElEX0FSR19UWVBFLFxuICAgIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELFxuICAgIEVSUl9PVVRfT0ZfUkFOR0UsXG4gICAgRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixcbiAgICBFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UXG4gIH0sXG4gIEFib3J0RXJyb3Jcbn0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCB7IHZhbGlkYXRlT2JqZWN0IH0gPSByZXF1aXJlKCcuLi92YWxpZGF0b3JzJylcbmNvbnN0IGtQYXVzZWQgPSBTeW1ib2woJ2tQYXVzZWQnKVxuY29uc3QgeyBTdHJpbmdEZWNvZGVyIH0gPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpXG5jb25zdCBmcm9tID0gcmVxdWlyZSgnLi9mcm9tJylcbk9iamVjdFNldFByb3RvdHlwZU9mKFJlYWRhYmxlLnByb3RvdHlwZSwgU3RyZWFtLnByb3RvdHlwZSlcbk9iamVjdFNldFByb3RvdHlwZU9mKFJlYWRhYmxlLCBTdHJlYW0pXG5jb25zdCBub3AgPSAoKSA9PiB7fVxuY29uc3QgeyBlcnJvck9yRGVzdHJveSB9ID0gZGVzdHJveUltcGxcbmNvbnN0IGtPYmplY3RNb2RlID0gMSA8PCAwXG5jb25zdCBrRW5kZWQgPSAxIDw8IDFcbmNvbnN0IGtFbmRFbWl0dGVkID0gMSA8PCAyXG5jb25zdCBrUmVhZGluZyA9IDEgPDwgM1xuY29uc3Qga0NvbnN0cnVjdGVkID0gMSA8PCA0XG5jb25zdCBrU3luYyA9IDEgPDwgNVxuY29uc3Qga05lZWRSZWFkYWJsZSA9IDEgPDwgNlxuY29uc3Qga0VtaXR0ZWRSZWFkYWJsZSA9IDEgPDwgN1xuY29uc3Qga1JlYWRhYmxlTGlzdGVuaW5nID0gMSA8PCA4XG5jb25zdCBrUmVzdW1lU2NoZWR1bGVkID0gMSA8PCA5XG5jb25zdCBrRXJyb3JFbWl0dGVkID0gMSA8PCAxMFxuY29uc3Qga0VtaXRDbG9zZSA9IDEgPDwgMTFcbmNvbnN0IGtBdXRvRGVzdHJveSA9IDEgPDwgMTJcbmNvbnN0IGtEZXN0cm95ZWQgPSAxIDw8IDEzXG5jb25zdCBrQ2xvc2VkID0gMSA8PCAxNFxuY29uc3Qga0Nsb3NlRW1pdHRlZCA9IDEgPDwgMTVcbmNvbnN0IGtNdWx0aUF3YWl0RHJhaW4gPSAxIDw8IDE2XG5jb25zdCBrUmVhZGluZ01vcmUgPSAxIDw8IDE3XG5jb25zdCBrRGF0YUVtaXR0ZWQgPSAxIDw8IDE4XG5cbi8vIFRPRE8oYmVuamFtaW5ncikgaXQgaXMgbGlrZWx5IHNsb3dlciB0byBkbyBpdCB0aGlzIHdheSB0aGFuIHdpdGggZnJlZSBmdW5jdGlvbnNcbmZ1bmN0aW9uIG1ha2VCaXRNYXBEZXNjcmlwdG9yKGJpdCkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5zdGF0ZSAmIGJpdCkgIT09IDBcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlKSB0aGlzLnN0YXRlIHw9IGJpdFxuICAgICAgZWxzZSB0aGlzLnN0YXRlICY9IH5iaXRcbiAgICB9XG4gIH1cbn1cbk9iamVjdERlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdGF0ZS5wcm90b3R5cGUsIHtcbiAgb2JqZWN0TW9kZTogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa09iamVjdE1vZGUpLFxuICBlbmRlZDogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa0VuZGVkKSxcbiAgZW5kRW1pdHRlZDogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa0VuZEVtaXR0ZWQpLFxuICByZWFkaW5nOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrUmVhZGluZyksXG4gIC8vIFN0cmVhbSBpcyBzdGlsbCBiZWluZyBjb25zdHJ1Y3RlZCBhbmQgY2Fubm90IGJlXG4gIC8vIGRlc3Ryb3llZCB1bnRpbCBjb25zdHJ1Y3Rpb24gZmluaXNoZWQgb3IgZmFpbGVkLlxuICAvLyBBc3luYyBjb25zdHJ1Y3Rpb24gaXMgb3B0IGluLCB0aGVyZWZvcmUgd2Ugc3RhcnQgYXNcbiAgLy8gY29uc3RydWN0ZWQuXG4gIGNvbnN0cnVjdGVkOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrQ29uc3RydWN0ZWQpLFxuICAvLyBBIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHN5bmM6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtTeW5jKSxcbiAgLy8gV2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIG5lZWRSZWFkYWJsZTogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa05lZWRSZWFkYWJsZSksXG4gIGVtaXR0ZWRSZWFkYWJsZTogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa0VtaXR0ZWRSZWFkYWJsZSksXG4gIHJlYWRhYmxlTGlzdGVuaW5nOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrUmVhZGFibGVMaXN0ZW5pbmcpLFxuICByZXN1bWVTY2hlZHVsZWQ6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtSZXN1bWVTY2hlZHVsZWQpLFxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2Fpbi5cbiAgZXJyb3JFbWl0dGVkOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrRXJyb3JFbWl0dGVkKSxcbiAgZW1pdENsb3NlOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrRW1pdENsb3NlKSxcbiAgYXV0b0Rlc3Ryb3k6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtBdXRvRGVzdHJveSksXG4gIC8vIEhhcyBpdCBiZWVuIGRlc3Ryb3llZC5cbiAgZGVzdHJveWVkOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrRGVzdHJveWVkKSxcbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZGVzdHJveWluZy5cbiAgY2xvc2VkOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrQ2xvc2VkKSxcbiAgLy8gVHJ1ZSBpZiBjbG9zZSBoYXMgYmVlbiBlbWl0dGVkIG9yIHdvdWxkIGhhdmUgYmVlbiBlbWl0dGVkXG4gIC8vIGRlcGVuZGluZyBvbiBlbWl0Q2xvc2UuXG4gIGNsb3NlRW1pdHRlZDogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa0Nsb3NlRW1pdHRlZCksXG4gIG11bHRpQXdhaXREcmFpbjogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa011bHRpQXdhaXREcmFpbiksXG4gIC8vIElmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWQuXG4gIHJlYWRpbmdNb3JlOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrUmVhZGluZ01vcmUpLFxuICBkYXRhRW1pdHRlZDogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa0RhdGFFbWl0dGVkKVxufSlcbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtLCBpc0R1cGxleCkge1xuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbS5cbiAgLy8gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgc2VwYXJhdGVseSBhcyByZWFkYWJsZVhYWCBhbmQgd3JpdGFibGVYWFguXG4gIGlmICh0eXBlb2YgaXNEdXBsZXggIT09ICdib29sZWFuJykgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiByZXF1aXJlKCcuL2R1cGxleCcpXG5cbiAgLy8gQml0IG1hcCBmaWVsZCB0byBzdG9yZSBSZWFkYWJsZVN0YXRlIG1vcmUgZWZmY2llbnRseSB3aXRoIDEgYml0IHBlciBmaWVsZFxuICAvLyBpbnN0ZWFkIG9mIGEgVjggc2xvdCBwZXIgZmllbGQuXG4gIHRoaXMuc3RhdGUgPSBrRW1pdENsb3NlIHwga0F1dG9EZXN0cm95IHwga0NvbnN0cnVjdGVkIHwga1N5bmNcbiAgLy8gT2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXkuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMub2JqZWN0TW9kZSkgdGhpcy5zdGF0ZSB8PSBrT2JqZWN0TW9kZVxuICBpZiAoaXNEdXBsZXggJiYgb3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZSkgdGhpcy5zdGF0ZSB8PSBrT2JqZWN0TW9kZVxuXG4gIC8vIFRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gb3B0aW9uc1xuICAgID8gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpXG4gICAgOiBnZXREZWZhdWx0SGlnaFdhdGVyTWFyayhmYWxzZSlcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpLlxuICB0aGlzLmJ1ZmZlciA9IG5ldyBCdWZmZXJMaXN0KClcbiAgdGhpcy5sZW5ndGggPSAwXG4gIHRoaXMucGlwZXMgPSBbXVxuICB0aGlzLmZsb3dpbmcgPSBudWxsXG4gIHRoaXNba1BhdXNlZF0gPSBudWxsXG5cbiAgLy8gU2hvdWxkIGNsb3NlIGJlIGVtaXR0ZWQgb24gZGVzdHJveS4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lbWl0Q2xvc2UgPT09IGZhbHNlKSB0aGlzLnN0YXRlICY9IH5rRW1pdENsb3NlXG5cbiAgLy8gU2hvdWxkIC5kZXN0cm95KCkgYmUgY2FsbGVkIGFmdGVyICdlbmQnIChhbmQgcG90ZW50aWFsbHkgJ2ZpbmlzaCcpLlxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmF1dG9EZXN0cm95ID09PSBmYWxzZSkgdGhpcy5zdGF0ZSAmPSB+a0F1dG9EZXN0cm95XG5cbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZXJyb3JlZC4gV2hlbiB0cnVlIG5vIGZ1cnRoZXJcbiAgLy8gX3JlYWQgY2FsbHMsICdkYXRhJyBvciAncmVhZGFibGUnIGV2ZW50cyBzaG91bGQgb2NjdXIuIFRoaXMgaXMgbmVlZGVkXG4gIC8vIHNpbmNlIHdoZW4gYXV0b0Rlc3Ryb3kgaXMgZGlzYWJsZWQgd2UgbmVlZCBhIHdheSB0byB0ZWxsIHdoZXRoZXIgdGhlXG4gIC8vIHN0cmVhbSBoYXMgZmFpbGVkLlxuICB0aGlzLmVycm9yZWQgPSBudWxsXG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRFbmNvZGluZykgfHwgJ3V0ZjgnXG5cbiAgLy8gUmVmIHRoZSBwaXBlZCBkZXN0IHdoaWNoIHdlIG5lZWQgYSBkcmFpbiBldmVudCBvbiBpdFxuICAvLyB0eXBlOiBudWxsIHwgV3JpdGFibGUgfCBTZXQ8V3JpdGFibGU+LlxuICB0aGlzLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICB0aGlzLmRlY29kZXIgPSBudWxsXG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKVxuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nXG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKVxuXG4gIC8vIENoZWNraW5nIGZvciBhIFN0cmVhbS5EdXBsZXggaW5zdGFuY2UgaXMgZmFzdGVyIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGVcbiAgLy8gdGhlIFJlYWRhYmxlU3RhdGUgY29uc3RydWN0b3IsIGF0IGxlYXN0IHdpdGggVjggNi41LlxuICBjb25zdCBpc0R1cGxleCA9IHRoaXMgaW5zdGFuY2VvZiByZXF1aXJlKCcuL2R1cGxleCcpXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzLCBpc0R1cGxleClcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZFxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnN0cnVjdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fY29uc3RydWN0ID0gb3B0aW9ucy5jb25zdHJ1Y3RcbiAgICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWlzRHVwbGV4KSBhZGRBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgdGhpcylcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzLCBvcHRpb25zKVxuICBkZXN0cm95SW1wbC5jb25zdHJ1Y3QodGhpcywgKCkgPT4ge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSkge1xuICAgICAgbWF5YmVSZWFkTW9yZSh0aGlzLCB0aGlzLl9yZWFkYWJsZVN0YXRlKVxuICAgIH1cbiAgfSlcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveVxuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3lcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycilcbn1cblJlYWRhYmxlLnByb3RvdHlwZVtFRS5jYXB0dXJlUmVqZWN0aW9uU3ltYm9sXSA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdGhpcy5kZXN0cm95KGVycilcbn1cblJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2xBc3luY0Rpc3Bvc2VdID0gZnVuY3Rpb24gKCkge1xuICBsZXQgZXJyb3JcbiAgaWYgKCF0aGlzLmRlc3Ryb3llZCkge1xuICAgIGVycm9yID0gdGhpcy5yZWFkYWJsZUVuZGVkID8gbnVsbCA6IG5ldyBBYm9ydEVycm9yKClcbiAgICB0aGlzLmRlc3Ryb3koZXJyb3IpXG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IGVvcyh0aGlzLCAoZXJyKSA9PiAoZXJyICYmIGVyciAhPT0gZXJyb3IgPyByZWplY3QoZXJyKSA6IHJlc29sdmUobnVsbCkpKSlcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpXG59XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpLlxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgdHJ1ZSlcbn1cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgZGVidWcoJ3JlYWRhYmxlQWRkQ2h1bmsnLCBjaHVuaylcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgbGV0IGVyclxuICBpZiAoKHN0YXRlLnN0YXRlICYga09iamVjdE1vZGUpID09PSAwKSB7XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nXG4gICAgICBpZiAoc3RhdGUuZW5jb2RpbmcgIT09IGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChhZGRUb0Zyb250ICYmIHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgICAgLy8gV2hlbiB1bnNoaWZ0aW5nLCBpZiBzdGF0ZS5lbmNvZGluZyBpcyBzZXQsIHdlIGhhdmUgdG8gc2F2ZVxuICAgICAgICAgIC8vIHRoZSBzdHJpbmcgaW4gdGhlIEJ1ZmZlckxpc3Qgd2l0aCB0aGUgc3RhdGUgZW5jb2RpbmcuXG4gICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpLnRvU3RyaW5nKHN0YXRlLmVuY29kaW5nKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKVxuICAgICAgICAgIGVuY29kaW5nID0gJydcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgIGVuY29kaW5nID0gJydcbiAgICB9IGVsc2UgaWYgKFN0cmVhbS5faXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgY2h1bmsgPSBTdHJlYW0uX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaylcbiAgICAgIGVuY29kaW5nID0gJydcbiAgICB9IGVsc2UgaWYgKGNodW5rICE9IG51bGwpIHtcbiAgICAgIGVyciA9IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2h1bmsnLCBbJ3N0cmluZycsICdCdWZmZXInLCAnVWludDhBcnJheSddLCBjaHVuaylcbiAgICB9XG4gIH1cbiAgaWYgKGVycikge1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyKVxuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUuc3RhdGUgJj0gfmtSZWFkaW5nXG4gICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKVxuICB9IGVsc2UgaWYgKChzdGF0ZS5zdGF0ZSAmIGtPYmplY3RNb2RlKSAhPT0gMCB8fCAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkpIHtcbiAgICBpZiAoYWRkVG9Gcm9udCkge1xuICAgICAgaWYgKChzdGF0ZS5zdGF0ZSAmIGtFbmRFbWl0dGVkKSAhPT0gMCkgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCgpKVxuICAgICAgZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkIHx8IHN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICAgICAgZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSlcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GKCkpXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5kZXN0cm95ZWQgfHwgc3RhdGUuZXJyb3JlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnN0YXRlICY9IH5rUmVhZGluZ1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICAgICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsubGVuZ3RoICE9PSAwKSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpXG4gICAgICAgIGVsc2UgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnN0YXRlICY9IH5rUmVhZGluZ1xuICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSlcbiAgfVxuXG4gIC8vIFdlIGNhbiBwdXNoIG1vcmUgZGF0YSBpZiB3ZSBhcmUgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmsuXG4gIC8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lIG1vcmUgYnl0ZXMuXG4gIC8vIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsIHN1Y2ggYXMgdGhlIHJlcGwuXG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKVxufVxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jICYmIHN0cmVhbS5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKSB7XG4gICAgLy8gVXNlIHRoZSBndWFyZCB0byBhdm9pZCBjcmVhdGluZyBgU2V0KClgIHJlcGVhdGVkbHlcbiAgICAvLyB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgcGlwZXMuXG4gICAgaWYgKChzdGF0ZS5zdGF0ZSAmIGtNdWx0aUF3YWl0RHJhaW4pICE9PSAwKSB7XG4gICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycy5jbGVhcigpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICAgIH1cbiAgICBzdGF0ZS5kYXRhRW1pdHRlZCA9IHRydWVcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKVxuICB9IGVsc2Uge1xuICAgIC8vIFVwZGF0ZSB0aGUgYnVmZmVyIGluZm8uXG4gICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKVxuICAgIGVsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspXG4gICAgaWYgKChzdGF0ZS5zdGF0ZSAmIGtOZWVkUmVhZGFibGUpICE9PSAwKSBlbWl0UmVhZGFibGUoc3RyZWFtKVxuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSlcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIHJldHVybiBzdGF0ZVtrUGF1c2VkXSA9PT0gdHJ1ZSB8fCBzdGF0ZS5mbG93aW5nID09PSBmYWxzZVxufVxuXG4vLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYylcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gZGVjb2RlclxuICAvLyBJZiBzZXRFbmNvZGluZyhudWxsKSwgZGVjb2Rlci5lbmNvZGluZyBlcXVhbHMgdXRmOC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZ1xuICBjb25zdCBidWZmZXIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlclxuICAvLyBJdGVyYXRlIG92ZXIgY3VycmVudCBidWZmZXIgdG8gY29udmVydCBhbHJlYWR5IHN0b3JlZCBCdWZmZXJzOlxuICBsZXQgY29udGVudCA9ICcnXG4gIGZvciAoY29uc3QgZGF0YSBvZiBidWZmZXIpIHtcbiAgICBjb250ZW50ICs9IGRlY29kZXIud3JpdGUoZGF0YSlcbiAgfVxuICBidWZmZXIuY2xlYXIoKVxuICBpZiAoY29udGVudCAhPT0gJycpIGJ1ZmZlci5wdXNoKGNvbnRlbnQpXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoID0gY29udGVudC5sZW5ndGhcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDFHQi5cbmNvbnN0IE1BWF9IV00gPSAweDQwMDAwMDAwXG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID4gTUFYX0hXTSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKCdzaXplJywgJzw9IDFHaUInLCBuKVxuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIgdG8gcHJldmVudCBpbmNyZWFzaW5nIGh3bSBleGNlc3NpdmVseSBpblxuICAgIC8vIHRpbnkgYW1vdW50cy5cbiAgICBuLS1cbiAgICBuIHw9IG4gPj4+IDFcbiAgICBuIHw9IG4gPj4+IDJcbiAgICBuIHw9IG4gPj4+IDRcbiAgICBuIHw9IG4gPj4+IDhcbiAgICBuIHw9IG4gPj4+IDE2XG4gICAgbisrXG4gIH1cbiAgcmV0dXJuIG5cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkpIHJldHVybiAwXG4gIGlmICgoc3RhdGUuc3RhdGUgJiBrT2JqZWN0TW9kZSkgIT09IDApIHJldHVybiAxXG4gIGlmIChOdW1iZXJJc05hTihuKSkge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZS5cbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXIuZmlyc3QoKS5sZW5ndGhcbiAgICByZXR1cm4gc3RhdGUubGVuZ3RoXG4gIH1cbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gblxuICByZXR1cm4gc3RhdGUuZW5kZWQgPyBzdGF0ZS5sZW5ndGggOiAwXG59XG5cbi8vIFlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbilcbiAgLy8gU2FtZSBhcyBwYXJzZUludCh1bmRlZmluZWQsIDEwKSwgaG93ZXZlciBWOCA3LjMgcGVyZm9ybWFuY2UgcmVncmVzc2VkXG4gIC8vIGluIHRoaXMgc2NlbmFyaW8sIHNvIHdlIGFyZSBkb2luZyBpdCBtYW51YWxseS5cbiAgaWYgKG4gPT09IHVuZGVmaW5lZCkge1xuICAgIG4gPSBOYU5cbiAgfSBlbHNlIGlmICghTnVtYmVySXNJbnRlZ2VyKG4pKSB7XG4gICAgbiA9IE51bWJlclBhcnNlSW50KG4sIDEwKVxuICB9XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCBuT3JpZyA9IG5cblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobilcbiAgaWYgKG4gIT09IDApIHN0YXRlLnN0YXRlICY9IH5rRW1pdHRlZFJlYWRhYmxlXG5cbiAgLy8gSWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAoXG4gICAgbiA9PT0gMCAmJlxuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSAmJlxuICAgICgoc3RhdGUuaGlnaFdhdGVyTWFyayAhPT0gMCA/IHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIDogc3RhdGUubGVuZ3RoID4gMCkgfHwgc3RhdGUuZW5kZWQpXG4gICkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKVxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpXG4gICAgZWxzZSBlbWl0UmVhZGFibGUodGhpcylcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKVxuXG4gIC8vIElmIHdlJ3ZlIGVuZGVkLCBhbmQgd2UncmUgbm93IGNsZWFyLCB0aGVuIGZpbmlzaCBpdCB1cC5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUuZW5kZWQpIHtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgbGV0IGRvUmVhZCA9IChzdGF0ZS5zdGF0ZSAmIGtOZWVkUmVhZGFibGUpICE9PSAwXG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKVxuXG4gIC8vIElmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZS5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWVcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpXG4gIH1cblxuICAvLyBIb3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeSwgaWYgd2UncmUgY29uc3RydWN0aW5nIHdlIGhhdmUgdG8gd2FpdCxcbiAgLy8gYW5kIGlmIHdlJ3JlIGRlc3Ryb3llZCBvciBlcnJvcmVkLCB0aGVuIGl0J3Mgbm90IGFsbG93ZWQsXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nIHx8IHN0YXRlLmRlc3Ryb3llZCB8fCBzdGF0ZS5lcnJvcmVkIHx8ICFzdGF0ZS5jb25zdHJ1Y3RlZCkge1xuICAgIGRvUmVhZCA9IGZhbHNlXG4gICAgZGVidWcoJ3JlYWRpbmcsIGVuZGVkIG9yIGNvbnN0cnVjdGluZycsIGRvUmVhZClcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpXG4gICAgc3RhdGUuc3RhdGUgfD0ga1JlYWRpbmcgfCBrU3luY1xuICAgIC8vIElmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUuc3RhdGUgfD0ga05lZWRSZWFkYWJsZVxuXG4gICAgLy8gQ2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvck9yRGVzdHJveSh0aGlzLCBlcnIpXG4gICAgfVxuICAgIHN0YXRlLnN0YXRlICY9IH5rU3luY1xuXG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpXG4gIH1cbiAgbGV0IHJldFxuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKVxuICBlbHNlIHJldCA9IG51bGxcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgbiA9IDBcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gblxuICAgIGlmIChzdGF0ZS5tdWx0aUF3YWl0RHJhaW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gICAgfVxuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZVxuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcylcbiAgfVxuICBpZiAocmV0ICE9PSBudWxsICYmICFzdGF0ZS5lcnJvckVtaXR0ZWQgJiYgIXN0YXRlLmNsb3NlRW1pdHRlZCkge1xuICAgIHN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIHRoaXMuZW1pdCgnZGF0YScsIHJldClcbiAgfVxuICByZXR1cm4gcmV0XG59XG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ29uRW9mQ2h1bmsnKVxuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVyblxuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIGNvbnN0IGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKVxuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKVxuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZVxuICBpZiAoc3RhdGUuc3luYykge1xuICAgIC8vIElmIHdlIGFyZSBzeW5jLCB3YWl0IHVudGlsIG5leHQgdGljayB0byBlbWl0IHRoZSBkYXRhLlxuICAgIC8vIE90aGVyd2lzZSB3ZSByaXNrIGVtaXR0aW5nIGRhdGEgaW4gdGhlIGZsb3coKVxuICAgIC8vIHRoZSByZWFkYWJsZSBjb2RlIHRyaWdnZXJzIGR1cmluZyBhIHJlYWQoKSBjYWxsLlxuICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2VcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlXG4gICAgLy8gV2UgaGF2ZSB0byBlbWl0IHJlYWRhYmxlIG5vdyB0aGF0IHdlIGFyZSBFT0YuIE1vZHVsZXNcbiAgICAvLyBpbiB0aGUgZWNvc3lzdGVtIChlLmcuIGRpY2VyKSByZWx5IG9uIHRoaXMgZXZlbnQgYmVpbmcgc3luYy5cbiAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSlcbiAgfVxufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpXG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlXG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZVxuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW1pdFJlYWRhYmxlXycsIHN0YXRlLmRlc3Ryb3llZCwgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZClcbiAgaWYgKCFzdGF0ZS5kZXN0cm95ZWQgJiYgIXN0YXRlLmVycm9yZWQgJiYgKHN0YXRlLmxlbmd0aCB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlXG4gIH1cblxuICAvLyBUaGUgc3RyZWFtIG5lZWRzIGFub3RoZXIgcmVhZGFibGUgZXZlbnQgaWY6XG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgZmxvdyhzdHJlYW0pXG59XG5cbi8vIEF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUgJiYgc3RhdGUuY29uc3RydWN0ZWQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWVcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKVxuICB9XG59XG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIC8vIEF0dGVtcHQgdG8gcmVhZCBtb3JlIGRhdGEgaWYgd2Ugc2hvdWxkLlxuICAvL1xuICAvLyBUaGUgY29uZGl0aW9ucyBmb3IgcmVhZGluZyBtb3JlIGRhdGEgYXJlIChvbmUgb2YpOlxuICAvLyAtIE5vdCBlbm91Z2ggZGF0YSBidWZmZXJlZCAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykuIFRoZSBsb29wXG4gIC8vICAgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgdGhlIGJ1ZmZlciB3aXRoIGVub3VnaCBkYXRhIGlmIHN1Y2ggZGF0YVxuICAvLyAgIGlzIGF2YWlsYWJsZS4gSWYgaGlnaFdhdGVyTWFyayBpcyAwIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBmbG93aW5nIG1vZGVcbiAgLy8gICB3ZSBzaG91bGQgX25vdF8gYXR0ZW1wdCB0byBidWZmZXIgYW55IGV4dHJhIGRhdGEuIFdlJ2xsIGdldCBtb3JlIGRhdGFcbiAgLy8gICB3aGVuIHRoZSBzdHJlYW0gY29uc3VtZXIgY2FsbHMgcmVhZCgpIGluc3RlYWQuXG4gIC8vIC0gTm8gZGF0YSBpbiB0aGUgYnVmZmVyLCBhbmQgdGhlIHN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUuIEluIHRoaXMgbW9kZVxuICAvLyAgIHRoZSBsb29wIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyByZWFkKCkgaXMgY2FsbGVkLiBGYWlsaW5nIHRvXG4gIC8vICAgY2FsbCByZWFkIGhlcmUgd291bGQgYWJvcnQgdGhlIGZsb3cgYW5kIHRoZXJlJ3Mgbm8gb3RoZXIgbWVjaGFuaXNtIGZvclxuICAvLyAgIGNvbnRpbnVpbmcgdGhlIGZsb3cgaWYgdGhlIHN0cmVhbSBjb25zdW1lciBoYXMganVzdCBzdWJzY3JpYmVkIHRvIHRoZVxuICAvLyAgICdkYXRhJyBldmVudC5cbiAgLy9cbiAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGNvbmRpdGlvbnMgdG8ga2VlcCByZWFkaW5nIGRhdGEsIHRoZSBmb2xsb3dpbmdcbiAgLy8gY29uZGl0aW9ucyBwcmV2ZW50IHRoZSBkYXRhIGZyb20gYmVpbmcgcmVhZDpcbiAgLy8gLSBUaGUgc3RyZWFtIGhhcyBlbmRlZCAoc3RhdGUuZW5kZWQpLlxuICAvLyAtIFRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nICdyZWFkJyBvcGVyYXRpb24gKHN0YXRlLnJlYWRpbmcpLiBUaGlzIGlzIGFcbiAgLy8gICBjYXNlIHdoZXJlIHRoZSBzdHJlYW0gaGFzIGNhbGxlZCB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBfcmVhZCgpXG4gIC8vICAgbWV0aG9kLCBidXQgdGhleSBhcmUgcHJvY2Vzc2luZyB0aGUgY2FsbCBhc3luY2hyb25vdXNseSBhbmQgaGF2ZSBfbm90X1xuICAvLyAgIGNhbGxlZCBwdXNoKCkgd2l0aCBuZXcgZGF0YS4gSW4gdGhpcyBjYXNlIHdlIHNraXAgcGVyZm9ybWluZyBtb3JlXG4gIC8vICAgcmVhZCgpcy4gVGhlIGV4ZWN1dGlvbiBlbmRzIGluIHRoaXMgbWV0aG9kIGFnYWluIGFmdGVyIHRoZSBfcmVhZCgpIGVuZHNcbiAgLy8gICB1cCBjYWxsaW5nIHB1c2goKSB3aXRoIG1vcmUgZGF0YS5cbiAgd2hpbGUgKFxuICAgICFzdGF0ZS5yZWFkaW5nICYmXG4gICAgIXN0YXRlLmVuZGVkICYmXG4gICAgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSlcbiAgKSB7XG4gICAgY29uc3QgbGVuID0gc3RhdGUubGVuZ3RoXG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJylcbiAgICBzdHJlYW0ucmVhZCgwKVxuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIERpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVha1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2Vcbn1cblxuLy8gQWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aHJvdyBuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ19yZWFkKCknKVxufVxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgY29uc3Qgc3JjID0gdGhpc1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgaWYgKHN0YXRlLnBpcGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICghc3RhdGUubXVsdGlBd2FpdERyYWluKSB7XG4gICAgICBzdGF0ZS5tdWx0aUF3YWl0RHJhaW4gPSB0cnVlXG4gICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IG5ldyBTYWZlU2V0KHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID8gW3N0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzXSA6IFtdKVxuICAgIH1cbiAgfVxuICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpXG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlcy5sZW5ndGgsIHBpcGVPcHRzKVxuICBjb25zdCBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnJcbiAgY29uc3QgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlXG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzLm5leHRUaWNrKGVuZEZuKVxuICBlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbilcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpXG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlLCB1bnBpcGVJbmZvKSB7XG4gICAgZGVidWcoJ29udW5waXBlJylcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlXG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKVxuICAgIGRlc3QuZW5kKClcbiAgfVxuICBsZXQgb25kcmFpblxuICBsZXQgY2xlYW5lZFVwID0gZmFsc2VcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpXG4gICAgLy8gQ2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlbi5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgaWYgKG9uZHJhaW4pIHtcbiAgICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICB9XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKVxuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGNsZWFuZWRVcCA9IHRydWVcblxuICAgIC8vIElmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKG9uZHJhaW4gJiYgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgJiYgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSkgb25kcmFpbigpXG4gIH1cbiAgZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgIGlmICghY2xlYW5lZFVwKSB7XG4gICAgICBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID09PSAxICYmIHN0YXRlLnBpcGVzWzBdID09PSBkZXN0KSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCAwKVxuICAgICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IGRlc3RcbiAgICAgICAgc3RhdGUubXVsdGlBd2FpdERyYWluID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID4gMSAmJiBzdGF0ZS5waXBlcy5pbmNsdWRlcyhkZXN0KSkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuc2l6ZSlcbiAgICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuYWRkKGRlc3QpXG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKVxuICAgIH1cbiAgICBpZiAoIW9uZHJhaW4pIHtcbiAgICAgIC8vIFdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgICAgIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAgICAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgICAgIC8vIHRvbyBzbG93LlxuICAgICAgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYywgZGVzdClcbiAgICAgIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcbiAgICB9XG4gIH1cbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJylcbiAgICBjb25zdCByZXQgPSBkZXN0LndyaXRlKGNodW5rKVxuICAgIGRlYnVnKCdkZXN0LndyaXRlJywgcmV0KVxuICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICBwYXVzZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIEhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpXG4gICAgdW5waXBlKClcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgaWYgKGRlc3QubGlzdGVuZXJDb3VudCgnZXJyb3InKSA9PT0gMCkge1xuICAgICAgY29uc3QgcyA9IGRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKHMgJiYgIXMuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIC8vIFVzZXIgaW5jb3JyZWN0bHkgZW1pdHRlZCAnZXJyb3InIGRpcmVjdGx5IG9uIHRoZSBzdHJlYW0uXG4gICAgICAgIGVycm9yT3JEZXN0cm95KGRlc3QsIGVyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpXG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgICB1bnBpcGUoKVxuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKVxuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgICB1bnBpcGUoKVxuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJylcbiAgICBzcmMudW5waXBlKGRlc3QpXG4gIH1cblxuICAvLyBUZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0by5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKVxuXG4gIC8vIFN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cblxuICBpZiAoZGVzdC53cml0YWJsZU5lZWREcmFpbiA9PT0gdHJ1ZSkge1xuICAgIHBhdXNlKClcbiAgfSBlbHNlIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpXG4gICAgc3JjLnJlc3VtZSgpXG4gIH1cbiAgcmV0dXJuIGRlc3Rcbn1cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYywgZGVzdCkge1xuICByZXR1cm4gZnVuY3Rpb24gcGlwZU9uRHJhaW5GdW5jdGlvblJlc3VsdCgpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZVxuXG4gICAgLy8gYG9uZHJhaW5gIHdpbGwgY2FsbCBkaXJlY3RseSxcbiAgICAvLyBgdGhpc2AgbWF5YmUgbm90IGEgcmVmZXJlbmNlIHRvIGRlc3QsXG4gICAgLy8gc28gd2UgdXNlIHRoZSByZWFsIGRlc3QgaGVyZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPT09IGRlc3QpIHtcbiAgICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIDEpXG4gICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IG51bGxcbiAgICB9IGVsc2UgaWYgKHN0YXRlLm11bHRpQXdhaXREcmFpbikge1xuICAgICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuc2l6ZSlcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmRlbGV0ZShkZXN0KVxuICAgIH1cbiAgICBpZiAoKCFzdGF0ZS5hd2FpdERyYWluV3JpdGVycyB8fCBzdGF0ZS5hd2FpdERyYWluV3JpdGVycy5zaXplID09PSAwKSAmJiBzcmMubGlzdGVuZXJDb3VudCgnZGF0YScpKSB7XG4gICAgICBzcmMucmVzdW1lKClcbiAgICB9XG4gIH1cbn1cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdW5waXBlSW5mbyA9IHtcbiAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICB9XG5cbiAgLy8gSWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpc1xuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIGNvbnN0IGRlc3RzID0gc3RhdGUucGlwZXNcbiAgICBzdGF0ZS5waXBlcyA9IFtdXG4gICAgdGhpcy5wYXVzZSgpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXN0cy5sZW5ndGg7IGkrKylcbiAgICAgIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMsIHtcbiAgICAgICAgaGFzVW5waXBlZDogZmFsc2VcbiAgICAgIH0pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIFRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIGNvbnN0IGluZGV4ID0gQXJyYXlQcm90b3R5cGVJbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KVxuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpc1xuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpXG4gIGlmIChzdGF0ZS5waXBlcy5sZW5ndGggPT09IDApIHRoaXMucGF1c2UoKVxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIFNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nLlxuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICBjb25zdCByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKVxuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBVcGRhdGUgcmVhZGFibGVMaXN0ZW5pbmcgc28gdGhhdCByZXN1bWUoKSBtYXkgYmUgYSBuby1vcFxuICAgIC8vIGEgZmV3IGxpbmVzIGRvd24uIFRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgb25jZSgncmVhZGFibGUnKS5cbiAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRoaXMubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDBcblxuICAgIC8vIFRyeSBzdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWQuXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpXG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWVcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZVxuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2VcbiAgICAgIGRlYnVnKCdvbiByZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUucmVhZGluZylcbiAgICAgIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpXG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcylcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uXG5SZWFkYWJsZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIGNvbnN0IHJlcyA9IFN0cmVhbS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIuY2FsbCh0aGlzLCBldiwgZm4pXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZW9uZSBzdGlsbCBsaXN0ZW5pbmcgdG9cbiAgICAvLyByZWFkYWJsZSBhbmQgcmVzZXQgdGhlIHN0YXRlLiBIb3dldmVyIHRoaXMgbmVlZHMgdG8gaGFwcGVuXG4gICAgLy8gYWZ0ZXIgcmVhZGFibGUgaGFzIGJlZW4gZW1pdHRlZCBidXQgYmVmb3JlIEkvTyAobmV4dFRpY2spIHRvXG4gICAgLy8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScsIGZuKSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nXG4gICAgLy8gcmVzdW1lIHdpdGhpbiB0aGUgc2FtZSB0aWNrIHdpbGwgaGF2ZSBub1xuICAgIC8vIGVmZmVjdC5cbiAgICBwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLCB0aGlzKVxuICB9XG4gIHJldHVybiByZXNcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5vZmYgPSBSZWFkYWJsZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXJcblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoZXYpIHtcbiAgY29uc3QgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgfHwgZXYgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZW9uZSBzdGlsbCBsaXN0ZW5pbmcgdG9cbiAgICAvLyByZWFkYWJsZSBhbmQgcmVzZXQgdGhlIHN0YXRlLiBIb3dldmVyIHRoaXMgbmVlZHMgdG8gaGFwcGVuXG4gICAgLy8gYWZ0ZXIgcmVhZGFibGUgaGFzIGJlZW4gZW1pdHRlZCBidXQgYmVmb3JlIEkvTyAobmV4dFRpY2spIHRvXG4gICAgLy8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScsIGZuKSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nXG4gICAgLy8gcmVzdW1lIHdpdGhpbiB0aGUgc2FtZSB0aWNrIHdpbGwgaGF2ZSBub1xuICAgIC8vIGVmZmVjdC5cbiAgICBwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLCB0aGlzKVxuICB9XG4gIHJldHVybiByZXNcbn1cbmZ1bmN0aW9uIHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nKHNlbGYpIHtcbiAgY29uc3Qgc3RhdGUgPSBzZWxmLl9yZWFkYWJsZVN0YXRlXG4gIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc2VsZi5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuICBpZiAoc3RhdGUucmVzdW1lU2NoZWR1bGVkICYmIHN0YXRlW2tQYXVzZWRdID09PSBmYWxzZSkge1xuICAgIC8vIEZsb3dpbmcgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgbm93LCBvdGhlcndpc2VcbiAgICAvLyB0aGUgdXBjb21pbmcgcmVzdW1lIHdpbGwgbm90IGZsb3cuXG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWVcblxuICAgIC8vIENydWRlIHdheSB0byBjaGVjayBpZiB3ZSBzaG91bGQgcmVzdW1lLlxuICB9IGVsc2UgaWYgKHNlbGYubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIHNlbGYucmVzdW1lKClcbiAgfSBlbHNlIGlmICghc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICBzdGF0ZS5mbG93aW5nID0gbnVsbFxuICB9XG59XG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpXG4gIHNlbGYucmVhZCgwKVxufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpXG4gICAgLy8gV2UgZmxvdyBvbmx5IGlmIHRoZXJlIGlzIG5vIG9uZSBsaXN0ZW5pbmdcbiAgICAvLyBmb3IgcmVhZGFibGUsIGJ1dCB3ZSBzdGlsbCBoYXZlIHRvIGNhbGxcbiAgICAvLyByZXN1bWUoKS5cbiAgICBzdGF0ZS5mbG93aW5nID0gIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nXG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKVxuICB9XG4gIHN0YXRlW2tQYXVzZWRdID0gZmFsc2VcbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZVxuICAgIHByb2Nlc3MubmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSlcbiAgfVxufVxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGRlYnVnKCdyZXN1bWUnLCBzdGF0ZS5yZWFkaW5nKVxuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBzdHJlYW0ucmVhZCgwKVxuICB9XG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlXG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKVxuICBmbG93KHN0cmVhbSlcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApXG59XG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpXG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB7XG4gICAgZGVidWcoJ3BhdXNlJylcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgncGF1c2UnKVxuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGVba1BhdXNlZF0gPSB0cnVlXG4gIHJldHVybiB0aGlzXG59XG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpXG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpO1xufVxuXG4vLyBXcmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgbGV0IHBhdXNlZCA9IGZhbHNlXG5cbiAgLy8gVE9ETyAocm9uYWcpOiBTaG91bGQgdGhpcy5kZXN0cm95KGVycikgZW1pdFxuICAvLyAnZXJyb3InIG9uIHRoZSB3cmFwcGVkIHN0cmVhbT8gV291bGQgcmVxdWlyZVxuICAvLyBhIHN0YXRpYyBmYWN0b3J5IG1ldGhvZCwgZS5nLiBSZWFkYWJsZS53cmFwKHN0cmVhbSkuXG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgaWYgKCF0aGlzLnB1c2goY2h1bmspICYmIHN0cmVhbS5wYXVzZSkge1xuICAgICAgcGF1c2VkID0gdHJ1ZVxuICAgICAgc3RyZWFtLnBhdXNlKClcbiAgICB9XG4gIH0pXG4gIHN0cmVhbS5vbignZW5kJywgKCkgPT4ge1xuICAgIHRoaXMucHVzaChudWxsKVxuICB9KVxuICBzdHJlYW0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgIGVycm9yT3JEZXN0cm95KHRoaXMsIGVycilcbiAgfSlcbiAgc3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICB0aGlzLmRlc3Ryb3koKVxuICB9KVxuICBzdHJlYW0ub24oJ2Rlc3Ryb3knLCAoKSA9PiB7XG4gICAgdGhpcy5kZXN0cm95KClcbiAgfSlcbiAgdGhpcy5fcmVhZCA9ICgpID0+IHtcbiAgICBpZiAocGF1c2VkICYmIHN0cmVhbS5yZXN1bWUpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlXG4gICAgICBzdHJlYW0ucmVzdW1lKClcbiAgICB9XG4gIH1cblxuICAvLyBQcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuIEltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBjb25zdCBzdHJlYW1LZXlzID0gT2JqZWN0S2V5cyhzdHJlYW0pXG4gIGZvciAobGV0IGogPSAxOyBqIDwgc3RyZWFtS2V5cy5sZW5ndGg7IGorKykge1xuICAgIGNvbnN0IGkgPSBzdHJlYW1LZXlzW2pdXG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gc3RyZWFtW2ldLmJpbmQoc3RyZWFtKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpc1xufVxuUmVhZGFibGUucHJvdG90eXBlW1N5bWJvbEFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gc3RyZWFtVG9Bc3luY0l0ZXJhdG9yKHRoaXMpXG59XG5SZWFkYWJsZS5wcm90b3R5cGUuaXRlcmF0b3IgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIHJldHVybiBzdHJlYW1Ub0FzeW5jSXRlcmF0b3IodGhpcywgb3B0aW9ucylcbn1cbmZ1bmN0aW9uIHN0cmVhbVRvQXN5bmNJdGVyYXRvcihzdHJlYW0sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHJlYW0ucmVhZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0cmVhbSA9IFJlYWRhYmxlLndyYXAoc3RyZWFtLCB7XG4gICAgICBvYmplY3RNb2RlOiB0cnVlXG4gICAgfSlcbiAgfVxuICBjb25zdCBpdGVyID0gY3JlYXRlQXN5bmNJdGVyYXRvcihzdHJlYW0sIG9wdGlvbnMpXG4gIGl0ZXIuc3RyZWFtID0gc3RyZWFtXG4gIHJldHVybiBpdGVyXG59XG5hc3luYyBmdW5jdGlvbiogY3JlYXRlQXN5bmNJdGVyYXRvcihzdHJlYW0sIG9wdGlvbnMpIHtcbiAgbGV0IGNhbGxiYWNrID0gbm9wXG4gIGZ1bmN0aW9uIG5leHQocmVzb2x2ZSkge1xuICAgIGlmICh0aGlzID09PSBzdHJlYW0pIHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIGNhbGxiYWNrID0gbm9wXG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrID0gcmVzb2x2ZVxuICAgIH1cbiAgfVxuICBzdHJlYW0ub24oJ3JlYWRhYmxlJywgbmV4dClcbiAgbGV0IGVycm9yXG4gIGNvbnN0IGNsZWFudXAgPSBlb3MoXG4gICAgc3RyZWFtLFxuICAgIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0sXG4gICAgKGVycikgPT4ge1xuICAgICAgZXJyb3IgPSBlcnIgPyBhZ2dyZWdhdGVUd29FcnJvcnMoZXJyb3IsIGVycikgOiBudWxsXG4gICAgICBjYWxsYmFjaygpXG4gICAgICBjYWxsYmFjayA9IG5vcFxuICAgIH1cbiAgKVxuICB0cnkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHN0cmVhbS5kZXN0cm95ZWQgPyBudWxsIDogc3RyZWFtLnJlYWQoKVxuICAgICAgaWYgKGNodW5rICE9PSBudWxsKSB7XG4gICAgICAgIHlpZWxkIGNodW5rXG4gICAgICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9IGVsc2UgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UobmV4dClcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yID0gYWdncmVnYXRlVHdvRXJyb3JzKGVycm9yLCBlcnIpXG4gICAgdGhyb3cgZXJyb3JcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoXG4gICAgICAoZXJyb3IgfHwgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5kZXN0cm95T25SZXR1cm4pICE9PSBmYWxzZSkgJiZcbiAgICAgIChlcnJvciA9PT0gdW5kZWZpbmVkIHx8IHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5hdXRvRGVzdHJveSlcbiAgICApIHtcbiAgICAgIGRlc3Ryb3lJbXBsLmRlc3Ryb3llcihzdHJlYW0sIG51bGwpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS5vZmYoJ3JlYWRhYmxlJywgbmV4dClcbiAgICAgIGNsZWFudXAoKVxuICAgIH1cbiAgfVxufVxuXG4vLyBNYWtpbmcgaXQgZXhwbGljaXQgdGhlc2UgcHJvcGVydGllcyBhcmUgbm90IGVudW1lcmFibGVcbi8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuLy8gdXNlcmxhbmQgd2lsbCBmYWlsLlxuT2JqZWN0RGVmaW5lUHJvcGVydGllcyhSZWFkYWJsZS5wcm90b3R5cGUsIHtcbiAgcmVhZGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgICAgIC8vIHIucmVhZGFibGUgPT09IGZhbHNlIG1lYW5zIHRoYXQgdGhpcyBpcyBwYXJ0IG9mIGEgRHVwbGV4IHN0cmVhbVxuICAgICAgLy8gd2hlcmUgdGhlIHJlYWRhYmxlIHNpZGUgd2FzIGRpc2FibGVkIHVwb24gY29uc3RydWN0aW9uLlxuICAgICAgLy8gQ29tcGF0LiBUaGUgdXNlciBtaWdodCBtYW51YWxseSBkaXNhYmxlIHJlYWRhYmxlIHNpZGUgdGhyb3VnaFxuICAgICAgLy8gZGVwcmVjYXRlZCBzZXR0ZXIuXG4gICAgICByZXR1cm4gISFyICYmIHIucmVhZGFibGUgIT09IGZhbHNlICYmICFyLmRlc3Ryb3llZCAmJiAhci5lcnJvckVtaXR0ZWQgJiYgIXIuZW5kRW1pdHRlZFxuICAgIH0sXG4gICAgc2V0KHZhbCkge1xuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdC5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGFibGUgPSAhIXZhbFxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVEaWRSZWFkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGF0YUVtaXR0ZWRcbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlQWJvcnRlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIShcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkIHx8IHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCkgJiZcbiAgICAgICAgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZFxuICAgICAgKVxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVIaWdoV2F0ZXJNYXJrOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVCdWZmZXI6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlclxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVGbG93aW5nOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IHN0YXRlXG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZWFkYWJsZUxlbmd0aDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGhcbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlT2JqZWN0TW9kZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZSA6IGZhbHNlXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUVuY29kaW5nOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA6IG51bGxcbiAgICB9XG4gIH0sXG4gIGVycm9yZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmVycm9yZWQgOiBudWxsXG4gICAgfVxuICB9LFxuICBjbG9zZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmNsb3NlZCA6IGZhbHNlXG4gICAgfVxuICB9LFxuICBkZXN0cm95ZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA6IGZhbHNlXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIFdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldC5cbiAgICAgIGlmICghdGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkLlxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVFbmRlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA6IGZhbHNlXG4gICAgfVxuICB9XG59KVxuT2JqZWN0RGVmaW5lUHJvcGVydGllcyhSZWFkYWJsZVN0YXRlLnByb3RvdHlwZSwge1xuICAvLyBMZWdhY3kgZ2V0dGVyIGZvciBgcGlwZXNDb3VudGAuXG4gIHBpcGVzQ291bnQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucGlwZXMubGVuZ3RoXG4gICAgfVxuICB9LFxuICAvLyBMZWdhY3kgcHJvcGVydHkgZm9yIGBwYXVzZWRgLlxuICBwYXVzZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXNba1BhdXNlZF0gIT09IGZhbHNlXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXNba1BhdXNlZF0gPSAhIXZhbHVlXG4gICAgfVxuICB9XG59KVxuXG4vLyBFeHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdFxuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkLlxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICBsZXQgcmV0XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKVxuICBlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIFJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdC5cbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgcmV0ID0gc3RhdGUuYnVmZmVyLmpvaW4oJycpXG4gICAgZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmZpcnN0KClcbiAgICBlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKVxuICAgIHN0YXRlLmJ1ZmZlci5jbGVhcigpXG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBwYXJ0IG9mIGxpc3QuXG4gICAgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbnN1bWUobiwgc3RhdGUuZGVjb2RlcilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgZGVidWcoJ2VuZFJlYWRhYmxlJywgc3RhdGUuZW5kRW1pdHRlZClcbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKVxuICB9XG59XG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgZGVidWcoJ2VuZFJlYWRhYmxlTlQnLCBzdGF0ZS5lbmRFbWl0dGVkLCBzdGF0ZS5sZW5ndGgpXG5cbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZXJyb3JlZCAmJiAhc3RhdGUuY2xvc2VFbWl0dGVkICYmICFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlXG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgaWYgKHN0cmVhbS53cml0YWJsZSAmJiBzdHJlYW0uYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW5kV3JpdGFibGVOVCwgc3RyZWFtKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuYXV0b0Rlc3Ryb3kpIHtcbiAgICAgIC8vIEluIGNhc2Ugb2YgZHVwbGV4IHN0cmVhbXMgd2UgbmVlZCBhIHdheSB0byBkZXRlY3RcbiAgICAgIC8vIGlmIHRoZSB3cml0YWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsLlxuICAgICAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gICAgICBjb25zdCBhdXRvRGVzdHJveSA9XG4gICAgICAgICF3U3RhdGUgfHxcbiAgICAgICAgKHdTdGF0ZS5hdXRvRGVzdHJveSAmJlxuICAgICAgICAgIC8vIFdlIGRvbid0IGV4cGVjdCB0aGUgd3JpdGFibGUgdG8gZXZlciAnZmluaXNoJ1xuICAgICAgICAgIC8vIGlmIHdyaXRhYmxlIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLlxuICAgICAgICAgICh3U3RhdGUuZmluaXNoZWQgfHwgd1N0YXRlLndyaXRhYmxlID09PSBmYWxzZSkpXG4gICAgICBpZiAoYXV0b0Rlc3Ryb3kpIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZW5kV3JpdGFibGVOVChzdHJlYW0pIHtcbiAgY29uc3Qgd3JpdGFibGUgPSBzdHJlYW0ud3JpdGFibGUgJiYgIXN0cmVhbS53cml0YWJsZUVuZGVkICYmICFzdHJlYW0uZGVzdHJveWVkXG4gIGlmICh3cml0YWJsZSkge1xuICAgIHN0cmVhbS5lbmQoKVxuICB9XG59XG5SZWFkYWJsZS5mcm9tID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBvcHRzKSB7XG4gIHJldHVybiBmcm9tKFJlYWRhYmxlLCBpdGVyYWJsZSwgb3B0cylcbn1cbmxldCB3ZWJTdHJlYW1zQWRhcHRlcnNcblxuLy8gTGF6eSB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzXG5mdW5jdGlvbiBsYXp5V2ViU3RyZWFtcygpIHtcbiAgaWYgKHdlYlN0cmVhbXNBZGFwdGVycyA9PT0gdW5kZWZpbmVkKSB3ZWJTdHJlYW1zQWRhcHRlcnMgPSB7fVxuICByZXR1cm4gd2ViU3RyZWFtc0FkYXB0ZXJzXG59XG5SZWFkYWJsZS5mcm9tV2ViID0gZnVuY3Rpb24gKHJlYWRhYmxlU3RyZWFtLCBvcHRpb25zKSB7XG4gIHJldHVybiBsYXp5V2ViU3RyZWFtcygpLm5ld1N0cmVhbVJlYWRhYmxlRnJvbVJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtLCBvcHRpb25zKVxufVxuUmVhZGFibGUudG9XZWIgPSBmdW5jdGlvbiAoc3RyZWFtUmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3UmVhZGFibGVTdHJlYW1Gcm9tU3RyZWFtUmVhZGFibGUoc3RyZWFtUmVhZGFibGUsIG9wdGlvbnMpXG59XG5SZWFkYWJsZS53cmFwID0gZnVuY3Rpb24gKHNyYywgb3B0aW9ucykge1xuICB2YXIgX3JlZiwgX3NyYyRyZWFkYWJsZU9iamVjdE1vXG4gIHJldHVybiBuZXcgUmVhZGFibGUoe1xuICAgIG9iamVjdE1vZGU6XG4gICAgICAoX3JlZiA9XG4gICAgICAgIChfc3JjJHJlYWRhYmxlT2JqZWN0TW8gPSBzcmMucmVhZGFibGVPYmplY3RNb2RlKSAhPT0gbnVsbCAmJiBfc3JjJHJlYWRhYmxlT2JqZWN0TW8gIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gX3NyYyRyZWFkYWJsZU9iamVjdE1vXG4gICAgICAgICAgOiBzcmMub2JqZWN0TW9kZSkgIT09IG51bGwgJiYgX3JlZiAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gX3JlZlxuICAgICAgICA6IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgICBkZXN0cm95KGVyciwgY2FsbGJhY2spIHtcbiAgICAgIGRlc3Ryb3lJbXBsLmRlc3Ryb3llcihzcmMsIGVycilcbiAgICAgIGNhbGxiYWNrKGVycilcbiAgICB9XG4gIH0pLndyYXAoc3JjKVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///57576\n")},65291:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { MathFloor, NumberIsInteger } = __webpack_require__(24134)\nconst { validateInteger } = __webpack_require__(277)\nconst { ERR_INVALID_ARG_VALUE } = (__webpack_require__(76371).codes)\nlet defaultHighWaterMarkBytes = 16 * 1024\nlet defaultHighWaterMarkObjectMode = 16\nfunction highWaterMarkFrom(options, isDuplex, duplexKey) {\n return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null\n}\nfunction getDefaultHighWaterMark(objectMode) {\n return objectMode ? defaultHighWaterMarkObjectMode : defaultHighWaterMarkBytes\n}\nfunction setDefaultHighWaterMark(objectMode, value) {\n validateInteger(value, 'value', 0)\n if (objectMode) {\n defaultHighWaterMarkObjectMode = value\n } else {\n defaultHighWaterMarkBytes = value\n }\n}\nfunction getHighWaterMark(state, options, duplexKey, isDuplex) {\n const hwm = highWaterMarkFrom(options, isDuplex, duplexKey)\n if (hwm != null) {\n if (!NumberIsInteger(hwm) || hwm < 0) {\n const name = isDuplex ? `options.${duplexKey}` : 'options.highWaterMark'\n throw new ERR_INVALID_ARG_VALUE(name, hwm)\n }\n return MathFloor(hwm)\n }\n\n // Default value\n return getDefaultHighWaterMark(state.objectMode)\n}\nmodule.exports = {\n getHighWaterMark,\n getDefaultHighWaterMark,\n setDefaultHighWaterMark\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUyOTEuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosUUFBUSw2QkFBNkIsRUFBRSxtQkFBTyxDQUFDLEtBQXdCO0FBQ3ZFLFFBQVEsa0JBQWtCLEVBQUUsbUJBQU8sQ0FBQyxHQUFlO0FBQ25ELFFBQVEsd0JBQXdCLEVBQUUsa0NBQWtDO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxVQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZS5qcz8wZGI2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE1hdGhGbG9vciwgTnVtYmVySXNJbnRlZ2VyIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHsgdmFsaWRhdGVJbnRlZ2VyIH0gPSByZXF1aXJlKCcuLi92YWxpZGF0b3JzJylcbmNvbnN0IHsgRVJSX0lOVkFMSURfQVJHX1ZBTFVFIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpLmNvZGVzXG5sZXQgZGVmYXVsdEhpZ2hXYXRlck1hcmtCeXRlcyA9IDE2ICogMTAyNFxubGV0IGRlZmF1bHRIaWdoV2F0ZXJNYXJrT2JqZWN0TW9kZSA9IDE2XG5mdW5jdGlvbiBoaWdoV2F0ZXJNYXJrRnJvbShvcHRpb25zLCBpc0R1cGxleCwgZHVwbGV4S2V5KSB7XG4gIHJldHVybiBvcHRpb25zLmhpZ2hXYXRlck1hcmsgIT0gbnVsbCA/IG9wdGlvbnMuaGlnaFdhdGVyTWFyayA6IGlzRHVwbGV4ID8gb3B0aW9uc1tkdXBsZXhLZXldIDogbnVsbFxufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsob2JqZWN0TW9kZSkge1xuICByZXR1cm4gb2JqZWN0TW9kZSA/IGRlZmF1bHRIaWdoV2F0ZXJNYXJrT2JqZWN0TW9kZSA6IGRlZmF1bHRIaWdoV2F0ZXJNYXJrQnl0ZXNcbn1cbmZ1bmN0aW9uIHNldERlZmF1bHRIaWdoV2F0ZXJNYXJrKG9iamVjdE1vZGUsIHZhbHVlKSB7XG4gIHZhbGlkYXRlSW50ZWdlcih2YWx1ZSwgJ3ZhbHVlJywgMClcbiAgaWYgKG9iamVjdE1vZGUpIHtcbiAgICBkZWZhdWx0SGlnaFdhdGVyTWFya09iamVjdE1vZGUgPSB2YWx1ZVxuICB9IGVsc2Uge1xuICAgIGRlZmF1bHRIaWdoV2F0ZXJNYXJrQnl0ZXMgPSB2YWx1ZVxuICB9XG59XG5mdW5jdGlvbiBnZXRIaWdoV2F0ZXJNYXJrKHN0YXRlLCBvcHRpb25zLCBkdXBsZXhLZXksIGlzRHVwbGV4KSB7XG4gIGNvbnN0IGh3bSA9IGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpXG4gIGlmIChod20gIT0gbnVsbCkge1xuICAgIGlmICghTnVtYmVySXNJbnRlZ2VyKGh3bSkgfHwgaHdtIDwgMCkge1xuICAgICAgY29uc3QgbmFtZSA9IGlzRHVwbGV4ID8gYG9wdGlvbnMuJHtkdXBsZXhLZXl9YCA6ICdvcHRpb25zLmhpZ2hXYXRlck1hcmsnXG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKG5hbWUsIGh3bSlcbiAgICB9XG4gICAgcmV0dXJuIE1hdGhGbG9vcihod20pXG4gIH1cblxuICAvLyBEZWZhdWx0IHZhbHVlXG4gIHJldHVybiBnZXREZWZhdWx0SGlnaFdhdGVyTWFyayhzdGF0ZS5vYmplY3RNb2RlKVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldEhpZ2hXYXRlck1hcmssXG4gIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrLFxuICBzZXREZWZhdWx0SGlnaFdhdGVyTWFya1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///65291\n")},17382:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n\n\nconst { ObjectSetPrototypeOf, Symbol } = __webpack_require__(24134)\nmodule.exports = Transform\nconst { ERR_METHOD_NOT_IMPLEMENTED } = (__webpack_require__(76371).codes)\nconst Duplex = __webpack_require__(93370)\nconst { getHighWaterMark } = __webpack_require__(65291)\nObjectSetPrototypeOf(Transform.prototype, Duplex.prototype)\nObjectSetPrototypeOf(Transform, Duplex)\nconst kCallback = Symbol('kCallback')\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options)\n\n // TODO (ronag): This should preferably always be\n // applied but would be semver-major. Or even better;\n // make Transform a Readable with the Writable interface.\n const readableHighWaterMark = options ? getHighWaterMark(this, options, 'readableHighWaterMark', true) : null\n if (readableHighWaterMark === 0) {\n // A Duplex will buffer both on the writable and readable side while\n // a Transform just wants to buffer hwm number of elements. To avoid\n // buffering twice we disable buffering on the writable side.\n options = {\n ...options,\n highWaterMark: null,\n readableHighWaterMark,\n // TODO (ronag): 0 is not optimal since we have\n // a \"bug\" where we check needDrain before calling _write and not after.\n // Refs: https://github.com/nodejs/node/pull/32887\n // Refs: https://github.com/nodejs/node/pull/35941\n writableHighWaterMark: options.writableHighWaterMark || 0\n }\n }\n Duplex.call(this, options)\n\n // We have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false\n this[kCallback] = null\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform\n if (typeof options.flush === 'function') this._flush = options.flush\n }\n\n // When the writable side finishes, then flush out anything remaining.\n // Backwards compat. Some Transform streams incorrectly implement _final\n // instead of or in addition to _flush. By using 'prefinish' instead of\n // implementing _final we continue supporting this unfortunate use case.\n this.on('prefinish', prefinish)\n}\nfunction final(cb) {\n if (typeof this._flush === 'function' && !this.destroyed) {\n this._flush((er, data) => {\n if (er) {\n if (cb) {\n cb(er)\n } else {\n this.destroy(er)\n }\n return\n }\n if (data != null) {\n this.push(data)\n }\n this.push(null)\n if (cb) {\n cb()\n }\n })\n } else {\n this.push(null)\n if (cb) {\n cb()\n }\n }\n}\nfunction prefinish() {\n if (this._final !== final) {\n final.call(this)\n }\n}\nTransform.prototype._final = final\nTransform.prototype._transform = function (chunk, encoding, callback) {\n throw new ERR_METHOD_NOT_IMPLEMENTED('_transform()')\n}\nTransform.prototype._write = function (chunk, encoding, callback) {\n const rState = this._readableState\n const wState = this._writableState\n const length = rState.length\n this._transform(chunk, encoding, (err, val) => {\n if (err) {\n callback(err)\n return\n }\n if (val != null) {\n this.push(val)\n }\n if (\n wState.ended ||\n // Backwards compat.\n length === rState.length ||\n // Backwards compat.\n rState.length < rState.highWaterMark\n ) {\n callback()\n } else {\n this[kCallback] = callback\n }\n })\n}\nTransform.prototype._read = function () {\n if (this[kCallback]) {\n const callback = this[kCallback]\n this[kCallback] = null\n callback()\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTczODIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxhQUFhO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFWTs7QUFFWixRQUFRLCtCQUErQixFQUFFLG1CQUFPLENBQUMsS0FBd0I7QUFDekU7QUFDQSxRQUFRLDZCQUE2QixFQUFFLGtDQUFrQztBQUN6RSxlQUFlLG1CQUFPLENBQUMsS0FBVTtBQUNqQyxRQUFRLG1CQUFtQixFQUFFLG1CQUFPLENBQUMsS0FBUztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3RyYW5zZm9ybS5qcz8yMmU2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE9iamVjdFNldFByb3RvdHlwZU9mLCBTeW1ib2wgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm1cbmNvbnN0IHsgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJykuY29kZXNcbmNvbnN0IER1cGxleCA9IHJlcXVpcmUoJy4vZHVwbGV4JylcbmNvbnN0IHsgZ2V0SGlnaFdhdGVyTWFyayB9ID0gcmVxdWlyZSgnLi9zdGF0ZScpXG5PYmplY3RTZXRQcm90b3R5cGVPZihUcmFuc2Zvcm0ucHJvdG90eXBlLCBEdXBsZXgucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoVHJhbnNmb3JtLCBEdXBsZXgpXG5jb25zdCBrQ2FsbGJhY2sgPSBTeW1ib2woJ2tDYWxsYmFjaycpXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucylcblxuICAvLyBUT0RPIChyb25hZyk6IFRoaXMgc2hvdWxkIHByZWZlcmFibHkgYWx3YXlzIGJlXG4gIC8vIGFwcGxpZWQgYnV0IHdvdWxkIGJlIHNlbXZlci1tYWpvci4gT3IgZXZlbiBiZXR0ZXI7XG4gIC8vIG1ha2UgVHJhbnNmb3JtIGEgUmVhZGFibGUgd2l0aCB0aGUgV3JpdGFibGUgaW50ZXJmYWNlLlxuICBjb25zdCByZWFkYWJsZUhpZ2hXYXRlck1hcmsgPSBvcHRpb25zID8gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywgdHJ1ZSkgOiBudWxsXG4gIGlmIChyZWFkYWJsZUhpZ2hXYXRlck1hcmsgPT09IDApIHtcbiAgICAvLyBBIER1cGxleCB3aWxsIGJ1ZmZlciBib3RoIG9uIHRoZSB3cml0YWJsZSBhbmQgcmVhZGFibGUgc2lkZSB3aGlsZVxuICAgIC8vIGEgVHJhbnNmb3JtIGp1c3Qgd2FudHMgdG8gYnVmZmVyIGh3bSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIGF2b2lkXG4gICAgLy8gYnVmZmVyaW5nIHR3aWNlIHdlIGRpc2FibGUgYnVmZmVyaW5nIG9uIHRoZSB3cml0YWJsZSBzaWRlLlxuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGlnaFdhdGVyTWFyazogbnVsbCxcbiAgICAgIHJlYWRhYmxlSGlnaFdhdGVyTWFyayxcbiAgICAgIC8vIFRPRE8gKHJvbmFnKTogMCBpcyBub3Qgb3B0aW1hbCBzaW5jZSB3ZSBoYXZlXG4gICAgICAvLyBhIFwiYnVnXCIgd2hlcmUgd2UgY2hlY2sgbmVlZERyYWluIGJlZm9yZSBjYWxsaW5nIF93cml0ZSBhbmQgbm90IGFmdGVyLlxuICAgICAgLy8gUmVmczogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzI4ODdcbiAgICAgIC8vIFJlZnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM1OTQxXG4gICAgICB3cml0YWJsZUhpZ2hXYXRlck1hcms6IG9wdGlvbnMud3JpdGFibGVIaWdoV2F0ZXJNYXJrIHx8IDBcbiAgICB9XG4gIH1cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucylcblxuICAvLyBXZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlXG4gIHRoaXNba0NhbGxiYWNrXSA9IG51bGxcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoXG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIC8vIEJhY2t3YXJkcyBjb21wYXQuIFNvbWUgVHJhbnNmb3JtIHN0cmVhbXMgaW5jb3JyZWN0bHkgaW1wbGVtZW50IF9maW5hbFxuICAvLyBpbnN0ZWFkIG9mIG9yIGluIGFkZGl0aW9uIHRvIF9mbHVzaC4gQnkgdXNpbmcgJ3ByZWZpbmlzaCcgaW5zdGVhZCBvZlxuICAvLyBpbXBsZW1lbnRpbmcgX2ZpbmFsIHdlIGNvbnRpbnVlIHN1cHBvcnRpbmcgdGhpcyB1bmZvcnR1bmF0ZSB1c2UgY2FzZS5cbiAgdGhpcy5vbigncHJlZmluaXNoJywgcHJlZmluaXNoKVxufVxuZnVuY3Rpb24gZmluYWwoY2IpIHtcbiAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGhpcy5kZXN0cm95ZWQpIHtcbiAgICB0aGlzLl9mbHVzaCgoZXIsIGRhdGEpID0+IHtcbiAgICAgIGlmIChlcikge1xuICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICBjYihlcilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3koZXIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMucHVzaChkYXRhKVxuICAgICAgfVxuICAgICAgdGhpcy5wdXNoKG51bGwpXG4gICAgICBpZiAoY2IpIHtcbiAgICAgICAgY2IoKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wdXNoKG51bGwpXG4gICAgaWYgKGNiKSB7XG4gICAgICBjYigpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goKSB7XG4gIGlmICh0aGlzLl9maW5hbCAhPT0gZmluYWwpIHtcbiAgICBmaW5hbC5jYWxsKHRoaXMpXG4gIH1cbn1cblRyYW5zZm9ybS5wcm90b3R5cGUuX2ZpbmFsID0gZmluYWxcblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHRocm93IG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCgnX3RyYW5zZm9ybSgpJylcbn1cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgY29uc3QgclN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3U3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gIGNvbnN0IGxlbmd0aCA9IHJTdGF0ZS5sZW5ndGhcbiAgdGhpcy5fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgKGVyciwgdmFsKSA9PiB7XG4gICAgaWYgKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgdGhpcy5wdXNoKHZhbClcbiAgICB9XG4gICAgaWYgKFxuICAgICAgd1N0YXRlLmVuZGVkIHx8XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LlxuICAgICAgbGVuZ3RoID09PSByU3RhdGUubGVuZ3RoIHx8XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LlxuICAgICAgclN0YXRlLmxlbmd0aCA8IHJTdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgKSB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0NhbGxiYWNrXSA9IGNhbGxiYWNrXG4gICAgfVxuICB9KVxufVxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXNba0NhbGxiYWNrXSkge1xuICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpc1trQ2FsbGJhY2tdXG4gICAgdGhpc1trQ2FsbGJhY2tdID0gbnVsbFxuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///17382\n")},16115:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { SymbolAsyncIterator, SymbolIterator, SymbolFor } = __webpack_require__(24134)\n\n// We need to use SymbolFor to make these globally available\n// for interopt with readable-stream, i.e. readable-stream\n// and node core needs to be able to read/write private state\n// from each other for proper interoperability.\nconst kIsDestroyed = SymbolFor('nodejs.stream.destroyed')\nconst kIsErrored = SymbolFor('nodejs.stream.errored')\nconst kIsReadable = SymbolFor('nodejs.stream.readable')\nconst kIsWritable = SymbolFor('nodejs.stream.writable')\nconst kIsDisturbed = SymbolFor('nodejs.stream.disturbed')\nconst kIsClosedPromise = SymbolFor('nodejs.webstream.isClosedPromise')\nconst kControllerErrorFunction = SymbolFor('nodejs.webstream.controllerErrorFunction')\nfunction isReadableNodeStream(obj, strict = false) {\n var _obj$_readableState\n return !!(\n (\n obj &&\n typeof obj.pipe === 'function' &&\n typeof obj.on === 'function' &&\n (!strict || (typeof obj.pause === 'function' && typeof obj.resume === 'function')) &&\n (!obj._writableState ||\n ((_obj$_readableState = obj._readableState) === null || _obj$_readableState === undefined\n ? undefined\n : _obj$_readableState.readable) !== false) &&\n // Duplex\n (!obj._writableState || obj._readableState)\n ) // Writable has .pipe.\n )\n}\n\nfunction isWritableNodeStream(obj) {\n var _obj$_writableState\n return !!(\n (\n obj &&\n typeof obj.write === 'function' &&\n typeof obj.on === 'function' &&\n (!obj._readableState ||\n ((_obj$_writableState = obj._writableState) === null || _obj$_writableState === undefined\n ? undefined\n : _obj$_writableState.writable) !== false)\n ) // Duplex\n )\n}\n\nfunction isDuplexNodeStream(obj) {\n return !!(\n obj &&\n typeof obj.pipe === 'function' &&\n obj._readableState &&\n typeof obj.on === 'function' &&\n typeof obj.write === 'function'\n )\n}\nfunction isNodeStream(obj) {\n return (\n obj &&\n (obj._readableState ||\n obj._writableState ||\n (typeof obj.write === 'function' && typeof obj.on === 'function') ||\n (typeof obj.pipe === 'function' && typeof obj.on === 'function'))\n )\n}\nfunction isReadableStream(obj) {\n return !!(\n obj &&\n !isNodeStream(obj) &&\n typeof obj.pipeThrough === 'function' &&\n typeof obj.getReader === 'function' &&\n typeof obj.cancel === 'function'\n )\n}\nfunction isWritableStream(obj) {\n return !!(obj && !isNodeStream(obj) && typeof obj.getWriter === 'function' && typeof obj.abort === 'function')\n}\nfunction isTransformStream(obj) {\n return !!(obj && !isNodeStream(obj) && typeof obj.readable === 'object' && typeof obj.writable === 'object')\n}\nfunction isWebStream(obj) {\n return isReadableStream(obj) || isWritableStream(obj) || isTransformStream(obj)\n}\nfunction isIterable(obj, isAsync) {\n if (obj == null) return false\n if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'\n if (isAsync === false) return typeof obj[SymbolIterator] === 'function'\n return typeof obj[SymbolAsyncIterator] === 'function' || typeof obj[SymbolIterator] === 'function'\n}\nfunction isDestroyed(stream) {\n if (!isNodeStream(stream)) return null\n const wState = stream._writableState\n const rState = stream._readableState\n const state = wState || rState\n return !!(stream.destroyed || stream[kIsDestroyed] || (state !== null && state !== undefined && state.destroyed))\n}\n\n// Have been end():d.\nfunction isWritableEnded(stream) {\n if (!isWritableNodeStream(stream)) return null\n if (stream.writableEnded === true) return true\n const wState = stream._writableState\n if (wState !== null && wState !== undefined && wState.errored) return false\n if (typeof (wState === null || wState === undefined ? undefined : wState.ended) !== 'boolean') return null\n return wState.ended\n}\n\n// Have emitted 'finish'.\nfunction isWritableFinished(stream, strict) {\n if (!isWritableNodeStream(stream)) return null\n if (stream.writableFinished === true) return true\n const wState = stream._writableState\n if (wState !== null && wState !== undefined && wState.errored) return false\n if (typeof (wState === null || wState === undefined ? undefined : wState.finished) !== 'boolean') return null\n return !!(wState.finished || (strict === false && wState.ended === true && wState.length === 0))\n}\n\n// Have been push(null):d.\nfunction isReadableEnded(stream) {\n if (!isReadableNodeStream(stream)) return null\n if (stream.readableEnded === true) return true\n const rState = stream._readableState\n if (!rState || rState.errored) return false\n if (typeof (rState === null || rState === undefined ? undefined : rState.ended) !== 'boolean') return null\n return rState.ended\n}\n\n// Have emitted 'end'.\nfunction isReadableFinished(stream, strict) {\n if (!isReadableNodeStream(stream)) return null\n const rState = stream._readableState\n if (rState !== null && rState !== undefined && rState.errored) return false\n if (typeof (rState === null || rState === undefined ? undefined : rState.endEmitted) !== 'boolean') return null\n return !!(rState.endEmitted || (strict === false && rState.ended === true && rState.length === 0))\n}\nfunction isReadable(stream) {\n if (stream && stream[kIsReadable] != null) return stream[kIsReadable]\n if (typeof (stream === null || stream === undefined ? undefined : stream.readable) !== 'boolean') return null\n if (isDestroyed(stream)) return false\n return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream)\n}\nfunction isWritable(stream) {\n if (stream && stream[kIsWritable] != null) return stream[kIsWritable]\n if (typeof (stream === null || stream === undefined ? undefined : stream.writable) !== 'boolean') return null\n if (isDestroyed(stream)) return false\n return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream)\n}\nfunction isFinished(stream, opts) {\n if (!isNodeStream(stream)) {\n return null\n }\n if (isDestroyed(stream)) {\n return true\n }\n if ((opts === null || opts === undefined ? undefined : opts.readable) !== false && isReadable(stream)) {\n return false\n }\n if ((opts === null || opts === undefined ? undefined : opts.writable) !== false && isWritable(stream)) {\n return false\n }\n return true\n}\nfunction isWritableErrored(stream) {\n var _stream$_writableStat, _stream$_writableStat2\n if (!isNodeStream(stream)) {\n return null\n }\n if (stream.writableErrored) {\n return stream.writableErrored\n }\n return (_stream$_writableStat =\n (_stream$_writableStat2 = stream._writableState) === null || _stream$_writableStat2 === undefined\n ? undefined\n : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined\n ? _stream$_writableStat\n : null\n}\nfunction isReadableErrored(stream) {\n var _stream$_readableStat, _stream$_readableStat2\n if (!isNodeStream(stream)) {\n return null\n }\n if (stream.readableErrored) {\n return stream.readableErrored\n }\n return (_stream$_readableStat =\n (_stream$_readableStat2 = stream._readableState) === null || _stream$_readableStat2 === undefined\n ? undefined\n : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined\n ? _stream$_readableStat\n : null\n}\nfunction isClosed(stream) {\n if (!isNodeStream(stream)) {\n return null\n }\n if (typeof stream.closed === 'boolean') {\n return stream.closed\n }\n const wState = stream._writableState\n const rState = stream._readableState\n if (\n typeof (wState === null || wState === undefined ? undefined : wState.closed) === 'boolean' ||\n typeof (rState === null || rState === undefined ? undefined : rState.closed) === 'boolean'\n ) {\n return (\n (wState === null || wState === undefined ? undefined : wState.closed) ||\n (rState === null || rState === undefined ? undefined : rState.closed)\n )\n }\n if (typeof stream._closed === 'boolean' && isOutgoingMessage(stream)) {\n return stream._closed\n }\n return null\n}\nfunction isOutgoingMessage(stream) {\n return (\n typeof stream._closed === 'boolean' &&\n typeof stream._defaultKeepAlive === 'boolean' &&\n typeof stream._removedConnection === 'boolean' &&\n typeof stream._removedContLen === 'boolean'\n )\n}\nfunction isServerResponse(stream) {\n return typeof stream._sent100 === 'boolean' && isOutgoingMessage(stream)\n}\nfunction isServerRequest(stream) {\n var _stream$req\n return (\n typeof stream._consuming === 'boolean' &&\n typeof stream._dumped === 'boolean' &&\n ((_stream$req = stream.req) === null || _stream$req === undefined ? undefined : _stream$req.upgradeOrConnect) ===\n undefined\n )\n}\nfunction willEmitClose(stream) {\n if (!isNodeStream(stream)) return null\n const wState = stream._writableState\n const rState = stream._readableState\n const state = wState || rState\n return (\n (!state && isServerResponse(stream)) || !!(state && state.autoDestroy && state.emitClose && state.closed === false)\n )\n}\nfunction isDisturbed(stream) {\n var _stream$kIsDisturbed\n return !!(\n stream &&\n ((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && _stream$kIsDisturbed !== undefined\n ? _stream$kIsDisturbed\n : stream.readableDidRead || stream.readableAborted)\n )\n}\nfunction isErrored(stream) {\n var _ref,\n _ref2,\n _ref3,\n _ref4,\n _ref5,\n _stream$kIsErrored,\n _stream$_readableStat3,\n _stream$_writableStat3,\n _stream$_readableStat4,\n _stream$_writableStat4\n return !!(\n stream &&\n ((_ref =\n (_ref2 =\n (_ref3 =\n (_ref4 =\n (_ref5 =\n (_stream$kIsErrored = stream[kIsErrored]) !== null && _stream$kIsErrored !== undefined\n ? _stream$kIsErrored\n : stream.readableErrored) !== null && _ref5 !== undefined\n ? _ref5\n : stream.writableErrored) !== null && _ref4 !== undefined\n ? _ref4\n : (_stream$_readableStat3 = stream._readableState) === null || _stream$_readableStat3 === undefined\n ? undefined\n : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined\n ? _ref3\n : (_stream$_writableStat3 = stream._writableState) === null || _stream$_writableStat3 === undefined\n ? undefined\n : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined\n ? _ref2\n : (_stream$_readableStat4 = stream._readableState) === null || _stream$_readableStat4 === undefined\n ? undefined\n : _stream$_readableStat4.errored) !== null && _ref !== undefined\n ? _ref\n : (_stream$_writableStat4 = stream._writableState) === null || _stream$_writableStat4 === undefined\n ? undefined\n : _stream$_writableStat4.errored)\n )\n}\nmodule.exports = {\n isDestroyed,\n kIsDestroyed,\n isDisturbed,\n kIsDisturbed,\n isErrored,\n kIsErrored,\n isReadable,\n kIsReadable,\n kIsClosedPromise,\n kControllerErrorFunction,\n kIsWritable,\n isClosed,\n isDuplexNodeStream,\n isFinished,\n isIterable,\n isReadableNodeStream,\n isReadableStream,\n isReadableEnded,\n isReadableFinished,\n isReadableErrored,\n isNodeStream,\n isWebStream,\n isWritable,\n isWritableNodeStream,\n isWritableStream,\n isWritableEnded,\n isWritableFinished,\n isWritableErrored,\n isServerRequest,\n isServerResponse,\n willEmitClose,\n isTransformStream\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYxMTUuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosUUFBUSxpREFBaUQsRUFBRSxtQkFBTyxDQUFDLEtBQXdCOztBQUUzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzLmpzP2RjYmUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgU3ltYm9sQXN5bmNJdGVyYXRvciwgU3ltYm9sSXRlcmF0b3IsIFN5bWJvbEZvciB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5cbi8vIFdlIG5lZWQgdG8gdXNlIFN5bWJvbEZvciB0byBtYWtlIHRoZXNlIGdsb2JhbGx5IGF2YWlsYWJsZVxuLy8gZm9yIGludGVyb3B0IHdpdGggcmVhZGFibGUtc3RyZWFtLCBpLmUuIHJlYWRhYmxlLXN0cmVhbVxuLy8gYW5kIG5vZGUgY29yZSBuZWVkcyB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgcHJpdmF0ZSBzdGF0ZVxuLy8gZnJvbSBlYWNoIG90aGVyIGZvciBwcm9wZXIgaW50ZXJvcGVyYWJpbGl0eS5cbmNvbnN0IGtJc0Rlc3Ryb3llZCA9IFN5bWJvbEZvcignbm9kZWpzLnN0cmVhbS5kZXN0cm95ZWQnKVxuY29uc3Qga0lzRXJyb3JlZCA9IFN5bWJvbEZvcignbm9kZWpzLnN0cmVhbS5lcnJvcmVkJylcbmNvbnN0IGtJc1JlYWRhYmxlID0gU3ltYm9sRm9yKCdub2RlanMuc3RyZWFtLnJlYWRhYmxlJylcbmNvbnN0IGtJc1dyaXRhYmxlID0gU3ltYm9sRm9yKCdub2RlanMuc3RyZWFtLndyaXRhYmxlJylcbmNvbnN0IGtJc0Rpc3R1cmJlZCA9IFN5bWJvbEZvcignbm9kZWpzLnN0cmVhbS5kaXN0dXJiZWQnKVxuY29uc3Qga0lzQ2xvc2VkUHJvbWlzZSA9IFN5bWJvbEZvcignbm9kZWpzLndlYnN0cmVhbS5pc0Nsb3NlZFByb21pc2UnKVxuY29uc3Qga0NvbnRyb2xsZXJFcnJvckZ1bmN0aW9uID0gU3ltYm9sRm9yKCdub2RlanMud2Vic3RyZWFtLmNvbnRyb2xsZXJFcnJvckZ1bmN0aW9uJylcbmZ1bmN0aW9uIGlzUmVhZGFibGVOb2RlU3RyZWFtKG9iaiwgc3RyaWN0ID0gZmFsc2UpIHtcbiAgdmFyIF9vYmokX3JlYWRhYmxlU3RhdGVcbiAgcmV0dXJuICEhKFxuICAgIChcbiAgICAgIG9iaiAmJlxuICAgICAgdHlwZW9mIG9iai5waXBlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoIXN0cmljdCB8fCAodHlwZW9mIG9iai5wYXVzZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnJlc3VtZSA9PT0gJ2Z1bmN0aW9uJykpICYmXG4gICAgICAoIW9iai5fd3JpdGFibGVTdGF0ZSB8fFxuICAgICAgICAoKF9vYmokX3JlYWRhYmxlU3RhdGUgPSBvYmouX3JlYWRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9vYmokX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBfb2JqJF9yZWFkYWJsZVN0YXRlLnJlYWRhYmxlKSAhPT0gZmFsc2UpICYmXG4gICAgICAvLyBEdXBsZXhcbiAgICAgICghb2JqLl93cml0YWJsZVN0YXRlIHx8IG9iai5fcmVhZGFibGVTdGF0ZSlcbiAgICApIC8vIFdyaXRhYmxlIGhhcyAucGlwZS5cbiAgKVxufVxuXG5mdW5jdGlvbiBpc1dyaXRhYmxlTm9kZVN0cmVhbShvYmopIHtcbiAgdmFyIF9vYmokX3dyaXRhYmxlU3RhdGVcbiAgcmV0dXJuICEhKFxuICAgIChcbiAgICAgIG9iaiAmJlxuICAgICAgdHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgdHlwZW9mIG9iai5vbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKCFvYmouX3JlYWRhYmxlU3RhdGUgfHxcbiAgICAgICAgKChfb2JqJF93cml0YWJsZVN0YXRlID0gb2JqLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfb2JqJF93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogX29iaiRfd3JpdGFibGVTdGF0ZS53cml0YWJsZSkgIT09IGZhbHNlKVxuICAgICkgLy8gRHVwbGV4XG4gIClcbn1cblxuZnVuY3Rpb24gaXNEdXBsZXhOb2RlU3RyZWFtKG9iaikge1xuICByZXR1cm4gISEoXG4gICAgb2JqICYmXG4gICAgdHlwZW9mIG9iai5waXBlID09PSAnZnVuY3Rpb24nICYmXG4gICAgb2JqLl9yZWFkYWJsZVN0YXRlICYmXG4gICAgdHlwZW9mIG9iai5vbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmoud3JpdGUgPT09ICdmdW5jdGlvbidcbiAgKVxufVxuZnVuY3Rpb24gaXNOb2RlU3RyZWFtKG9iaikge1xuICByZXR1cm4gKFxuICAgIG9iaiAmJlxuICAgIChvYmouX3JlYWRhYmxlU3RhdGUgfHxcbiAgICAgIG9iai5fd3JpdGFibGVTdGF0ZSB8fFxuICAgICAgKHR5cGVvZiBvYmoud3JpdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5vbiA9PT0gJ2Z1bmN0aW9uJykgfHxcbiAgICAgICh0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5vbiA9PT0gJ2Z1bmN0aW9uJykpXG4gIClcbn1cbmZ1bmN0aW9uIGlzUmVhZGFibGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAhIShcbiAgICBvYmogJiZcbiAgICAhaXNOb2RlU3RyZWFtKG9iaikgJiZcbiAgICB0eXBlb2Ygb2JqLnBpcGVUaHJvdWdoID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iai5nZXRSZWFkZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqLmNhbmNlbCA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5mdW5jdGlvbiBpc1dyaXRhYmxlU3RyZWFtKG9iaikge1xuICByZXR1cm4gISEob2JqICYmICFpc05vZGVTdHJlYW0ob2JqKSAmJiB0eXBlb2Ygb2JqLmdldFdyaXRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLmFib3J0ID09PSAnZnVuY3Rpb24nKVxufVxuZnVuY3Rpb24gaXNUcmFuc2Zvcm1TdHJlYW0ob2JqKSB7XG4gIHJldHVybiAhIShvYmogJiYgIWlzTm9kZVN0cmVhbShvYmopICYmIHR5cGVvZiBvYmoucmVhZGFibGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoud3JpdGFibGUgPT09ICdvYmplY3QnKVxufVxuZnVuY3Rpb24gaXNXZWJTdHJlYW0ob2JqKSB7XG4gIHJldHVybiBpc1JlYWRhYmxlU3RyZWFtKG9iaikgfHwgaXNXcml0YWJsZVN0cmVhbShvYmopIHx8IGlzVHJhbnNmb3JtU3RyZWFtKG9iailcbn1cbmZ1bmN0aW9uIGlzSXRlcmFibGUob2JqLCBpc0FzeW5jKSB7XG4gIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gIGlmIChpc0FzeW5jID09PSB0cnVlKSByZXR1cm4gdHlwZW9mIG9ialtTeW1ib2xBc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJ1xuICBpZiAoaXNBc3luYyA9PT0gZmFsc2UpIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEl0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJ1xuICByZXR1cm4gdHlwZW9mIG9ialtTeW1ib2xBc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2Ygb2JqW1N5bWJvbEl0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJ1xufVxuZnVuY3Rpb24gaXNEZXN0cm95ZWQoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGNvbnN0IHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgc3RhdGUgPSB3U3RhdGUgfHwgclN0YXRlXG4gIHJldHVybiAhIShzdHJlYW0uZGVzdHJveWVkIHx8IHN0cmVhbVtrSXNEZXN0cm95ZWRdIHx8IChzdGF0ZSAhPT0gbnVsbCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLmRlc3Ryb3llZCkpXG59XG5cbi8vIEhhdmUgYmVlbiBlbmQoKTpkLlxuZnVuY3Rpb24gaXNXcml0YWJsZUVuZGVkKHN0cmVhbSkge1xuICBpZiAoIWlzV3JpdGFibGVOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGlmIChzdHJlYW0ud3JpdGFibGVFbmRlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWVcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICh3U3RhdGUgIT09IG51bGwgJiYgd1N0YXRlICE9PSB1bmRlZmluZWQgJiYgd1N0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuZW5kZWQpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIHJldHVybiB3U3RhdGUuZW5kZWRcbn1cblxuLy8gSGF2ZSBlbWl0dGVkICdmaW5pc2gnLlxuZnVuY3Rpb24gaXNXcml0YWJsZUZpbmlzaGVkKHN0cmVhbSwgc3RyaWN0KSB7XG4gIGlmICghaXNXcml0YWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS53cml0YWJsZUZpbmlzaGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHdTdGF0ZSAhPT0gbnVsbCAmJiB3U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB3U3RhdGUuZXJyb3JlZCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5maW5pc2hlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuICEhKHdTdGF0ZS5maW5pc2hlZCB8fCAoc3RyaWN0ID09PSBmYWxzZSAmJiB3U3RhdGUuZW5kZWQgPT09IHRydWUgJiYgd1N0YXRlLmxlbmd0aCA9PT0gMCkpXG59XG5cbi8vIEhhdmUgYmVlbiBwdXNoKG51bGwpOmQuXG5mdW5jdGlvbiBpc1JlYWRhYmxlRW5kZWQoc3RyZWFtKSB7XG4gIGlmICghaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS5yZWFkYWJsZUVuZGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuZW5kZWQpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIHJldHVybiByU3RhdGUuZW5kZWRcbn1cblxuLy8gSGF2ZSBlbWl0dGVkICdlbmQnLlxuZnVuY3Rpb24gaXNSZWFkYWJsZUZpbmlzaGVkKHN0cmVhbSwgc3RyaWN0KSB7XG4gIGlmICghaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChyU3RhdGUgIT09IG51bGwgJiYgclN0YXRlICE9PSB1bmRlZmluZWQgJiYgclN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuZW5kRW1pdHRlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuICEhKHJTdGF0ZS5lbmRFbWl0dGVkIHx8IChzdHJpY3QgPT09IGZhbHNlICYmIHJTdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiByU3RhdGUubGVuZ3RoID09PSAwKSlcbn1cbmZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyZWFtKSB7XG4gIGlmIChzdHJlYW0gJiYgc3RyZWFtW2tJc1JlYWRhYmxlXSAhPSBudWxsKSByZXR1cm4gc3RyZWFtW2tJc1JlYWRhYmxlXVxuICBpZiAodHlwZW9mIChzdHJlYW0gPT09IG51bGwgfHwgc3RyZWFtID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzdHJlYW0ucmVhZGFibGUpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIGlmIChpc0Rlc3Ryb3llZChzdHJlYW0pKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGlzUmVhZGFibGVOb2RlU3RyZWFtKHN0cmVhbSkgJiYgc3RyZWFtLnJlYWRhYmxlICYmICFpc1JlYWRhYmxlRmluaXNoZWQoc3RyZWFtKVxufVxuZnVuY3Rpb24gaXNXcml0YWJsZShzdHJlYW0pIHtcbiAgaWYgKHN0cmVhbSAmJiBzdHJlYW1ba0lzV3JpdGFibGVdICE9IG51bGwpIHJldHVybiBzdHJlYW1ba0lzV3JpdGFibGVdXG4gIGlmICh0eXBlb2YgKHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHN0cmVhbS53cml0YWJsZSkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgaWYgKGlzRGVzdHJveWVkKHN0cmVhbSkpIHJldHVybiBmYWxzZVxuICByZXR1cm4gaXNXcml0YWJsZU5vZGVTdHJlYW0oc3RyZWFtKSAmJiBzdHJlYW0ud3JpdGFibGUgJiYgIWlzV3JpdGFibGVFbmRlZChzdHJlYW0pXG59XG5mdW5jdGlvbiBpc0ZpbmlzaGVkKHN0cmVhbSwgb3B0cykge1xuICBpZiAoIWlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAoaXNEZXN0cm95ZWQoc3RyZWFtKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdHMucmVhZGFibGUpICE9PSBmYWxzZSAmJiBpc1JlYWRhYmxlKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBpZiAoKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0cy53cml0YWJsZSkgIT09IGZhbHNlICYmIGlzV3JpdGFibGUoc3RyZWFtKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5mdW5jdGlvbiBpc1dyaXRhYmxlRXJyb3JlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0kX3dyaXRhYmxlU3RhdCwgX3N0cmVhbSRfd3JpdGFibGVTdGF0MlxuICBpZiAoIWlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAoc3RyZWFtLndyaXRhYmxlRXJyb3JlZCkge1xuICAgIHJldHVybiBzdHJlYW0ud3JpdGFibGVFcnJvcmVkXG4gIH1cbiAgcmV0dXJuIChfc3RyZWFtJF93cml0YWJsZVN0YXQgPVxuICAgIChfc3RyZWFtJF93cml0YWJsZVN0YXQyID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQyID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIuZXJyb3JlZCkgIT09IG51bGwgJiYgX3N0cmVhbSRfd3JpdGFibGVTdGF0ICE9PSB1bmRlZmluZWRcbiAgICA/IF9zdHJlYW0kX3dyaXRhYmxlU3RhdFxuICAgIDogbnVsbFxufVxuZnVuY3Rpb24gaXNSZWFkYWJsZUVycm9yZWQoc3RyZWFtKSB7XG4gIHZhciBfc3RyZWFtJF9yZWFkYWJsZVN0YXQsIF9zdHJlYW0kX3JlYWRhYmxlU3RhdDJcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgaWYgKHN0cmVhbS5yZWFkYWJsZUVycm9yZWQpIHtcbiAgICByZXR1cm4gc3RyZWFtLnJlYWRhYmxlRXJyb3JlZFxuICB9XG4gIHJldHVybiAoX3N0cmVhbSRfcmVhZGFibGVTdGF0ID1cbiAgICAoX3N0cmVhbSRfcmVhZGFibGVTdGF0MiA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MiA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQyLmVycm9yZWQpICE9PSBudWxsICYmIF9zdHJlYW0kX3JlYWRhYmxlU3RhdCAhPT0gdW5kZWZpbmVkXG4gICAgPyBfc3RyZWFtJF9yZWFkYWJsZVN0YXRcbiAgICA6IG51bGxcbn1cbmZ1bmN0aW9uIGlzQ2xvc2VkKHN0cmVhbSkge1xuICBpZiAoIWlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAodHlwZW9mIHN0cmVhbS5jbG9zZWQgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBzdHJlYW0uY2xvc2VkXG4gIH1cbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBpZiAoXG4gICAgdHlwZW9mICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuY2xvc2VkKSA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgdHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuY2xvc2VkKSA9PT0gJ2Jvb2xlYW4nXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICAod1N0YXRlID09PSBudWxsIHx8IHdTdGF0ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogd1N0YXRlLmNsb3NlZCkgfHxcbiAgICAgIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuY2xvc2VkKVxuICAgIClcbiAgfVxuICBpZiAodHlwZW9mIHN0cmVhbS5fY2xvc2VkID09PSAnYm9vbGVhbicgJiYgaXNPdXRnb2luZ01lc3NhZ2Uoc3RyZWFtKSkge1xuICAgIHJldHVybiBzdHJlYW0uX2Nsb3NlZFxuICB9XG4gIHJldHVybiBudWxsXG59XG5mdW5jdGlvbiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygc3RyZWFtLl9jbG9zZWQgPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0uX2RlZmF1bHRLZWVwQWxpdmUgPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0uX3JlbW92ZWRDb25uZWN0aW9uID09PSAnYm9vbGVhbicgJiZcbiAgICB0eXBlb2Ygc3RyZWFtLl9yZW1vdmVkQ29udExlbiA9PT0gJ2Jvb2xlYW4nXG4gIClcbn1cbmZ1bmN0aW9uIGlzU2VydmVyUmVzcG9uc2Uoc3RyZWFtKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RyZWFtLl9zZW50MTAwID09PSAnYm9vbGVhbicgJiYgaXNPdXRnb2luZ01lc3NhZ2Uoc3RyZWFtKVxufVxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXF1ZXN0KHN0cmVhbSkge1xuICB2YXIgX3N0cmVhbSRyZXFcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygc3RyZWFtLl9jb25zdW1pbmcgPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0uX2R1bXBlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgKChfc3RyZWFtJHJlcSA9IHN0cmVhbS5yZXEpID09PSBudWxsIHx8IF9zdHJlYW0kcmVxID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBfc3RyZWFtJHJlcS51cGdyYWRlT3JDb25uZWN0KSA9PT1cbiAgICAgIHVuZGVmaW5lZFxuICApXG59XG5mdW5jdGlvbiB3aWxsRW1pdENsb3NlKHN0cmVhbSkge1xuICBpZiAoIWlzTm9kZVN0cmVhbShzdHJlYW0pKSByZXR1cm4gbnVsbFxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHN0YXRlID0gd1N0YXRlIHx8IHJTdGF0ZVxuICByZXR1cm4gKFxuICAgICghc3RhdGUgJiYgaXNTZXJ2ZXJSZXNwb25zZShzdHJlYW0pKSB8fCAhIShzdGF0ZSAmJiBzdGF0ZS5hdXRvRGVzdHJveSAmJiBzdGF0ZS5lbWl0Q2xvc2UgJiYgc3RhdGUuY2xvc2VkID09PSBmYWxzZSlcbiAgKVxufVxuZnVuY3Rpb24gaXNEaXN0dXJiZWQoc3RyZWFtKSB7XG4gIHZhciBfc3RyZWFtJGtJc0Rpc3R1cmJlZFxuICByZXR1cm4gISEoXG4gICAgc3RyZWFtICYmXG4gICAgKChfc3RyZWFtJGtJc0Rpc3R1cmJlZCA9IHN0cmVhbVtrSXNEaXN0dXJiZWRdKSAhPT0gbnVsbCAmJiBfc3RyZWFtJGtJc0Rpc3R1cmJlZCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IF9zdHJlYW0ka0lzRGlzdHVyYmVkXG4gICAgICA6IHN0cmVhbS5yZWFkYWJsZURpZFJlYWQgfHwgc3RyZWFtLnJlYWRhYmxlQWJvcnRlZClcbiAgKVxufVxuZnVuY3Rpb24gaXNFcnJvcmVkKHN0cmVhbSkge1xuICB2YXIgX3JlZixcbiAgICBfcmVmMixcbiAgICBfcmVmMyxcbiAgICBfcmVmNCxcbiAgICBfcmVmNSxcbiAgICBfc3RyZWFtJGtJc0Vycm9yZWQsXG4gICAgX3N0cmVhbSRfcmVhZGFibGVTdGF0MyxcbiAgICBfc3RyZWFtJF93cml0YWJsZVN0YXQzLFxuICAgIF9zdHJlYW0kX3JlYWRhYmxlU3RhdDQsXG4gICAgX3N0cmVhbSRfd3JpdGFibGVTdGF0NFxuICByZXR1cm4gISEoXG4gICAgc3RyZWFtICYmXG4gICAgKChfcmVmID1cbiAgICAgIChfcmVmMiA9XG4gICAgICAgIChfcmVmMyA9XG4gICAgICAgICAgKF9yZWY0ID1cbiAgICAgICAgICAgIChfcmVmNSA9XG4gICAgICAgICAgICAgIChfc3RyZWFtJGtJc0Vycm9yZWQgPSBzdHJlYW1ba0lzRXJyb3JlZF0pICE9PSBudWxsICYmIF9zdHJlYW0ka0lzRXJyb3JlZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBfc3RyZWFtJGtJc0Vycm9yZWRcbiAgICAgICAgICAgICAgICA6IHN0cmVhbS5yZWFkYWJsZUVycm9yZWQpICE9PSBudWxsICYmIF9yZWY1ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBfcmVmNVxuICAgICAgICAgICAgICA6IHN0cmVhbS53cml0YWJsZUVycm9yZWQpICE9PSBudWxsICYmIF9yZWY0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gX3JlZjRcbiAgICAgICAgICAgIDogKF9zdHJlYW0kX3JlYWRhYmxlU3RhdDMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9zdHJlYW0kX3JlYWRhYmxlU3RhdDMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogX3N0cmVhbSRfcmVhZGFibGVTdGF0My5lcnJvckVtaXR0ZWQpICE9PSBudWxsICYmIF9yZWYzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IF9yZWYzXG4gICAgICAgICAgOiAoX3N0cmVhbSRfd3JpdGFibGVTdGF0MyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX3N0cmVhbSRfd3JpdGFibGVTdGF0MyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDMuZXJyb3JFbWl0dGVkKSAhPT0gbnVsbCAmJiBfcmVmMiAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gX3JlZjJcbiAgICAgICAgOiAoX3N0cmVhbSRfcmVhZGFibGVTdGF0NCA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX3N0cmVhbSRfcmVhZGFibGVTdGF0NCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogX3N0cmVhbSRfcmVhZGFibGVTdGF0NC5lcnJvcmVkKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB1bmRlZmluZWRcbiAgICAgID8gX3JlZlxuICAgICAgOiAoX3N0cmVhbSRfd3JpdGFibGVTdGF0NCA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX3N0cmVhbSRfd3JpdGFibGVTdGF0NCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBfc3RyZWFtJF93cml0YWJsZVN0YXQ0LmVycm9yZWQpXG4gIClcbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0Rlc3Ryb3llZCxcbiAga0lzRGVzdHJveWVkLFxuICBpc0Rpc3R1cmJlZCxcbiAga0lzRGlzdHVyYmVkLFxuICBpc0Vycm9yZWQsXG4gIGtJc0Vycm9yZWQsXG4gIGlzUmVhZGFibGUsXG4gIGtJc1JlYWRhYmxlLFxuICBrSXNDbG9zZWRQcm9taXNlLFxuICBrQ29udHJvbGxlckVycm9yRnVuY3Rpb24sXG4gIGtJc1dyaXRhYmxlLFxuICBpc0Nsb3NlZCxcbiAgaXNEdXBsZXhOb2RlU3RyZWFtLFxuICBpc0ZpbmlzaGVkLFxuICBpc0l0ZXJhYmxlLFxuICBpc1JlYWRhYmxlTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZWFkYWJsZUVuZGVkLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc05vZGVTdHJlYW0sXG4gIGlzV2ViU3RyZWFtLFxuICBpc1dyaXRhYmxlLFxuICBpc1dyaXRhYmxlTm9kZVN0cmVhbSxcbiAgaXNXcml0YWJsZVN0cmVhbSxcbiAgaXNXcml0YWJsZUVuZGVkLFxuICBpc1dyaXRhYmxlRmluaXNoZWQsXG4gIGlzV3JpdGFibGVFcnJvcmVkLFxuICBpc1NlcnZlclJlcXVlc3QsXG4gIGlzU2VydmVyUmVzcG9uc2UsXG4gIHdpbGxFbWl0Q2xvc2UsXG4gIGlzVHJhbnNmb3JtU3RyZWFtXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///16115\n")},78584:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/* replacement start */\n\nconst process = __webpack_require__(54422)\n\n/* replacement end */\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n;('use strict')\nconst {\n ArrayPrototypeSlice,\n Error,\n FunctionPrototypeSymbolHasInstance,\n ObjectDefineProperty,\n ObjectDefineProperties,\n ObjectSetPrototypeOf,\n StringPrototypeToLowerCase,\n Symbol,\n SymbolHasInstance\n} = __webpack_require__(24134)\nmodule.exports = Writable\nWritable.WritableState = WritableState\nconst { EventEmitter: EE } = __webpack_require__(24434)\nconst Stream = (__webpack_require__(94259).Stream)\nconst { Buffer } = __webpack_require__(20181)\nconst destroyImpl = __webpack_require__(75896)\nconst { addAbortSignal } = __webpack_require__(4147)\nconst { getHighWaterMark, getDefaultHighWaterMark } = __webpack_require__(65291)\nconst {\n ERR_INVALID_ARG_TYPE,\n ERR_METHOD_NOT_IMPLEMENTED,\n ERR_MULTIPLE_CALLBACK,\n ERR_STREAM_CANNOT_PIPE,\n ERR_STREAM_DESTROYED,\n ERR_STREAM_ALREADY_FINISHED,\n ERR_STREAM_NULL_VALUES,\n ERR_STREAM_WRITE_AFTER_END,\n ERR_UNKNOWN_ENCODING\n} = (__webpack_require__(76371).codes)\nconst { errorOrDestroy } = destroyImpl\nObjectSetPrototypeOf(Writable.prototype, Stream.prototype)\nObjectSetPrototypeOf(Writable, Stream)\nfunction nop() {}\nconst kOnFinished = Symbol('kOnFinished')\nfunction WritableState(options, stream, isDuplex) {\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream,\n // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.\n if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof __webpack_require__(93370)\n\n // Object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!(options && options.objectMode)\n if (isDuplex) this.objectMode = this.objectMode || !!(options && options.writableObjectMode)\n\n // The point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write().\n this.highWaterMark = options\n ? getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex)\n : getDefaultHighWaterMark(false)\n\n // if _final has been called.\n this.finalCalled = false\n\n // drain event flag.\n this.needDrain = false\n // At the start of calling end()\n this.ending = false\n // When end() has been called, and returned.\n this.ended = false\n // When 'finish' is emitted.\n this.finished = false\n\n // Has it been destroyed\n this.destroyed = false\n\n // Should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n const noDecode = !!(options && options.decodeStrings === false)\n this.decodeStrings = !noDecode\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = (options && options.defaultEncoding) || 'utf8'\n\n // Not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0\n\n // A flag to see when we're in the middle of a write.\n this.writing = false\n\n // When true all writes will be buffered until .uncork() call.\n this.corked = 0\n\n // A flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true\n\n // A flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false\n\n // The callback that's passed to _write(chunk, cb).\n this.onwrite = onwrite.bind(undefined, stream)\n\n // The callback that the user supplies to write(chunk, encoding, cb).\n this.writecb = null\n\n // The amount that is being written when _write is called.\n this.writelen = 0\n\n // Storage for data passed to the afterWrite() callback in case of\n // synchronous _write() completion.\n this.afterWriteTickInfo = null\n resetBuffer(this)\n\n // Number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted.\n this.pendingcb = 0\n\n // Stream is still being constructed and cannot be\n // destroyed until construction finished or failed.\n // Async construction is opt in, therefore we start as\n // constructed.\n this.constructed = true\n\n // Emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams.\n this.prefinished = false\n\n // True if the error was already emitted and should not be thrown again.\n this.errorEmitted = false\n\n // Should close be emitted on destroy. Defaults to true.\n this.emitClose = !options || options.emitClose !== false\n\n // Should .destroy() be called after 'finish' (and potentially 'end').\n this.autoDestroy = !options || options.autoDestroy !== false\n\n // Indicates whether the stream has errored. When true all write() calls\n // should return false. This is needed since when autoDestroy\n // is disabled we need a way to tell whether the stream has failed.\n this.errored = null\n\n // Indicates whether the stream has finished destroying.\n this.closed = false\n\n // True if close has been emitted or would have been emitted\n // depending on emitClose.\n this.closeEmitted = false\n this[kOnFinished] = []\n}\nfunction resetBuffer(state) {\n state.buffered = []\n state.bufferedIndex = 0\n state.allBuffers = true\n state.allNoop = true\n}\nWritableState.prototype.getBuffer = function getBuffer() {\n return ArrayPrototypeSlice(this.buffered, this.bufferedIndex)\n}\nObjectDefineProperty(WritableState.prototype, 'bufferedRequestCount', {\n __proto__: null,\n get() {\n return this.buffered.length - this.bufferedIndex\n }\n})\nfunction Writable(options) {\n // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n\n // Checking for a Stream.Duplex instance is faster here instead of inside\n // the WritableState constructor, at least with V8 6.5.\n const isDuplex = this instanceof __webpack_require__(93370)\n if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) return new Writable(options)\n this._writableState = new WritableState(options, this, isDuplex)\n if (options) {\n if (typeof options.write === 'function') this._write = options.write\n if (typeof options.writev === 'function') this._writev = options.writev\n if (typeof options.destroy === 'function') this._destroy = options.destroy\n if (typeof options.final === 'function') this._final = options.final\n if (typeof options.construct === 'function') this._construct = options.construct\n if (options.signal) addAbortSignal(options.signal, this)\n }\n Stream.call(this, options)\n destroyImpl.construct(this, () => {\n const state = this._writableState\n if (!state.writing) {\n clearBuffer(this, state)\n }\n finishMaybe(this, state)\n })\n}\nObjectDefineProperty(Writable, SymbolHasInstance, {\n __proto__: null,\n value: function (object) {\n if (FunctionPrototypeSymbolHasInstance(this, object)) return true\n if (this !== Writable) return false\n return object && object._writableState instanceof WritableState\n }\n})\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE())\n}\nfunction _write(stream, chunk, encoding, cb) {\n const state = stream._writableState\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = state.defaultEncoding\n } else {\n if (!encoding) encoding = state.defaultEncoding\n else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)\n if (typeof cb !== 'function') cb = nop\n }\n if (chunk === null) {\n throw new ERR_STREAM_NULL_VALUES()\n } else if (!state.objectMode) {\n if (typeof chunk === 'string') {\n if (state.decodeStrings !== false) {\n chunk = Buffer.from(chunk, encoding)\n encoding = 'buffer'\n }\n } else if (chunk instanceof Buffer) {\n encoding = 'buffer'\n } else if (Stream._isUint8Array(chunk)) {\n chunk = Stream._uint8ArrayToBuffer(chunk)\n encoding = 'buffer'\n } else {\n throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk)\n }\n }\n let err\n if (state.ending) {\n err = new ERR_STREAM_WRITE_AFTER_END()\n } else if (state.destroyed) {\n err = new ERR_STREAM_DESTROYED('write')\n }\n if (err) {\n process.nextTick(cb, err)\n errorOrDestroy(stream, err, true)\n return err\n }\n state.pendingcb++\n return writeOrBuffer(stream, state, chunk, encoding, cb)\n}\nWritable.prototype.write = function (chunk, encoding, cb) {\n return _write(this, chunk, encoding, cb) === true\n}\nWritable.prototype.cork = function () {\n this._writableState.corked++\n}\nWritable.prototype.uncork = function () {\n const state = this._writableState\n if (state.corked) {\n state.corked--\n if (!state.writing) clearBuffer(this, state)\n }\n}\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = StringPrototypeToLowerCase(encoding)\n if (!Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)\n this._writableState.defaultEncoding = encoding\n return this\n}\n\n// If we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, chunk, encoding, callback) {\n const len = state.objectMode ? 1 : chunk.length\n state.length += len\n\n // stream._write resets state.length\n const ret = state.length < state.highWaterMark\n // We must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true\n if (state.writing || state.corked || state.errored || !state.constructed) {\n state.buffered.push({\n chunk,\n encoding,\n callback\n })\n if (state.allBuffers && encoding !== 'buffer') {\n state.allBuffers = false\n }\n if (state.allNoop && callback !== nop) {\n state.allNoop = false\n }\n } else {\n state.writelen = len\n state.writecb = callback\n state.writing = true\n state.sync = true\n stream._write(chunk, encoding, state.onwrite)\n state.sync = false\n }\n\n // Return false if errored or destroyed in order to break\n // any synchronous while(stream.write(data)) loops.\n return ret && !state.errored && !state.destroyed\n}\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len\n state.writecb = cb\n state.writing = true\n state.sync = true\n if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'))\n else if (writev) stream._writev(chunk, state.onwrite)\n else stream._write(chunk, encoding, state.onwrite)\n state.sync = false\n}\nfunction onwriteError(stream, state, er, cb) {\n --state.pendingcb\n cb(er)\n // Ensure callbacks are invoked even when autoDestroy is\n // not enabled. Passing `er` here doesn't make sense since\n // it's related to one specific write, not to the buffered\n // writes.\n errorBuffer(state)\n // This can emit error, but error must always follow cb.\n errorOrDestroy(stream, er)\n}\nfunction onwrite(stream, er) {\n const state = stream._writableState\n const sync = state.sync\n const cb = state.writecb\n if (typeof cb !== 'function') {\n errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK())\n return\n }\n state.writing = false\n state.writecb = null\n state.length -= state.writelen\n state.writelen = 0\n if (er) {\n // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364\n er.stack // eslint-disable-line no-unused-expressions\n\n if (!state.errored) {\n state.errored = er\n }\n\n // In case of duplex streams we need to notify the readable side of the\n // error.\n if (stream._readableState && !stream._readableState.errored) {\n stream._readableState.errored = er\n }\n if (sync) {\n process.nextTick(onwriteError, stream, state, er, cb)\n } else {\n onwriteError(stream, state, er, cb)\n }\n } else {\n if (state.buffered.length > state.bufferedIndex) {\n clearBuffer(stream, state)\n }\n if (sync) {\n // It is a common case that the callback passed to .write() is always\n // the same. In that case, we do not schedule a new nextTick(), but\n // rather just increase a counter, to improve performance and avoid\n // memory allocations.\n if (state.afterWriteTickInfo !== null && state.afterWriteTickInfo.cb === cb) {\n state.afterWriteTickInfo.count++\n } else {\n state.afterWriteTickInfo = {\n count: 1,\n cb,\n stream,\n state\n }\n process.nextTick(afterWriteTick, state.afterWriteTickInfo)\n }\n } else {\n afterWrite(stream, state, 1, cb)\n }\n }\n}\nfunction afterWriteTick({ stream, state, count, cb }) {\n state.afterWriteTickInfo = null\n return afterWrite(stream, state, count, cb)\n}\nfunction afterWrite(stream, state, count, cb) {\n const needDrain = !state.ending && !stream.destroyed && state.length === 0 && state.needDrain\n if (needDrain) {\n state.needDrain = false\n stream.emit('drain')\n }\n while (count-- > 0) {\n state.pendingcb--\n cb()\n }\n if (state.destroyed) {\n errorBuffer(state)\n }\n finishMaybe(stream, state)\n}\n\n// If there's something in the buffer waiting, then invoke callbacks.\nfunction errorBuffer(state) {\n if (state.writing) {\n return\n }\n for (let n = state.bufferedIndex; n < state.buffered.length; ++n) {\n var _state$errored\n const { chunk, callback } = state.buffered[n]\n const len = state.objectMode ? 1 : chunk.length\n state.length -= len\n callback(\n (_state$errored = state.errored) !== null && _state$errored !== undefined\n ? _state$errored\n : new ERR_STREAM_DESTROYED('write')\n )\n }\n const onfinishCallbacks = state[kOnFinished].splice(0)\n for (let i = 0; i < onfinishCallbacks.length; i++) {\n var _state$errored2\n onfinishCallbacks[i](\n (_state$errored2 = state.errored) !== null && _state$errored2 !== undefined\n ? _state$errored2\n : new ERR_STREAM_DESTROYED('end')\n )\n }\n resetBuffer(state)\n}\n\n// If there's something in the buffer waiting, then process it.\nfunction clearBuffer(stream, state) {\n if (state.corked || state.bufferProcessing || state.destroyed || !state.constructed) {\n return\n }\n const { buffered, bufferedIndex, objectMode } = state\n const bufferedLength = buffered.length - bufferedIndex\n if (!bufferedLength) {\n return\n }\n let i = bufferedIndex\n state.bufferProcessing = true\n if (bufferedLength > 1 && stream._writev) {\n state.pendingcb -= bufferedLength - 1\n const callback = state.allNoop\n ? nop\n : (err) => {\n for (let n = i; n < buffered.length; ++n) {\n buffered[n].callback(err)\n }\n }\n // Make a copy of `buffered` if it's going to be used by `callback` above,\n // since `doWrite` will mutate the array.\n const chunks = state.allNoop && i === 0 ? buffered : ArrayPrototypeSlice(buffered, i)\n chunks.allBuffers = state.allBuffers\n doWrite(stream, state, true, state.length, chunks, '', callback)\n resetBuffer(state)\n } else {\n do {\n const { chunk, encoding, callback } = buffered[i]\n buffered[i++] = null\n const len = objectMode ? 1 : chunk.length\n doWrite(stream, state, false, len, chunk, encoding, callback)\n } while (i < buffered.length && !state.writing)\n if (i === buffered.length) {\n resetBuffer(state)\n } else if (i > 256) {\n buffered.splice(0, i)\n state.bufferedIndex = 0\n } else {\n state.bufferedIndex = i\n }\n }\n state.bufferProcessing = false\n}\nWritable.prototype._write = function (chunk, encoding, cb) {\n if (this._writev) {\n this._writev(\n [\n {\n chunk,\n encoding\n }\n ],\n cb\n )\n } else {\n throw new ERR_METHOD_NOT_IMPLEMENTED('_write()')\n }\n}\nWritable.prototype._writev = null\nWritable.prototype.end = function (chunk, encoding, cb) {\n const state = this._writableState\n if (typeof chunk === 'function') {\n cb = chunk\n chunk = null\n encoding = null\n } else if (typeof encoding === 'function') {\n cb = encoding\n encoding = null\n }\n let err\n if (chunk !== null && chunk !== undefined) {\n const ret = _write(this, chunk, encoding)\n if (ret instanceof Error) {\n err = ret\n }\n }\n\n // .end() fully uncorks.\n if (state.corked) {\n state.corked = 1\n this.uncork()\n }\n if (err) {\n // Do nothing...\n } else if (!state.errored && !state.ending) {\n // This is forgiving in terms of unnecessary calls to end() and can hide\n // logic errors. However, usually such errors are harmless and causing a\n // hard error can be disproportionately destructive. It is not always\n // trivial for the user to determine whether end() needs to be called\n // or not.\n\n state.ending = true\n finishMaybe(this, state, true)\n state.ended = true\n } else if (state.finished) {\n err = new ERR_STREAM_ALREADY_FINISHED('end')\n } else if (state.destroyed) {\n err = new ERR_STREAM_DESTROYED('end')\n }\n if (typeof cb === 'function') {\n if (err || state.finished) {\n process.nextTick(cb, err)\n } else {\n state[kOnFinished].push(cb)\n }\n }\n return this\n}\nfunction needFinish(state) {\n return (\n state.ending &&\n !state.destroyed &&\n state.constructed &&\n state.length === 0 &&\n !state.errored &&\n state.buffered.length === 0 &&\n !state.finished &&\n !state.writing &&\n !state.errorEmitted &&\n !state.closeEmitted\n )\n}\nfunction callFinal(stream, state) {\n let called = false\n function onFinish(err) {\n if (called) {\n errorOrDestroy(stream, err !== null && err !== undefined ? err : ERR_MULTIPLE_CALLBACK())\n return\n }\n called = true\n state.pendingcb--\n if (err) {\n const onfinishCallbacks = state[kOnFinished].splice(0)\n for (let i = 0; i < onfinishCallbacks.length; i++) {\n onfinishCallbacks[i](err)\n }\n errorOrDestroy(stream, err, state.sync)\n } else if (needFinish(state)) {\n state.prefinished = true\n stream.emit('prefinish')\n // Backwards compat. Don't check state.sync here.\n // Some streams assume 'finish' will be emitted\n // asynchronously relative to _final callback.\n state.pendingcb++\n process.nextTick(finish, stream, state)\n }\n }\n state.sync = true\n state.pendingcb++\n try {\n stream._final(onFinish)\n } catch (err) {\n onFinish(err)\n }\n state.sync = false\n}\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function' && !state.destroyed) {\n state.finalCalled = true\n callFinal(stream, state)\n } else {\n state.prefinished = true\n stream.emit('prefinish')\n }\n }\n}\nfunction finishMaybe(stream, state, sync) {\n if (needFinish(state)) {\n prefinish(stream, state)\n if (state.pendingcb === 0) {\n if (sync) {\n state.pendingcb++\n process.nextTick(\n (stream, state) => {\n if (needFinish(state)) {\n finish(stream, state)\n } else {\n state.pendingcb--\n }\n },\n stream,\n state\n )\n } else if (needFinish(state)) {\n state.pendingcb++\n finish(stream, state)\n }\n }\n }\n}\nfunction finish(stream, state) {\n state.pendingcb--\n state.finished = true\n const onfinishCallbacks = state[kOnFinished].splice(0)\n for (let i = 0; i < onfinishCallbacks.length; i++) {\n onfinishCallbacks[i]()\n }\n stream.emit('finish')\n if (state.autoDestroy) {\n // In case of duplex streams we need a way to detect\n // if the readable side is ready for autoDestroy as well.\n const rState = stream._readableState\n const autoDestroy =\n !rState ||\n (rState.autoDestroy &&\n // We don't expect the readable to ever 'end'\n // if readable is explicitly set to false.\n (rState.endEmitted || rState.readable === false))\n if (autoDestroy) {\n stream.destroy()\n }\n }\n}\nObjectDefineProperties(Writable.prototype, {\n closed: {\n __proto__: null,\n get() {\n return this._writableState ? this._writableState.closed : false\n }\n },\n destroyed: {\n __proto__: null,\n get() {\n return this._writableState ? this._writableState.destroyed : false\n },\n set(value) {\n // Backward compatibility, the user is explicitly managing destroyed.\n if (this._writableState) {\n this._writableState.destroyed = value\n }\n }\n },\n writable: {\n __proto__: null,\n get() {\n const w = this._writableState\n // w.writable === false means that this is part of a Duplex stream\n // where the writable side was disabled upon construction.\n // Compat. The user might manually disable writable side through\n // deprecated setter.\n return !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended\n },\n set(val) {\n // Backwards compatible.\n if (this._writableState) {\n this._writableState.writable = !!val\n }\n }\n },\n writableFinished: {\n __proto__: null,\n get() {\n return this._writableState ? this._writableState.finished : false\n }\n },\n writableObjectMode: {\n __proto__: null,\n get() {\n return this._writableState ? this._writableState.objectMode : false\n }\n },\n writableBuffer: {\n __proto__: null,\n get() {\n return this._writableState && this._writableState.getBuffer()\n }\n },\n writableEnded: {\n __proto__: null,\n get() {\n return this._writableState ? this._writableState.ending : false\n }\n },\n writableNeedDrain: {\n __proto__: null,\n get() {\n const wState = this._writableState\n if (!wState) return false\n return !wState.destroyed && !wState.ending && wState.needDrain\n }\n },\n writableHighWaterMark: {\n __proto__: null,\n get() {\n return this._writableState && this._writableState.highWaterMark\n }\n },\n writableCorked: {\n __proto__: null,\n get() {\n return this._writableState ? this._writableState.corked : 0\n }\n },\n writableLength: {\n __proto__: null,\n get() {\n return this._writableState && this._writableState.length\n }\n },\n errored: {\n __proto__: null,\n enumerable: false,\n get() {\n return this._writableState ? this._writableState.errored : null\n }\n },\n writableAborted: {\n __proto__: null,\n enumerable: false,\n get: function () {\n return !!(\n this._writableState.writable !== false &&\n (this._writableState.destroyed || this._writableState.errored) &&\n !this._writableState.finished\n )\n }\n }\n})\nconst destroy = destroyImpl.destroy\nWritable.prototype.destroy = function (err, cb) {\n const state = this._writableState\n\n // Invoke pending callbacks.\n if (!state.destroyed && (state.bufferedIndex < state.buffered.length || state[kOnFinished].length)) {\n process.nextTick(errorBuffer, state)\n }\n destroy.call(this, err, cb)\n return this\n}\nWritable.prototype._undestroy = destroyImpl.undestroy\nWritable.prototype._destroy = function (err, cb) {\n cb(err)\n}\nWritable.prototype[EE.captureRejectionSymbol] = function (err) {\n this.destroy(err)\n}\nlet webStreamsAdapters\n\n// Lazy to avoid circular references\nfunction lazyWebStreams() {\n if (webStreamsAdapters === undefined) webStreamsAdapters = {}\n return webStreamsAdapters\n}\nWritable.fromWeb = function (writableStream, options) {\n return lazyWebStreams().newStreamWritableFromWritableStream(writableStream, options)\n}\nWritable.toWeb = function (streamWritable) {\n return lazyWebStreams().newWritableStreamFromStreamWritable(streamWritable)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzg1ODQuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsZ0JBQWdCLG1CQUFPLENBQUMsS0FBVTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsbUJBQU8sQ0FBQyxLQUF3QjtBQUNwQztBQUNBO0FBQ0EsUUFBUSxtQkFBbUIsRUFBRSxtQkFBTyxDQUFDLEtBQVE7QUFDN0MsZUFBZSxtQ0FBMEI7QUFDekMsUUFBUSxTQUFTLEVBQUUsbUJBQU8sQ0FBQyxLQUFRO0FBQ25DLG9CQUFvQixtQkFBTyxDQUFDLEtBQVc7QUFDdkMsUUFBUSxpQkFBaUIsRUFBRSxtQkFBTyxDQUFDLElBQW9CO0FBQ3ZELFFBQVEsNENBQTRDLEVBQUUsbUJBQU8sQ0FBQyxLQUFTO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLGtDQUFrQztBQUN0QyxRQUFRLGlCQUFpQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSxtQkFBTyxDQUFDLEtBQVU7O0FBRXBGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DLG1CQUFPLENBQUMsS0FBVTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiwwQkFBMEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsMkJBQTJCO0FBQy9EO0FBQ0EsWUFBWSxrQkFBa0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhCQUE4QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsc0NBQXNDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIscUJBQXFCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLGNBQWMsNEJBQTRCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsOEJBQThCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhCQUE4QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy93cml0YWJsZS5qcz8zNzRjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7XG4gIEFycmF5UHJvdG90eXBlU2xpY2UsXG4gIEVycm9yLFxuICBGdW5jdGlvblByb3RvdHlwZVN5bWJvbEhhc0luc3RhbmNlLFxuICBPYmplY3REZWZpbmVQcm9wZXJ0eSxcbiAgT2JqZWN0RGVmaW5lUHJvcGVydGllcyxcbiAgT2JqZWN0U2V0UHJvdG90eXBlT2YsXG4gIFN0cmluZ1Byb3RvdHlwZVRvTG93ZXJDYXNlLFxuICBTeW1ib2wsXG4gIFN5bWJvbEhhc0luc3RhbmNlXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnLi9sZWdhY3knKS5TdHJlYW1cbmNvbnN0IHsgQnVmZmVyIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3QgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgeyBhZGRBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi9hZGQtYWJvcnQtc2lnbmFsJylcbmNvbnN0IHsgZ2V0SGlnaFdhdGVyTWFyaywgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsgfSA9IHJlcXVpcmUoJy4vc3RhdGUnKVxuY29uc3Qge1xuICBFUlJfSU5WQUxJRF9BUkdfVFlQRSxcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSxcbiAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gIEVSUl9TVFJFQU1fQUxSRUFEWV9GSU5JU0hFRCxcbiAgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyxcbiAgRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQsXG4gIEVSUl9VTktOT1dOX0VOQ09ESU5HXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKS5jb2Rlc1xuY29uc3QgeyBlcnJvck9yRGVzdHJveSB9ID0gZGVzdHJveUltcGxcbk9iamVjdFNldFByb3RvdHlwZU9mKFdyaXRhYmxlLnByb3RvdHlwZSwgU3RyZWFtLnByb3RvdHlwZSlcbk9iamVjdFNldFByb3RvdHlwZU9mKFdyaXRhYmxlLCBTdHJlYW0pXG5mdW5jdGlvbiBub3AoKSB7fVxuY29uc3Qga09uRmluaXNoZWQgPSBTeW1ib2woJ2tPbkZpbmlzaGVkJylcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtLCBpc0R1cGxleCkge1xuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbSxcbiAgLy8gZS5nLiBvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZSB2cy4gb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGUsIGV0Yy5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcblxuICAvLyBPYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIShvcHRpb25zICYmIG9wdGlvbnMub2JqZWN0TW9kZSlcbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISEob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZSlcblxuICAvLyBUaGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKCkuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IG9wdGlvbnNcbiAgICA/IGdldEhpZ2hXYXRlck1hcmsodGhpcywgb3B0aW9ucywgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIGlzRHVwbGV4KVxuICAgIDogZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsoZmFsc2UpXG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZC5cbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlXG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZVxuICAvLyBBdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlXG4gIC8vIFdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWQuXG4gIHRoaXMuZW5kZWQgPSBmYWxzZVxuICAvLyBXaGVuICdmaW5pc2gnIGlzIGVtaXR0ZWQuXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZVxuXG4gIC8vIEhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlXG5cbiAgLy8gU2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICBjb25zdCBub0RlY29kZSA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZSlcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlXG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRFbmNvZGluZykgfHwgJ3V0ZjgnXG5cbiAgLy8gTm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwXG5cbiAgLy8gQSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2VcblxuICAvLyBXaGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsLlxuICB0aGlzLmNvcmtlZCA9IDBcblxuICAvLyBBIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZVxuXG4gIC8vIEEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlXG5cbiAgLy8gVGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLCBjYikuXG4gIHRoaXMub253cml0ZSA9IG9ud3JpdGUuYmluZCh1bmRlZmluZWQsIHN0cmVhbSlcblxuICAvLyBUaGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKS5cbiAgdGhpcy53cml0ZWNiID0gbnVsbFxuXG4gIC8vIFRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDBcblxuICAvLyBTdG9yYWdlIGZvciBkYXRhIHBhc3NlZCB0byB0aGUgYWZ0ZXJXcml0ZSgpIGNhbGxiYWNrIGluIGNhc2Ugb2ZcbiAgLy8gc3luY2hyb25vdXMgX3dyaXRlKCkgY29tcGxldGlvbi5cbiAgdGhpcy5hZnRlcldyaXRlVGlja0luZm8gPSBudWxsXG4gIHJlc2V0QnVmZmVyKHRoaXMpXG5cbiAgLy8gTnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkLlxuICB0aGlzLnBlbmRpbmdjYiA9IDBcblxuICAvLyBTdHJlYW0gaXMgc3RpbGwgYmVpbmcgY29uc3RydWN0ZWQgYW5kIGNhbm5vdCBiZVxuICAvLyBkZXN0cm95ZWQgdW50aWwgY29uc3RydWN0aW9uIGZpbmlzaGVkIG9yIGZhaWxlZC5cbiAgLy8gQXN5bmMgY29uc3RydWN0aW9uIGlzIG9wdCBpbiwgdGhlcmVmb3JlIHdlIHN0YXJ0IGFzXG4gIC8vIGNvbnN0cnVjdGVkLlxuICB0aGlzLmNvbnN0cnVjdGVkID0gdHJ1ZVxuXG4gIC8vIEVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXMuXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZVxuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluLlxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlXG5cbiAgLy8gU2hvdWxkIGNsb3NlIGJlIGVtaXR0ZWQgb24gZGVzdHJveS4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgdGhpcy5lbWl0Q2xvc2UgPSAhb3B0aW9ucyB8fCBvcHRpb25zLmVtaXRDbG9zZSAhPT0gZmFsc2VcblxuICAvLyBTaG91bGQgLmRlc3Ryb3koKSBiZSBjYWxsZWQgYWZ0ZXIgJ2ZpbmlzaCcgKGFuZCBwb3RlbnRpYWxseSAnZW5kJykuXG4gIHRoaXMuYXV0b0Rlc3Ryb3kgPSAhb3B0aW9ucyB8fCBvcHRpb25zLmF1dG9EZXN0cm95ICE9PSBmYWxzZVxuXG4gIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGVycm9yZWQuIFdoZW4gdHJ1ZSBhbGwgd3JpdGUoKSBjYWxsc1xuICAvLyBzaG91bGQgcmV0dXJuIGZhbHNlLiBUaGlzIGlzIG5lZWRlZCBzaW5jZSB3aGVuIGF1dG9EZXN0cm95XG4gIC8vIGlzIGRpc2FibGVkIHdlIG5lZWQgYSB3YXkgdG8gdGVsbCB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGZhaWxlZC5cbiAgdGhpcy5lcnJvcmVkID0gbnVsbFxuXG4gIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGZpbmlzaGVkIGRlc3Ryb3lpbmcuXG4gIHRoaXMuY2xvc2VkID0gZmFsc2VcblxuICAvLyBUcnVlIGlmIGNsb3NlIGhhcyBiZWVuIGVtaXR0ZWQgb3Igd291bGQgaGF2ZSBiZWVuIGVtaXR0ZWRcbiAgLy8gZGVwZW5kaW5nIG9uIGVtaXRDbG9zZS5cbiAgdGhpcy5jbG9zZUVtaXR0ZWQgPSBmYWxzZVxuICB0aGlzW2tPbkZpbmlzaGVkXSA9IFtdXG59XG5mdW5jdGlvbiByZXNldEJ1ZmZlcihzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJlZCA9IFtdXG4gIHN0YXRlLmJ1ZmZlcmVkSW5kZXggPSAwXG4gIHN0YXRlLmFsbEJ1ZmZlcnMgPSB0cnVlXG4gIHN0YXRlLmFsbE5vb3AgPSB0cnVlXG59XG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7XG4gIHJldHVybiBBcnJheVByb3RvdHlwZVNsaWNlKHRoaXMuYnVmZmVyZWQsIHRoaXMuYnVmZmVyZWRJbmRleClcbn1cbk9iamVjdERlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyZWRSZXF1ZXN0Q291bnQnLCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlcmVkLmxlbmd0aCAtIHRoaXMuYnVmZmVyZWRJbmRleFxuICB9XG59KVxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRvby5cbiAgLy8gYHJlYWxIYXNJbnN0YW5jZWAgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdXNpbmcgcGxhaW4gYGluc3RhbmNlb2ZgXG4gIC8vIHdvdWxkIHJldHVybiBmYWxzZSwgYXMgbm8gYF93cml0YWJsZVN0YXRlYCBwcm9wZXJ0eSBpcyBhdHRhY2hlZC5cblxuICAvLyBUcnlpbmcgdG8gdXNlIHRoZSBjdXN0b20gYGluc3RhbmNlb2ZgIGZvciBXcml0YWJsZSBoZXJlIHdpbGwgYWxzbyBicmVhayB0aGVcbiAgLy8gTm9kZS5qcyBMYXp5VHJhbnNmb3JtIGltcGxlbWVudGF0aW9uLCB3aGljaCBoYXMgYSBub24tdHJpdmlhbCBnZXR0ZXIgZm9yXG4gIC8vIGBfd3JpdGFibGVTdGF0ZWAgdGhhdCB3b3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cblxuICAvLyBDaGVja2luZyBmb3IgYSBTdHJlYW0uRHVwbGV4IGluc3RhbmNlIGlzIGZhc3RlciBoZXJlIGluc3RlYWQgb2YgaW5zaWRlXG4gIC8vIHRoZSBXcml0YWJsZVN0YXRlIGNvbnN0cnVjdG9yLCBhdCBsZWFzdCB3aXRoIFY4IDYuNS5cbiAgY29uc3QgaXNEdXBsZXggPSB0aGlzIGluc3RhbmNlb2YgcmVxdWlyZSgnLi9kdXBsZXgnKVxuICBpZiAoIWlzRHVwbGV4ICYmICFGdW5jdGlvblByb3RvdHlwZVN5bWJvbEhhc0luc3RhbmNlKFdyaXRhYmxlLCB0aGlzKSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKVxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGVcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldlxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWxcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29uc3RydWN0ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9jb25zdHJ1Y3QgPSBvcHRpb25zLmNvbnN0cnVjdFxuICAgIGlmIChvcHRpb25zLnNpZ25hbCkgYWRkQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsIHRoaXMpXG4gIH1cbiAgU3RyZWFtLmNhbGwodGhpcywgb3B0aW9ucylcbiAgZGVzdHJveUltcGwuY29uc3RydWN0KHRoaXMsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgICBpZiAoIXN0YXRlLndyaXRpbmcpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKVxuICAgIH1cbiAgICBmaW5pc2hNYXliZSh0aGlzLCBzdGF0ZSlcbiAgfSlcbn1cbk9iamVjdERlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2xIYXNJbnN0YW5jZSwge1xuICBfX3Byb3RvX186IG51bGwsXG4gIHZhbHVlOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgaWYgKEZ1bmN0aW9uUHJvdG90eXBlU3ltYm9sSGFzSW5zdGFuY2UodGhpcywgb2JqZWN0KSkgcmV0dXJuIHRydWVcbiAgICBpZiAodGhpcyAhPT0gV3JpdGFibGUpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZVxuICB9XG59KVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgZXJyb3JPckRlc3Ryb3kodGhpcywgbmV3IEVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUoKSlcbn1cbmZ1bmN0aW9uIF93cml0ZShzdHJlYW0sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2RpbmdcbiAgICBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZ1xuICB9IGVsc2Uge1xuICAgIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nXG4gICAgZWxzZSBpZiAoZW5jb2RpbmcgIT09ICdidWZmZXInICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHRocm93IG5ldyBFUlJfVU5LTk9XTl9FTkNPRElORyhlbmNvZGluZylcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcFxuICB9XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFUlJfU1RSRUFNX05VTExfVkFMVUVTKClcbiAgfSBlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcidcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNodW5rIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInXG4gICAgfSBlbHNlIGlmIChTdHJlYW0uX2lzVWludDhBcnJheShjaHVuaykpIHtcbiAgICAgIGNodW5rID0gU3RyZWFtLl91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspXG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2h1bmsnLCBbJ3N0cmluZycsICdCdWZmZXInLCAnVWludDhBcnJheSddLCBjaHVuaylcbiAgICB9XG4gIH1cbiAgbGV0IGVyclxuICBpZiAoc3RhdGUuZW5kaW5nKSB7XG4gICAgZXJyID0gbmV3IEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EKClcbiAgfSBlbHNlIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICBlcnIgPSBuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoJ3dyaXRlJylcbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKVxuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyLCB0cnVlKVxuICAgIHJldHVybiBlcnJcbiAgfVxuICBzdGF0ZS5wZW5kaW5nY2IrK1xuICByZXR1cm4gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKVxufVxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgcmV0dXJuIF93cml0ZSh0aGlzLCBjaHVuaywgZW5jb2RpbmcsIGNiKSA9PT0gdHJ1ZVxufVxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKytcbn1cbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS1cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKVxuICB9XG59XG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBTdHJpbmdQcm90b3R5cGVUb0xvd2VyQ2FzZShlbmNvZGluZylcbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHRocm93IG5ldyBFUlJfVU5LTk9XTl9FTkNPRElORyhlbmNvZGluZylcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZ1xuICByZXR1cm4gdGhpc1xufVxuXG4vLyBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gIHN0YXRlLmxlbmd0aCArPSBsZW5cblxuICAvLyBzdHJlYW0uX3dyaXRlIHJlc2V0cyBzdGF0ZS5sZW5ndGhcbiAgY29uc3QgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFya1xuICAvLyBXZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWVcbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkIHx8IHN0YXRlLmVycm9yZWQgfHwgIXN0YXRlLmNvbnN0cnVjdGVkKSB7XG4gICAgc3RhdGUuYnVmZmVyZWQucHVzaCh7XG4gICAgICBjaHVuayxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgY2FsbGJhY2tcbiAgICB9KVxuICAgIGlmIChzdGF0ZS5hbGxCdWZmZXJzICYmIGVuY29kaW5nICE9PSAnYnVmZmVyJykge1xuICAgICAgc3RhdGUuYWxsQnVmZmVycyA9IGZhbHNlXG4gICAgfVxuICAgIGlmIChzdGF0ZS5hbGxOb29wICYmIGNhbGxiYWNrICE9PSBub3ApIHtcbiAgICAgIHN0YXRlLmFsbE5vb3AgPSBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS53cml0ZWxlbiA9IGxlblxuICAgIHN0YXRlLndyaXRlY2IgPSBjYWxsYmFja1xuICAgIHN0YXRlLndyaXRpbmcgPSB0cnVlXG4gICAgc3RhdGUuc3luYyA9IHRydWVcbiAgICBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSlcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2VcbiAgfVxuXG4gIC8vIFJldHVybiBmYWxzZSBpZiBlcnJvcmVkIG9yIGRlc3Ryb3llZCBpbiBvcmRlciB0byBicmVha1xuICAvLyBhbnkgc3luY2hyb25vdXMgd2hpbGUoc3RyZWFtLndyaXRlKGRhdGEpKSBsb29wcy5cbiAgcmV0dXJuIHJldCAmJiAhc3RhdGUuZXJyb3JlZCAmJiAhc3RhdGUuZGVzdHJveWVkXG59XG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuXG4gIHN0YXRlLndyaXRlY2IgPSBjYlxuICBzdGF0ZS53cml0aW5nID0gdHJ1ZVxuICBzdGF0ZS5zeW5jID0gdHJ1ZVxuICBpZiAoc3RhdGUuZGVzdHJveWVkKSBzdGF0ZS5vbndyaXRlKG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnd3JpdGUnKSlcbiAgZWxzZSBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSlcbiAgZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSlcbiAgc3RhdGUuc3luYyA9IGZhbHNlXG59XG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiXG4gIGNiKGVyKVxuICAvLyBFbnN1cmUgY2FsbGJhY2tzIGFyZSBpbnZva2VkIGV2ZW4gd2hlbiBhdXRvRGVzdHJveSBpc1xuICAvLyBub3QgZW5hYmxlZC4gUGFzc2luZyBgZXJgIGhlcmUgZG9lc24ndCBtYWtlIHNlbnNlIHNpbmNlXG4gIC8vIGl0J3MgcmVsYXRlZCB0byBvbmUgc3BlY2lmaWMgd3JpdGUsIG5vdCB0byB0aGUgYnVmZmVyZWRcbiAgLy8gd3JpdGVzLlxuICBlcnJvckJ1ZmZlcihzdGF0ZSlcbiAgLy8gVGhpcyBjYW4gZW1pdCBlcnJvciwgYnV0IGVycm9yIG11c3QgYWx3YXlzIGZvbGxvdyBjYi5cbiAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcilcbn1cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBjb25zdCBzeW5jID0gc3RhdGUuc3luY1xuICBjb25zdCBjYiA9IHN0YXRlLndyaXRlY2JcbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSygpKVxuICAgIHJldHVyblxuICB9XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZVxuICBzdGF0ZS53cml0ZWNiID0gbnVsbFxuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW5cbiAgc3RhdGUud3JpdGVsZW4gPSAwXG4gIGlmIChlcikge1xuICAgIC8vIEF2b2lkIFY4IGxlYWssIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM0MTAzI2lzc3VlY29tbWVudC02NTIwMDIzNjRcbiAgICBlci5zdGFjayAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXG4gICAgaWYgKCFzdGF0ZS5lcnJvcmVkKSB7XG4gICAgICBzdGF0ZS5lcnJvcmVkID0gZXJcbiAgICB9XG5cbiAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSByZWFkYWJsZSBzaWRlIG9mIHRoZVxuICAgIC8vIGVycm9yLlxuICAgIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUgJiYgIXN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lcnJvcmVkKSB7XG4gICAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCA9IGVyXG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKG9ud3JpdGVFcnJvciwgc3RyZWFtLCBzdGF0ZSwgZXIsIGNiKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgZXIsIGNiKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RhdGUuYnVmZmVyZWQubGVuZ3RoID4gc3RhdGUuYnVmZmVyZWRJbmRleCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSlcbiAgICB9XG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8vIEl0IGlzIGEgY29tbW9uIGNhc2UgdGhhdCB0aGUgY2FsbGJhY2sgcGFzc2VkIHRvIC53cml0ZSgpIGlzIGFsd2F5c1xuICAgICAgLy8gdGhlIHNhbWUuIEluIHRoYXQgY2FzZSwgd2UgZG8gbm90IHNjaGVkdWxlIGEgbmV3IG5leHRUaWNrKCksIGJ1dFxuICAgICAgLy8gcmF0aGVyIGp1c3QgaW5jcmVhc2UgYSBjb3VudGVyLCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBhdm9pZFxuICAgICAgLy8gbWVtb3J5IGFsbG9jYXRpb25zLlxuICAgICAgaWYgKHN0YXRlLmFmdGVyV3JpdGVUaWNrSW5mbyAhPT0gbnVsbCAmJiBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8uY2IgPT09IGNiKSB7XG4gICAgICAgIHN0YXRlLmFmdGVyV3JpdGVUaWNrSW5mby5jb3VudCsrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8gPSB7XG4gICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgY2IsXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhhZnRlcldyaXRlVGljaywgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIDEsIGNiKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYWZ0ZXJXcml0ZVRpY2soeyBzdHJlYW0sIHN0YXRlLCBjb3VudCwgY2IgfSkge1xuICBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8gPSBudWxsXG4gIHJldHVybiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGNvdW50LCBjYilcbn1cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgY291bnQsIGNiKSB7XG4gIGNvbnN0IG5lZWREcmFpbiA9ICFzdGF0ZS5lbmRpbmcgJiYgIXN0cmVhbS5kZXN0cm95ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpblxuICBpZiAobmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2VcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKVxuICB9XG4gIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tXG4gICAgY2IoKVxuICB9XG4gIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICBlcnJvckJ1ZmZlcihzdGF0ZSlcbiAgfVxuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKVxufVxuXG4vLyBJZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gaW52b2tlIGNhbGxiYWNrcy5cbmZ1bmN0aW9uIGVycm9yQnVmZmVyKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZm9yIChsZXQgbiA9IHN0YXRlLmJ1ZmZlcmVkSW5kZXg7IG4gPCBzdGF0ZS5idWZmZXJlZC5sZW5ndGg7ICsrbikge1xuICAgIHZhciBfc3RhdGUkZXJyb3JlZFxuICAgIGNvbnN0IHsgY2h1bmssIGNhbGxiYWNrIH0gPSBzdGF0ZS5idWZmZXJlZFtuXVxuICAgIGNvbnN0IGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgc3RhdGUubGVuZ3RoIC09IGxlblxuICAgIGNhbGxiYWNrKFxuICAgICAgKF9zdGF0ZSRlcnJvcmVkID0gc3RhdGUuZXJyb3JlZCkgIT09IG51bGwgJiYgX3N0YXRlJGVycm9yZWQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IF9zdGF0ZSRlcnJvcmVkXG4gICAgICAgIDogbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCd3cml0ZScpXG4gICAgKVxuICB9XG4gIGNvbnN0IG9uZmluaXNoQ2FsbGJhY2tzID0gc3RhdGVba09uRmluaXNoZWRdLnNwbGljZSgwKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9uZmluaXNoQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9zdGF0ZSRlcnJvcmVkMlxuICAgIG9uZmluaXNoQ2FsbGJhY2tzW2ldKFxuICAgICAgKF9zdGF0ZSRlcnJvcmVkMiA9IHN0YXRlLmVycm9yZWQpICE9PSBudWxsICYmIF9zdGF0ZSRlcnJvcmVkMiAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gX3N0YXRlJGVycm9yZWQyXG4gICAgICAgIDogbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCdlbmQnKVxuICAgIClcbiAgfVxuICByZXNldEJ1ZmZlcihzdGF0ZSlcbn1cblxuLy8gSWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXQuXG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5jb3JrZWQgfHwgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyB8fCBzdGF0ZS5kZXN0cm95ZWQgfHwgIXN0YXRlLmNvbnN0cnVjdGVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgeyBidWZmZXJlZCwgYnVmZmVyZWRJbmRleCwgb2JqZWN0TW9kZSB9ID0gc3RhdGVcbiAgY29uc3QgYnVmZmVyZWRMZW5ndGggPSBidWZmZXJlZC5sZW5ndGggLSBidWZmZXJlZEluZGV4XG4gIGlmICghYnVmZmVyZWRMZW5ndGgpIHtcbiAgICByZXR1cm5cbiAgfVxuICBsZXQgaSA9IGJ1ZmZlcmVkSW5kZXhcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWVcbiAgaWYgKGJ1ZmZlcmVkTGVuZ3RoID4gMSAmJiBzdHJlYW0uX3dyaXRldikge1xuICAgIHN0YXRlLnBlbmRpbmdjYiAtPSBidWZmZXJlZExlbmd0aCAtIDFcbiAgICBjb25zdCBjYWxsYmFjayA9IHN0YXRlLmFsbE5vb3BcbiAgICAgID8gbm9wXG4gICAgICA6IChlcnIpID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBuID0gaTsgbiA8IGJ1ZmZlcmVkLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICBidWZmZXJlZFtuXS5jYWxsYmFjayhlcnIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgLy8gTWFrZSBhIGNvcHkgb2YgYGJ1ZmZlcmVkYCBpZiBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgYnkgYGNhbGxiYWNrYCBhYm92ZSxcbiAgICAvLyBzaW5jZSBgZG9Xcml0ZWAgd2lsbCBtdXRhdGUgdGhlIGFycmF5LlxuICAgIGNvbnN0IGNodW5rcyA9IHN0YXRlLmFsbE5vb3AgJiYgaSA9PT0gMCA/IGJ1ZmZlcmVkIDogQXJyYXlQcm90b3R5cGVTbGljZShidWZmZXJlZCwgaSlcbiAgICBjaHVua3MuYWxsQnVmZmVycyA9IHN0YXRlLmFsbEJ1ZmZlcnNcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgY2h1bmtzLCAnJywgY2FsbGJhY2spXG4gICAgcmVzZXRCdWZmZXIoc3RhdGUpXG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgY29uc3QgeyBjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrIH0gPSBidWZmZXJlZFtpXVxuICAgICAgYnVmZmVyZWRbaSsrXSA9IG51bGxcbiAgICAgIGNvbnN0IGxlbiA9IG9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spXG4gICAgfSB3aGlsZSAoaSA8IGJ1ZmZlcmVkLmxlbmd0aCAmJiAhc3RhdGUud3JpdGluZylcbiAgICBpZiAoaSA9PT0gYnVmZmVyZWQubGVuZ3RoKSB7XG4gICAgICByZXNldEJ1ZmZlcihzdGF0ZSlcbiAgICB9IGVsc2UgaWYgKGkgPiAyNTYpIHtcbiAgICAgIGJ1ZmZlcmVkLnNwbGljZSgwLCBpKVxuICAgICAgc3RhdGUuYnVmZmVyZWRJbmRleCA9IDBcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRJbmRleCA9IGlcbiAgICB9XG4gIH1cbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlXG59XG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKHRoaXMuX3dyaXRldikge1xuICAgIHRoaXMuX3dyaXRldihcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNodW5rLFxuICAgICAgICAgIGVuY29kaW5nXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBjYlxuICAgIClcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ193cml0ZSgpJylcbiAgfVxufVxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rXG4gICAgY2h1bmsgPSBudWxsXG4gICAgZW5jb2RpbmcgPSBudWxsXG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gbnVsbFxuICB9XG4gIGxldCBlcnJcbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXQgPSBfd3JpdGUodGhpcywgY2h1bmssIGVuY29kaW5nKVxuICAgIGlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZXJyID0gcmV0XG4gICAgfVxuICB9XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3MuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxXG4gICAgdGhpcy51bmNvcmsoKVxuICB9XG4gIGlmIChlcnIpIHtcbiAgICAvLyBEbyBub3RoaW5nLi4uXG4gIH0gZWxzZSBpZiAoIXN0YXRlLmVycm9yZWQgJiYgIXN0YXRlLmVuZGluZykge1xuICAgIC8vIFRoaXMgaXMgZm9yZ2l2aW5nIGluIHRlcm1zIG9mIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGVuZCgpIGFuZCBjYW4gaGlkZVxuICAgIC8vIGxvZ2ljIGVycm9ycy4gSG93ZXZlciwgdXN1YWxseSBzdWNoIGVycm9ycyBhcmUgaGFybWxlc3MgYW5kIGNhdXNpbmcgYVxuICAgIC8vIGhhcmQgZXJyb3IgY2FuIGJlIGRpc3Byb3BvcnRpb25hdGVseSBkZXN0cnVjdGl2ZS4gSXQgaXMgbm90IGFsd2F5c1xuICAgIC8vIHRyaXZpYWwgZm9yIHRoZSB1c2VyIHRvIGRldGVybWluZSB3aGV0aGVyIGVuZCgpIG5lZWRzIHRvIGJlIGNhbGxlZFxuICAgIC8vIG9yIG5vdC5cblxuICAgIHN0YXRlLmVuZGluZyA9IHRydWVcbiAgICBmaW5pc2hNYXliZSh0aGlzLCBzdGF0ZSwgdHJ1ZSlcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWVcbiAgfSBlbHNlIGlmIChzdGF0ZS5maW5pc2hlZCkge1xuICAgIGVyciA9IG5ldyBFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQoJ2VuZCcpXG4gIH0gZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgZXJyID0gbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCdlbmQnKVxuICB9XG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZXJyIHx8IHN0YXRlLmZpbmlzaGVkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlW2tPbkZpbmlzaGVkXS5wdXNoKGNiKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpc1xufVxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gKFxuICAgIHN0YXRlLmVuZGluZyAmJlxuICAgICFzdGF0ZS5kZXN0cm95ZWQgJiZcbiAgICBzdGF0ZS5jb25zdHJ1Y3RlZCAmJlxuICAgIHN0YXRlLmxlbmd0aCA9PT0gMCAmJlxuICAgICFzdGF0ZS5lcnJvcmVkICYmXG4gICAgc3RhdGUuYnVmZmVyZWQubGVuZ3RoID09PSAwICYmXG4gICAgIXN0YXRlLmZpbmlzaGVkICYmXG4gICAgIXN0YXRlLndyaXRpbmcgJiZcbiAgICAhc3RhdGUuZXJyb3JFbWl0dGVkICYmXG4gICAgIXN0YXRlLmNsb3NlRW1pdHRlZFxuICApXG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBsZXQgY2FsbGVkID0gZmFsc2VcbiAgZnVuY3Rpb24gb25GaW5pc2goZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIgIT09IG51bGwgJiYgZXJyICE9PSB1bmRlZmluZWQgPyBlcnIgOiBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlXG4gICAgc3RhdGUucGVuZGluZ2NiLS1cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb25zdCBvbmZpbmlzaENhbGxiYWNrcyA9IHN0YXRlW2tPbkZpbmlzaGVkXS5zcGxpY2UoMClcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb25maW5pc2hDYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb25maW5pc2hDYWxsYmFja3NbaV0oZXJyKVxuICAgICAgfVxuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIsIHN0YXRlLnN5bmMpXG4gICAgfSBlbHNlIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlXG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJylcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXQuIERvbid0IGNoZWNrIHN0YXRlLnN5bmMgaGVyZS5cbiAgICAgIC8vIFNvbWUgc3RyZWFtcyBhc3N1bWUgJ2ZpbmlzaCcgd2lsbCBiZSBlbWl0dGVkXG4gICAgICAvLyBhc3luY2hyb25vdXNseSByZWxhdGl2ZSB0byBfZmluYWwgY2FsbGJhY2suXG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrK1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2gsIHN0cmVhbSwgc3RhdGUpXG4gICAgfVxuICB9XG4gIHN0YXRlLnN5bmMgPSB0cnVlXG4gIHN0YXRlLnBlbmRpbmdjYisrXG4gIHRyeSB7XG4gICAgc3RyZWFtLl9maW5hbChvbkZpbmlzaClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb25GaW5pc2goZXJyKVxuICB9XG4gIHN0YXRlLnN5bmMgPSBmYWxzZVxufVxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCAmJiAhc3RhdGUuZmluYWxDYWxsZWQpIHtcbiAgICBpZiAodHlwZW9mIHN0cmVhbS5fZmluYWwgPT09ICdmdW5jdGlvbicgJiYgIXN0YXRlLmRlc3Ryb3llZCkge1xuICAgICAgc3RhdGUuZmluYWxDYWxsZWQgPSB0cnVlXG4gICAgICBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlXG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUsIHN5bmMpIHtcbiAgaWYgKG5lZWRGaW5pc2goc3RhdGUpKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpXG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgc3RhdGUucGVuZGluZ2NiKytcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhcbiAgICAgICAgICAoc3RyZWFtLCBzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5lZWRGaW5pc2goc3RhdGUpKSB7XG4gICAgICAgICAgICAgIGZpbmlzaChzdHJlYW0sIHN0YXRlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdGUucGVuZGluZ2NiLS1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICApXG4gICAgICB9IGVsc2UgaWYgKG5lZWRGaW5pc2goc3RhdGUpKSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmdjYisrXG4gICAgICAgIGZpbmlzaChzdHJlYW0sIHN0YXRlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUucGVuZGluZ2NiLS1cbiAgc3RhdGUuZmluaXNoZWQgPSB0cnVlXG4gIGNvbnN0IG9uZmluaXNoQ2FsbGJhY2tzID0gc3RhdGVba09uRmluaXNoZWRdLnNwbGljZSgwKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9uZmluaXNoQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgb25maW5pc2hDYWxsYmFja3NbaV0oKVxuICB9XG4gIHN0cmVhbS5lbWl0KCdmaW5pc2gnKVxuICBpZiAoc3RhdGUuYXV0b0Rlc3Ryb3kpIHtcbiAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgLy8gaWYgdGhlIHJlYWRhYmxlIHNpZGUgaXMgcmVhZHkgZm9yIGF1dG9EZXN0cm95IGFzIHdlbGwuXG4gICAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gICAgY29uc3QgYXV0b0Rlc3Ryb3kgPVxuICAgICAgIXJTdGF0ZSB8fFxuICAgICAgKHJTdGF0ZS5hdXRvRGVzdHJveSAmJlxuICAgICAgICAvLyBXZSBkb24ndCBleHBlY3QgdGhlIHJlYWRhYmxlIHRvIGV2ZXIgJ2VuZCdcbiAgICAgICAgLy8gaWYgcmVhZGFibGUgaXMgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UuXG4gICAgICAgIChyU3RhdGUuZW5kRW1pdHRlZCB8fCByU3RhdGUucmVhZGFibGUgPT09IGZhbHNlKSlcbiAgICBpZiAoYXV0b0Rlc3Ryb3kpIHtcbiAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgICB9XG4gIH1cbn1cbk9iamVjdERlZmluZVByb3BlcnRpZXMoV3JpdGFibGUucHJvdG90eXBlLCB7XG4gIGNsb3NlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuY2xvc2VkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGRlc3Ryb3llZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkIDogZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseSBtYW5hZ2luZyBkZXN0cm95ZWQuXG4gICAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuICB3cml0YWJsZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICAgICAgLy8gdy53cml0YWJsZSA9PT0gZmFsc2UgbWVhbnMgdGhhdCB0aGlzIGlzIHBhcnQgb2YgYSBEdXBsZXggc3RyZWFtXG4gICAgICAvLyB3aGVyZSB0aGUgd3JpdGFibGUgc2lkZSB3YXMgZGlzYWJsZWQgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAvLyBDb21wYXQuIFRoZSB1c2VyIG1pZ2h0IG1hbnVhbGx5IGRpc2FibGUgd3JpdGFibGUgc2lkZSB0aHJvdWdoXG4gICAgICAvLyBkZXByZWNhdGVkIHNldHRlci5cbiAgICAgIHJldHVybiAhIXcgJiYgdy53cml0YWJsZSAhPT0gZmFsc2UgJiYgIXcuZGVzdHJveWVkICYmICF3LmVycm9yZWQgJiYgIXcuZW5kaW5nICYmICF3LmVuZGVkXG4gICAgfSxcbiAgICBzZXQodmFsKSB7XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJsZS5cbiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSAhIXZhbFxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVGaW5pc2hlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgOiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVPYmplY3RNb2RlOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5vYmplY3RNb2RlIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlQnVmZmVyOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKClcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlRW5kZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA6IGZhbHNlXG4gICAgfVxuICB9LFxuICB3cml0YWJsZU5lZWREcmFpbjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCB3U3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gICAgICBpZiAoIXdTdGF0ZSkgcmV0dXJuIGZhbHNlXG4gICAgICByZXR1cm4gIXdTdGF0ZS5kZXN0cm95ZWQgJiYgIXdTdGF0ZS5lbmRpbmcgJiYgd1N0YXRlLm5lZWREcmFpblxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVDb3JrZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCA6IDBcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RoXG4gICAgfVxuICB9LFxuICBlcnJvcmVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvcmVkIDogbnVsbFxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVBYm9ydGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhKFxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLndyaXRhYmxlICE9PSBmYWxzZSAmJlxuICAgICAgICAodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvcmVkKSAmJlxuICAgICAgICAhdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZFxuICAgICAgKVxuICAgIH1cbiAgfVxufSlcbmNvbnN0IGRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95XG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuXG4gIC8vIEludm9rZSBwZW5kaW5nIGNhbGxiYWNrcy5cbiAgaWYgKCFzdGF0ZS5kZXN0cm95ZWQgJiYgKHN0YXRlLmJ1ZmZlcmVkSW5kZXggPCBzdGF0ZS5idWZmZXJlZC5sZW5ndGggfHwgc3RhdGVba09uRmluaXNoZWRdLmxlbmd0aCkpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVycm9yQnVmZmVyLCBzdGF0ZSlcbiAgfVxuICBkZXN0cm95LmNhbGwodGhpcywgZXJyLCBjYilcbiAgcmV0dXJuIHRoaXNcbn1cbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95XG5Xcml0YWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICBjYihlcnIpXG59XG5Xcml0YWJsZS5wcm90b3R5cGVbRUUuY2FwdHVyZVJlamVjdGlvblN5bWJvbF0gPSBmdW5jdGlvbiAoZXJyKSB7XG4gIHRoaXMuZGVzdHJveShlcnIpXG59XG5sZXQgd2ViU3RyZWFtc0FkYXB0ZXJzXG5cbi8vIExhenkgdG8gYXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlc1xuZnVuY3Rpb24gbGF6eVdlYlN0cmVhbXMoKSB7XG4gIGlmICh3ZWJTdHJlYW1zQWRhcHRlcnMgPT09IHVuZGVmaW5lZCkgd2ViU3RyZWFtc0FkYXB0ZXJzID0ge31cbiAgcmV0dXJuIHdlYlN0cmVhbXNBZGFwdGVyc1xufVxuV3JpdGFibGUuZnJvbVdlYiA9IGZ1bmN0aW9uICh3cml0YWJsZVN0cmVhbSwgb3B0aW9ucykge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdTdHJlYW1Xcml0YWJsZUZyb21Xcml0YWJsZVN0cmVhbSh3cml0YWJsZVN0cmVhbSwgb3B0aW9ucylcbn1cbldyaXRhYmxlLnRvV2ViID0gZnVuY3Rpb24gKHN0cmVhbVdyaXRhYmxlKSB7XG4gIHJldHVybiBsYXp5V2ViU3RyZWFtcygpLm5ld1dyaXRhYmxlU3RyZWFtRnJvbVN0cmVhbVdyaXRhYmxlKHN0cmVhbVdyaXRhYmxlKVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///78584\n")},277:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/* eslint jsdoc/require-jsdoc: \"error\" */\n\n\n\nconst {\n ArrayIsArray,\n ArrayPrototypeIncludes,\n ArrayPrototypeJoin,\n ArrayPrototypeMap,\n NumberIsInteger,\n NumberIsNaN,\n NumberMAX_SAFE_INTEGER,\n NumberMIN_SAFE_INTEGER,\n NumberParseInt,\n ObjectPrototypeHasOwnProperty,\n RegExpPrototypeExec,\n String,\n StringPrototypeToUpperCase,\n StringPrototypeTrim\n} = __webpack_require__(24134)\nconst {\n hideStackFrames,\n codes: { ERR_SOCKET_BAD_PORT, ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE, ERR_UNKNOWN_SIGNAL }\n} = __webpack_require__(76371)\nconst { normalizeEncoding } = __webpack_require__(57760)\nconst { isAsyncFunction, isArrayBufferView } = (__webpack_require__(57760).types)\nconst signals = {}\n\n/**\n * @param {*} value\n * @returns {boolean}\n */\nfunction isInt32(value) {\n return value === (value | 0)\n}\n\n/**\n * @param {*} value\n * @returns {boolean}\n */\nfunction isUint32(value) {\n return value === value >>> 0\n}\nconst octalReg = /^[0-7]+$/\nconst modeDesc = 'must be a 32-bit unsigned integer or an octal string'\n\n/**\n * Parse and validate values that will be converted into mode_t (the S_*\n * constants). Only valid numbers and octal strings are allowed. They could be\n * converted to 32-bit unsigned integers or non-negative signed integers in the\n * C++ land, but any value higher than 0o777 will result in platform-specific\n * behaviors.\n * @param {*} value Values to be validated\n * @param {string} name Name of the argument\n * @param {number} [def] If specified, will be returned for invalid values\n * @returns {number}\n */\nfunction parseFileMode(value, name, def) {\n if (typeof value === 'undefined') {\n value = def\n }\n if (typeof value === 'string') {\n if (RegExpPrototypeExec(octalReg, value) === null) {\n throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc)\n }\n value = NumberParseInt(value, 8)\n }\n validateUint32(value, name)\n return value\n}\n\n/**\n * @callback validateInteger\n * @param {*} value\n * @param {string} name\n * @param {number} [min]\n * @param {number} [max]\n * @returns {asserts value is number}\n */\n\n/** @type {validateInteger} */\nconst validateInteger = hideStackFrames((value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER) => {\n if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)\n if (!NumberIsInteger(value)) throw new ERR_OUT_OF_RANGE(name, 'an integer', value)\n if (value < min || value > max) throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)\n})\n\n/**\n * @callback validateInt32\n * @param {*} value\n * @param {string} name\n * @param {number} [min]\n * @param {number} [max]\n * @returns {asserts value is number}\n */\n\n/** @type {validateInt32} */\nconst validateInt32 = hideStackFrames((value, name, min = -2147483648, max = 2147483647) => {\n // The defaults for min and max correspond to the limits of 32-bit integers.\n if (typeof value !== 'number') {\n throw new ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n if (!NumberIsInteger(value)) {\n throw new ERR_OUT_OF_RANGE(name, 'an integer', value)\n }\n if (value < min || value > max) {\n throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)\n }\n})\n\n/**\n * @callback validateUint32\n * @param {*} value\n * @param {string} name\n * @param {number|boolean} [positive=false]\n * @returns {asserts value is number}\n */\n\n/** @type {validateUint32} */\nconst validateUint32 = hideStackFrames((value, name, positive = false) => {\n if (typeof value !== 'number') {\n throw new ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n if (!NumberIsInteger(value)) {\n throw new ERR_OUT_OF_RANGE(name, 'an integer', value)\n }\n const min = positive ? 1 : 0\n // 2 ** 32 === 4294967296\n const max = 4294967295\n if (value < min || value > max) {\n throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)\n }\n})\n\n/**\n * @callback validateString\n * @param {*} value\n * @param {string} name\n * @returns {asserts value is string}\n */\n\n/** @type {validateString} */\nfunction validateString(value, name) {\n if (typeof value !== 'string') throw new ERR_INVALID_ARG_TYPE(name, 'string', value)\n}\n\n/**\n * @callback validateNumber\n * @param {*} value\n * @param {string} name\n * @param {number} [min]\n * @param {number} [max]\n * @returns {asserts value is number}\n */\n\n/** @type {validateNumber} */\nfunction validateNumber(value, name, min = undefined, max) {\n if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)\n if (\n (min != null && value < min) ||\n (max != null && value > max) ||\n ((min != null || max != null) && NumberIsNaN(value))\n ) {\n throw new ERR_OUT_OF_RANGE(\n name,\n `${min != null ? `>= ${min}` : ''}${min != null && max != null ? ' && ' : ''}${max != null ? `<= ${max}` : ''}`,\n value\n )\n }\n}\n\n/**\n * @callback validateOneOf\n * @template T\n * @param {T} value\n * @param {string} name\n * @param {T[]} oneOf\n */\n\n/** @type {validateOneOf} */\nconst validateOneOf = hideStackFrames((value, name, oneOf) => {\n if (!ArrayPrototypeIncludes(oneOf, value)) {\n const allowed = ArrayPrototypeJoin(\n ArrayPrototypeMap(oneOf, (v) => (typeof v === 'string' ? `'${v}'` : String(v))),\n ', '\n )\n const reason = 'must be one of: ' + allowed\n throw new ERR_INVALID_ARG_VALUE(name, value, reason)\n }\n})\n\n/**\n * @callback validateBoolean\n * @param {*} value\n * @param {string} name\n * @returns {asserts value is boolean}\n */\n\n/** @type {validateBoolean} */\nfunction validateBoolean(value, name) {\n if (typeof value !== 'boolean') throw new ERR_INVALID_ARG_TYPE(name, 'boolean', value)\n}\n\n/**\n * @param {any} options\n * @param {string} key\n * @param {boolean} defaultValue\n * @returns {boolean}\n */\nfunction getOwnPropertyValueOrDefault(options, key, defaultValue) {\n return options == null || !ObjectPrototypeHasOwnProperty(options, key) ? defaultValue : options[key]\n}\n\n/**\n * @callback validateObject\n * @param {*} value\n * @param {string} name\n * @param {{\n * allowArray?: boolean,\n * allowFunction?: boolean,\n * nullable?: boolean\n * }} [options]\n */\n\n/** @type {validateObject} */\nconst validateObject = hideStackFrames((value, name, options = null) => {\n const allowArray = getOwnPropertyValueOrDefault(options, 'allowArray', false)\n const allowFunction = getOwnPropertyValueOrDefault(options, 'allowFunction', false)\n const nullable = getOwnPropertyValueOrDefault(options, 'nullable', false)\n if (\n (!nullable && value === null) ||\n (!allowArray && ArrayIsArray(value)) ||\n (typeof value !== 'object' && (!allowFunction || typeof value !== 'function'))\n ) {\n throw new ERR_INVALID_ARG_TYPE(name, 'Object', value)\n }\n})\n\n/**\n * @callback validateDictionary - We are using the Web IDL Standard definition\n * of \"dictionary\" here, which means any value\n * whose Type is either Undefined, Null, or\n * Object (which includes functions).\n * @param {*} value\n * @param {string} name\n * @see https://webidl.spec.whatwg.org/#es-dictionary\n * @see https://tc39.es/ecma262/#table-typeof-operator-results\n */\n\n/** @type {validateDictionary} */\nconst validateDictionary = hideStackFrames((value, name) => {\n if (value != null && typeof value !== 'object' && typeof value !== 'function') {\n throw new ERR_INVALID_ARG_TYPE(name, 'a dictionary', value)\n }\n})\n\n/**\n * @callback validateArray\n * @param {*} value\n * @param {string} name\n * @param {number} [minLength]\n * @returns {asserts value is any[]}\n */\n\n/** @type {validateArray} */\nconst validateArray = hideStackFrames((value, name, minLength = 0) => {\n if (!ArrayIsArray(value)) {\n throw new ERR_INVALID_ARG_TYPE(name, 'Array', value)\n }\n if (value.length < minLength) {\n const reason = `must be longer than ${minLength}`\n throw new ERR_INVALID_ARG_VALUE(name, value, reason)\n }\n})\n\n/**\n * @callback validateStringArray\n * @param {*} value\n * @param {string} name\n * @returns {asserts value is string[]}\n */\n\n/** @type {validateStringArray} */\nfunction validateStringArray(value, name) {\n validateArray(value, name)\n for (let i = 0; i < value.length; i++) {\n validateString(value[i], `${name}[${i}]`)\n }\n}\n\n/**\n * @callback validateBooleanArray\n * @param {*} value\n * @param {string} name\n * @returns {asserts value is boolean[]}\n */\n\n/** @type {validateBooleanArray} */\nfunction validateBooleanArray(value, name) {\n validateArray(value, name)\n for (let i = 0; i < value.length; i++) {\n validateBoolean(value[i], `${name}[${i}]`)\n }\n}\n\n/**\n * @callback validateAbortSignalArray\n * @param {*} value\n * @param {string} name\n * @returns {asserts value is AbortSignal[]}\n */\n\n/** @type {validateAbortSignalArray} */\nfunction validateAbortSignalArray(value, name) {\n validateArray(value, name)\n for (let i = 0; i < value.length; i++) {\n const signal = value[i]\n const indexedName = `${name}[${i}]`\n if (signal == null) {\n throw new ERR_INVALID_ARG_TYPE(indexedName, 'AbortSignal', signal)\n }\n validateAbortSignal(signal, indexedName)\n }\n}\n\n/**\n * @param {*} signal\n * @param {string} [name='signal']\n * @returns {asserts signal is keyof signals}\n */\nfunction validateSignalName(signal, name = 'signal') {\n validateString(signal, name)\n if (signals[signal] === undefined) {\n if (signals[StringPrototypeToUpperCase(signal)] !== undefined) {\n throw new ERR_UNKNOWN_SIGNAL(signal + ' (signals must use all capital letters)')\n }\n throw new ERR_UNKNOWN_SIGNAL(signal)\n }\n}\n\n/**\n * @callback validateBuffer\n * @param {*} buffer\n * @param {string} [name='buffer']\n * @returns {asserts buffer is ArrayBufferView}\n */\n\n/** @type {validateBuffer} */\nconst validateBuffer = hideStackFrames((buffer, name = 'buffer') => {\n if (!isArrayBufferView(buffer)) {\n throw new ERR_INVALID_ARG_TYPE(name, ['Buffer', 'TypedArray', 'DataView'], buffer)\n }\n})\n\n/**\n * @param {string} data\n * @param {string} encoding\n */\nfunction validateEncoding(data, encoding) {\n const normalizedEncoding = normalizeEncoding(encoding)\n const length = data.length\n if (normalizedEncoding === 'hex' && length % 2 !== 0) {\n throw new ERR_INVALID_ARG_VALUE('encoding', encoding, `is invalid for data of length ${length}`)\n }\n}\n\n/**\n * Check that the port number is not NaN when coerced to a number,\n * is an integer and that it falls within the legal range of port numbers.\n * @param {*} port\n * @param {string} [name='Port']\n * @param {boolean} [allowZero=true]\n * @returns {number}\n */\nfunction validatePort(port, name = 'Port', allowZero = true) {\n if (\n (typeof port !== 'number' && typeof port !== 'string') ||\n (typeof port === 'string' && StringPrototypeTrim(port).length === 0) ||\n +port !== +port >>> 0 ||\n port > 0xffff ||\n (port === 0 && !allowZero)\n ) {\n throw new ERR_SOCKET_BAD_PORT(name, port, allowZero)\n }\n return port | 0\n}\n\n/**\n * @callback validateAbortSignal\n * @param {*} signal\n * @param {string} name\n */\n\n/** @type {validateAbortSignal} */\nconst validateAbortSignal = hideStackFrames((signal, name) => {\n if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) {\n throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)\n }\n})\n\n/**\n * @callback validateFunction\n * @param {*} value\n * @param {string} name\n * @returns {asserts value is Function}\n */\n\n/** @type {validateFunction} */\nconst validateFunction = hideStackFrames((value, name) => {\n if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)\n})\n\n/**\n * @callback validatePlainFunction\n * @param {*} value\n * @param {string} name\n * @returns {asserts value is Function}\n */\n\n/** @type {validatePlainFunction} */\nconst validatePlainFunction = hideStackFrames((value, name) => {\n if (typeof value !== 'function' || isAsyncFunction(value)) throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)\n})\n\n/**\n * @callback validateUndefined\n * @param {*} value\n * @param {string} name\n * @returns {asserts value is undefined}\n */\n\n/** @type {validateUndefined} */\nconst validateUndefined = hideStackFrames((value, name) => {\n if (value !== undefined) throw new ERR_INVALID_ARG_TYPE(name, 'undefined', value)\n})\n\n/**\n * @template T\n * @param {T} value\n * @param {string} name\n * @param {T[]} union\n */\nfunction validateUnion(value, name, union) {\n if (!ArrayPrototypeIncludes(union, value)) {\n throw new ERR_INVALID_ARG_TYPE(name, `('${ArrayPrototypeJoin(union, '|')}')`, value)\n }\n}\n\n/*\n The rules for the Link header field are described here:\n https://www.rfc-editor.org/rfc/rfc8288.html#section-3\n\n This regex validates any string surrounded by angle brackets\n (not necessarily a valid URI reference) followed by zero or more\n link-params separated by semicolons.\n*/\nconst linkValueRegExp = /^(?:<[^>]*>)(?:\\s*;\\s*[^;\"\\s]+(?:=(\")?[^;\"\\s]*\\1)?)*$/\n\n/**\n * @param {any} value\n * @param {string} name\n */\nfunction validateLinkHeaderFormat(value, name) {\n if (typeof value === 'undefined' || !RegExpPrototypeExec(linkValueRegExp, value)) {\n throw new ERR_INVALID_ARG_VALUE(\n name,\n value,\n 'must be an array or string of format \"; rel=preload; as=style\"'\n )\n }\n}\n\n/**\n * @param {any} hints\n * @return {string}\n */\nfunction validateLinkHeaderValue(hints) {\n if (typeof hints === 'string') {\n validateLinkHeaderFormat(hints, 'hints')\n return hints\n } else if (ArrayIsArray(hints)) {\n const hintsLength = hints.length\n let result = ''\n if (hintsLength === 0) {\n return result\n }\n for (let i = 0; i < hintsLength; i++) {\n const link = hints[i]\n validateLinkHeaderFormat(link, 'hints')\n result += link\n if (i !== hintsLength - 1) {\n result += ', '\n }\n }\n return result\n }\n throw new ERR_INVALID_ARG_VALUE(\n 'hints',\n hints,\n 'must be an array or string of format \"; rel=preload; as=style\"'\n )\n}\nmodule.exports = {\n isInt32,\n isUint32,\n parseFileMode,\n validateArray,\n validateStringArray,\n validateBooleanArray,\n validateAbortSignalArray,\n validateBoolean,\n validateBuffer,\n validateDictionary,\n validateEncoding,\n validateFunction,\n validateInt32,\n validateInteger,\n validateNumber,\n validateObject,\n validateOneOf,\n validatePlainFunction,\n validatePort,\n validateSignalName,\n validateString,\n validateUint32,\n validateUndefined,\n validateUnion,\n validateAbortSignal,\n validateLinkHeaderValue\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0EsNENBQTRDLE1BQU0sZ0JBQWdCOztBQUVsRTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGFBQWE7QUFDekU7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxhQUFhO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC92YWxpZGF0b3JzLmpzP2VmNjYiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IGpzZG9jL3JlcXVpcmUtanNkb2M6IFwiZXJyb3JcIiAqL1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBBcnJheUlzQXJyYXksXG4gIEFycmF5UHJvdG90eXBlSW5jbHVkZXMsXG4gIEFycmF5UHJvdG90eXBlSm9pbixcbiAgQXJyYXlQcm90b3R5cGVNYXAsXG4gIE51bWJlcklzSW50ZWdlcixcbiAgTnVtYmVySXNOYU4sXG4gIE51bWJlck1BWF9TQUZFX0lOVEVHRVIsXG4gIE51bWJlck1JTl9TQUZFX0lOVEVHRVIsXG4gIE51bWJlclBhcnNlSW50LFxuICBPYmplY3RQcm90b3R5cGVIYXNPd25Qcm9wZXJ0eSxcbiAgUmVnRXhwUHJvdG90eXBlRXhlYyxcbiAgU3RyaW5nLFxuICBTdHJpbmdQcm90b3R5cGVUb1VwcGVyQ2FzZSxcbiAgU3RyaW5nUHJvdG90eXBlVHJpbVxufSA9IHJlcXVpcmUoJy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3Qge1xuICBoaWRlU3RhY2tGcmFtZXMsXG4gIGNvZGVzOiB7IEVSUl9TT0NLRVRfQkFEX1BPUlQsIEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfSU5WQUxJRF9BUkdfVkFMVUUsIEVSUl9PVVRfT0ZfUkFOR0UsIEVSUl9VTktOT1dOX1NJR05BTCB9XG59ID0gcmVxdWlyZSgnLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyBub3JtYWxpemVFbmNvZGluZyB9ID0gcmVxdWlyZSgnLi4vb3Vycy91dGlsJylcbmNvbnN0IHsgaXNBc3luY0Z1bmN0aW9uLCBpc0FycmF5QnVmZmVyVmlldyB9ID0gcmVxdWlyZSgnLi4vb3Vycy91dGlsJykudHlwZXNcbmNvbnN0IHNpZ25hbHMgPSB7fVxuXG4vKipcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ludDMyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gKHZhbHVlIHwgMClcbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNVaW50MzIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA+Pj4gMFxufVxuY29uc3Qgb2N0YWxSZWcgPSAvXlswLTddKyQvXG5jb25zdCBtb2RlRGVzYyA9ICdtdXN0IGJlIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgb3IgYW4gb2N0YWwgc3RyaW5nJ1xuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSB2YWx1ZXMgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIG1vZGVfdCAodGhlIFNfKlxuICogY29uc3RhbnRzKS4gT25seSB2YWxpZCBudW1iZXJzIGFuZCBvY3RhbCBzdHJpbmdzIGFyZSBhbGxvd2VkLiBUaGV5IGNvdWxkIGJlXG4gKiBjb252ZXJ0ZWQgdG8gMzItYml0IHVuc2lnbmVkIGludGVnZXJzIG9yIG5vbi1uZWdhdGl2ZSBzaWduZWQgaW50ZWdlcnMgaW4gdGhlXG4gKiBDKysgbGFuZCwgYnV0IGFueSB2YWx1ZSBoaWdoZXIgdGhhbiAwbzc3NyB3aWxsIHJlc3VsdCBpbiBwbGF0Zm9ybS1zcGVjaWZpY1xuICogYmVoYXZpb3JzLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZXMgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBhcmd1bWVudFxuICogQHBhcmFtIHtudW1iZXJ9IFtkZWZdIElmIHNwZWNpZmllZCwgd2lsbCBiZSByZXR1cm5lZCBmb3IgaW52YWxpZCB2YWx1ZXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlRmlsZU1vZGUodmFsdWUsIG5hbWUsIGRlZikge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHZhbHVlID0gZGVmXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoUmVnRXhwUHJvdG90eXBlRXhlYyhvY3RhbFJlZywgdmFsdWUpID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKG5hbWUsIHZhbHVlLCBtb2RlRGVzYylcbiAgICB9XG4gICAgdmFsdWUgPSBOdW1iZXJQYXJzZUludCh2YWx1ZSwgOClcbiAgfVxuICB2YWxpZGF0ZVVpbnQzMih2YWx1ZSwgbmFtZSlcbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlSW50ZWdlclxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluXVxuICogQHBhcmFtIHtudW1iZXJ9IFttYXhdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUludGVnZXJ9ICovXG5jb25zdCB2YWxpZGF0ZUludGVnZXIgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lLCBtaW4gPSBOdW1iZXJNSU5fU0FGRV9JTlRFR0VSLCBtYXggPSBOdW1iZXJNQVhfU0FGRV9JTlRFR0VSKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICBpZiAoIU51bWJlcklzSW50ZWdlcih2YWx1ZSkpIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsICdhbiBpbnRlZ2VyJywgdmFsdWUpXG4gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgYD49ICR7bWlufSAmJiA8PSAke21heH1gLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlSW50MzJcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gW21pbl1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4XVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgbnVtYmVyfVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVJbnQzMn0gKi9cbmNvbnN0IHZhbGlkYXRlSW50MzIgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lLCBtaW4gPSAtMjE0NzQ4MzY0OCwgbWF4ID0gMjE0NzQ4MzY0NykgPT4ge1xuICAvLyBUaGUgZGVmYXVsdHMgZm9yIG1pbiBhbmQgbWF4IGNvcnJlc3BvbmQgdG8gdGhlIGxpbWl0cyBvZiAzMi1iaXQgaW50ZWdlcnMuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdudW1iZXInLCB2YWx1ZSlcbiAgfVxuICBpZiAoIU51bWJlcklzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShuYW1lLCAnYW4gaW50ZWdlcicsIHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsIGA+PSAke21pbn0gJiYgPD0gJHttYXh9YCwgdmFsdWUpXG4gIH1cbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlVWludDMyXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtudW1iZXJ8Ym9vbGVhbn0gW3Bvc2l0aXZlPWZhbHNlXVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgbnVtYmVyfVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVVaW50MzJ9ICovXG5jb25zdCB2YWxpZGF0ZVVpbnQzMiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIHBvc2l0aXZlID0gZmFsc2UpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG4gIGlmICghTnVtYmVySXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsICdhbiBpbnRlZ2VyJywgdmFsdWUpXG4gIH1cbiAgY29uc3QgbWluID0gcG9zaXRpdmUgPyAxIDogMFxuICAvLyAyICoqIDMyID09PSA0Mjk0OTY3Mjk2XG4gIGNvbnN0IG1heCA9IDQyOTQ5NjcyOTVcbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgYD49ICR7bWlufSAmJiA8PSAke21heH1gLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBzdHJpbmd9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVN0cmluZ30gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ3N0cmluZycsIHZhbHVlKVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZU51bWJlclxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluXVxuICogQHBhcmFtIHtudW1iZXJ9IFttYXhdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZU51bWJlcn0gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKHZhbHVlLCBuYW1lLCBtaW4gPSB1bmRlZmluZWQsIG1heCkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdudW1iZXInLCB2YWx1ZSlcbiAgaWYgKFxuICAgIChtaW4gIT0gbnVsbCAmJiB2YWx1ZSA8IG1pbikgfHxcbiAgICAobWF4ICE9IG51bGwgJiYgdmFsdWUgPiBtYXgpIHx8XG4gICAgKChtaW4gIT0gbnVsbCB8fCBtYXggIT0gbnVsbCkgJiYgTnVtYmVySXNOYU4odmFsdWUpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShcbiAgICAgIG5hbWUsXG4gICAgICBgJHttaW4gIT0gbnVsbCA/IGA+PSAke21pbn1gIDogJyd9JHttaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCA/ICcgJiYgJyA6ICcnfSR7bWF4ICE9IG51bGwgPyBgPD0gJHttYXh9YCA6ICcnfWAsXG4gICAgICB2YWx1ZVxuICAgIClcbiAgfVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZU9uZU9mXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7VFtdfSBvbmVPZlxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVPbmVPZn0gKi9cbmNvbnN0IHZhbGlkYXRlT25lT2YgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lLCBvbmVPZikgPT4ge1xuICBpZiAoIUFycmF5UHJvdG90eXBlSW5jbHVkZXMob25lT2YsIHZhbHVlKSkge1xuICAgIGNvbnN0IGFsbG93ZWQgPSBBcnJheVByb3RvdHlwZUpvaW4oXG4gICAgICBBcnJheVByb3RvdHlwZU1hcChvbmVPZiwgKHYpID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyBgJyR7dn0nYCA6IFN0cmluZyh2KSkpLFxuICAgICAgJywgJ1xuICAgIClcbiAgICBjb25zdCByZWFzb24gPSAnbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxvd2VkXG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShuYW1lLCB2YWx1ZSwgcmVhc29uKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBib29sZWFufVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVCb29sZWFufSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdib29sZWFuJywgdmFsdWUpXG59XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9wdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVmYXVsdFZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlWYWx1ZU9yRGVmYXVsdChvcHRpb25zLCBrZXksIGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4gb3B0aW9ucyA9PSBudWxsIHx8ICFPYmplY3RQcm90b3R5cGVIYXNPd25Qcm9wZXJ0eShvcHRpb25zLCBrZXkpID8gZGVmYXVsdFZhbHVlIDogb3B0aW9uc1trZXldXG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlT2JqZWN0XG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHt7XG4gKiAgIGFsbG93QXJyYXk/OiBib29sZWFuLFxuICogICBhbGxvd0Z1bmN0aW9uPzogYm9vbGVhbixcbiAqICAgbnVsbGFibGU/OiBib29sZWFuXG4gKiB9fSBbb3B0aW9uc11cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlT2JqZWN0fSAqL1xuY29uc3QgdmFsaWRhdGVPYmplY3QgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lLCBvcHRpb25zID0gbnVsbCkgPT4ge1xuICBjb25zdCBhbGxvd0FycmF5ID0gZ2V0T3duUHJvcGVydHlWYWx1ZU9yRGVmYXVsdChvcHRpb25zLCAnYWxsb3dBcnJheScsIGZhbHNlKVxuICBjb25zdCBhbGxvd0Z1bmN0aW9uID0gZ2V0T3duUHJvcGVydHlWYWx1ZU9yRGVmYXVsdChvcHRpb25zLCAnYWxsb3dGdW5jdGlvbicsIGZhbHNlKVxuICBjb25zdCBudWxsYWJsZSA9IGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywgJ251bGxhYmxlJywgZmFsc2UpXG4gIGlmIChcbiAgICAoIW51bGxhYmxlICYmIHZhbHVlID09PSBudWxsKSB8fFxuICAgICghYWxsb3dBcnJheSAmJiBBcnJheUlzQXJyYXkodmFsdWUpKSB8fFxuICAgICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmICghYWxsb3dGdW5jdGlvbiB8fCB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ09iamVjdCcsIHZhbHVlKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZURpY3Rpb25hcnkgLSBXZSBhcmUgdXNpbmcgdGhlIFdlYiBJREwgU3RhbmRhcmQgZGVmaW5pdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFwiZGljdGlvbmFyeVwiIGhlcmUsIHdoaWNoIG1lYW5zIGFueSB2YWx1ZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIFR5cGUgaXMgZWl0aGVyIFVuZGVmaW5lZCwgTnVsbCwgb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgKHdoaWNoIGluY2x1ZGVzIGZ1bmN0aW9ucykuXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHNlZSBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLWRpY3Rpb25hcnlcbiAqIEBzZWUgaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3RhYmxlLXR5cGVvZi1vcGVyYXRvci1yZXN1bHRzXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZURpY3Rpb25hcnl9ICovXG5jb25zdCB2YWxpZGF0ZURpY3Rpb25hcnkgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lKSA9PiB7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdhIGRpY3Rpb25hcnknLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVBcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluTGVuZ3RoXVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgYW55W119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFycmF5fSAqL1xuY29uc3QgdmFsaWRhdGVBcnJheSA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbkxlbmd0aCA9IDApID0+IHtcbiAgaWYgKCFBcnJheUlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBcnJheScsIHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZS5sZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICBjb25zdCByZWFzb24gPSBgbXVzdCBiZSBsb25nZXIgdGhhbiAke21pbkxlbmd0aH1gXG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShuYW1lLCB2YWx1ZSwgcmVhc29uKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZVN0cmluZ0FycmF5XG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgc3RyaW5nW119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVN0cmluZ0FycmF5fSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmdBcnJheSh2YWx1ZSwgbmFtZSkge1xuICB2YWxpZGF0ZUFycmF5KHZhbHVlLCBuYW1lKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVTdHJpbmcodmFsdWVbaV0sIGAke25hbWV9WyR7aX1dYClcbiAgfVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUJvb2xlYW5BcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIGJvb2xlYW5bXX1cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlQm9vbGVhbkFycmF5fSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuQXJyYXkodmFsdWUsIG5hbWUpIHtcbiAgdmFsaWRhdGVBcnJheSh2YWx1ZSwgbmFtZSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQm9vbGVhbih2YWx1ZVtpXSwgYCR7bmFtZX1bJHtpfV1gKVxuICB9XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlQWJvcnRTaWduYWxBcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIEFib3J0U2lnbmFsW119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFib3J0U2lnbmFsQXJyYXl9ICovXG5mdW5jdGlvbiB2YWxpZGF0ZUFib3J0U2lnbmFsQXJyYXkodmFsdWUsIG5hbWUpIHtcbiAgdmFsaWRhdGVBcnJheSh2YWx1ZSwgbmFtZSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNpZ25hbCA9IHZhbHVlW2ldXG4gICAgY29uc3QgaW5kZXhlZE5hbWUgPSBgJHtuYW1lfVske2l9XWBcbiAgICBpZiAoc2lnbmFsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShpbmRleGVkTmFtZSwgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICAgIH1cbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKHNpZ25hbCwgaW5kZXhlZE5hbWUpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHNpZ25hbFxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdzaWduYWwnXVxuICogQHJldHVybnMge2Fzc2VydHMgc2lnbmFsIGlzIGtleW9mIHNpZ25hbHN9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU2lnbmFsTmFtZShzaWduYWwsIG5hbWUgPSAnc2lnbmFsJykge1xuICB2YWxpZGF0ZVN0cmluZyhzaWduYWwsIG5hbWUpXG4gIGlmIChzaWduYWxzW3NpZ25hbF0gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzaWduYWxzW1N0cmluZ1Byb3RvdHlwZVRvVXBwZXJDYXNlKHNpZ25hbCldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfVU5LTk9XTl9TSUdOQUwoc2lnbmFsICsgJyAoc2lnbmFscyBtdXN0IHVzZSBhbGwgY2FwaXRhbCBsZXR0ZXJzKScpXG4gICAgfVxuICAgIHRocm93IG5ldyBFUlJfVU5LTk9XTl9TSUdOQUwoc2lnbmFsKVxuICB9XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlQnVmZmVyXG4gKiBAcGFyYW0geyp9IGJ1ZmZlclxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdidWZmZXInXVxuICogQHJldHVybnMge2Fzc2VydHMgYnVmZmVyIGlzIEFycmF5QnVmZmVyVmlld31cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlQnVmZmVyfSAqL1xuY29uc3QgdmFsaWRhdGVCdWZmZXIgPSBoaWRlU3RhY2tGcmFtZXMoKGJ1ZmZlciwgbmFtZSA9ICdidWZmZXInKSA9PiB7XG4gIGlmICghaXNBcnJheUJ1ZmZlclZpZXcoYnVmZmVyKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCBbJ0J1ZmZlcicsICdUeXBlZEFycmF5JywgJ0RhdGFWaWV3J10sIGJ1ZmZlcilcbiAgfVxufSlcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRW5jb2RpbmcoZGF0YSwgZW5jb2RpbmcpIHtcbiAgY29uc3Qgbm9ybWFsaXplZEVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpXG4gIGNvbnN0IGxlbmd0aCA9IGRhdGEubGVuZ3RoXG4gIGlmIChub3JtYWxpemVkRW5jb2RpbmcgPT09ICdoZXgnICYmIGxlbmd0aCAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKCdlbmNvZGluZycsIGVuY29kaW5nLCBgaXMgaW52YWxpZCBmb3IgZGF0YSBvZiBsZW5ndGggJHtsZW5ndGh9YClcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHRoYXQgdGhlIHBvcnQgbnVtYmVyIGlzIG5vdCBOYU4gd2hlbiBjb2VyY2VkIHRvIGEgbnVtYmVyLFxuICogaXMgYW4gaW50ZWdlciBhbmQgdGhhdCBpdCBmYWxscyB3aXRoaW4gdGhlIGxlZ2FsIHJhbmdlIG9mIHBvcnQgbnVtYmVycy5cbiAqIEBwYXJhbSB7Kn0gcG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdQb3J0J11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93WmVybz10cnVlXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQb3J0KHBvcnQsIG5hbWUgPSAnUG9ydCcsIGFsbG93WmVybyA9IHRydWUpIHtcbiAgaWYgKFxuICAgICh0eXBlb2YgcG9ydCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHBvcnQgIT09ICdzdHJpbmcnKSB8fFxuICAgICh0eXBlb2YgcG9ydCA9PT0gJ3N0cmluZycgJiYgU3RyaW5nUHJvdG90eXBlVHJpbShwb3J0KS5sZW5ndGggPT09IDApIHx8XG4gICAgK3BvcnQgIT09ICtwb3J0ID4+PiAwIHx8XG4gICAgcG9ydCA+IDB4ZmZmZiB8fFxuICAgIChwb3J0ID09PSAwICYmICFhbGxvd1plcm8pXG4gICkge1xuICAgIHRocm93IG5ldyBFUlJfU09DS0VUX0JBRF9QT1JUKG5hbWUsIHBvcnQsIGFsbG93WmVybylcbiAgfVxuICByZXR1cm4gcG9ydCB8IDBcbn1cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVBYm9ydFNpZ25hbFxuICogQHBhcmFtIHsqfSBzaWduYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFib3J0U2lnbmFsfSAqL1xuY29uc3QgdmFsaWRhdGVBYm9ydFNpZ25hbCA9IGhpZGVTdGFja0ZyYW1lcygoc2lnbmFsLCBuYW1lKSA9PiB7XG4gIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCAmJiAoc2lnbmFsID09PSBudWxsIHx8IHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBYm9ydFNpZ25hbCcsIHNpZ25hbClcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVGdW5jdGlvblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVGdW5jdGlvbn0gKi9cbmNvbnN0IHZhbGlkYXRlRnVuY3Rpb24gPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnRnVuY3Rpb24nLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlUGxhaW5GdW5jdGlvblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVQbGFpbkZ1bmN0aW9ufSAqL1xuY29uc3QgdmFsaWRhdGVQbGFpbkZ1bmN0aW9uID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nIHx8IGlzQXN5bmNGdW5jdGlvbih2YWx1ZSkpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnRnVuY3Rpb24nLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlVW5kZWZpbmVkXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgdW5kZWZpbmVkfVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVVbmRlZmluZWR9ICovXG5jb25zdCB2YWxpZGF0ZVVuZGVmaW5lZCA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUpID0+IHtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAndW5kZWZpbmVkJywgdmFsdWUpXG59KVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtUW119IHVuaW9uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlVW5pb24odmFsdWUsIG5hbWUsIHVuaW9uKSB7XG4gIGlmICghQXJyYXlQcm90b3R5cGVJbmNsdWRlcyh1bmlvbiwgdmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsIGAoJyR7QXJyYXlQcm90b3R5cGVKb2luKHVuaW9uLCAnfCcpfScpYCwgdmFsdWUpXG4gIH1cbn1cblxuLypcbiAgVGhlIHJ1bGVzIGZvciB0aGUgTGluayBoZWFkZXIgZmllbGQgYXJlIGRlc2NyaWJlZCBoZXJlOlxuICBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjODI4OC5odG1sI3NlY3Rpb24tM1xuXG4gIFRoaXMgcmVnZXggdmFsaWRhdGVzIGFueSBzdHJpbmcgc3Vycm91bmRlZCBieSBhbmdsZSBicmFja2V0c1xuICAobm90IG5lY2Vzc2FyaWx5IGEgdmFsaWQgVVJJIHJlZmVyZW5jZSkgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlXG4gIGxpbmstcGFyYW1zIHNlcGFyYXRlZCBieSBzZW1pY29sb25zLlxuKi9cbmNvbnN0IGxpbmtWYWx1ZVJlZ0V4cCA9IC9eKD86PFtePl0qPikoPzpcXHMqO1xccypbXjtcIlxcc10rKD86PShcIik/W147XCJcXHNdKlxcMSk/KSokL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMaW5rSGVhZGVyRm9ybWF0KHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8ICFSZWdFeHBQcm90b3R5cGVFeGVjKGxpbmtWYWx1ZVJlZ0V4cCwgdmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgICdtdXN0IGJlIGFuIGFycmF5IG9yIHN0cmluZyBvZiBmb3JtYXQgXCI8L3N0eWxlcy5jc3M+OyByZWw9cHJlbG9hZDsgYXM9c3R5bGVcIidcbiAgICApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gaGludHNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMaW5rSGVhZGVyVmFsdWUoaGludHMpIHtcbiAgaWYgKHR5cGVvZiBoaW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWxpZGF0ZUxpbmtIZWFkZXJGb3JtYXQoaGludHMsICdoaW50cycpXG4gICAgcmV0dXJuIGhpbnRzXG4gIH0gZWxzZSBpZiAoQXJyYXlJc0FycmF5KGhpbnRzKSkge1xuICAgIGNvbnN0IGhpbnRzTGVuZ3RoID0gaGludHMubGVuZ3RoXG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgaWYgKGhpbnRzTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGludHNMZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGluayA9IGhpbnRzW2ldXG4gICAgICB2YWxpZGF0ZUxpbmtIZWFkZXJGb3JtYXQobGluaywgJ2hpbnRzJylcbiAgICAgIHJlc3VsdCArPSBsaW5rXG4gICAgICBpZiAoaSAhPT0gaGludHNMZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCAnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKFxuICAgICdoaW50cycsXG4gICAgaGludHMsXG4gICAgJ211c3QgYmUgYW4gYXJyYXkgb3Igc3RyaW5nIG9mIGZvcm1hdCBcIjwvc3R5bGVzLmNzcz47IHJlbD1wcmVsb2FkOyBhcz1zdHlsZVwiJ1xuICApXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNJbnQzMixcbiAgaXNVaW50MzIsXG4gIHBhcnNlRmlsZU1vZGUsXG4gIHZhbGlkYXRlQXJyYXksXG4gIHZhbGlkYXRlU3RyaW5nQXJyYXksXG4gIHZhbGlkYXRlQm9vbGVhbkFycmF5LFxuICB2YWxpZGF0ZUFib3J0U2lnbmFsQXJyYXksXG4gIHZhbGlkYXRlQm9vbGVhbixcbiAgdmFsaWRhdGVCdWZmZXIsXG4gIHZhbGlkYXRlRGljdGlvbmFyeSxcbiAgdmFsaWRhdGVFbmNvZGluZyxcbiAgdmFsaWRhdGVGdW5jdGlvbixcbiAgdmFsaWRhdGVJbnQzMixcbiAgdmFsaWRhdGVJbnRlZ2VyLFxuICB2YWxpZGF0ZU51bWJlcixcbiAgdmFsaWRhdGVPYmplY3QsXG4gIHZhbGlkYXRlT25lT2YsXG4gIHZhbGlkYXRlUGxhaW5GdW5jdGlvbixcbiAgdmFsaWRhdGVQb3J0LFxuICB2YWxpZGF0ZVNpZ25hbE5hbWUsXG4gIHZhbGlkYXRlU3RyaW5nLFxuICB2YWxpZGF0ZVVpbnQzMixcbiAgdmFsaWRhdGVVbmRlZmluZWQsXG4gIHZhbGlkYXRlVW5pb24sXG4gIHZhbGlkYXRlQWJvcnRTaWduYWwsXG4gIHZhbGlkYXRlTGlua0hlYWRlclZhbHVlXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///277\n")},76371:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { format, inspect, AggregateError: CustomAggregateError } = __webpack_require__(57760)\n\n/*\n This file is a reduced and adapted version of the main lib/internal/errors.js file defined at\n\n https://github.com/nodejs/node/blob/master/lib/internal/errors.js\n\n Don't try to replace with the original file and keep it up to date (starting from E(...) definitions)\n with the upstream file.\n*/\n\nconst AggregateError = globalThis.AggregateError || CustomAggregateError\nconst kIsNodeError = Symbol('kIsNodeError')\nconst kTypes = [\n 'string',\n 'function',\n 'number',\n 'object',\n // Accept 'Function' and 'Object' as alternative to the lower cased version.\n 'Function',\n 'Object',\n 'boolean',\n 'bigint',\n 'symbol'\n]\nconst classRegExp = /^([A-Z][a-z0-9]*)+$/\nconst nodeInternalPrefix = '__node_internal_'\nconst codes = {}\nfunction assert(value, message) {\n if (!value) {\n throw new codes.ERR_INTERNAL_ASSERTION(message)\n }\n}\n\n// Only use this for integers! Decimal numbers do not work with this function.\nfunction addNumericalSeparator(val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\nfunction getMessage(key, msg, args) {\n if (typeof msg === 'function') {\n assert(\n msg.length <= args.length,\n // Default options do not count.\n `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).`\n )\n return msg(...args)\n }\n const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length\n assert(\n expectedLength === args.length,\n `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).`\n )\n if (args.length === 0) {\n return msg\n }\n return format(msg, ...args)\n}\nfunction E(code, message, Base) {\n if (!Base) {\n Base = Error\n }\n class NodeError extends Base {\n constructor(...args) {\n super(getMessage(code, message, args))\n }\n toString() {\n return `${this.name} [${code}]: ${this.message}`\n }\n }\n Object.defineProperties(NodeError.prototype, {\n name: {\n value: Base.name,\n writable: true,\n enumerable: false,\n configurable: true\n },\n toString: {\n value() {\n return `${this.name} [${code}]: ${this.message}`\n },\n writable: true,\n enumerable: false,\n configurable: true\n }\n })\n NodeError.prototype.code = code\n NodeError.prototype[kIsNodeError] = true\n codes[code] = NodeError\n}\nfunction hideStackFrames(fn) {\n // We rename the functions that will be hidden to cut off the stacktrace\n // at the outermost one\n const hidden = nodeInternalPrefix + fn.name\n Object.defineProperty(fn, 'name', {\n value: hidden\n })\n return fn\n}\nfunction aggregateTwoErrors(innerError, outerError) {\n if (innerError && outerError && innerError !== outerError) {\n if (Array.isArray(outerError.errors)) {\n // If `outerError` is already an `AggregateError`.\n outerError.errors.push(innerError)\n return outerError\n }\n const err = new AggregateError([outerError, innerError], outerError.message)\n err.code = outerError.code\n return err\n }\n return innerError || outerError\n}\nclass AbortError extends Error {\n constructor(message = 'The operation was aborted', options = undefined) {\n if (options !== undefined && typeof options !== 'object') {\n throw new codes.ERR_INVALID_ARG_TYPE('options', 'Object', options)\n }\n super(message, options)\n this.code = 'ABORT_ERR'\n this.name = 'AbortError'\n }\n}\nE('ERR_ASSERTION', '%s', Error)\nE(\n 'ERR_INVALID_ARG_TYPE',\n (name, expected, actual) => {\n assert(typeof name === 'string', \"'name' must be a string\")\n if (!Array.isArray(expected)) {\n expected = [expected]\n }\n let msg = 'The '\n if (name.endsWith(' argument')) {\n // For cases like 'first argument'\n msg += `${name} `\n } else {\n msg += `\"${name}\" ${name.includes('.') ? 'property' : 'argument'} `\n }\n msg += 'must be '\n const types = []\n const instances = []\n const other = []\n for (const value of expected) {\n assert(typeof value === 'string', 'All expected entries have to be of type string')\n if (kTypes.includes(value)) {\n types.push(value.toLowerCase())\n } else if (classRegExp.test(value)) {\n instances.push(value)\n } else {\n assert(value !== 'object', 'The value \"object\" should be written as \"Object\"')\n other.push(value)\n }\n }\n\n // Special handle `object` in case other instances are allowed to outline\n // the differences between each other.\n if (instances.length > 0) {\n const pos = types.indexOf('object')\n if (pos !== -1) {\n types.splice(types, pos, 1)\n instances.push('Object')\n }\n }\n if (types.length > 0) {\n switch (types.length) {\n case 1:\n msg += `of type ${types[0]}`\n break\n case 2:\n msg += `one of type ${types[0]} or ${types[1]}`\n break\n default: {\n const last = types.pop()\n msg += `one of type ${types.join(', ')}, or ${last}`\n }\n }\n if (instances.length > 0 || other.length > 0) {\n msg += ' or '\n }\n }\n if (instances.length > 0) {\n switch (instances.length) {\n case 1:\n msg += `an instance of ${instances[0]}`\n break\n case 2:\n msg += `an instance of ${instances[0]} or ${instances[1]}`\n break\n default: {\n const last = instances.pop()\n msg += `an instance of ${instances.join(', ')}, or ${last}`\n }\n }\n if (other.length > 0) {\n msg += ' or '\n }\n }\n switch (other.length) {\n case 0:\n break\n case 1:\n if (other[0].toLowerCase() !== other[0]) {\n msg += 'an '\n }\n msg += `${other[0]}`\n break\n case 2:\n msg += `one of ${other[0]} or ${other[1]}`\n break\n default: {\n const last = other.pop()\n msg += `one of ${other.join(', ')}, or ${last}`\n }\n }\n if (actual == null) {\n msg += `. Received ${actual}`\n } else if (typeof actual === 'function' && actual.name) {\n msg += `. Received function ${actual.name}`\n } else if (typeof actual === 'object') {\n var _actual$constructor\n if (\n (_actual$constructor = actual.constructor) !== null &&\n _actual$constructor !== undefined &&\n _actual$constructor.name\n ) {\n msg += `. Received an instance of ${actual.constructor.name}`\n } else {\n const inspected = inspect(actual, {\n depth: -1\n })\n msg += `. Received ${inspected}`\n }\n } else {\n let inspected = inspect(actual, {\n colors: false\n })\n if (inspected.length > 25) {\n inspected = `${inspected.slice(0, 25)}...`\n }\n msg += `. Received type ${typeof actual} (${inspected})`\n }\n return msg\n },\n TypeError\n)\nE(\n 'ERR_INVALID_ARG_VALUE',\n (name, value, reason = 'is invalid') => {\n let inspected = inspect(value)\n if (inspected.length > 128) {\n inspected = inspected.slice(0, 128) + '...'\n }\n const type = name.includes('.') ? 'property' : 'argument'\n return `The ${type} '${name}' ${reason}. Received ${inspected}`\n },\n TypeError\n)\nE(\n 'ERR_INVALID_RETURN_VALUE',\n (input, name, value) => {\n var _value$constructor\n const type =\n value !== null &&\n value !== undefined &&\n (_value$constructor = value.constructor) !== null &&\n _value$constructor !== undefined &&\n _value$constructor.name\n ? `instance of ${value.constructor.name}`\n : `type ${typeof value}`\n return `Expected ${input} to be returned from the \"${name}\"` + ` function but got ${type}.`\n },\n TypeError\n)\nE(\n 'ERR_MISSING_ARGS',\n (...args) => {\n assert(args.length > 0, 'At least one arg needs to be specified')\n let msg\n const len = args.length\n args = (Array.isArray(args) ? args : [args]).map((a) => `\"${a}\"`).join(' or ')\n switch (len) {\n case 1:\n msg += `The ${args[0]} argument`\n break\n case 2:\n msg += `The ${args[0]} and ${args[1]} arguments`\n break\n default:\n {\n const last = args.pop()\n msg += `The ${args.join(', ')}, and ${last} arguments`\n }\n break\n }\n return `${msg} must be specified`\n },\n TypeError\n)\nE(\n 'ERR_OUT_OF_RANGE',\n (str, range, input) => {\n assert(range, 'Missing \"range\" argument')\n let received\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > 2n ** 32n || input < -(2n ** 32n)) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n } else {\n received = inspect(input)\n }\n return `The value of \"${str}\" is out of range. It must be ${range}. Received ${received}`\n },\n RangeError\n)\nE('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times', Error)\nE('ERR_METHOD_NOT_IMPLEMENTED', 'The %s method is not implemented', Error)\nE('ERR_STREAM_ALREADY_FINISHED', 'Cannot call %s after a stream was finished', Error)\nE('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable', Error)\nE('ERR_STREAM_DESTROYED', 'Cannot call %s after a stream was destroyed', Error)\nE('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError)\nE('ERR_STREAM_PREMATURE_CLOSE', 'Premature close', Error)\nE('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF', Error)\nE('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event', Error)\nE('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error)\nE('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError)\nmodule.exports = {\n AbortError,\n aggregateTwoErrors: hideStackFrames(aggregateTwoErrors),\n hideStackFrames,\n codes\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYzNzEuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosUUFBUSx3REFBd0QsRUFBRSxtQkFBTyxDQUFDLEtBQVE7O0FBRWxGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGdCQUFnQjtBQUN6QixjQUFjLG9CQUFvQixFQUFFLElBQUk7QUFDeEM7QUFDQSxZQUFZLGdCQUFnQixFQUFFLElBQUk7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxNQUFNLGlDQUFpQyxZQUFZLHNDQUFzQyxXQUFXO0FBQ25IO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTSxpQ0FBaUMsWUFBWSxzQ0FBc0MsZUFBZTtBQUNySDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsV0FBVyxHQUFHLEtBQUssS0FBSyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtCQUFrQixXQUFXLEdBQUcsS0FBSyxLQUFLLGFBQWE7QUFDdkQsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCLE1BQU07QUFDTixpQkFBaUIsS0FBSyxJQUFJLDhDQUE4QztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFNBQVM7QUFDckM7QUFDQTtBQUNBLGdDQUFnQyxVQUFVLEtBQUssU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsaUJBQWlCLE9BQU8sS0FBSztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsYUFBYTtBQUNoRDtBQUNBO0FBQ0EsbUNBQW1DLGNBQWMsS0FBSyxhQUFhO0FBQ25FO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUIsT0FBTyxLQUFLO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBLHlCQUF5QixVQUFVLEtBQUssU0FBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUJBQWlCLE9BQU8sS0FBSztBQUN0RDtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsT0FBTztBQUNsQyxNQUFNO0FBQ04sb0NBQW9DLFlBQVk7QUFDaEQsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0Qyx3QkFBd0I7QUFDcEUsUUFBUTtBQUNSO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsNkJBQTZCLFVBQVU7QUFDdkM7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHVCQUF1Qix1QkFBdUI7QUFDOUM7QUFDQSxnQ0FBZ0MsZUFBZSxHQUFHLFVBQVU7QUFDNUQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixNQUFNLEdBQUcsS0FBSyxJQUFJLE9BQU8sYUFBYSxVQUFVO0FBQ2xFLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hELGtCQUFrQixhQUFhO0FBQy9CLHVCQUF1QixPQUFPLDJCQUEyQixLQUFLLDBCQUEwQixLQUFLO0FBQzdGLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLEVBQUU7QUFDbEU7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUyxNQUFNLFNBQVM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCLFFBQVEsTUFBTTtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSw0QkFBNEIsSUFBSSxnQ0FBZ0MsTUFBTSxhQUFhLFNBQVM7QUFDNUYsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL291cnMvZXJyb3JzLmpzPzJkNzEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZm9ybWF0LCBpbnNwZWN0LCBBZ2dyZWdhdGVFcnJvcjogQ3VzdG9tQWdncmVnYXRlRXJyb3IgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8qXG4gIFRoaXMgZmlsZSBpcyBhIHJlZHVjZWQgYW5kIGFkYXB0ZWQgdmVyc2lvbiBvZiB0aGUgbWFpbiBsaWIvaW50ZXJuYWwvZXJyb3JzLmpzIGZpbGUgZGVmaW5lZCBhdFxuXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21hc3Rlci9saWIvaW50ZXJuYWwvZXJyb3JzLmpzXG5cbiAgRG9uJ3QgdHJ5IHRvIHJlcGxhY2Ugd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSBhbmQga2VlcCBpdCB1cCB0byBkYXRlIChzdGFydGluZyBmcm9tIEUoLi4uKSBkZWZpbml0aW9ucylcbiAgd2l0aCB0aGUgdXBzdHJlYW0gZmlsZS5cbiovXG5cbmNvbnN0IEFnZ3JlZ2F0ZUVycm9yID0gZ2xvYmFsVGhpcy5BZ2dyZWdhdGVFcnJvciB8fCBDdXN0b21BZ2dyZWdhdGVFcnJvclxuY29uc3Qga0lzTm9kZUVycm9yID0gU3ltYm9sKCdrSXNOb2RlRXJyb3InKVxuY29uc3Qga1R5cGVzID0gW1xuICAnc3RyaW5nJyxcbiAgJ2Z1bmN0aW9uJyxcbiAgJ251bWJlcicsXG4gICdvYmplY3QnLFxuICAvLyBBY2NlcHQgJ0Z1bmN0aW9uJyBhbmQgJ09iamVjdCcgYXMgYWx0ZXJuYXRpdmUgdG8gdGhlIGxvd2VyIGNhc2VkIHZlcnNpb24uXG4gICdGdW5jdGlvbicsXG4gICdPYmplY3QnLFxuICAnYm9vbGVhbicsXG4gICdiaWdpbnQnLFxuICAnc3ltYm9sJ1xuXVxuY29uc3QgY2xhc3NSZWdFeHAgPSAvXihbQS1aXVthLXowLTldKikrJC9cbmNvbnN0IG5vZGVJbnRlcm5hbFByZWZpeCA9ICdfX25vZGVfaW50ZXJuYWxfJ1xuY29uc3QgY29kZXMgPSB7fVxuZnVuY3Rpb24gYXNzZXJ0KHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgY29kZXMuRVJSX0lOVEVSTkFMX0FTU0VSVElPTihtZXNzYWdlKVxuICB9XG59XG5cbi8vIE9ubHkgdXNlIHRoaXMgZm9yIGludGVnZXJzISBEZWNpbWFsIG51bWJlcnMgZG8gbm90IHdvcmsgd2l0aCB0aGlzIGZ1bmN0aW9uLlxuZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHZhbCkge1xuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSB2YWwubGVuZ3RoXG4gIGNvbnN0IHN0YXJ0ID0gdmFsWzBdID09PSAnLScgPyAxIDogMFxuICBmb3IgKDsgaSA+PSBzdGFydCArIDQ7IGkgLT0gMykge1xuICAgIHJlcyA9IGBfJHt2YWwuc2xpY2UoaSAtIDMsIGkpfSR7cmVzfWBcbiAgfVxuICByZXR1cm4gYCR7dmFsLnNsaWNlKDAsIGkpfSR7cmVzfWBcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoa2V5LCBtc2csIGFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBtc2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NlcnQoXG4gICAgICBtc2cubGVuZ3RoIDw9IGFyZ3MubGVuZ3RoLFxuICAgICAgLy8gRGVmYXVsdCBvcHRpb25zIGRvIG5vdCBjb3VudC5cbiAgICAgIGBDb2RlOiAke2tleX07IFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbGVuZ3RoICgke2FyZ3MubGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIG9uZXMgKCR7bXNnLmxlbmd0aH0pLmBcbiAgICApXG4gICAgcmV0dXJuIG1zZyguLi5hcmdzKVxuICB9XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gKG1zZy5tYXRjaCgvJVtkZmlqb09zXS9nKSB8fCBbXSkubGVuZ3RoXG4gIGFzc2VydChcbiAgICBleHBlY3RlZExlbmd0aCA9PT0gYXJncy5sZW5ndGgsXG4gICAgYENvZGU6ICR7a2V5fTsgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBsZW5ndGggKCR7YXJncy5sZW5ndGh9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgb25lcyAoJHtleHBlY3RlZExlbmd0aH0pLmBcbiAgKVxuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbXNnXG4gIH1cbiAgcmV0dXJuIGZvcm1hdChtc2csIC4uLmFyZ3MpXG59XG5mdW5jdGlvbiBFKGNvZGUsIG1lc3NhZ2UsIEJhc2UpIHtcbiAgaWYgKCFCYXNlKSB7XG4gICAgQmFzZSA9IEVycm9yXG4gIH1cbiAgY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgc3VwZXIoZ2V0TWVzc2FnZShjb2RlLCBtZXNzYWdlLCBhcmdzKSlcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtjb2RlfV06ICR7dGhpcy5tZXNzYWdlfWBcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTm9kZUVycm9yLnByb3RvdHlwZSwge1xuICAgIG5hbWU6IHtcbiAgICAgIHZhbHVlOiBCYXNlLm5hbWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSxcbiAgICB0b1N0cmluZzoge1xuICAgICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske2NvZGV9XTogJHt0aGlzLm1lc3NhZ2V9YFxuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pXG4gIE5vZGVFcnJvci5wcm90b3R5cGUuY29kZSA9IGNvZGVcbiAgTm9kZUVycm9yLnByb3RvdHlwZVtrSXNOb2RlRXJyb3JdID0gdHJ1ZVxuICBjb2Rlc1tjb2RlXSA9IE5vZGVFcnJvclxufVxuZnVuY3Rpb24gaGlkZVN0YWNrRnJhbWVzKGZuKSB7XG4gIC8vIFdlIHJlbmFtZSB0aGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBoaWRkZW4gdG8gY3V0IG9mZiB0aGUgc3RhY2t0cmFjZVxuICAvLyBhdCB0aGUgb3V0ZXJtb3N0IG9uZVxuICBjb25zdCBoaWRkZW4gPSBub2RlSW50ZXJuYWxQcmVmaXggKyBmbi5uYW1lXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7XG4gICAgdmFsdWU6IGhpZGRlblxuICB9KVxuICByZXR1cm4gZm5cbn1cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhpbm5lckVycm9yLCBvdXRlckVycm9yKSB7XG4gIGlmIChpbm5lckVycm9yICYmIG91dGVyRXJyb3IgJiYgaW5uZXJFcnJvciAhPT0gb3V0ZXJFcnJvcikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGVyRXJyb3IuZXJyb3JzKSkge1xuICAgICAgLy8gSWYgYG91dGVyRXJyb3JgIGlzIGFscmVhZHkgYW4gYEFnZ3JlZ2F0ZUVycm9yYC5cbiAgICAgIG91dGVyRXJyb3IuZXJyb3JzLnB1c2goaW5uZXJFcnJvcilcbiAgICAgIHJldHVybiBvdXRlckVycm9yXG4gICAgfVxuICAgIGNvbnN0IGVyciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihbb3V0ZXJFcnJvciwgaW5uZXJFcnJvcl0sIG91dGVyRXJyb3IubWVzc2FnZSlcbiAgICBlcnIuY29kZSA9IG91dGVyRXJyb3IuY29kZVxuICAgIHJldHVybiBlcnJcbiAgfVxuICByZXR1cm4gaW5uZXJFcnJvciB8fCBvdXRlckVycm9yXG59XG5jbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQnLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBjb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnb3B0aW9ucycsICdPYmplY3QnLCBvcHRpb25zKVxuICAgIH1cbiAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKVxuICAgIHRoaXMuY29kZSA9ICdBQk9SVF9FUlInXG4gICAgdGhpcy5uYW1lID0gJ0Fib3J0RXJyb3InXG4gIH1cbn1cbkUoJ0VSUl9BU1NFUlRJT04nLCAnJXMnLCBFcnJvcilcbkUoXG4gICdFUlJfSU5WQUxJRF9BUkdfVFlQRScsXG4gIChuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSA9PiB7XG4gICAgYXNzZXJ0KHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJywgXCInbmFtZScgbXVzdCBiZSBhIHN0cmluZ1wiKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICAgIGV4cGVjdGVkID0gW2V4cGVjdGVkXVxuICAgIH1cbiAgICBsZXQgbXNnID0gJ1RoZSAnXG4gICAgaWYgKG5hbWUuZW5kc1dpdGgoJyBhcmd1bWVudCcpKSB7XG4gICAgICAvLyBGb3IgY2FzZXMgbGlrZSAnZmlyc3QgYXJndW1lbnQnXG4gICAgICBtc2cgKz0gYCR7bmFtZX0gYFxuICAgIH0gZWxzZSB7XG4gICAgICBtc2cgKz0gYFwiJHtuYW1lfVwiICR7bmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCd9IGBcbiAgICB9XG4gICAgbXNnICs9ICdtdXN0IGJlICdcbiAgICBjb25zdCB0eXBlcyA9IFtdXG4gICAgY29uc3QgaW5zdGFuY2VzID0gW11cbiAgICBjb25zdCBvdGhlciA9IFtdXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBleHBlY3RlZCkge1xuICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsICdBbGwgZXhwZWN0ZWQgZW50cmllcyBoYXZlIHRvIGJlIG9mIHR5cGUgc3RyaW5nJylcbiAgICAgIGlmIChrVHlwZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIHR5cGVzLnB1c2godmFsdWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIH0gZWxzZSBpZiAoY2xhc3NSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgaW5zdGFuY2VzLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQodmFsdWUgIT09ICdvYmplY3QnLCAnVGhlIHZhbHVlIFwib2JqZWN0XCIgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgXCJPYmplY3RcIicpXG4gICAgICAgIG90aGVyLnB1c2godmFsdWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGUgYG9iamVjdGAgaW4gY2FzZSBvdGhlciBpbnN0YW5jZXMgYXJlIGFsbG93ZWQgdG8gb3V0bGluZVxuICAgIC8vIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVhY2ggb3RoZXIuXG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwb3MgPSB0eXBlcy5pbmRleE9mKCdvYmplY3QnKVxuICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgdHlwZXMuc3BsaWNlKHR5cGVzLCBwb3MsIDEpXG4gICAgICAgIGluc3RhbmNlcy5wdXNoKCdPYmplY3QnKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3dpdGNoICh0eXBlcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIG1zZyArPSBgb2YgdHlwZSAke3R5cGVzWzBdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbXNnICs9IGBvbmUgb2YgdHlwZSAke3R5cGVzWzBdfSBvciAke3R5cGVzWzFdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IHR5cGVzLnBvcCgpXG4gICAgICAgICAgbXNnICs9IGBvbmUgb2YgdHlwZSAke3R5cGVzLmpvaW4oJywgJyl9LCBvciAke2xhc3R9YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaW5zdGFuY2VzLmxlbmd0aCA+IDAgfHwgb3RoZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBtc2cgKz0gJyBvciAnXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3dpdGNoIChpbnN0YW5jZXMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBtc2cgKz0gYGFuIGluc3RhbmNlIG9mICR7aW5zdGFuY2VzWzBdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlc1swXX0gb3IgJHtpbnN0YW5jZXNbMV19YFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gaW5zdGFuY2VzLnBvcCgpXG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlcy5qb2luKCcsICcpfSwgb3IgJHtsYXN0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbXNnICs9ICcgb3IgJ1xuICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKG90aGVyLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAob3RoZXJbMF0udG9Mb3dlckNhc2UoKSAhPT0gb3RoZXJbMF0pIHtcbiAgICAgICAgICBtc2cgKz0gJ2FuICdcbiAgICAgICAgfVxuICAgICAgICBtc2cgKz0gYCR7b3RoZXJbMF19YFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICBtc2cgKz0gYG9uZSBvZiAke290aGVyWzBdfSBvciAke290aGVyWzFdfWBcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbGFzdCA9IG90aGVyLnBvcCgpXG4gICAgICAgIG1zZyArPSBgb25lIG9mICR7b3RoZXIuam9pbignLCAnKX0sIG9yICR7bGFzdH1gXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhY3R1YWwgPT0gbnVsbCkge1xuICAgICAgbXNnICs9IGAuIFJlY2VpdmVkICR7YWN0dWFsfWBcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgPT09ICdmdW5jdGlvbicgJiYgYWN0dWFsLm5hbWUpIHtcbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCBmdW5jdGlvbiAke2FjdHVhbC5uYW1lfWBcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2FjdHVhbCRjb25zdHJ1Y3RvclxuICAgICAgaWYgKFxuICAgICAgICAoX2FjdHVhbCRjb25zdHJ1Y3RvciA9IGFjdHVhbC5jb25zdHJ1Y3RvcikgIT09IG51bGwgJiZcbiAgICAgICAgX2FjdHVhbCRjb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9hY3R1YWwkY29uc3RydWN0b3IubmFtZVxuICAgICAgKSB7XG4gICAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCBhbiBpbnN0YW5jZSBvZiAke2FjdHVhbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluc3BlY3RlZCA9IGluc3BlY3QoYWN0dWFsLCB7XG4gICAgICAgICAgZGVwdGg6IC0xXG4gICAgICAgIH0pXG4gICAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCAke2luc3BlY3RlZH1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpbnNwZWN0ZWQgPSBpbnNwZWN0KGFjdHVhbCwge1xuICAgICAgICBjb2xvcnM6IGZhbHNlXG4gICAgICB9KVxuICAgICAgaWYgKGluc3BlY3RlZC5sZW5ndGggPiAyNSkge1xuICAgICAgICBpbnNwZWN0ZWQgPSBgJHtpbnNwZWN0ZWQuc2xpY2UoMCwgMjUpfS4uLmBcbiAgICAgIH1cbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGFjdHVhbH0gKCR7aW5zcGVjdGVkfSlgXG4gICAgfVxuICAgIHJldHVybiBtc2dcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX0lOVkFMSURfQVJHX1ZBTFVFJyxcbiAgKG5hbWUsIHZhbHVlLCByZWFzb24gPSAnaXMgaW52YWxpZCcpID0+IHtcbiAgICBsZXQgaW5zcGVjdGVkID0gaW5zcGVjdCh2YWx1ZSlcbiAgICBpZiAoaW5zcGVjdGVkLmxlbmd0aCA+IDEyOCkge1xuICAgICAgaW5zcGVjdGVkID0gaW5zcGVjdGVkLnNsaWNlKDAsIDEyOCkgKyAnLi4uJ1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gbmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCdcbiAgICByZXR1cm4gYFRoZSAke3R5cGV9ICcke25hbWV9JyAke3JlYXNvbn0uIFJlY2VpdmVkICR7aW5zcGVjdGVkfWBcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFJyxcbiAgKGlucHV0LCBuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIHZhciBfdmFsdWUkY29uc3RydWN0b3JcbiAgICBjb25zdCB0eXBlID1cbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX3ZhbHVlJGNvbnN0cnVjdG9yID0gdmFsdWUuY29uc3RydWN0b3IpICE9PSBudWxsICYmXG4gICAgICBfdmFsdWUkY29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgX3ZhbHVlJGNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgPyBgaW5zdGFuY2Ugb2YgJHt2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgOiBgdHlwZSAke3R5cGVvZiB2YWx1ZX1gXG4gICAgcmV0dXJuIGBFeHBlY3RlZCAke2lucHV0fSB0byBiZSByZXR1cm5lZCBmcm9tIHRoZSBcIiR7bmFtZX1cImAgKyBgIGZ1bmN0aW9uIGJ1dCBnb3QgJHt0eXBlfS5gXG4gIH0sXG4gIFR5cGVFcnJvclxuKVxuRShcbiAgJ0VSUl9NSVNTSU5HX0FSR1MnLFxuICAoLi4uYXJncykgPT4ge1xuICAgIGFzc2VydChhcmdzLmxlbmd0aCA+IDAsICdBdCBsZWFzdCBvbmUgYXJnIG5lZWRzIHRvIGJlIHNwZWNpZmllZCcpXG4gICAgbGV0IG1zZ1xuICAgIGNvbnN0IGxlbiA9IGFyZ3MubGVuZ3RoXG4gICAgYXJncyA9IChBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXSkubWFwKChhKSA9PiBgXCIke2F9XCJgKS5qb2luKCcgb3IgJylcbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3NbMF19IGFyZ3VtZW50YFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3NbMF19IGFuZCAke2FyZ3NbMV19IGFyZ3VtZW50c2BcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gYXJncy5wb3AoKVxuICAgICAgICAgIG1zZyArPSBgVGhlICR7YXJncy5qb2luKCcsICcpfSwgYW5kICR7bGFzdH0gYXJndW1lbnRzYFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIHJldHVybiBgJHttc2d9IG11c3QgYmUgc3BlY2lmaWVkYFxuICB9LFxuICBUeXBlRXJyb3JcbilcbkUoXG4gICdFUlJfT1VUX09GX1JBTkdFJyxcbiAgKHN0ciwgcmFuZ2UsIGlucHV0KSA9PiB7XG4gICAgYXNzZXJ0KHJhbmdlLCAnTWlzc2luZyBcInJhbmdlXCIgYXJndW1lbnQnKVxuICAgIGxldCByZWNlaXZlZFxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSAmJiBNYXRoLmFicyhpbnB1dCkgPiAyICoqIDMyKSB7XG4gICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihTdHJpbmcoaW5wdXQpKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpXG4gICAgICBpZiAoaW5wdXQgPiAybiAqKiAzMm4gfHwgaW5wdXQgPCAtKDJuICoqIDMybikpIHtcbiAgICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IocmVjZWl2ZWQpXG4gICAgICB9XG4gICAgICByZWNlaXZlZCArPSAnbidcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjZWl2ZWQgPSBpbnNwZWN0KGlucHV0KVxuICAgIH1cbiAgICByZXR1cm4gYFRoZSB2YWx1ZSBvZiBcIiR7c3RyfVwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSAke3JhbmdlfS4gUmVjZWl2ZWQgJHtyZWNlaXZlZH1gXG4gIH0sXG4gIFJhbmdlRXJyb3JcbilcbkUoJ0VSUl9NVUxUSVBMRV9DQUxMQkFDSycsICdDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnLCBFcnJvcilcbkUoJ0VSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEJywgJ1RoZSAlcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQnLCAnQ2Fubm90IGNhbGwgJXMgYWZ0ZXIgYSBzdHJlYW0gd2FzIGZpbmlzaGVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0NBTk5PVF9QSVBFJywgJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fREVTVFJPWUVEJywgJ0Nhbm5vdCBjYWxsICVzIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fTlVMTF9WQUxVRVMnLCAnTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nLCBUeXBlRXJyb3IpXG5FKCdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScsICdQcmVtYXR1cmUgY2xvc2UnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YnLCAnc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQnLCAnc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EJywgJ3dyaXRlIGFmdGVyIGVuZCcsIEVycm9yKVxuRSgnRVJSX1VOS05PV05fRU5DT0RJTkcnLCAnVW5rbm93biBlbmNvZGluZzogJXMnLCBUeXBlRXJyb3IpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQWJvcnRFcnJvcixcbiAgYWdncmVnYXRlVHdvRXJyb3JzOiBoaWRlU3RhY2tGcmFtZXMoYWdncmVnYXRlVHdvRXJyb3JzKSxcbiAgaGlkZVN0YWNrRnJhbWVzLFxuICBjb2Rlc1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///76371\n")},34478:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst Stream = __webpack_require__(2203)\nif (Stream && process.env.READABLE_STREAM === 'disable') {\n const promises = Stream.promises\n\n // Explicit export naming is needed for ESM\n module.exports._uint8ArrayToBuffer = Stream._uint8ArrayToBuffer\n module.exports._isUint8Array = Stream._isUint8Array\n module.exports.isDisturbed = Stream.isDisturbed\n module.exports.isErrored = Stream.isErrored\n module.exports.isReadable = Stream.isReadable\n module.exports.Readable = Stream.Readable\n module.exports.Writable = Stream.Writable\n module.exports.Duplex = Stream.Duplex\n module.exports.Transform = Stream.Transform\n module.exports.PassThrough = Stream.PassThrough\n module.exports.addAbortSignal = Stream.addAbortSignal\n module.exports.finished = Stream.finished\n module.exports.destroy = Stream.destroy\n module.exports.pipeline = Stream.pipeline\n module.exports.compose = Stream.compose\n Object.defineProperty(Stream, 'promises', {\n configurable: true,\n enumerable: true,\n get() {\n return promises\n }\n })\n module.exports.Stream = Stream.Stream\n} else {\n const CustomStream = __webpack_require__(85506)\n const promises = __webpack_require__(43095)\n const originalDestroy = CustomStream.Readable.destroy\n module.exports = CustomStream.Readable\n\n // Explicit export naming is needed for ESM\n module.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer\n module.exports._isUint8Array = CustomStream._isUint8Array\n module.exports.isDisturbed = CustomStream.isDisturbed\n module.exports.isErrored = CustomStream.isErrored\n module.exports.isReadable = CustomStream.isReadable\n module.exports.Readable = CustomStream.Readable\n module.exports.Writable = CustomStream.Writable\n module.exports.Duplex = CustomStream.Duplex\n module.exports.Transform = CustomStream.Transform\n module.exports.PassThrough = CustomStream.PassThrough\n module.exports.addAbortSignal = CustomStream.addAbortSignal\n module.exports.finished = CustomStream.finished\n module.exports.destroy = CustomStream.destroy\n module.exports.destroy = originalDestroy\n module.exports.pipeline = CustomStream.pipeline\n module.exports.compose = CustomStream.compose\n Object.defineProperty(CustomStream, 'promises', {\n configurable: true,\n enumerable: true,\n get() {\n return promises\n }\n })\n module.exports.Stream = CustomStream.Stream\n}\n\n// Allow default importing\nmodule.exports[\"default\"] = module.exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ0NzguanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosZUFBZSxtQkFBTyxDQUFDLElBQVE7QUFDL0I7QUFDQTs7QUFFQTtBQUNBLEVBQUUsa0NBQWtDO0FBQ3BDLEVBQUUsNEJBQTRCO0FBQzlCLEVBQUUsMEJBQTBCO0FBQzVCLEVBQUUsd0JBQXdCO0FBQzFCLEVBQUUseUJBQXlCO0FBQzNCLEVBQUUsdUJBQXVCO0FBQ3pCLEVBQUUsdUJBQXVCO0FBQ3pCLEVBQUUscUJBQXFCO0FBQ3ZCLEVBQUUsd0JBQXdCO0FBQzFCLEVBQUUsMEJBQTBCO0FBQzVCLEVBQUUsNkJBQTZCO0FBQy9CLEVBQUUsdUJBQXVCO0FBQ3pCLEVBQUUsc0JBQXNCO0FBQ3hCLEVBQUUsdUJBQXVCO0FBQ3pCLEVBQUUsc0JBQXNCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFLHFCQUFxQjtBQUN2QixFQUFFO0FBQ0YsdUJBQXVCLG1CQUFPLENBQUMsS0FBVztBQUMxQyxtQkFBbUIsbUJBQU8sQ0FBQyxLQUFvQjtBQUMvQztBQUNBOztBQUVBO0FBQ0EsRUFBRSxrQ0FBa0M7QUFDcEMsRUFBRSw0QkFBNEI7QUFDOUIsRUFBRSwwQkFBMEI7QUFDNUIsRUFBRSx3QkFBd0I7QUFDMUIsRUFBRSx5QkFBeUI7QUFDM0IsRUFBRSx1QkFBdUI7QUFDekIsRUFBRSx1QkFBdUI7QUFDekIsRUFBRSxxQkFBcUI7QUFDdkIsRUFBRSx3QkFBd0I7QUFDMUIsRUFBRSwwQkFBMEI7QUFDNUIsRUFBRSw2QkFBNkI7QUFDL0IsRUFBRSx1QkFBdUI7QUFDekIsRUFBRSxzQkFBc0I7QUFDeEIsRUFBRSxzQkFBc0I7QUFDeEIsRUFBRSx1QkFBdUI7QUFDekIsRUFBRSxzQkFBc0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUUscUJBQXFCO0FBQ3ZCOztBQUVBO0FBQ0EseUJBQXNCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL291cnMvaW5kZXguanM/ZjYxZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmlmIChTdHJlYW0gJiYgcHJvY2Vzcy5lbnYuUkVBREFCTEVfU1RSRUFNID09PSAnZGlzYWJsZScpIHtcbiAgY29uc3QgcHJvbWlzZXMgPSBTdHJlYW0ucHJvbWlzZXNcblxuICAvLyBFeHBsaWNpdCBleHBvcnQgbmFtaW5nIGlzIG5lZWRlZCBmb3IgRVNNXG4gIG1vZHVsZS5leHBvcnRzLl91aW50OEFycmF5VG9CdWZmZXIgPSBTdHJlYW0uX3VpbnQ4QXJyYXlUb0J1ZmZlclxuICBtb2R1bGUuZXhwb3J0cy5faXNVaW50OEFycmF5ID0gU3RyZWFtLl9pc1VpbnQ4QXJyYXlcbiAgbW9kdWxlLmV4cG9ydHMuaXNEaXN0dXJiZWQgPSBTdHJlYW0uaXNEaXN0dXJiZWRcbiAgbW9kdWxlLmV4cG9ydHMuaXNFcnJvcmVkID0gU3RyZWFtLmlzRXJyb3JlZFxuICBtb2R1bGUuZXhwb3J0cy5pc1JlYWRhYmxlID0gU3RyZWFtLmlzUmVhZGFibGVcbiAgbW9kdWxlLmV4cG9ydHMuUmVhZGFibGUgPSBTdHJlYW0uUmVhZGFibGVcbiAgbW9kdWxlLmV4cG9ydHMuV3JpdGFibGUgPSBTdHJlYW0uV3JpdGFibGVcbiAgbW9kdWxlLmV4cG9ydHMuRHVwbGV4ID0gU3RyZWFtLkR1cGxleFxuICBtb2R1bGUuZXhwb3J0cy5UcmFuc2Zvcm0gPSBTdHJlYW0uVHJhbnNmb3JtXG4gIG1vZHVsZS5leHBvcnRzLlBhc3NUaHJvdWdoID0gU3RyZWFtLlBhc3NUaHJvdWdoXG4gIG1vZHVsZS5leHBvcnRzLmFkZEFib3J0U2lnbmFsID0gU3RyZWFtLmFkZEFib3J0U2lnbmFsXG4gIG1vZHVsZS5leHBvcnRzLmZpbmlzaGVkID0gU3RyZWFtLmZpbmlzaGVkXG4gIG1vZHVsZS5leHBvcnRzLmRlc3Ryb3kgPSBTdHJlYW0uZGVzdHJveVxuICBtb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IFN0cmVhbS5waXBlbGluZVxuICBtb2R1bGUuZXhwb3J0cy5jb21wb3NlID0gU3RyZWFtLmNvbXBvc2VcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmVhbSwgJ3Byb21pc2VzJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlc1xuICAgIH1cbiAgfSlcbiAgbW9kdWxlLmV4cG9ydHMuU3RyZWFtID0gU3RyZWFtLlN0cmVhbVxufSBlbHNlIHtcbiAgY29uc3QgQ3VzdG9tU3RyZWFtID0gcmVxdWlyZSgnLi4vc3RyZWFtJylcbiAgY29uc3QgcHJvbWlzZXMgPSByZXF1aXJlKCcuLi9zdHJlYW0vcHJvbWlzZXMnKVxuICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBDdXN0b21TdHJlYW0uUmVhZGFibGUuZGVzdHJveVxuICBtb2R1bGUuZXhwb3J0cyA9IEN1c3RvbVN0cmVhbS5SZWFkYWJsZVxuXG4gIC8vIEV4cGxpY2l0IGV4cG9ydCBuYW1pbmcgaXMgbmVlZGVkIGZvciBFU01cbiAgbW9kdWxlLmV4cG9ydHMuX3VpbnQ4QXJyYXlUb0J1ZmZlciA9IEN1c3RvbVN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyXG4gIG1vZHVsZS5leHBvcnRzLl9pc1VpbnQ4QXJyYXkgPSBDdXN0b21TdHJlYW0uX2lzVWludDhBcnJheVxuICBtb2R1bGUuZXhwb3J0cy5pc0Rpc3R1cmJlZCA9IEN1c3RvbVN0cmVhbS5pc0Rpc3R1cmJlZFxuICBtb2R1bGUuZXhwb3J0cy5pc0Vycm9yZWQgPSBDdXN0b21TdHJlYW0uaXNFcnJvcmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzUmVhZGFibGUgPSBDdXN0b21TdHJlYW0uaXNSZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5SZWFkYWJsZSA9IEN1c3RvbVN0cmVhbS5SZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5Xcml0YWJsZSA9IEN1c3RvbVN0cmVhbS5Xcml0YWJsZVxuICBtb2R1bGUuZXhwb3J0cy5EdXBsZXggPSBDdXN0b21TdHJlYW0uRHVwbGV4XG4gIG1vZHVsZS5leHBvcnRzLlRyYW5zZm9ybSA9IEN1c3RvbVN0cmVhbS5UcmFuc2Zvcm1cbiAgbW9kdWxlLmV4cG9ydHMuUGFzc1Rocm91Z2ggPSBDdXN0b21TdHJlYW0uUGFzc1Rocm91Z2hcbiAgbW9kdWxlLmV4cG9ydHMuYWRkQWJvcnRTaWduYWwgPSBDdXN0b21TdHJlYW0uYWRkQWJvcnRTaWduYWxcbiAgbW9kdWxlLmV4cG9ydHMuZmluaXNoZWQgPSBDdXN0b21TdHJlYW0uZmluaXNoZWRcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IEN1c3RvbVN0cmVhbS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzLmRlc3Ryb3kgPSBvcmlnaW5hbERlc3Ryb3lcbiAgbW9kdWxlLmV4cG9ydHMucGlwZWxpbmUgPSBDdXN0b21TdHJlYW0ucGlwZWxpbmVcbiAgbW9kdWxlLmV4cG9ydHMuY29tcG9zZSA9IEN1c3RvbVN0cmVhbS5jb21wb3NlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDdXN0b21TdHJlYW0sICdwcm9taXNlcycsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZXNcbiAgICB9XG4gIH0pXG4gIG1vZHVsZS5leHBvcnRzLlN0cmVhbSA9IEN1c3RvbVN0cmVhbS5TdHJlYW1cbn1cblxuLy8gQWxsb3cgZGVmYXVsdCBpbXBvcnRpbmdcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBtb2R1bGUuZXhwb3J0c1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///34478\n")},24134:module=>{"use strict";eval("\n\n/*\n This file is a reduced and adapted version of the main lib/internal/per_context/primordials.js file defined at\n\n https://github.com/nodejs/node/blob/master/lib/internal/per_context/primordials.js\n\n Don't try to replace with the original file and keep it up to date with the upstream file.\n*/\nmodule.exports = {\n ArrayIsArray(self) {\n return Array.isArray(self)\n },\n ArrayPrototypeIncludes(self, el) {\n return self.includes(el)\n },\n ArrayPrototypeIndexOf(self, el) {\n return self.indexOf(el)\n },\n ArrayPrototypeJoin(self, sep) {\n return self.join(sep)\n },\n ArrayPrototypeMap(self, fn) {\n return self.map(fn)\n },\n ArrayPrototypePop(self, el) {\n return self.pop(el)\n },\n ArrayPrototypePush(self, el) {\n return self.push(el)\n },\n ArrayPrototypeSlice(self, start, end) {\n return self.slice(start, end)\n },\n Error,\n FunctionPrototypeCall(fn, thisArgs, ...args) {\n return fn.call(thisArgs, ...args)\n },\n FunctionPrototypeSymbolHasInstance(self, instance) {\n return Function.prototype[Symbol.hasInstance].call(self, instance)\n },\n MathFloor: Math.floor,\n Number,\n NumberIsInteger: Number.isInteger,\n NumberIsNaN: Number.isNaN,\n NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER,\n NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER,\n NumberParseInt: Number.parseInt,\n ObjectDefineProperties(self, props) {\n return Object.defineProperties(self, props)\n },\n ObjectDefineProperty(self, name, prop) {\n return Object.defineProperty(self, name, prop)\n },\n ObjectGetOwnPropertyDescriptor(self, name) {\n return Object.getOwnPropertyDescriptor(self, name)\n },\n ObjectKeys(obj) {\n return Object.keys(obj)\n },\n ObjectSetPrototypeOf(target, proto) {\n return Object.setPrototypeOf(target, proto)\n },\n Promise,\n PromisePrototypeCatch(self, fn) {\n return self.catch(fn)\n },\n PromisePrototypeThen(self, thenFn, catchFn) {\n return self.then(thenFn, catchFn)\n },\n PromiseReject(err) {\n return Promise.reject(err)\n },\n PromiseResolve(val) {\n return Promise.resolve(val)\n },\n ReflectApply: Reflect.apply,\n RegExpPrototypeTest(self, value) {\n return self.test(value)\n },\n SafeSet: Set,\n String,\n StringPrototypeSlice(self, start, end) {\n return self.slice(start, end)\n },\n StringPrototypeToLowerCase(self) {\n return self.toLowerCase()\n },\n StringPrototypeToUpperCase(self) {\n return self.toUpperCase()\n },\n StringPrototypeTrim(self) {\n return self.trim()\n },\n Symbol,\n SymbolFor: Symbol.for,\n SymbolAsyncIterator: Symbol.asyncIterator,\n SymbolHasInstance: Symbol.hasInstance,\n SymbolIterator: Symbol.iterator,\n SymbolDispose: Symbol.dispose || Symbol('Symbol.dispose'),\n SymbolAsyncDispose: Symbol.asyncDispose || Symbol('Symbol.asyncDispose'),\n TypedArrayPrototypeSet(self, buf, len) {\n return self.set(buf, len)\n },\n Boolean: Boolean,\n Uint8Array\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQxMzQuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVo7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL291cnMvcHJpbW9yZGlhbHMuanM/NzdiNCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuLypcbiAgVGhpcyBmaWxlIGlzIGEgcmVkdWNlZCBhbmQgYWRhcHRlZCB2ZXJzaW9uIG9mIHRoZSBtYWluIGxpYi9pbnRlcm5hbC9wZXJfY29udGV4dC9wcmltb3JkaWFscy5qcyBmaWxlIGRlZmluZWQgYXRcblxuICBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYXN0ZXIvbGliL2ludGVybmFsL3Blcl9jb250ZXh0L3ByaW1vcmRpYWxzLmpzXG5cbiAgRG9uJ3QgdHJ5IHRvIHJlcGxhY2Ugd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSBhbmQga2VlcCBpdCB1cCB0byBkYXRlIHdpdGggdGhlIHVwc3RyZWFtIGZpbGUuXG4qL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFycmF5SXNBcnJheShzZWxmKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2VsZilcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVJbmNsdWRlcyhzZWxmLCBlbCkge1xuICAgIHJldHVybiBzZWxmLmluY2x1ZGVzKGVsKVxuICB9LFxuICBBcnJheVByb3RvdHlwZUluZGV4T2Yoc2VsZiwgZWwpIHtcbiAgICByZXR1cm4gc2VsZi5pbmRleE9mKGVsKVxuICB9LFxuICBBcnJheVByb3RvdHlwZUpvaW4oc2VsZiwgc2VwKSB7XG4gICAgcmV0dXJuIHNlbGYuam9pbihzZXApXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlTWFwKHNlbGYsIGZuKSB7XG4gICAgcmV0dXJuIHNlbGYubWFwKGZuKVxuICB9LFxuICBBcnJheVByb3RvdHlwZVBvcChzZWxmLCBlbCkge1xuICAgIHJldHVybiBzZWxmLnBvcChlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVQdXNoKHNlbGYsIGVsKSB7XG4gICAgcmV0dXJuIHNlbGYucHVzaChlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVTbGljZShzZWxmLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNlbGYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgfSxcbiAgRXJyb3IsXG4gIEZ1bmN0aW9uUHJvdG90eXBlQ2FsbChmbiwgdGhpc0FyZ3MsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZm4uY2FsbCh0aGlzQXJncywgLi4uYXJncylcbiAgfSxcbiAgRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZShzZWxmLCBpbnN0YW5jZSkge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXS5jYWxsKHNlbGYsIGluc3RhbmNlKVxuICB9LFxuICBNYXRoRmxvb3I6IE1hdGguZmxvb3IsXG4gIE51bWJlcixcbiAgTnVtYmVySXNJbnRlZ2VyOiBOdW1iZXIuaXNJbnRlZ2VyLFxuICBOdW1iZXJJc05hTjogTnVtYmVyLmlzTmFOLFxuICBOdW1iZXJNQVhfU0FGRV9JTlRFR0VSOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgTnVtYmVyTUlOX1NBRkVfSU5URUdFUjogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsXG4gIE51bWJlclBhcnNlSW50OiBOdW1iZXIucGFyc2VJbnQsXG4gIE9iamVjdERlZmluZVByb3BlcnRpZXMoc2VsZiwgcHJvcHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc2VsZiwgcHJvcHMpXG4gIH0sXG4gIE9iamVjdERlZmluZVByb3BlcnR5KHNlbGYsIG5hbWUsIHByb3ApIHtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIG5hbWUsIHByb3ApXG4gIH0sXG4gIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBuYW1lKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VsZiwgbmFtZSlcbiAgfSxcbiAgT2JqZWN0S2V5cyhvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICB9LFxuICBPYmplY3RTZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKSB7XG4gICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKVxuICB9LFxuICBQcm9taXNlLFxuICBQcm9taXNlUHJvdG90eXBlQ2F0Y2goc2VsZiwgZm4pIHtcbiAgICByZXR1cm4gc2VsZi5jYXRjaChmbilcbiAgfSxcbiAgUHJvbWlzZVByb3RvdHlwZVRoZW4oc2VsZiwgdGhlbkZuLCBjYXRjaEZuKSB7XG4gICAgcmV0dXJuIHNlbGYudGhlbih0aGVuRm4sIGNhdGNoRm4pXG4gIH0sXG4gIFByb21pc2VSZWplY3QoZXJyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycilcbiAgfSxcbiAgUHJvbWlzZVJlc29sdmUodmFsKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWwpXG4gIH0sXG4gIFJlZmxlY3RBcHBseTogUmVmbGVjdC5hcHBseSxcbiAgUmVnRXhwUHJvdG90eXBlVGVzdChzZWxmLCB2YWx1ZSkge1xuICAgIHJldHVybiBzZWxmLnRlc3QodmFsdWUpXG4gIH0sXG4gIFNhZmVTZXQ6IFNldCxcbiAgU3RyaW5nLFxuICBTdHJpbmdQcm90b3R5cGVTbGljZShzZWxmLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNlbGYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvTG93ZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvVXBwZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVHJpbShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYudHJpbSgpXG4gIH0sXG4gIFN5bWJvbCxcbiAgU3ltYm9sRm9yOiBTeW1ib2wuZm9yLFxuICBTeW1ib2xBc3luY0l0ZXJhdG9yOiBTeW1ib2wuYXN5bmNJdGVyYXRvcixcbiAgU3ltYm9sSGFzSW5zdGFuY2U6IFN5bWJvbC5oYXNJbnN0YW5jZSxcbiAgU3ltYm9sSXRlcmF0b3I6IFN5bWJvbC5pdGVyYXRvcixcbiAgU3ltYm9sRGlzcG9zZTogU3ltYm9sLmRpc3Bvc2UgfHwgU3ltYm9sKCdTeW1ib2wuZGlzcG9zZScpLFxuICBTeW1ib2xBc3luY0Rpc3Bvc2U6IFN5bWJvbC5hc3luY0Rpc3Bvc2UgfHwgU3ltYm9sKCdTeW1ib2wuYXN5bmNEaXNwb3NlJyksXG4gIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQoc2VsZiwgYnVmLCBsZW4pIHtcbiAgICByZXR1cm4gc2VsZi5zZXQoYnVmLCBsZW4pXG4gIH0sXG4gIEJvb2xlYW46IEJvb2xlYW4sXG4gIFVpbnQ4QXJyYXlcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///24134\n")},57760:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst bufferModule = __webpack_require__(20181)\nconst { kResistStopPropagation, SymbolDispose } = __webpack_require__(24134)\nconst AbortSignal = globalThis.AbortSignal || (__webpack_require__(66584).AbortSignal)\nconst AbortController = globalThis.AbortController || (__webpack_require__(66584).AbortController)\nconst AsyncFunction = Object.getPrototypeOf(async function () {}).constructor\nconst Blob = globalThis.Blob || bufferModule.Blob\n/* eslint-disable indent */\nconst isBlob =\n typeof Blob !== 'undefined'\n ? function isBlob(b) {\n // eslint-disable-next-line indent\n return b instanceof Blob\n }\n : function isBlob(b) {\n return false\n }\n/* eslint-enable indent */\n\nconst validateAbortSignal = (signal, name) => {\n if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) {\n throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)\n }\n}\nconst validateFunction = (value, name) => {\n if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)\n}\n\n// This is a simplified version of AggregateError\nclass AggregateError extends Error {\n constructor(errors) {\n if (!Array.isArray(errors)) {\n throw new TypeError(`Expected input to be an Array, got ${typeof errors}`)\n }\n let message = ''\n for (let i = 0; i < errors.length; i++) {\n message += ` ${errors[i].stack}\\n`\n }\n super(message)\n this.name = 'AggregateError'\n this.errors = errors\n }\n}\nmodule.exports = {\n AggregateError,\n kEmptyObject: Object.freeze({}),\n once(callback) {\n let called = false\n return function (...args) {\n if (called) {\n return\n }\n called = true\n callback.apply(this, args)\n }\n },\n createDeferredPromise: function () {\n let resolve\n let reject\n\n // eslint-disable-next-line promise/param-names\n const promise = new Promise((res, rej) => {\n resolve = res\n reject = rej\n })\n return {\n promise,\n resolve,\n reject\n }\n },\n promisify(fn) {\n return new Promise((resolve, reject) => {\n fn((err, ...args) => {\n if (err) {\n return reject(err)\n }\n return resolve(...args)\n })\n })\n },\n debuglog() {\n return function () {}\n },\n format(format, ...args) {\n // Simplified version of https://nodejs.org/api/util.html#utilformatformat-args\n return format.replace(/%([sdifj])/g, function (...[_unused, type]) {\n const replacement = args.shift()\n if (type === 'f') {\n return replacement.toFixed(6)\n } else if (type === 'j') {\n return JSON.stringify(replacement)\n } else if (type === 's' && typeof replacement === 'object') {\n const ctor = replacement.constructor !== Object ? replacement.constructor.name : ''\n return `${ctor} {}`.trim()\n } else {\n return replacement.toString()\n }\n })\n },\n inspect(value) {\n // Vastly simplified version of https://nodejs.org/api/util.html#utilinspectobject-options\n switch (typeof value) {\n case 'string':\n if (value.includes(\"'\")) {\n if (!value.includes('\"')) {\n return `\"${value}\"`\n } else if (!value.includes('`') && !value.includes('${')) {\n return `\\`${value}\\``\n }\n }\n return `'${value}'`\n case 'number':\n if (isNaN(value)) {\n return 'NaN'\n } else if (Object.is(value, -0)) {\n return String(value)\n }\n return value\n case 'bigint':\n return `${String(value)}n`\n case 'boolean':\n case 'undefined':\n return String(value)\n case 'object':\n return '{}'\n }\n },\n types: {\n isAsyncFunction(fn) {\n return fn instanceof AsyncFunction\n },\n isArrayBufferView(arr) {\n return ArrayBuffer.isView(arr)\n }\n },\n isBlob,\n deprecate(fn, message) {\n return fn\n },\n addAbortListener:\n (__webpack_require__(24434).addAbortListener) ||\n function addAbortListener(signal, listener) {\n if (signal === undefined) {\n throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal)\n }\n validateAbortSignal(signal, 'signal')\n validateFunction(listener, 'listener')\n let removeEventListener\n if (signal.aborted) {\n queueMicrotask(() => listener())\n } else {\n signal.addEventListener('abort', listener, {\n __proto__: null,\n once: true,\n [kResistStopPropagation]: true\n })\n removeEventListener = () => {\n signal.removeEventListener('abort', listener)\n }\n }\n return {\n __proto__: null,\n [SymbolDispose]() {\n var _removeEventListener\n ;(_removeEventListener = removeEventListener) === null || _removeEventListener === undefined\n ? undefined\n : _removeEventListener()\n }\n }\n },\n AbortSignalAny:\n AbortSignal.any ||\n function AbortSignalAny(signals) {\n // Fast path if there is only one signal.\n if (signals.length === 1) {\n return signals[0]\n }\n const ac = new AbortController()\n const abort = () => ac.abort()\n signals.forEach((signal) => {\n validateAbortSignal(signal, 'signals')\n signal.addEventListener('abort', abort, {\n once: true\n })\n })\n ac.signal.addEventListener(\n 'abort',\n () => {\n signals.forEach((signal) => signal.removeEventListener('abort', abort))\n },\n {\n once: true\n }\n )\n return ac.signal\n }\n}\nmodule.exports.promisify.custom = Symbol.for('nodejs.util.promisify.custom')\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc3NjAuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVoscUJBQXFCLG1CQUFPLENBQUMsS0FBUTtBQUNyQyxRQUFRLHdDQUF3QyxFQUFFLG1CQUFPLENBQUMsS0FBZTtBQUN6RSw4Q0FBOEMsd0NBQXVDO0FBQ3JGLHNEQUFzRCw0Q0FBMkM7QUFDakcsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGNBQWM7QUFDOUU7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkMsd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixNQUFNO0FBQzdCLFlBQVksb0RBQW9EO0FBQ2hFLHdCQUF3QixNQUFNO0FBQzlCO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLElBQUksNkNBQWtDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9vdXJzL3V0aWwuanM/NTc1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuY29uc3QgYnVmZmVyTW9kdWxlID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsga1Jlc2lzdFN0b3BQcm9wYWdhdGlvbiwgU3ltYm9sRGlzcG9zZSB9ID0gcmVxdWlyZSgnLi9wcmltb3JkaWFscycpXG5jb25zdCBBYm9ydFNpZ25hbCA9IGdsb2JhbFRoaXMuQWJvcnRTaWduYWwgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0U2lnbmFsXG5jb25zdCBBYm9ydENvbnRyb2xsZXIgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciB8fCByZXF1aXJlKCdhYm9ydC1jb250cm9sbGVyJykuQWJvcnRDb250cm9sbGVyXG5jb25zdCBBc3luY0Z1bmN0aW9uID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGFzeW5jIGZ1bmN0aW9uICgpIHt9KS5jb25zdHJ1Y3RvclxuY29uc3QgQmxvYiA9IGdsb2JhbFRoaXMuQmxvYiB8fCBidWZmZXJNb2R1bGUuQmxvYlxuLyogZXNsaW50LWRpc2FibGUgaW5kZW50ICovXG5jb25zdCBpc0Jsb2IgPVxuICB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IGZ1bmN0aW9uIGlzQmxvYihiKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbmRlbnRcbiAgICAgICAgcmV0dXJuIGIgaW5zdGFuY2VvZiBCbG9iXG4gICAgICB9XG4gICAgOiBmdW5jdGlvbiBpc0Jsb2IoYikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbi8qIGVzbGludC1lbmFibGUgaW5kZW50ICovXG5cbmNvbnN0IHZhbGlkYXRlQWJvcnRTaWduYWwgPSAoc2lnbmFsLCBuYW1lKSA9PiB7XG4gIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCAmJiAoc2lnbmFsID09PSBudWxsIHx8IHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBYm9ydFNpZ25hbCcsIHNpZ25hbClcbiAgfVxufVxuY29uc3QgdmFsaWRhdGVGdW5jdGlvbiA9ICh2YWx1ZSwgbmFtZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ0Z1bmN0aW9uJywgdmFsdWUpXG59XG5cbi8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgQWdncmVnYXRlRXJyb3JcbmNsYXNzIEFnZ3JlZ2F0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlcnJvcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXJyb3JzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaW5wdXQgdG8gYmUgYW4gQXJyYXksIGdvdCAke3R5cGVvZiBlcnJvcnN9YClcbiAgICB9XG4gICAgbGV0IG1lc3NhZ2UgPSAnJ1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBtZXNzYWdlICs9IGAgICAgJHtlcnJvcnNbaV0uc3RhY2t9XFxuYFxuICAgIH1cbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdBZ2dyZWdhdGVFcnJvcidcbiAgICB0aGlzLmVycm9ycyA9IGVycm9yc1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQWdncmVnYXRlRXJyb3IsXG4gIGtFbXB0eU9iamVjdDogT2JqZWN0LmZyZWV6ZSh7fSksXG4gIG9uY2UoY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGVkID0gZmFsc2VcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgIGlmIChjYWxsZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjYWxsZWQgPSB0cnVlXG4gICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKVxuICAgIH1cbiAgfSxcbiAgY3JlYXRlRGVmZXJyZWRQcm9taXNlOiBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlc29sdmVcbiAgICBsZXQgcmVqZWN0XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wYXJhbS1uYW1lc1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIHJlc29sdmUgPSByZXNcbiAgICAgIHJlamVjdCA9IHJlalxuICAgIH0pXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb21pc2UsXG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0XG4gICAgfVxuICB9LFxuICBwcm9taXNpZnkoZm4pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZm4oKGVyciwgLi4uYXJncykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmUoLi4uYXJncylcbiAgICAgIH0pXG4gICAgfSlcbiAgfSxcbiAgZGVidWdsb2coKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHt9XG4gIH0sXG4gIGZvcm1hdChmb3JtYXQsIC4uLmFyZ3MpIHtcbiAgICAvLyBTaW1wbGlmaWVkIHZlcnNpb24gb2YgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS91dGlsLmh0bWwjdXRpbGZvcm1hdGZvcm1hdC1hcmdzXG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC8lKFtzZGlmal0pL2csIGZ1bmN0aW9uICguLi5bX3VudXNlZCwgdHlwZV0pIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gYXJncy5zaGlmdCgpXG4gICAgICBpZiAodHlwZSA9PT0gJ2YnKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudC50b0ZpeGVkKDYpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdqJykge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVwbGFjZW1lbnQpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzJyAmJiB0eXBlb2YgcmVwbGFjZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGN0b3IgPSByZXBsYWNlbWVudC5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ID8gcmVwbGFjZW1lbnQuY29uc3RydWN0b3IubmFtZSA6ICcnXG4gICAgICAgIHJldHVybiBgJHtjdG9yfSB7fWAudHJpbSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQudG9TdHJpbmcoKVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIGluc3BlY3QodmFsdWUpIHtcbiAgICAvLyBWYXN0bHkgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvdXRpbC5odG1sI3V0aWxpbnNwZWN0b2JqZWN0LW9wdGlvbnNcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiJ1wiKSkge1xuICAgICAgICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ1wiJykpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYFxuICAgICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlLmluY2x1ZGVzKCdgJykgJiYgIXZhbHVlLmluY2x1ZGVzKCckeycpKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxcYCR7dmFsdWV9XFxgYFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCcke3ZhbHVlfSdgXG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuICdOYU4nXG4gICAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LmlzKHZhbHVlLCAtMCkpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgICAgcmV0dXJuIGAke1N0cmluZyh2YWx1ZSl9bmBcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAne30nXG4gICAgfVxuICB9LFxuICB0eXBlczoge1xuICAgIGlzQXN5bmNGdW5jdGlvbihmbikge1xuICAgICAgcmV0dXJuIGZuIGluc3RhbmNlb2YgQXN5bmNGdW5jdGlvblxuICAgIH0sXG4gICAgaXNBcnJheUJ1ZmZlclZpZXcoYXJyKSB7XG4gICAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGFycilcbiAgICB9XG4gIH0sXG4gIGlzQmxvYixcbiAgZGVwcmVjYXRlKGZuLCBtZXNzYWdlKSB7XG4gICAgcmV0dXJuIGZuXG4gIH0sXG4gIGFkZEFib3J0TGlzdGVuZXI6XG4gICAgcmVxdWlyZSgnZXZlbnRzJykuYWRkQWJvcnRMaXN0ZW5lciB8fFxuICAgIGZ1bmN0aW9uIGFkZEFib3J0TGlzdGVuZXIoc2lnbmFsLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHNpZ25hbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc2lnbmFsJywgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICAgICAgfVxuICAgICAgdmFsaWRhdGVBYm9ydFNpZ25hbChzaWduYWwsICdzaWduYWwnKVxuICAgICAgdmFsaWRhdGVGdW5jdGlvbihsaXN0ZW5lciwgJ2xpc3RlbmVyJylcbiAgICAgIGxldCByZW1vdmVFdmVudExpc3RlbmVyXG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gbGlzdGVuZXIoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgICAgW2tSZXNpc3RTdG9wUHJvcGFnYXRpb25dOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgbGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgW1N5bWJvbERpc3Bvc2VdKCkge1xuICAgICAgICAgIHZhciBfcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgICAgICAgIDsoX3JlbW92ZUV2ZW50TGlzdGVuZXIgPSByZW1vdmVFdmVudExpc3RlbmVyKSA9PT0gbnVsbCB8fCBfcmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBfcmVtb3ZlRXZlbnRMaXN0ZW5lcigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICBBYm9ydFNpZ25hbEFueTpcbiAgICBBYm9ydFNpZ25hbC5hbnkgfHxcbiAgICBmdW5jdGlvbiBBYm9ydFNpZ25hbEFueShzaWduYWxzKSB7XG4gICAgICAvLyBGYXN0IHBhdGggaWYgdGhlcmUgaXMgb25seSBvbmUgc2lnbmFsLlxuICAgICAgaWYgKHNpZ25hbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBzaWduYWxzWzBdXG4gICAgICB9XG4gICAgICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgYWJvcnQgPSAoKSA9PiBhYy5hYm9ydCgpXG4gICAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4ge1xuICAgICAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKHNpZ25hbCwgJ3NpZ25hbHMnKVxuICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydCwge1xuICAgICAgICAgIG9uY2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydCkpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbmNlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIHJldHVybiBhYy5zaWduYWxcbiAgICB9XG59XG5tb2R1bGUuZXhwb3J0cy5wcm9taXNpZnkuY3VzdG9tID0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbScpXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///57760\n")},85506:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/* replacement start */\n\nconst { Buffer } = __webpack_require__(20181)\n\n/* replacement end */\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n;('use strict')\nconst { ObjectDefineProperty, ObjectKeys, ReflectApply } = __webpack_require__(24134)\nconst {\n promisify: { custom: customPromisify }\n} = __webpack_require__(57760)\nconst { streamReturningOperators, promiseReturningOperators } = __webpack_require__(60823)\nconst {\n codes: { ERR_ILLEGAL_CONSTRUCTOR }\n} = __webpack_require__(76371)\nconst compose = __webpack_require__(47830)\nconst { setDefaultHighWaterMark, getDefaultHighWaterMark } = __webpack_require__(65291)\nconst { pipeline } = __webpack_require__(57758)\nconst { destroyer } = __webpack_require__(75896)\nconst eos = __webpack_require__(86238)\nconst internalBuffer = {}\nconst promises = __webpack_require__(43095)\nconst utils = __webpack_require__(16115)\nconst Stream = (module.exports = __webpack_require__(94259).Stream)\nStream.isDestroyed = utils.isDestroyed\nStream.isDisturbed = utils.isDisturbed\nStream.isErrored = utils.isErrored\nStream.isReadable = utils.isReadable\nStream.isWritable = utils.isWritable\nStream.Readable = __webpack_require__(57576)\nfor (const key of ObjectKeys(streamReturningOperators)) {\n const op = streamReturningOperators[key]\n function fn(...args) {\n if (new.target) {\n throw ERR_ILLEGAL_CONSTRUCTOR()\n }\n return Stream.Readable.from(ReflectApply(op, this, args))\n }\n ObjectDefineProperty(fn, 'name', {\n __proto__: null,\n value: op.name\n })\n ObjectDefineProperty(fn, 'length', {\n __proto__: null,\n value: op.length\n })\n ObjectDefineProperty(Stream.Readable.prototype, key, {\n __proto__: null,\n value: fn,\n enumerable: false,\n configurable: true,\n writable: true\n })\n}\nfor (const key of ObjectKeys(promiseReturningOperators)) {\n const op = promiseReturningOperators[key]\n function fn(...args) {\n if (new.target) {\n throw ERR_ILLEGAL_CONSTRUCTOR()\n }\n return ReflectApply(op, this, args)\n }\n ObjectDefineProperty(fn, 'name', {\n __proto__: null,\n value: op.name\n })\n ObjectDefineProperty(fn, 'length', {\n __proto__: null,\n value: op.length\n })\n ObjectDefineProperty(Stream.Readable.prototype, key, {\n __proto__: null,\n value: fn,\n enumerable: false,\n configurable: true,\n writable: true\n })\n}\nStream.Writable = __webpack_require__(78584)\nStream.Duplex = __webpack_require__(93370)\nStream.Transform = __webpack_require__(17382)\nStream.PassThrough = __webpack_require__(86524)\nStream.pipeline = pipeline\nconst { addAbortSignal } = __webpack_require__(4147)\nStream.addAbortSignal = addAbortSignal\nStream.finished = eos\nStream.destroy = destroyer\nStream.compose = compose\nStream.setDefaultHighWaterMark = setDefaultHighWaterMark\nStream.getDefaultHighWaterMark = getDefaultHighWaterMark\nObjectDefineProperty(Stream, 'promises', {\n __proto__: null,\n configurable: true,\n enumerable: true,\n get() {\n return promises\n }\n})\nObjectDefineProperty(pipeline, customPromisify, {\n __proto__: null,\n enumerable: true,\n get() {\n return promises.pipeline\n }\n})\nObjectDefineProperty(eos, customPromisify, {\n __proto__: null,\n enumerable: true,\n get() {\n return promises.finished\n }\n})\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream\nStream._isUint8Array = function isUint8Array(value) {\n return value instanceof Uint8Array\n}\nStream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODU1MDYuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsUUFBUSxTQUFTLEVBQUUsbUJBQU8sQ0FBQyxLQUFROztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELFFBQVEsaURBQWlELEVBQUUsbUJBQU8sQ0FBQyxLQUFvQjtBQUN2RjtBQUNBLGVBQWU7QUFDZixFQUFFLEVBQUUsbUJBQU8sQ0FBQyxLQUFhO0FBQ3pCLFFBQVEsc0RBQXNELEVBQUUsbUJBQU8sQ0FBQyxLQUE4QjtBQUN0RztBQUNBLFdBQVc7QUFDWCxFQUFFLEVBQUUsbUJBQU8sQ0FBQyxLQUFlO0FBQzNCLGdCQUFnQixtQkFBTyxDQUFDLEtBQTRCO0FBQ3BELFFBQVEsbURBQW1ELEVBQUUsbUJBQU8sQ0FBQyxLQUEwQjtBQUMvRixRQUFRLFdBQVcsRUFBRSxtQkFBTyxDQUFDLEtBQTZCO0FBQzFELFFBQVEsWUFBWSxFQUFFLG1CQUFPLENBQUMsS0FBNEI7QUFDMUQsWUFBWSxtQkFBTyxDQUFDLEtBQWtDO0FBQ3REO0FBQ0EsaUJBQWlCLG1CQUFPLENBQUMsS0FBbUI7QUFDNUMsY0FBYyxtQkFBTyxDQUFDLEtBQTBCO0FBQ2hELGdCQUFnQixrREFBNEQ7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBTyxDQUFDLEtBQTZCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGtCQUFrQixtQkFBTyxDQUFDLEtBQTZCO0FBQ3ZELGdCQUFnQixtQkFBTyxDQUFDLEtBQTJCO0FBQ25ELG1CQUFtQixtQkFBTyxDQUFDLEtBQThCO0FBQ3pELHFCQUFxQixtQkFBTyxDQUFDLEtBQWdDO0FBQzdEO0FBQ0EsUUFBUSxpQkFBaUIsRUFBRSxtQkFBTyxDQUFDLElBQXFDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvc3RyZWFtLmpzPzdjYmIiXSwic291cmNlc0NvbnRlbnQiOlsiLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3QgeyBPYmplY3REZWZpbmVQcm9wZXJ0eSwgT2JqZWN0S2V5cywgUmVmbGVjdEFwcGx5IH0gPSByZXF1aXJlKCcuL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3Qge1xuICBwcm9taXNpZnk6IHsgY3VzdG9tOiBjdXN0b21Qcm9taXNpZnkgfVxufSA9IHJlcXVpcmUoJy4vb3Vycy91dGlsJylcbmNvbnN0IHsgc3RyZWFtUmV0dXJuaW5nT3BlcmF0b3JzLCBwcm9taXNlUmV0dXJuaW5nT3BlcmF0b3JzIH0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvb3BlcmF0b3JzJylcbmNvbnN0IHtcbiAgY29kZXM6IHsgRVJSX0lMTEVHQUxfQ09OU1RSVUNUT1IgfVxufSA9IHJlcXVpcmUoJy4vb3Vycy9lcnJvcnMnKVxuY29uc3QgY29tcG9zZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9jb21wb3NlJylcbmNvbnN0IHsgc2V0RGVmYXVsdEhpZ2hXYXRlck1hcmssIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrIH0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RhdGUnKVxuY29uc3QgeyBwaXBlbGluZSB9ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lJylcbmNvbnN0IHsgZGVzdHJveWVyIH0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbScpXG5jb25zdCBpbnRlcm5hbEJ1ZmZlciA9IHt9XG5jb25zdCBwcm9taXNlcyA9IHJlcXVpcmUoJy4vc3RyZWFtL3Byb21pc2VzJylcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzJylcbmNvbnN0IFN0cmVhbSA9IChtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9sZWdhY3knKS5TdHJlYW0pXG5TdHJlYW0uaXNEZXN0cm95ZWQgPSB1dGlscy5pc0Rlc3Ryb3llZFxuU3RyZWFtLmlzRGlzdHVyYmVkID0gdXRpbHMuaXNEaXN0dXJiZWRcblN0cmVhbS5pc0Vycm9yZWQgPSB1dGlscy5pc0Vycm9yZWRcblN0cmVhbS5pc1JlYWRhYmxlID0gdXRpbHMuaXNSZWFkYWJsZVxuU3RyZWFtLmlzV3JpdGFibGUgPSB1dGlscy5pc1dyaXRhYmxlXG5TdHJlYW0uUmVhZGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvcmVhZGFibGUnKVxuZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0S2V5cyhzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMpKSB7XG4gIGNvbnN0IG9wID0gc3RyZWFtUmV0dXJuaW5nT3BlcmF0b3JzW2tleV1cbiAgZnVuY3Rpb24gZm4oLi4uYXJncykge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUigpXG4gICAgfVxuICAgIHJldHVybiBTdHJlYW0uUmVhZGFibGUuZnJvbShSZWZsZWN0QXBwbHkob3AsIHRoaXMsIGFyZ3MpKVxuICB9XG4gIE9iamVjdERlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLm5hbWVcbiAgfSlcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICdsZW5ndGgnLCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBvcC5sZW5ndGhcbiAgfSlcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoU3RyZWFtLlJlYWRhYmxlLnByb3RvdHlwZSwga2V5LCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBmbixcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcbn1cbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdEtleXMocHJvbWlzZVJldHVybmluZ09wZXJhdG9ycykpIHtcbiAgY29uc3Qgb3AgPSBwcm9taXNlUmV0dXJuaW5nT3BlcmF0b3JzW2tleV1cbiAgZnVuY3Rpb24gZm4oLi4uYXJncykge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUigpXG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0QXBwbHkob3AsIHRoaXMsIGFyZ3MpXG4gIH1cbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogb3AubmFtZVxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShmbiwgJ2xlbmd0aCcsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLmxlbmd0aFxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShTdHJlYW0uUmVhZGFibGUucHJvdG90eXBlLCBrZXksIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IGZuLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3dyaXRhYmxlJylcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4JylcblN0cmVhbS5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvdHJhbnNmb3JtJylcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9wYXNzdGhyb3VnaCcpXG5TdHJlYW0ucGlwZWxpbmUgPSBwaXBlbGluZVxuY29uc3QgeyBhZGRBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2FkZC1hYm9ydC1zaWduYWwnKVxuU3RyZWFtLmFkZEFib3J0U2lnbmFsID0gYWRkQWJvcnRTaWduYWxcblN0cmVhbS5maW5pc2hlZCA9IGVvc1xuU3RyZWFtLmRlc3Ryb3kgPSBkZXN0cm95ZXJcblN0cmVhbS5jb21wb3NlID0gY29tcG9zZVxuU3RyZWFtLnNldERlZmF1bHRIaWdoV2F0ZXJNYXJrID0gc2V0RGVmYXVsdEhpZ2hXYXRlck1hcmtcblN0cmVhbS5nZXREZWZhdWx0SGlnaFdhdGVyTWFyayA9IGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrXG5PYmplY3REZWZpbmVQcm9wZXJ0eShTdHJlYW0sICdwcm9taXNlcycsIHtcbiAgX19wcm90b19fOiBudWxsLFxuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldCgpIHtcbiAgICByZXR1cm4gcHJvbWlzZXNcbiAgfVxufSlcbk9iamVjdERlZmluZVByb3BlcnR5KHBpcGVsaW5lLCBjdXN0b21Qcm9taXNpZnksIHtcbiAgX19wcm90b19fOiBudWxsLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHByb21pc2VzLnBpcGVsaW5lXG4gIH1cbn0pXG5PYmplY3REZWZpbmVQcm9wZXJ0eShlb3MsIGN1c3RvbVByb21pc2lmeSwge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldCgpIHtcbiAgICByZXR1cm4gcHJvbWlzZXMuZmluaXNoZWRcbiAgfVxufSlcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC40LnhcblN0cmVhbS5TdHJlYW0gPSBTdHJlYW1cblN0cmVhbS5faXNVaW50OEFycmF5ID0gZnVuY3Rpb24gaXNVaW50OEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbn1cblN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyID0gZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmsuYnVmZmVyLCBjaHVuay5ieXRlT2Zmc2V0LCBjaHVuay5ieXRlTGVuZ3RoKVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///85506\n")},43095:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nconst { ArrayPrototypePop, Promise } = __webpack_require__(24134)\nconst { isIterable, isNodeStream, isWebStream } = __webpack_require__(16115)\nconst { pipelineImpl: pl } = __webpack_require__(57758)\nconst { finished } = __webpack_require__(86238)\n__webpack_require__(85506)\nfunction pipeline(...streams) {\n return new Promise((resolve, reject) => {\n let signal\n let end\n const lastArg = streams[streams.length - 1]\n if (\n lastArg &&\n typeof lastArg === 'object' &&\n !isNodeStream(lastArg) &&\n !isIterable(lastArg) &&\n !isWebStream(lastArg)\n ) {\n const options = ArrayPrototypePop(streams)\n signal = options.signal\n end = options.end\n }\n pl(\n streams,\n (err, value) => {\n if (err) {\n reject(err)\n } else {\n resolve(value)\n }\n },\n {\n signal,\n end\n }\n )\n })\n}\nmodule.exports = {\n finished,\n pipeline\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMwOTUuanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosUUFBUSw2QkFBNkIsRUFBRSxtQkFBTyxDQUFDLEtBQXFCO0FBQ3BFLFFBQVEsd0NBQXdDLEVBQUUsbUJBQU8sQ0FBQyxLQUEyQjtBQUNyRixRQUFRLG1CQUFtQixFQUFFLG1CQUFPLENBQUMsS0FBOEI7QUFDbkUsUUFBUSxXQUFXLEVBQUUsbUJBQU8sQ0FBQyxLQUFtQztBQUNoRSxtQkFBTyxDQUFDLEtBQXFCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9zdHJlYW0vcHJvbWlzZXMuanM/NzQwZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBcnJheVByb3RvdHlwZVBvcCwgUHJvbWlzZSB9ID0gcmVxdWlyZSgnLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IGlzSXRlcmFibGUsIGlzTm9kZVN0cmVhbSwgaXNXZWJTdHJlYW0gfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3N0cmVhbXMvdXRpbHMnKVxuY29uc3QgeyBwaXBlbGluZUltcGw6IHBsIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lJylcbmNvbnN0IHsgZmluaXNoZWQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbScpXG5yZXF1aXJlKCcuLi8uLi9saWIvc3RyZWFtLmpzJylcbmZ1bmN0aW9uIHBpcGVsaW5lKC4uLnN0cmVhbXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgc2lnbmFsXG4gICAgbGV0IGVuZFxuICAgIGNvbnN0IGxhc3RBcmcgPSBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV1cbiAgICBpZiAoXG4gICAgICBsYXN0QXJnICYmXG4gICAgICB0eXBlb2YgbGFzdEFyZyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFpc05vZGVTdHJlYW0obGFzdEFyZykgJiZcbiAgICAgICFpc0l0ZXJhYmxlKGxhc3RBcmcpICYmXG4gICAgICAhaXNXZWJTdHJlYW0obGFzdEFyZylcbiAgICApIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBBcnJheVByb3RvdHlwZVBvcChzdHJlYW1zKVxuICAgICAgc2lnbmFsID0gb3B0aW9ucy5zaWduYWxcbiAgICAgIGVuZCA9IG9wdGlvbnMuZW5kXG4gICAgfVxuICAgIHBsKFxuICAgICAgc3RyZWFtcyxcbiAgICAgIChlcnIsIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNpZ25hbCxcbiAgICAgICAgZW5kXG4gICAgICB9XG4gICAgKVxuICB9KVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZpbmlzaGVkLFxuICBwaXBlbGluZVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///43095\n")},76965:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = readdirGlob;\n\nconst fs = __webpack_require__(79896);\nconst { EventEmitter } = __webpack_require__(24434);\nconst { Minimatch } = __webpack_require__(25835);\nconst { resolve } = __webpack_require__(16928);\n\nfunction readdir(dir, strict) {\n return new Promise((resolve, reject) => {\n fs.readdir(dir, {withFileTypes: true} ,(err, files) => {\n if(err) {\n switch (err.code) {\n case 'ENOTDIR': // Not a directory\n if(strict) {\n reject(err);\n } else {\n resolve([]);\n }\n break;\n case 'ENOTSUP': // Operation not supported\n case 'ENOENT': // No such file or directory\n case 'ENAMETOOLONG': // Filename too long\n case 'UNKNOWN':\n resolve([]);\n break;\n case 'ELOOP': // Too many levels of symbolic links\n default:\n reject(err);\n break;\n }\n } else {\n resolve(files);\n }\n });\n });\n}\nfunction stat(file, followSymlinks) {\n return new Promise((resolve, reject) => {\n const statFunc = followSymlinks ? fs.stat : fs.lstat;\n statFunc(file, (err, stats) => {\n if(err) {\n switch (err.code) {\n case 'ENOENT':\n if(followSymlinks) {\n // Fallback to lstat to handle broken links as files\n resolve(stat(file, false)); \n } else {\n resolve(null);\n }\n break;\n default:\n resolve(null);\n break;\n }\n } else {\n resolve(stats);\n }\n });\n });\n}\n\nasync function* exploreWalkAsync(dir, path, followSymlinks, useStat, shouldSkip, strict) {\n let files = await readdir(path + dir, strict);\n for(const file of files) {\n let name = file.name;\n if(name === undefined) {\n // undefined file.name means the `withFileTypes` options is not supported by node\n // we have to call the stat function to know if file is directory or not.\n name = file;\n useStat = true;\n }\n const filename = dir + '/' + name;\n const relative = filename.slice(1); // Remove the leading /\n const absolute = path + '/' + relative;\n let stats = null;\n if(useStat || followSymlinks) {\n stats = await stat(absolute, followSymlinks);\n }\n if(!stats && file.name !== undefined) {\n stats = file;\n }\n if(stats === null) {\n stats = { isDirectory: () => false };\n }\n\n if(stats.isDirectory()) {\n if(!shouldSkip(relative)) {\n yield {relative, absolute, stats};\n yield* exploreWalkAsync(filename, path, followSymlinks, useStat, shouldSkip, false);\n }\n } else {\n yield {relative, absolute, stats};\n }\n }\n}\nasync function* explore(path, followSymlinks, useStat, shouldSkip) {\n yield* exploreWalkAsync('', path, followSymlinks, useStat, shouldSkip, true);\n}\n\n\nfunction readOptions(options) {\n return {\n pattern: options.pattern,\n dot: !!options.dot,\n noglobstar: !!options.noglobstar,\n matchBase: !!options.matchBase,\n nocase: !!options.nocase,\n ignore: options.ignore,\n skip: options.skip,\n\n follow: !!options.follow,\n stat: !!options.stat,\n nodir: !!options.nodir,\n mark: !!options.mark,\n silent: !!options.silent,\n absolute: !!options.absolute\n };\n}\n\nclass ReaddirGlob extends EventEmitter {\n constructor(cwd, options, cb) {\n super();\n if(typeof options === 'function') {\n cb = options;\n options = null;\n }\n\n this.options = readOptions(options || {});\n \n this.matchers = [];\n if(this.options.pattern) {\n const matchers = Array.isArray(this.options.pattern) ? this.options.pattern : [this.options.pattern];\n this.matchers = matchers.map( m =>\n new Minimatch(m, {\n dot: this.options.dot,\n noglobstar:this.options.noglobstar,\n matchBase:this.options.matchBase,\n nocase:this.options.nocase\n })\n );\n }\n \n this.ignoreMatchers = [];\n if(this.options.ignore) {\n const ignorePatterns = Array.isArray(this.options.ignore) ? this.options.ignore : [this.options.ignore];\n this.ignoreMatchers = ignorePatterns.map( ignore =>\n new Minimatch(ignore, {dot: true})\n );\n }\n \n this.skipMatchers = [];\n if(this.options.skip) {\n const skipPatterns = Array.isArray(this.options.skip) ? this.options.skip : [this.options.skip];\n this.skipMatchers = skipPatterns.map( skip =>\n new Minimatch(skip, {dot: true})\n );\n }\n\n this.iterator = explore(resolve(cwd || '.'), this.options.follow, this.options.stat, this._shouldSkipDirectory.bind(this));\n this.paused = false;\n this.inactive = false;\n this.aborted = false;\n \n if(cb) {\n this._matches = []; \n this.on('match', match => this._matches.push(this.options.absolute ? match.absolute : match.relative));\n this.on('error', err => cb(err));\n this.on('end', () => cb(null, this._matches));\n }\n\n setTimeout( () => this._next(), 0);\n }\n\n _shouldSkipDirectory(relative) {\n //console.log(relative, this.skipMatchers.some(m => m.match(relative)));\n return this.skipMatchers.some(m => m.match(relative));\n }\n\n _fileMatches(relative, isDirectory) {\n const file = relative + (isDirectory ? '/' : '');\n return (this.matchers.length === 0 || this.matchers.some(m => m.match(file)))\n && !this.ignoreMatchers.some(m => m.match(file))\n && (!this.options.nodir || !isDirectory);\n }\n\n _next() {\n if(!this.paused && !this.aborted) {\n this.iterator.next()\n .then((obj)=> {\n if(!obj.done) {\n const isDirectory = obj.value.stats.isDirectory();\n if(this._fileMatches(obj.value.relative, isDirectory )) {\n let relative = obj.value.relative;\n let absolute = obj.value.absolute;\n if(this.options.mark && isDirectory) {\n relative += '/';\n absolute += '/';\n }\n if(this.options.stat) {\n this.emit('match', {relative, absolute, stat:obj.value.stats});\n } else {\n this.emit('match', {relative, absolute});\n }\n }\n this._next(this.iterator);\n } else {\n this.emit('end');\n }\n })\n .catch((err) => {\n this.abort();\n this.emit('error', err);\n if(!err.code && !this.options.silent) {\n console.error(err);\n }\n });\n } else {\n this.inactive = true;\n }\n }\n\n abort() {\n this.aborted = true;\n }\n\n pause() {\n this.paused = true;\n }\n\n resume() {\n this.paused = false;\n if(this.inactive) {\n this.inactive = false;\n this._next();\n }\n }\n}\n\n\nfunction readdirGlob(pattern, options, cb) {\n return new ReaddirGlob(pattern, options, cb);\n}\nreaddirGlob.ReaddirGlob = ReaddirGlob;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY5NjUuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsV0FBVyxtQkFBTyxDQUFDLEtBQUk7QUFDdkIsUUFBUSxlQUFlLEVBQUUsbUJBQU8sQ0FBQyxLQUFRO0FBQ3pDLFFBQVEsWUFBWSxFQUFFLG1CQUFPLENBQUMsS0FBVztBQUN6QyxRQUFRLFVBQVUsRUFBRSxtQkFBTyxDQUFDLEtBQU07O0FBRWxDO0FBQ0E7QUFDQSxxQkFBcUIscUJBQXFCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLE1BQU07QUFDTixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsVUFBVTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixVQUFVO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHlDQUF5QztBQUMzRSxjQUFjO0FBQ2Qsa0NBQWtDLG1CQUFtQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9yZWFkZGlyLWdsb2IvaW5kZXguanM/NzI5OCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlYWRkaXJHbG9iO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5jb25zdCB7IE1pbmltYXRjaCB9ID0gcmVxdWlyZSgnbWluaW1hdGNoJyk7XG5jb25zdCB7IHJlc29sdmUgfSA9IHJlcXVpcmUoJ3BhdGgnKTtcblxuZnVuY3Rpb24gcmVhZGRpcihkaXIsIHN0cmljdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZzLnJlYWRkaXIoZGlyLCB7d2l0aEZpbGVUeXBlczogdHJ1ZX0gLChlcnIsIGZpbGVzKSA9PiB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgc3dpdGNoIChlcnIuY29kZSkge1xuICAgICAgICAgIGNhc2UgJ0VOT1RESVInOiAgICAgIC8vIE5vdCBhIGRpcmVjdG9yeVxuICAgICAgICAgICAgaWYoc3RyaWN0KSB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdFTk9UU1VQJzogICAgICAvLyBPcGVyYXRpb24gbm90IHN1cHBvcnRlZFxuICAgICAgICAgIGNhc2UgJ0VOT0VOVCc6ICAgICAgIC8vIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiAgICAgICAgICBjYXNlICdFTkFNRVRPT0xPTkcnOiAvLyBGaWxlbmFtZSB0b28gbG9uZ1xuICAgICAgICAgIGNhc2UgJ1VOS05PV04nOlxuICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdFTE9PUCc6ICAgICAgICAvLyBUb28gbWFueSBsZXZlbHMgb2Ygc3ltYm9saWMgbGlua3NcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShmaWxlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gc3RhdChmaWxlLCBmb2xsb3dTeW1saW5rcykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN0YXRGdW5jID0gZm9sbG93U3ltbGlua3MgPyBmcy5zdGF0IDogZnMubHN0YXQ7XG4gICAgc3RhdEZ1bmMoZmlsZSwgKGVyciwgc3RhdHMpID0+IHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICBzd2l0Y2ggKGVyci5jb2RlKSB7XG4gICAgICAgICAgY2FzZSAnRU5PRU5UJzpcbiAgICAgICAgICAgIGlmKGZvbGxvd1N5bWxpbmtzKSB7XG4gICAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxzdGF0IHRvIGhhbmRsZSBicm9rZW4gbGlua3MgYXMgZmlsZXNcbiAgICAgICAgICAgICAgcmVzb2x2ZShzdGF0KGZpbGUsIGZhbHNlKSk7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoc3RhdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24qIGV4cGxvcmVXYWxrQXN5bmMoZGlyLCBwYXRoLCBmb2xsb3dTeW1saW5rcywgdXNlU3RhdCwgc2hvdWxkU2tpcCwgc3RyaWN0KSB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXIocGF0aCArIGRpciwgc3RyaWN0KTtcbiAgZm9yKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBsZXQgbmFtZSA9IGZpbGUubmFtZTtcbiAgICBpZihuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHVuZGVmaW5lZCBmaWxlLm5hbWUgbWVhbnMgdGhlIGB3aXRoRmlsZVR5cGVzYCBvcHRpb25zIGlzIG5vdCBzdXBwb3J0ZWQgYnkgbm9kZVxuICAgICAgLy8gd2UgaGF2ZSB0byBjYWxsIHRoZSBzdGF0IGZ1bmN0aW9uIHRvIGtub3cgaWYgZmlsZSBpcyBkaXJlY3Rvcnkgb3Igbm90LlxuICAgICAgbmFtZSA9IGZpbGU7XG4gICAgICB1c2VTdGF0ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkaXIgKyAnLycgKyBuYW1lO1xuICAgIGNvbnN0IHJlbGF0aXZlID0gZmlsZW5hbWUuc2xpY2UoMSk7IC8vIFJlbW92ZSB0aGUgbGVhZGluZyAvXG4gICAgY29uc3QgYWJzb2x1dGUgPSBwYXRoICsgJy8nICsgcmVsYXRpdmU7XG4gICAgbGV0IHN0YXRzID0gbnVsbDtcbiAgICBpZih1c2VTdGF0IHx8IGZvbGxvd1N5bWxpbmtzKSB7XG4gICAgICBzdGF0cyA9IGF3YWl0IHN0YXQoYWJzb2x1dGUsIGZvbGxvd1N5bWxpbmtzKTtcbiAgICB9XG4gICAgaWYoIXN0YXRzICYmIGZpbGUubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0cyA9IGZpbGU7XG4gICAgfVxuICAgIGlmKHN0YXRzID09PSBudWxsKSB7XG4gICAgICBzdGF0cyA9IHsgaXNEaXJlY3Rvcnk6ICgpID0+IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYoIXNob3VsZFNraXAocmVsYXRpdmUpKSB7XG4gICAgICAgIHlpZWxkIHtyZWxhdGl2ZSwgYWJzb2x1dGUsIHN0YXRzfTtcbiAgICAgICAgeWllbGQqIGV4cGxvcmVXYWxrQXN5bmMoZmlsZW5hbWUsIHBhdGgsIGZvbGxvd1N5bWxpbmtzLCB1c2VTdGF0LCBzaG91bGRTa2lwLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIHtyZWxhdGl2ZSwgYWJzb2x1dGUsIHN0YXRzfTtcbiAgICB9XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uKiBleHBsb3JlKHBhdGgsIGZvbGxvd1N5bWxpbmtzLCB1c2VTdGF0LCBzaG91bGRTa2lwKSB7XG4gIHlpZWxkKiBleHBsb3JlV2Fsa0FzeW5jKCcnLCBwYXRoLCBmb2xsb3dTeW1saW5rcywgdXNlU3RhdCwgc2hvdWxkU2tpcCwgdHJ1ZSk7XG59XG5cblxuZnVuY3Rpb24gcmVhZE9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIHBhdHRlcm46IG9wdGlvbnMucGF0dGVybixcbiAgICBkb3Q6ICEhb3B0aW9ucy5kb3QsXG4gICAgbm9nbG9ic3RhcjogISFvcHRpb25zLm5vZ2xvYnN0YXIsXG4gICAgbWF0Y2hCYXNlOiAhIW9wdGlvbnMubWF0Y2hCYXNlLFxuICAgIG5vY2FzZTogISFvcHRpb25zLm5vY2FzZSxcbiAgICBpZ25vcmU6IG9wdGlvbnMuaWdub3JlLFxuICAgIHNraXA6IG9wdGlvbnMuc2tpcCxcblxuICAgIGZvbGxvdzogISFvcHRpb25zLmZvbGxvdyxcbiAgICBzdGF0OiAhIW9wdGlvbnMuc3RhdCxcbiAgICBub2RpcjogISFvcHRpb25zLm5vZGlyLFxuICAgIG1hcms6ICEhb3B0aW9ucy5tYXJrLFxuICAgIHNpbGVudDogISFvcHRpb25zLnNpbGVudCxcbiAgICBhYnNvbHV0ZTogISFvcHRpb25zLmFic29sdXRlXG4gIH07XG59XG5cbmNsYXNzIFJlYWRkaXJHbG9iIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoY3dkLCBvcHRpb25zLCBjYikge1xuICAgIHN1cGVyKCk7XG4gICAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHJlYWRPcHRpb25zKG9wdGlvbnMgfHzCoHt9KTtcbiAgXG4gICAgdGhpcy5tYXRjaGVycyA9IFtdO1xuICAgIGlmKHRoaXMub3B0aW9ucy5wYXR0ZXJuKSB7XG4gICAgICBjb25zdCBtYXRjaGVycyA9IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLnBhdHRlcm4pID8gdGhpcy5vcHRpb25zLnBhdHRlcm4gOiBbdGhpcy5vcHRpb25zLnBhdHRlcm5dO1xuICAgICAgdGhpcy5tYXRjaGVycyA9IG1hdGNoZXJzLm1hcCggbSA9PlxuICAgICAgICBuZXcgTWluaW1hdGNoKG0sIHtcbiAgICAgICAgICBkb3Q6IHRoaXMub3B0aW9ucy5kb3QsXG4gICAgICAgICAgbm9nbG9ic3Rhcjp0aGlzLm9wdGlvbnMubm9nbG9ic3RhcixcbiAgICAgICAgICBtYXRjaEJhc2U6dGhpcy5vcHRpb25zLm1hdGNoQmFzZSxcbiAgICAgICAgICBub2Nhc2U6dGhpcy5vcHRpb25zLm5vY2FzZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIFxuICAgIHRoaXMuaWdub3JlTWF0Y2hlcnMgPSBbXTtcbiAgICBpZih0aGlzLm9wdGlvbnMuaWdub3JlKSB7XG4gICAgICBjb25zdCBpZ25vcmVQYXR0ZXJucyA9IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmlnbm9yZSkgPyB0aGlzLm9wdGlvbnMuaWdub3JlIDogW3RoaXMub3B0aW9ucy5pZ25vcmVdO1xuICAgICAgdGhpcy5pZ25vcmVNYXRjaGVycyA9IGlnbm9yZVBhdHRlcm5zLm1hcCggaWdub3JlID0+XG4gICAgICAgIG5ldyBNaW5pbWF0Y2goaWdub3JlLCB7ZG90OiB0cnVlfSlcbiAgICAgICk7XG4gICAgfVxuICBcbiAgICB0aGlzLnNraXBNYXRjaGVycyA9IFtdO1xuICAgIGlmKHRoaXMub3B0aW9ucy5za2lwKSB7XG4gICAgICBjb25zdCBza2lwUGF0dGVybnMgPSBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5za2lwKSA/IHRoaXMub3B0aW9ucy5za2lwIDogW3RoaXMub3B0aW9ucy5za2lwXTtcbiAgICAgIHRoaXMuc2tpcE1hdGNoZXJzID0gc2tpcFBhdHRlcm5zLm1hcCggc2tpcCA9PlxuICAgICAgICBuZXcgTWluaW1hdGNoKHNraXAsIHtkb3Q6IHRydWV9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLml0ZXJhdG9yID0gZXhwbG9yZShyZXNvbHZlKGN3ZCB8fCAnLicpLCB0aGlzLm9wdGlvbnMuZm9sbG93LCB0aGlzLm9wdGlvbnMuc3RhdCwgdGhpcy5fc2hvdWxkU2tpcERpcmVjdG9yeS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuaW5hY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZTtcbiAgXG4gICAgaWYoY2IpIHtcbiAgICAgIHRoaXMuX21hdGNoZXMgPSBbXTsgXG4gICAgICB0aGlzLm9uKCdtYXRjaCcsIG1hdGNoID0+IHRoaXMuX21hdGNoZXMucHVzaCh0aGlzLm9wdGlvbnMuYWJzb2x1dGUgPyBtYXRjaC5hYnNvbHV0ZSA6IG1hdGNoLnJlbGF0aXZlKSk7XG4gICAgICB0aGlzLm9uKCdlcnJvcicsIGVyciA9PiBjYihlcnIpKTtcbiAgICAgIHRoaXMub24oJ2VuZCcsICgpID0+IGNiKG51bGwsIHRoaXMuX21hdGNoZXMpKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCAoKSA9PiB0aGlzLl9uZXh0KCksIDApO1xuICB9XG5cbiAgX3Nob3VsZFNraXBEaXJlY3RvcnkocmVsYXRpdmUpIHtcbiAgICAvL2NvbnNvbGUubG9nKHJlbGF0aXZlLCB0aGlzLnNraXBNYXRjaGVycy5zb21lKG0gPT4gbS5tYXRjaChyZWxhdGl2ZSkpKTtcbiAgICByZXR1cm4gdGhpcy5za2lwTWF0Y2hlcnMuc29tZShtID0+IG0ubWF0Y2gocmVsYXRpdmUpKTtcbiAgfVxuXG4gIF9maWxlTWF0Y2hlcyhyZWxhdGl2ZSwgaXNEaXJlY3RvcnkpIHtcbiAgICBjb25zdCBmaWxlID0gcmVsYXRpdmUgKyAoaXNEaXJlY3RvcnkgPyAnLycgOiAnJyk7XG4gICAgcmV0dXJuICh0aGlzLm1hdGNoZXJzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLm1hdGNoZXJzLnNvbWUobSA9PiBtLm1hdGNoKGZpbGUpKSlcbiAgICAgICYmICF0aGlzLmlnbm9yZU1hdGNoZXJzLnNvbWUobSA9PiBtLm1hdGNoKGZpbGUpKVxuICAgICAgJiYgKCF0aGlzLm9wdGlvbnMubm9kaXIgfHwgIWlzRGlyZWN0b3J5KTtcbiAgfVxuXG4gIF9uZXh0KCkge1xuICAgIGlmKCF0aGlzLnBhdXNlZCAmJiAhdGhpcy5hYm9ydGVkKSB7XG4gICAgICB0aGlzLml0ZXJhdG9yLm5leHQoKVxuICAgICAgLnRoZW4oKG9iaik9PiB7XG4gICAgICAgIGlmKCFvYmouZG9uZSkge1xuICAgICAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gb2JqLnZhbHVlLnN0YXRzLmlzRGlyZWN0b3J5KCk7XG4gICAgICAgICAgaWYodGhpcy5fZmlsZU1hdGNoZXMob2JqLnZhbHVlLnJlbGF0aXZlLCBpc0RpcmVjdG9yeSApKSB7XG4gICAgICAgICAgICBsZXQgcmVsYXRpdmUgPSBvYmoudmFsdWUucmVsYXRpdmU7XG4gICAgICAgICAgICBsZXQgYWJzb2x1dGUgPSBvYmoudmFsdWUuYWJzb2x1dGU7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWFyayAmJiBpc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICByZWxhdGl2ZSArPSAnLyc7XG4gICAgICAgICAgICAgIGFic29sdXRlICs9ICcvJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5zdGF0KSB7XG4gICAgICAgICAgICAgIHRoaXMuZW1pdCgnbWF0Y2gnLCB7cmVsYXRpdmUsIGFic29sdXRlLCBzdGF0Om9iai52YWx1ZS5zdGF0c30pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdtYXRjaCcsIHtyZWxhdGl2ZSwgYWJzb2x1dGV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbmV4dCh0aGlzLml0ZXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydCgpO1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgaWYoIWVyci5jb2RlICYmICF0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYWJvcnQoKSB7XG4gICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHBhdXNlKCkge1xuICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHJlc3VtZSgpIHtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgIGlmKHRoaXMuaW5hY3RpdmUpIHtcbiAgICAgIHRoaXMuaW5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX25leHQoKTtcbiAgICB9XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkZGlyR2xvYihwYXR0ZXJuLCBvcHRpb25zLCBjYikge1xuICByZXR1cm4gbmV3IFJlYWRkaXJHbG9iKHBhdHRlcm4sIG9wdGlvbnMsIGNiKTtcbn1cbnJlYWRkaXJHbG9iLlJlYWRkaXJHbG9iID0gUmVhZGRpckdsb2I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///76965\n")},84928:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var balanced = __webpack_require__(8505);\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m) return [str];\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n if (/\\$$/.test(m.pre)) { \n for (var k = 0; k < post.length; k++) {\n var expansion = pre+ '{' + m.body + '}' + post[k];\n expansions.push(expansion);\n }\n } else {\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,.*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = [];\n\n for (var j = 0; j < n.length; j++) {\n N.push.apply(N, expand(n[j], false));\n }\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n }\n\n return expansions;\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQ5MjguanMiLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLElBQWdCOztBQUV2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLElBQUk7QUFDL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLEtBQUs7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGFBQWE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQix1Q0FBdUMsR0FBRztBQUMxQyxZQUFZLEdBQUcseUJBQXlCO0FBQ3hDO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsY0FBYyxHQUFHO0FBQ2pCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUJBQXFCLEtBQUs7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckMsNkJBQTZCLGVBQWU7QUFDNUM7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxFQUFFO0FBQ1osNkJBQTZCO0FBQzdCLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGNBQWMsS0FBSyxRQUFRLEVBQUUsSUFBSSxFQUFFO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxzQkFBc0IsWUFBWTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUEsc0JBQXNCLGNBQWM7QUFDcEM7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixjQUFjO0FBQ2xDLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb3BpbG90LXVzYWdlLy4vbm9kZV9tb2R1bGVzL3JlYWRkaXItZ2xvYi9ub2RlX21vZHVsZXMvYnJhY2UtZXhwYW5zaW9uL2luZGV4LmpzPzQ3OTkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhbGFuY2VkID0gcmVxdWlyZSgnYmFsYW5jZWQtbWF0Y2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBhbmRUb3A7XG5cbnZhciBlc2NTbGFzaCA9ICdcXDBTTEFTSCcrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NPcGVuID0gJ1xcME9QRU4nK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjQ2xvc2UgPSAnXFwwQ0xPU0UnK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjQ29tbWEgPSAnXFwwQ09NTUEnK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjUGVyaW9kID0gJ1xcMFBFUklPRCcrTWF0aC5yYW5kb20oKSsnXFwwJztcblxuZnVuY3Rpb24gbnVtZXJpYyhzdHIpIHtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ciwgMTApID09IHN0clxuICAgID8gcGFyc2VJbnQoc3RyLCAxMClcbiAgICA6IHN0ci5jaGFyQ29kZUF0KDApO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVCcmFjZXMoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoJ1xcXFxcXFxcJykuam9pbihlc2NTbGFzaClcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXHsnKS5qb2luKGVzY09wZW4pXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFx9Jykuam9pbihlc2NDbG9zZSlcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXCwnKS5qb2luKGVzY0NvbW1hKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcLicpLmpvaW4oZXNjUGVyaW9kKTtcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVCcmFjZXMoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoZXNjU2xhc2gpLmpvaW4oJ1xcXFwnKVxuICAgICAgICAgICAgLnNwbGl0KGVzY09wZW4pLmpvaW4oJ3snKVxuICAgICAgICAgICAgLnNwbGl0KGVzY0Nsb3NlKS5qb2luKCd9JylcbiAgICAgICAgICAgIC5zcGxpdChlc2NDb21tYSkuam9pbignLCcpXG4gICAgICAgICAgICAuc3BsaXQoZXNjUGVyaW9kKS5qb2luKCcuJyk7XG59XG5cblxuLy8gQmFzaWNhbGx5IGp1c3Qgc3RyLnNwbGl0KFwiLFwiKSwgYnV0IGhhbmRsaW5nIGNhc2VzXG4vLyB3aGVyZSB3ZSBoYXZlIG5lc3RlZCBicmFjZWQgc2VjdGlvbnMsIHdoaWNoIHNob3VsZCBiZVxuLy8gdHJlYXRlZCBhcyBpbmRpdmlkdWFsIG1lbWJlcnMsIGxpa2Uge2Ese2IsY30sZH1cbmZ1bmN0aW9uIHBhcnNlQ29tbWFQYXJ0cyhzdHIpIHtcbiAgaWYgKCFzdHIpXG4gICAgcmV0dXJuIFsnJ107XG5cbiAgdmFyIHBhcnRzID0gW107XG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG5cbiAgaWYgKCFtKVxuICAgIHJldHVybiBzdHIuc3BsaXQoJywnKTtcblxuICB2YXIgcHJlID0gbS5wcmU7XG4gIHZhciBib2R5ID0gbS5ib2R5O1xuICB2YXIgcG9zdCA9IG0ucG9zdDtcbiAgdmFyIHAgPSBwcmUuc3BsaXQoJywnKTtcblxuICBwW3AubGVuZ3RoLTFdICs9ICd7JyArIGJvZHkgKyAnfSc7XG4gIHZhciBwb3N0UGFydHMgPSBwYXJzZUNvbW1hUGFydHMocG9zdCk7XG4gIGlmIChwb3N0Lmxlbmd0aCkge1xuICAgIHBbcC5sZW5ndGgtMV0gKz0gcG9zdFBhcnRzLnNoaWZ0KCk7XG4gICAgcC5wdXNoLmFwcGx5KHAsIHBvc3RQYXJ0cyk7XG4gIH1cblxuICBwYXJ0cy5wdXNoLmFwcGx5KHBhcnRzLCBwKTtcblxuICByZXR1cm4gcGFydHM7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFRvcChzdHIpIHtcbiAgaWYgKCFzdHIpXG4gICAgcmV0dXJuIFtdO1xuXG4gIC8vIEkgZG9uJ3Qga25vdyB3aHkgQmFzaCA0LjMgZG9lcyB0aGlzLCBidXQgaXQgZG9lcy5cbiAgLy8gQW55dGhpbmcgc3RhcnRpbmcgd2l0aCB7fSB3aWxsIGhhdmUgdGhlIGZpcnN0IHR3byBieXRlcyBwcmVzZXJ2ZWRcbiAgLy8gYnV0ICpvbmx5KiBhdCB0aGUgdG9wIGxldmVsLCBzbyB7fSxhfWIgd2lsbCBub3QgZXhwYW5kIHRvIGFueXRoaW5nLFxuICAvLyBidXQgYXt9LGJ9YyB3aWxsIGJlIGV4cGFuZGVkIHRvIFthfWMsYWJjXS5cbiAgLy8gT25lIGNvdWxkIGFyZ3VlIHRoYXQgdGhpcyBpcyBhIGJ1ZyBpbiBCYXNoLCBidXQgc2luY2UgdGhlIGdvYWwgb2ZcbiAgLy8gdGhpcyBtb2R1bGUgaXMgdG8gbWF0Y2ggQmFzaCdzIHJ1bGVzLCB3ZSBlc2NhcGUgYSBsZWFkaW5nIHt9XG4gIGlmIChzdHIuc3Vic3RyKDAsIDIpID09PSAne30nKSB7XG4gICAgc3RyID0gJ1xcXFx7XFxcXH0nICsgc3RyLnN1YnN0cigyKTtcbiAgfVxuXG4gIHJldHVybiBleHBhbmQoZXNjYXBlQnJhY2VzKHN0ciksIHRydWUpLm1hcCh1bmVzY2FwZUJyYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGVtYnJhY2Uoc3RyKSB7XG4gIHJldHVybiAneycgKyBzdHIgKyAnfSc7XG59XG5mdW5jdGlvbiBpc1BhZGRlZChlbCkge1xuICByZXR1cm4gL14tPzBcXGQvLnRlc3QoZWwpO1xufVxuXG5mdW5jdGlvbiBsdGUoaSwgeSkge1xuICByZXR1cm4gaSA8PSB5O1xufVxuZnVuY3Rpb24gZ3RlKGksIHkpIHtcbiAgcmV0dXJuIGkgPj0geTtcbn1cblxuZnVuY3Rpb24gZXhwYW5kKHN0ciwgaXNUb3ApIHtcbiAgdmFyIGV4cGFuc2lvbnMgPSBbXTtcblxuICB2YXIgbSA9IGJhbGFuY2VkKCd7JywgJ30nLCBzdHIpO1xuICBpZiAoIW0pIHJldHVybiBbc3RyXTtcblxuICAvLyBubyBuZWVkIHRvIGV4cGFuZCBwcmUsIHNpbmNlIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgZnJlZSBvZiBicmFjZS1zZXRzXG4gIHZhciBwcmUgPSBtLnByZTtcbiAgdmFyIHBvc3QgPSBtLnBvc3QubGVuZ3RoXG4gICAgPyBleHBhbmQobS5wb3N0LCBmYWxzZSlcbiAgICA6IFsnJ107XG5cbiAgaWYgKC9cXCQkLy50ZXN0KG0ucHJlKSkgeyAgICBcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgIHZhciBleHBhbnNpb24gPSBwcmUrICd7JyArIG0uYm9keSArICd9JyArIHBvc3Rba107XG4gICAgICBleHBhbnNpb25zLnB1c2goZXhwYW5zaW9uKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGlzTnVtZXJpY1NlcXVlbmNlID0gL14tP1xcZCtcXC5cXC4tP1xcZCsoPzpcXC5cXC4tP1xcZCspPyQvLnRlc3QobS5ib2R5KTtcbiAgICB2YXIgaXNBbHBoYVNlcXVlbmNlID0gL15bYS16QS1aXVxcLlxcLlthLXpBLVpdKD86XFwuXFwuLT9cXGQrKT8kLy50ZXN0KG0uYm9keSk7XG4gICAgdmFyIGlzU2VxdWVuY2UgPSBpc051bWVyaWNTZXF1ZW5jZSB8fCBpc0FscGhhU2VxdWVuY2U7XG4gICAgdmFyIGlzT3B0aW9ucyA9IG0uYm9keS5pbmRleE9mKCcsJykgPj0gMDtcbiAgICBpZiAoIWlzU2VxdWVuY2UgJiYgIWlzT3B0aW9ucykge1xuICAgICAgLy8ge2F9LGJ9XG4gICAgICBpZiAobS5wb3N0Lm1hdGNoKC8sLipcXH0vKSkge1xuICAgICAgICBzdHIgPSBtLnByZSArICd7JyArIG0uYm9keSArIGVzY0Nsb3NlICsgbS5wb3N0O1xuICAgICAgICByZXR1cm4gZXhwYW5kKHN0cik7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3N0cl07XG4gICAgfVxuXG4gICAgdmFyIG47XG4gICAgaWYgKGlzU2VxdWVuY2UpIHtcbiAgICAgIG4gPSBtLmJvZHkuc3BsaXQoL1xcLlxcLi8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuID0gcGFyc2VDb21tYVBhcnRzKG0uYm9keSk7XG4gICAgICBpZiAobi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8geHt7YSxifX15ID09PiB4e2F9eSB4e2J9eVxuICAgICAgICBuID0gZXhwYW5kKG5bMF0sIGZhbHNlKS5tYXAoZW1icmFjZSk7XG4gICAgICAgIGlmIChuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBwb3N0Lm1hcChmdW5jdGlvbihwKSB7XG4gICAgICAgICAgICByZXR1cm4gbS5wcmUgKyBuWzBdICsgcDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIG4gaXMgdGhlIHBhcnRzLCBhbmQgd2Uga25vdyBpdCdzIG5vdCBhIGNvbW1hIHNldFxuICAgIC8vIHdpdGggYSBzaW5nbGUgZW50cnkuXG4gICAgdmFyIE47XG5cbiAgICBpZiAoaXNTZXF1ZW5jZSkge1xuICAgICAgdmFyIHggPSBudW1lcmljKG5bMF0pO1xuICAgICAgdmFyIHkgPSBudW1lcmljKG5bMV0pO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5tYXgoblswXS5sZW5ndGgsIG5bMV0ubGVuZ3RoKVxuICAgICAgdmFyIGluY3IgPSBuLmxlbmd0aCA9PSAzXG4gICAgICAgID8gTWF0aC5hYnMobnVtZXJpYyhuWzJdKSlcbiAgICAgICAgOiAxO1xuICAgICAgdmFyIHRlc3QgPSBsdGU7XG4gICAgICB2YXIgcmV2ZXJzZSA9IHkgPCB4O1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgaW5jciAqPSAtMTtcbiAgICAgICAgdGVzdCA9IGd0ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYWQgPSBuLnNvbWUoaXNQYWRkZWQpO1xuXG4gICAgICBOID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSB4OyB0ZXN0KGksIHkpOyBpICs9IGluY3IpIHtcbiAgICAgICAgdmFyIGM7XG4gICAgICAgIGlmIChpc0FscGhhU2VxdWVuY2UpIHtcbiAgICAgICAgICBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTtcbiAgICAgICAgICBpZiAoYyA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgYyA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGMgPSBTdHJpbmcoaSk7XG4gICAgICAgICAgaWYgKHBhZCkge1xuICAgICAgICAgICAgdmFyIG5lZWQgPSB3aWR0aCAtIGMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG5lZWQgPiAwKSB7XG4gICAgICAgICAgICAgIHZhciB6ID0gbmV3IEFycmF5KG5lZWQgKyAxKS5qb2luKCcwJyk7XG4gICAgICAgICAgICAgIGlmIChpIDwgMClcbiAgICAgICAgICAgICAgICBjID0gJy0nICsgeiArIGMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjID0geiArIGM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE4ucHVzaChjKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgTiA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgTi5wdXNoLmFwcGx5KE4sIGV4cGFuZChuW2pdLCBmYWxzZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgTi5sZW5ndGg7IGorKykge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwb3N0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBleHBhbnNpb24gPSBwcmUgKyBOW2pdICsgcG9zdFtrXTtcbiAgICAgICAgaWYgKCFpc1RvcCB8fCBpc1NlcXVlbmNlIHx8IGV4cGFuc2lvbilcbiAgICAgICAgICBleHBhbnNpb25zLnB1c2goZXhwYW5zaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5zaW9ucztcbn1cblxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///84928\n")},88664:module=>{eval("const isWindows = typeof process === 'object' &&\n process &&\n process.platform === 'win32'\nmodule.exports = isWindows ? { sep: '\\\\' } : { sep: '/' }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODg2NjQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFlBQVksSUFBSSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvcGlsb3QtdXNhZ2UvLi9ub2RlX21vZHVsZXMvcmVhZGRpci1nbG9iL25vZGVfbW9kdWxlcy9taW5pbWF0Y2gvbGliL3BhdGguanM/YTRkMSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1dpbmRvd3MgPSB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2VzcyAmJlxuICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG5tb2R1bGUuZXhwb3J0cyA9IGlzV2luZG93cyA/IHsgc2VwOiAnXFxcXCcgfSA6IHsgc2VwOiAnLycgfVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///88664\n")},25835:(module,__unused_webpack_exports,__webpack_require__)=>{eval("const minimatch = module.exports = (p, pattern, options = {}) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\nmodule.exports = minimatch\n\nconst path = __webpack_require__(88664)\nminimatch.sep = path.sep\n\nconst GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\nconst expand = __webpack_require__(84928)\n\nconst plTypes = {\n '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n '?': { open: '(?:', close: ')?' },\n '+': { open: '(?:', close: ')+' },\n '*': { open: '(?:', close: ')*' },\n '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// \"abc\" -> { a:true, b:true, c:true }\nconst charSet = s => s.split('').reduce((set, c) => {\n set[c] = true\n return set\n}, {})\n\n// characters that need to be escaped in RegExp.\nconst reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// characters that indicate we have to add the pattern start\nconst addPatternStartSet = charSet('[.(')\n\n// normalizes slashes.\nconst slashSplit = /\\/+/\n\nminimatch.filter = (pattern, options = {}) =>\n (p, i, list) => minimatch(p, pattern, options)\n\nconst ext = (a, b = {}) => {\n const t = {}\n Object.keys(a).forEach(k => t[k] = a[k])\n Object.keys(b).forEach(k => t[k] = b[k])\n return t\n}\n\nminimatch.defaults = def => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p, pattern, options) => orig(p, pattern, ext(def, options))\n m.Minimatch = class Minimatch extends orig.Minimatch {\n constructor (pattern, options) {\n super(pattern, ext(def, options))\n }\n }\n m.Minimatch.defaults = options => orig.defaults(ext(def, options)).Minimatch\n m.filter = (pattern, options) => orig.filter(pattern, ext(def, options))\n m.defaults = options => orig.defaults(ext(def, options))\n m.makeRe = (pattern, options) => orig.makeRe(pattern, ext(def, options))\n m.braceExpand = (pattern, options) => orig.braceExpand(pattern, ext(def, options))\n m.match = (list, pattern, options) => orig.match(list, pattern, ext(def, options))\n\n return m\n}\n\n\n\n\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = (pattern, options) => braceExpand(pattern, options)\n\nconst braceExpand = (pattern, options = {}) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\n\nconst MAX_PATTERN_LENGTH = 1024 * 64\nconst assertValidPattern = pattern => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nconst SUBPARSE = Symbol('subparse')\n\nminimatch.makeRe = (pattern, options) =>\n new Minimatch(pattern, options || {}).makeRe()\n\nminimatch.match = (list, pattern, options = {}) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\n\n// replace stuff like \\* with *\nconst globUnescape = s => s.replace(/\\\\(.)/g, '$1')\nconst charUnescape = s => s.replace(/\\\\([^-\\]])/g, '$1')\nconst regExpEscape = s => s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\nconst braExpEscape = s => s.replace(/[[\\]\\\\]/g, '\\\\$&')\n\nclass Minimatch {\n constructor (pattern, options) {\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n this.options = options\n this.set = []\n this.pattern = pattern\n this.windowsPathsNoEscape = !!options.windowsPathsNoEscape ||\n options.allowWindowsEscape === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.regexp = null\n this.negate = false\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n\n // make the set of regexps etc.\n this.make()\n }\n\n debug () {}\n\n make () {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n let set = this.globSet = this.braceExpand()\n\n if (options.debug) this.debug = (...args) => console.error(...args)\n\n this.debug(this.pattern, set)\n\n // step 3: now we have a set, so turn each one into a series of path-portion\n // matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n set = this.globParts = set.map(s => s.split(slashSplit))\n\n this.debug(this.pattern, set)\n\n // glob --\x3e regexps\n set = set.map((s, si, set) => s.map(this.parse, this))\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n set = set.filter(s => s.indexOf(false) === -1)\n\n this.debug(this.pattern, set)\n\n this.set = set\n }\n\n parseNegate () {\n if (this.options.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne (file, pattern, partial) {\n var options = this.options\n\n this.debug('matchOne',\n { 'this': this, file: file, pattern: pattern })\n\n this.debug('matchOne', file.length, pattern.length)\n\n for (var fi = 0,\n pi = 0,\n fl = file.length,\n pl = pattern.length\n ; (fi < fl) && (pi < pl)\n ; fi++, pi++) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* istanbul ignore if */\n if (p === false) return false\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' || file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')) return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' || swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n // If there's more *pattern* left, then\n /* istanbul ignore if */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) return true\n }\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n var hit\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = f.match(p)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else /* istanbul ignore else */ if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return (fi === fl - 1) && (file[fi] === '')\n }\n\n // should be unreachable.\n /* istanbul ignore next */\n throw new Error('wtf?')\n }\n\n braceExpand () {\n return braceExpand(this.pattern, this.options)\n }\n\n parse (pattern, isSub) {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') {\n if (!options.noglobstar)\n return GLOBSTAR\n else\n pattern = '*'\n }\n if (pattern === '') return ''\n\n let re = ''\n let hasMagic = false\n let escaping = false\n // ? => one single character\n const patternListStack = []\n const negativeLists = []\n let stateChar\n let inClass = false\n let reClassStart = -1\n let classStart = -1\n let cs\n let pl\n let sp\n // . and .. never match anything that doesn't start with .,\n // even when options.dot is set. However, if the pattern\n // starts with ., then traversal patterns can match.\n let dotTravAllowed = pattern.charAt(0) === '.'\n let dotFileAllowed = options.dot || dotTravAllowed\n const patternStart = () =>\n dotTravAllowed\n ? ''\n : dotFileAllowed\n ? '(?!(?:^|\\\\/)\\\\.{1,2}(?:$|\\\\/))'\n : '(?!\\\\.)'\n const subPatternStart = (p) =>\n p.charAt(0) === '.'\n ? ''\n : options.dot\n ? '(?!(?:^|\\\\/)\\\\.{1,2}(?:$|\\\\/))'\n : '(?!\\\\.)'\n\n\n const clearStateChar = () => {\n if (stateChar) {\n // we had some state-tracking character\n // that wasn't consumed by this pass.\n switch (stateChar) {\n case '*':\n re += star\n hasMagic = true\n break\n case '?':\n re += qmark\n hasMagic = true\n break\n default:\n re += '\\\\' + stateChar\n break\n }\n this.debug('clearStateChar %j %j', stateChar, re)\n stateChar = false\n }\n }\n\n for (let i = 0, c; (i < pattern.length) && (c = pattern.charAt(i)); i++) {\n this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n // skip over any that are escaped.\n if (escaping) {\n /* istanbul ignore next - completely not allowed, even escaped. */\n if (c === '/') {\n return false\n }\n\n if (reSpecials[c]) {\n re += '\\\\'\n }\n re += c\n escaping = false\n continue\n }\n\n switch (c) {\n /* istanbul ignore next */\n case '/': {\n // Should already be path-split by now.\n return false\n }\n\n case '\\\\':\n if (inClass && pattern.charAt(i + 1) === '-') {\n re += c\n continue\n }\n\n clearStateChar()\n escaping = true\n continue\n\n // the various stateChar values\n // for the \"extglob\" stuff.\n case '?':\n case '*':\n case '+':\n case '@':\n case '!':\n this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n // all of those are literals inside a class, except that\n // the glob [!a] means [^a] in regexp\n if (inClass) {\n this.debug(' in class')\n if (c === '!' && i === classStart + 1) c = '^'\n re += c\n continue\n }\n\n // if we already have a stateChar, then it means\n // that there was something like ** or +? in there.\n // Handle the stateChar, then proceed with this one.\n this.debug('call clearStateChar %j', stateChar)\n clearStateChar()\n stateChar = c\n // if extglob is disabled, then +(asdf|foo) isn't a thing.\n // just clear the statechar *now*, rather than even diving into\n // the patternList stuff.\n if (options.noext) clearStateChar()\n continue\n\n case '(': {\n if (inClass) {\n re += '('\n continue\n }\n\n if (!stateChar) {\n re += '\\\\('\n continue\n }\n\n const plEntry = {\n type: stateChar,\n start: i - 1,\n reStart: re.length,\n open: plTypes[stateChar].open,\n close: plTypes[stateChar].close,\n }\n this.debug(this.pattern, '\\t', plEntry)\n patternListStack.push(plEntry)\n // negation is (?:(?!(?:js)(?:))[^/]*)\n re += plEntry.open\n // next entry starts with a dot maybe?\n if (plEntry.start === 0 && plEntry.type !== '!') {\n dotTravAllowed = true\n re += subPatternStart(pattern.slice(i + 1))\n }\n this.debug('plType %j %j', stateChar, re)\n stateChar = false\n continue\n }\n\n case ')': {\n const plEntry = patternListStack[patternListStack.length - 1]\n if (inClass || !plEntry) {\n re += '\\\\)'\n continue\n }\n patternListStack.pop()\n\n // closing an extglob\n clearStateChar()\n hasMagic = true\n pl = plEntry\n // negation is (?:(?!js)[^/]*)\n // The others are (?:)\n re += pl.close\n if (pl.type === '!') {\n negativeLists.push(Object.assign(pl, { reEnd: re.length }))\n }\n continue\n }\n\n case '|': {\n const plEntry = patternListStack[patternListStack.length - 1]\n if (inClass || !plEntry) {\n re += '\\\\|'\n continue\n }\n\n clearStateChar()\n re += '|'\n // next subpattern can start with a dot?\n if (plEntry.start === 0 && plEntry.type !== '!') {\n dotTravAllowed = true\n re += subPatternStart(pattern.slice(i + 1))\n }\n continue\n }\n\n // these are mostly the same in regexp and glob\n case '[':\n // swallow any state-tracking char before the [\n clearStateChar()\n\n if (inClass) {\n re += '\\\\' + c\n continue\n }\n\n inClass = true\n classStart = i\n reClassStart = re.length\n re += c\n continue\n\n case ']':\n // a right bracket shall lose its special\n // meaning and represent itself in\n // a bracket expression if it occurs\n // first in the list. -- POSIX.2 2.8.3.2\n if (i === classStart + 1 || !inClass) {\n re += '\\\\' + c\n continue\n }\n\n // split where the last [ was, make sure we don't have\n // an invalid re. if so, re-walk the contents of the\n // would-be class to re-translate any characters that\n // were passed through as-is\n // TODO: It would probably be faster to determine this\n // without a try/catch and a new RegExp, but it's tricky\n // to do safely. For now, this is safe and works.\n cs = pattern.substring(classStart + 1, i)\n try {\n RegExp('[' + braExpEscape(charUnescape(cs)) + ']')\n // looks good, finish up the class.\n re += c\n } catch (er) {\n // out of order ranges in JS are errors, but in glob syntax,\n // they're just a range that matches nothing.\n re = re.substring(0, reClassStart) + '(?:$.)' // match nothing ever\n }\n hasMagic = true\n inClass = false\n continue\n\n default:\n // swallow any state char that wasn't consumed\n clearStateChar()\n\n if (reSpecials[c] && !(c === '^' && inClass)) {\n re += '\\\\'\n }\n\n re += c\n break\n\n } // switch\n } // for\n\n // handle the case where we left a class open.\n // \"[abc\" is valid, equivalent to \"\\[abc\"\n if (inClass) {\n // split where the last [ was, and escape it\n // this is a huge pita. We now have to re-walk\n // the contents of the would-be class to re-translate\n // any characters that were passed through as-is\n cs = pattern.slice(classStart + 1)\n sp = this.parse(cs, SUBPARSE)\n re = re.substring(0, reClassStart) + '\\\\[' + sp[0]\n hasMagic = hasMagic || sp[1]\n }\n\n // handle the case where we had a +( thing at the *end*\n // of the pattern.\n // each pattern list stack adds 3 chars, and we need to go through\n // and escape any | chars that were passed through as-is for the regexp.\n // Go through and escape them, taking care not to double-escape any\n // | chars that were already escaped.\n for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n let tail\n tail = re.slice(pl.reStart + pl.open.length)\n this.debug('setting tail', re, pl)\n // maybe some even number of \\, then maybe 1 \\, followed by a |\n tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, (_, $1, $2) => {\n /* istanbul ignore else - should already be done */\n if (!$2) {\n // the | isn't already escaped, so escape it.\n $2 = '\\\\'\n }\n\n // need to escape all those slashes *again*, without escaping the\n // one that we need for escaping the | character. As it works out,\n // escaping an even number of slashes can be done by simply repeating\n // it exactly after itself. That's why this trick works.\n //\n // I am sorry that you have to see this.\n return $1 + $1 + $2 + '|'\n })\n\n this.debug('tail=%j\\n %s', tail, tail, pl, re)\n const t = pl.type === '*' ? star\n : pl.type === '?' ? qmark\n : '\\\\' + pl.type\n\n hasMagic = true\n re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n }\n\n // handle trailing things that only matter at the very end.\n clearStateChar()\n if (escaping) {\n // trailing \\\\\n re += '\\\\\\\\'\n }\n\n // only need to apply the nodot start if the re starts with\n // something that could conceivably capture a dot\n const addPatternStart = addPatternStartSet[re.charAt(0)]\n\n // Hack to work around lack of negative lookbehind in JS\n // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n // like 'a.xyz.yz' doesn't match. So, the first negative\n // lookahead, has to look ALL the way ahead, to the end of\n // the pattern.\n for (let n = negativeLists.length - 1; n > -1; n--) {\n const nl = negativeLists[n]\n\n const nlBefore = re.slice(0, nl.reStart)\n const nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n let nlAfter = re.slice(nl.reEnd)\n const nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + nlAfter\n\n // Handle nested stuff like *(*.js|!(*.json)), where open parens\n // mean that we should *not* include the ) in the bit that is considered\n // \"after\" the negated section.\n const closeParensBefore = nlBefore.split(')').length\n const openParensBefore = nlBefore.split('(').length - closeParensBefore\n let cleanAfter = nlAfter\n for (let i = 0; i < openParensBefore; i++) {\n cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n }\n nlAfter = cleanAfter\n\n const dollar = nlAfter === '' && isSub !== SUBPARSE ? '(?:$|\\\\/)' : ''\n\n re = nlBefore + nlFirst + nlAfter + dollar + nlLast\n }\n\n // if the re is not \"\" at this point, then we need to make sure\n // it doesn't match against an empty path part.\n // Otherwise a/* will match a/, which it should not.\n if (re !== '' && hasMagic) {\n re = '(?=.)' + re\n }\n\n if (addPatternStart) {\n re = patternStart() + re\n }\n\n // parsing just a piece of a larger pattern.\n if (isSub === SUBPARSE) {\n return [re, hasMagic]\n }\n\n // if it's nocase, and the lcase/uppercase don't match, it's magic\n if (options.nocase && !hasMagic) {\n hasMagic = pattern.toUpperCase() !== pattern.toLowerCase()\n }\n\n // skip the regexp for non-magical patterns\n // unescape anything in it, though, so that it'll be\n // an exact match against a file etc.\n if (!hasMagic) {\n return globUnescape(pattern)\n }\n\n const flags = options.nocase ? 'i' : ''\n try {\n return Object.assign(new RegExp('^' + re + '$', flags), {\n _glob: pattern,\n _src: re,\n })\n } catch (er) /* istanbul ignore next - should be impossible */ {\n // If it was an invalid regular expression, then it can't match\n // anything. This trick looks for a character after the end of\n // the string, which is of course impossible, except in multi-line\n // mode, but it's not a /m regex.\n return new RegExp('$.')\n }\n }\n\n makeRe () {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar = options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n const flags = options.nocase ? 'i' : ''\n\n // coalesce globstars and regexpify non-globstar patterns\n // if it's the only item, then we just do one twoStar\n // if it's the first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if it's the last, append (\\/twoStar|) to previous\n // if it's in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set.map(pattern => {\n pattern = pattern.map(p =>\n typeof p === 'string' ? regExpEscape(p)\n : p === GLOBSTAR ? GLOBSTAR\n : p._src\n ).reduce((set, p) => {\n if (!(set[set.length - 1] === GLOBSTAR && p === GLOBSTAR)) {\n set.push(p)\n }\n return set\n }, [])\n pattern.forEach((p, i) => {\n if (p !== GLOBSTAR || pattern[i-1] === GLOBSTAR) {\n return\n }\n if (i === 0) {\n if (pattern.length > 1) {\n pattern[i+1] = '(?:\\\\\\/|' + twoStar + '\\\\\\/)?' + pattern[i+1]\n } else {\n pattern[i] = twoStar\n }\n } else if (i === pattern.length - 1) {\n pattern[i-1] += '(?:\\\\\\/|' + twoStar + ')?'\n } else {\n pattern[i-1] += '(?:\\\\\\/|\\\\\\/' + twoStar + '\\\\\\/)' + pattern[i+1]\n pattern[i+1] = GLOBSTAR\n }\n })\n return pattern.filter(p => p !== GLOBSTAR).join('/')\n }).join('|')\n\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^(?:' + re + ')$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').*$'\n\n try {\n this.regexp = new RegExp(re, flags)\n } catch (ex) /* istanbul ignore next - should be impossible */ {\n this.regexp = false\n }\n return this.regexp\n }\n\n match (f, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) return false\n if (this.empty) return f === ''\n\n if (f === '/' && partial) return true\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (path.sep !== '/') {\n f = f.split(path.sep).join('/')\n }\n\n // treat the test path as a set of pathparts.\n f = f.split(slashSplit)\n this.debug(this.pattern, 'split', f)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename\n for (let i = f.length - 1; i >= 0; i--) {\n filename = f[i]\n if (filename) break\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = f\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) return true\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) return false\n return this.negate\n }\n\n static defaults (def) {\n return minimatch.defaults(def).Minimatch\n }\n}\n\nminimatch.Minimatch = Minimatch\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU4MzUuanMiLCJtYXBwaW5ncyI6IkFBQUEsNERBQTREO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsYUFBYSxtQkFBTyxDQUFDLEtBQWU7QUFDcEM7O0FBRUE7QUFDQTtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxLQUFpQjs7QUFFeEM7QUFDQSxTQUFTLHNDQUFzQztBQUMvQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLElBQUk7O0FBRS9DO0FBQ0E7QUFDQTs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxJQUFJOztBQUVMO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBOztBQUVBO0FBQ0E7O0FBRUEseUNBQXlDO0FBQ3pDOztBQUVBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7QUFNQTtBQUNBLEtBQUssSUFBSTtBQUNULEtBQUssR0FBRztBQUNSLEtBQUssS0FBSztBQUNWLEtBQUssSUFBSSxJQUFJLEVBQUU7QUFDZixLQUFLLElBQUksRUFBRSxJQUFJO0FBQ2Y7QUFDQTtBQUNBLEtBQUssSUFBSSxPQUFPLElBQUk7QUFDcEIsS0FBSyxFQUFFLE9BQU8sRUFBRTtBQUNoQjs7QUFFQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QixRQUFRLE1BQU07QUFDM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQ0FBc0M7O0FBRXRDLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGlEQUFpRDtBQUNyRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSw0Q0FBNEM7O0FBRXBEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixJQUFJO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsSUFBSTtBQUMvQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixpREFBaUQ7QUFDeEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxrQkFBa0I7QUFDckU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxRQUFRO0FBQ1IsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLElBQUk7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsRUFBRSxFQUFFLEtBQUs7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLFFBQVE7QUFDdkM7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29waWxvdC11c2FnZS8uL25vZGVfbW9kdWxlcy9yZWFkZGlyLWdsb2Ivbm9kZV9tb2R1bGVzL21pbmltYXRjaC9taW5pbWF0Y2guanM/ODVmMyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBtaW5pbWF0Y2ggPSBtb2R1bGUuZXhwb3J0cyA9IChwLCBwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgYXNzZXJ0VmFsaWRQYXR0ZXJuKHBhdHRlcm4pXG5cbiAgLy8gc2hvcnRjdXQ6IGNvbW1lbnRzIG1hdGNoIG5vdGhpbmcuXG4gIGlmICghb3B0aW9ucy5ub2NvbW1lbnQgJiYgcGF0dGVybi5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucykubWF0Y2gocClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaW5pbWF0Y2hcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJy4vbGliL3BhdGguanMnKVxubWluaW1hdGNoLnNlcCA9IHBhdGguc2VwXG5cbmNvbnN0IEdMT0JTVEFSID0gU3ltYm9sKCdnbG9ic3RhciAqKicpXG5taW5pbWF0Y2guR0xPQlNUQVIgPSBHTE9CU1RBUlxuY29uc3QgZXhwYW5kID0gcmVxdWlyZSgnYnJhY2UtZXhwYW5zaW9uJylcblxuY29uc3QgcGxUeXBlcyA9IHtcbiAgJyEnOiB7IG9wZW46ICcoPzooPyEoPzonLCBjbG9zZTogJykpW14vXSo/KSd9LFxuICAnPyc6IHsgb3BlbjogJyg/OicsIGNsb3NlOiAnKT8nIH0sXG4gICcrJzogeyBvcGVuOiAnKD86JywgY2xvc2U6ICcpKycgfSxcbiAgJyonOiB7IG9wZW46ICcoPzonLCBjbG9zZTogJykqJyB9LFxuICAnQCc6IHsgb3BlbjogJyg/OicsIGNsb3NlOiAnKScgfVxufVxuXG4vLyBhbnkgc2luZ2xlIHRoaW5nIG90aGVyIHRoYW4gL1xuLy8gZG9uJ3QgbmVlZCB0byBlc2NhcGUgLyB3aGVuIHVzaW5nIG5ldyBSZWdFeHAoKVxuY29uc3QgcW1hcmsgPSAnW14vXSdcblxuLy8gKiA9PiBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnNcbmNvbnN0IHN0YXIgPSBxbWFyayArICcqPydcblxuLy8gKiogd2hlbiBkb3RzIGFyZSBhbGxvd2VkLiAgQW55dGhpbmcgZ29lcywgZXhjZXB0IC4uIGFuZCAuXG4vLyBub3QgKF4gb3IgLyBmb2xsb3dlZCBieSBvbmUgb3IgdHdvIGRvdHMgZm9sbG93ZWQgYnkgJCBvciAvKSxcbi8vIGZvbGxvd2VkIGJ5IGFueXRoaW5nLCBhbnkgbnVtYmVyIG9mIHRpbWVzLlxuY29uc3QgdHdvU3RhckRvdCA9ICcoPzooPyEoPzpcXFxcXFwvfF4pKD86XFxcXC57MSwyfSkoJHxcXFxcXFwvKSkuKSo/J1xuXG4vLyBub3QgYSBeIG9yIC8gZm9sbG93ZWQgYnkgYSBkb3QsXG4vLyBmb2xsb3dlZCBieSBhbnl0aGluZywgYW55IG51bWJlciBvZiB0aW1lcy5cbmNvbnN0IHR3b1N0YXJOb0RvdCA9ICcoPzooPyEoPzpcXFxcXFwvfF4pXFxcXC4pLikqPydcblxuLy8gXCJhYmNcIiAtPiB7IGE6dHJ1ZSwgYjp0cnVlLCBjOnRydWUgfVxuY29uc3QgY2hhclNldCA9IHMgPT4gcy5zcGxpdCgnJykucmVkdWNlKChzZXQsIGMpID0+IHtcbiAgc2V0W2NdID0gdHJ1ZVxuICByZXR1cm4gc2V0XG59LCB7fSlcblxuLy8gY2hhcmFjdGVycyB0aGF0IG5lZWQgdG8gYmUgZXNjYXBlZCBpbiBSZWdFeHAuXG5jb25zdCByZVNwZWNpYWxzID0gY2hhclNldCgnKCkuKnt9Kz9bXV4kXFxcXCEnKVxuXG4vLyBjaGFyYWN0ZXJzIHRoYXQgaW5kaWNhdGUgd2UgaGF2ZSB0byBhZGQgdGhlIHBhdHRlcm4gc3RhcnRcbmNvbnN0IGFkZFBhdHRlcm5TdGFydFNldCA9IGNoYXJTZXQoJ1suKCcpXG5cbi8vIG5vcm1hbGl6ZXMgc2xhc2hlcy5cbmNvbnN0IHNsYXNoU3BsaXQgPSAvXFwvKy9cblxubWluaW1hdGNoLmZpbHRlciA9IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+XG4gIChwLCBpLCBsaXN0KSA9PiBtaW5pbWF0Y2gocCwgcGF0dGVybiwgb3B0aW9ucylcblxuY29uc3QgZXh0ID0gKGEsIGIgPSB7fSkgPT4ge1xuICBjb25zdCB0ID0ge31cbiAgT2JqZWN0LmtleXMoYSkuZm9yRWFjaChrID0+IHRba10gPSBhW2tdKVxuICBPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGsgPT4gdFtrXSA9IGJba10pXG4gIHJldHVybiB0XG59XG5cbm1pbmltYXRjaC5kZWZhdWx0cyA9IGRlZiA9PiB7XG4gIGlmICghZGVmIHx8IHR5cGVvZiBkZWYgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhkZWYpLmxlbmd0aCkge1xuICAgIHJldHVybiBtaW5pbWF0Y2hcbiAgfVxuXG4gIGNvbnN0IG9yaWcgPSBtaW5pbWF0Y2hcblxuICBjb25zdCBtID0gKHAsIHBhdHRlcm4sIG9wdGlvbnMpID0+IG9yaWcocCwgcGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpXG4gIG0uTWluaW1hdGNoID0gY2xhc3MgTWluaW1hdGNoIGV4dGVuZHMgb3JpZy5NaW5pbWF0Y2gge1xuICAgIGNvbnN0cnVjdG9yIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gICAgICBzdXBlcihwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgICB9XG4gIH1cbiAgbS5NaW5pbWF0Y2guZGVmYXVsdHMgPSBvcHRpb25zID0+IG9yaWcuZGVmYXVsdHMoZXh0KGRlZiwgb3B0aW9ucykpLk1pbmltYXRjaFxuICBtLmZpbHRlciA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnLmZpbHRlcihwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgbS5kZWZhdWx0cyA9IG9wdGlvbnMgPT4gb3JpZy5kZWZhdWx0cyhleHQoZGVmLCBvcHRpb25zKSlcbiAgbS5tYWtlUmUgPSAocGF0dGVybiwgb3B0aW9ucykgPT4gb3JpZy5tYWtlUmUocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpXG4gIG0uYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4gb3JpZy5icmFjZUV4cGFuZChwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgbS5tYXRjaCA9IChsaXN0LCBwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnLm1hdGNoKGxpc3QsIHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKVxuXG4gIHJldHVybiBtXG59XG5cblxuXG5cblxuLy8gQnJhY2UgZXhwYW5zaW9uOlxuLy8gYXtiLGN9ZCAtPiBhYmQgYWNkXG4vLyBhe2IsfWMgLT4gYWJjIGFjXG4vLyBhezAuLjN9ZCAtPiBhMGQgYTFkIGEyZCBhM2Rcbi8vIGF7Yixje2QsZX1mfWcgLT4gYWJnIGFjZGZnIGFjZWZnXG4vLyBhe2IsY31ke2UsZn1nIC0+IGFiZGVnIGFjZGVnIGFiZGVnIGFiZGZnXG4vL1xuLy8gSW52YWxpZCBzZXRzIGFyZSBub3QgZXhwYW5kZWQuXG4vLyBhezIuLn1iIC0+IGF7Mi4ufWJcbi8vIGF7Yn1jIC0+IGF7Yn1jXG5taW5pbWF0Y2guYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4gYnJhY2VFeHBhbmQocGF0dGVybiwgb3B0aW9ucylcblxuY29uc3QgYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGFzc2VydFZhbGlkUGF0dGVybihwYXR0ZXJuKVxuXG4gIC8vIFRoYW5rcyB0byBZZXRpbmcgTGkgPGh0dHBzOi8vZ2l0aHViLmNvbS95ZXRpbmdsaT4gZm9yXG4gIC8vIGltcHJvdmluZyB0aGlzIHJlZ2V4cCB0byBhdm9pZCBhIFJlRE9TIHZ1bG5lcmFiaWxpdHkuXG4gIGlmIChvcHRpb25zLm5vYnJhY2UgfHwgIS9cXHsoPzooPyFcXHspLikqXFx9Ly50ZXN0KHBhdHRlcm4pKSB7XG4gICAgLy8gc2hvcnRjdXQuIG5vIG5lZWQgdG8gZXhwYW5kLlxuICAgIHJldHVybiBbcGF0dGVybl1cbiAgfVxuXG4gIHJldHVybiBleHBhbmQocGF0dGVybilcbn1cblxuY29uc3QgTUFYX1BBVFRFUk5fTEVOR1RIID0gMTAyNCAqIDY0XG5jb25zdCBhc3NlcnRWYWxpZFBhdHRlcm4gPSBwYXR0ZXJuID0+IHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGF0dGVybicpXG4gIH1cblxuICBpZiAocGF0dGVybi5sZW5ndGggPiBNQVhfUEFUVEVSTl9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXR0ZXJuIGlzIHRvbyBsb25nJylcbiAgfVxufVxuXG4vLyBwYXJzZSBhIGNvbXBvbmVudCBvZiB0aGUgZXhwYW5kZWQgc2V0LlxuLy8gQXQgdGhpcyBwb2ludCwgbm8gcGF0dGVybiBtYXkgY29udGFpbiBcIi9cIiBpbiBpdFxuLy8gc28gd2UncmUgZ29pbmcgdG8gcmV0dXJuIGEgMmQgYXJyYXksIHdoZXJlIGVhY2ggZW50cnkgaXMgdGhlIGZ1bGxcbi8vIHBhdHRlcm4sIHNwbGl0IG9uICcvJywgYW5kIHRoZW4gdHVybmVkIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24uXG4vLyBBIHJlZ2V4cCBpcyBtYWRlIGF0IHRoZSBlbmQgd2hpY2ggam9pbnMgZWFjaCBhcnJheSB3aXRoIGFuXG4vLyBlc2NhcGVkIC8sIGFuZCBhbm90aGVyIGZ1bGwgb25lIHdoaWNoIGpvaW5zIGVhY2ggcmVnZXhwIHdpdGggfC5cbi8vXG4vLyBGb2xsb3dpbmcgdGhlIGxlYWQgb2YgQmFzaCA0LjEsIG5vdGUgdGhhdCBcIioqXCIgb25seSBoYXMgc3BlY2lhbCBtZWFuaW5nXG4vLyB3aGVuIGl0IGlzIHRoZSAqb25seSogdGhpbmcgaW4gYSBwYXRoIHBvcnRpb24uICBPdGhlcndpc2UsIGFueSBzZXJpZXNcbi8vIG9mICogaXMgZXF1aXZhbGVudCB0byBhIHNpbmdsZSAqLiAgR2xvYnN0YXIgYmVoYXZpb3IgaXMgZW5hYmxlZCBieVxuLy8gZGVmYXVsdCwgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIG9wdGlvbnMubm9nbG9ic3Rhci5cbmNvbnN0IFNVQlBBUlNFID0gU3ltYm9sKCdzdWJwYXJzZScpXG5cbm1pbmltYXRjaC5tYWtlUmUgPSAocGF0dGVybiwgb3B0aW9ucykgPT5cbiAgbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zIHx8IHt9KS5tYWtlUmUoKVxuXG5taW5pbWF0Y2gubWF0Y2ggPSAobGlzdCwgcGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IG1tID0gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zKVxuICBsaXN0ID0gbGlzdC5maWx0ZXIoZiA9PiBtbS5tYXRjaChmKSlcbiAgaWYgKG1tLm9wdGlvbnMubm9udWxsICYmICFsaXN0Lmxlbmd0aCkge1xuICAgIGxpc3QucHVzaChwYXR0ZXJuKVxuICB9XG4gIHJldHVybiBsaXN0XG59XG5cbi8vIHJlcGxhY2Ugc3R1ZmYgbGlrZSBcXCogd2l0aCAqXG5jb25zdCBnbG9iVW5lc2NhcGUgPSBzID0+IHMucmVwbGFjZSgvXFxcXCguKS9nLCAnJDEnKVxuY29uc3QgY2hhclVuZXNjYXBlID0gcyA9PiBzLnJlcGxhY2UoL1xcXFwoW14tXFxdXSkvZywgJyQxJylcbmNvbnN0IHJlZ0V4cEVzY2FwZSA9IHMgPT4gcy5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpXG5jb25zdCBicmFFeHBFc2NhcGUgPSBzID0+IHMucmVwbGFjZSgvW1tcXF1cXFxcXS9nLCAnXFxcXCQmJylcblxuY2xhc3MgTWluaW1hdGNoIHtcbiAgY29uc3RydWN0b3IgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybilcblxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5zZXQgPSBbXVxuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm5cbiAgICB0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlID0gISFvcHRpb25zLndpbmRvd3NQYXRoc05vRXNjYXBlIHx8XG4gICAgICBvcHRpb25zLmFsbG93V2luZG93c0VzY2FwZSA9PT0gZmFsc2VcbiAgICBpZiAodGhpcy53aW5kb3dzUGF0aHNOb0VzY2FwZSkge1xuICAgICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5wYXR0ZXJuLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuICAgIH1cbiAgICB0aGlzLnJlZ2V4cCA9IG51bGxcbiAgICB0aGlzLm5lZ2F0ZSA9IGZhbHNlXG4gICAgdGhpcy5jb21tZW50ID0gZmFsc2VcbiAgICB0aGlzLmVtcHR5ID0gZmFsc2VcbiAgICB0aGlzLnBhcnRpYWwgPSAhIW9wdGlvbnMucGFydGlhbFxuXG4gICAgLy8gbWFrZSB0aGUgc2V0IG9mIHJlZ2V4cHMgZXRjLlxuICAgIHRoaXMubWFrZSgpXG4gIH1cblxuICBkZWJ1ZyAoKSB7fVxuXG4gIG1ha2UgKCkge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLnBhdHRlcm5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgICAvLyBlbXB0eSBwYXR0ZXJucyBhbmQgY29tbWVudHMgbWF0Y2ggbm90aGluZy5cbiAgICBpZiAoIW9wdGlvbnMubm9jb21tZW50ICYmIHBhdHRlcm4uY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIHRoaXMuY29tbWVudCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXBhdHRlcm4pIHtcbiAgICAgIHRoaXMuZW1wdHkgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBzdGVwIDE6IGZpZ3VyZSBvdXQgbmVnYXRpb24sIGV0Yy5cbiAgICB0aGlzLnBhcnNlTmVnYXRlKClcblxuICAgIC8vIHN0ZXAgMjogZXhwYW5kIGJyYWNlc1xuICAgIGxldCBzZXQgPSB0aGlzLmdsb2JTZXQgPSB0aGlzLmJyYWNlRXhwYW5kKClcblxuICAgIGlmIChvcHRpb25zLmRlYnVnKSB0aGlzLmRlYnVnID0gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoLi4uYXJncylcblxuICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCBzZXQpXG5cbiAgICAvLyBzdGVwIDM6IG5vdyB3ZSBoYXZlIGEgc2V0LCBzbyB0dXJuIGVhY2ggb25lIGludG8gYSBzZXJpZXMgb2YgcGF0aC1wb3J0aW9uXG4gICAgLy8gbWF0Y2hpbmcgcGF0dGVybnMuXG4gICAgLy8gVGhlc2Ugd2lsbCBiZSByZWdleHBzLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgXCIqKlwiLCB3aGljaCBpc1xuICAgIC8vIHNldCB0byB0aGUgR0xPQlNUQVIgb2JqZWN0IGZvciBnbG9ic3RhciBiZWhhdmlvcixcbiAgICAvLyBhbmQgd2lsbCBub3QgY29udGFpbiBhbnkgLyBjaGFyYWN0ZXJzXG4gICAgc2V0ID0gdGhpcy5nbG9iUGFydHMgPSBzZXQubWFwKHMgPT4gcy5zcGxpdChzbGFzaFNwbGl0KSlcblxuICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCBzZXQpXG5cbiAgICAvLyBnbG9iIC0tPiByZWdleHBzXG4gICAgc2V0ID0gc2V0Lm1hcCgocywgc2ksIHNldCkgPT4gcy5tYXAodGhpcy5wYXJzZSwgdGhpcykpXG5cbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KVxuXG4gICAgLy8gZmlsdGVyIG91dCBldmVyeXRoaW5nIHRoYXQgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkuXG4gICAgc2V0ID0gc2V0LmZpbHRlcihzID0+IHMuaW5kZXhPZihmYWxzZSkgPT09IC0xKVxuXG4gICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldClcblxuICAgIHRoaXMuc2V0ID0gc2V0XG4gIH1cblxuICBwYXJzZU5lZ2F0ZSAoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub25lZ2F0ZSkgcmV0dXJuXG5cbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuXG4gICAgbGV0IG5lZ2F0ZSA9IGZhbHNlXG4gICAgbGV0IG5lZ2F0ZU9mZnNldCA9IDBcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGggJiYgcGF0dGVybi5jaGFyQXQoaSkgPT09ICchJzsgaSsrKSB7XG4gICAgICBuZWdhdGUgPSAhbmVnYXRlXG4gICAgICBuZWdhdGVPZmZzZXQrK1xuICAgIH1cblxuICAgIGlmIChuZWdhdGVPZmZzZXQpIHRoaXMucGF0dGVybiA9IHBhdHRlcm4uc2xpY2UobmVnYXRlT2Zmc2V0KVxuICAgIHRoaXMubmVnYXRlID0gbmVnYXRlXG4gIH1cblxuICAvLyBzZXQgcGFydGlhbCB0byB0cnVlIHRvIHRlc3QgaWYsIGZvciBleGFtcGxlLFxuICAvLyBcIi9hL2JcIiBtYXRjaGVzIHRoZSBzdGFydCBvZiBcIi8qL2IvKi9kXCJcbiAgLy8gUGFydGlhbCBtZWFucywgaWYgeW91IHJ1biBvdXQgb2YgZmlsZSBiZWZvcmUgeW91IHJ1blxuICAvLyBvdXQgb2YgcGF0dGVybiwgdGhlbiB0aGF0J3MgZmluZSwgYXMgbG9uZyBhcyBhbGxcbiAgLy8gdGhlIHBhcnRzIG1hdGNoLlxuICBtYXRjaE9uZSAoZmlsZSwgcGF0dGVybiwgcGFydGlhbCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZScsXG4gICAgICB7ICd0aGlzJzogdGhpcywgZmlsZTogZmlsZSwgcGF0dGVybjogcGF0dGVybiB9KVxuXG4gICAgdGhpcy5kZWJ1ZygnbWF0Y2hPbmUnLCBmaWxlLmxlbmd0aCwgcGF0dGVybi5sZW5ndGgpXG5cbiAgICBmb3IgKHZhciBmaSA9IDAsXG4gICAgICAgIHBpID0gMCxcbiAgICAgICAgZmwgPSBmaWxlLmxlbmd0aCxcbiAgICAgICAgcGwgPSBwYXR0ZXJuLmxlbmd0aFxuICAgICAgICA7IChmaSA8IGZsKSAmJiAocGkgPCBwbClcbiAgICAgICAgOyBmaSsrLCBwaSsrKSB7XG4gICAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZSBsb29wJylcbiAgICAgIHZhciBwID0gcGF0dGVybltwaV1cbiAgICAgIHZhciBmID0gZmlsZVtmaV1cblxuICAgICAgdGhpcy5kZWJ1ZyhwYXR0ZXJuLCBwLCBmKVxuXG4gICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZS5cbiAgICAgIC8vIHNvbWUgaW52YWxpZCByZWdleHAgc3R1ZmYgaW4gdGhlIHNldC5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHAgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcblxuICAgICAgaWYgKHAgPT09IEdMT0JTVEFSKSB7XG4gICAgICAgIHRoaXMuZGVidWcoJ0dMT0JTVEFSJywgW3BhdHRlcm4sIHAsIGZdKVxuXG4gICAgICAgIC8vIFwiKipcIlxuICAgICAgICAvLyBhLyoqL2IvKiovYyB3b3VsZCBtYXRjaCB0aGUgZm9sbG93aW5nOlxuICAgICAgICAvLyBhL2IveC95L3ovY1xuICAgICAgICAvLyBhL3gveS96L2IvY1xuICAgICAgICAvLyBhL2IveC9iL3gvY1xuICAgICAgICAvLyBhL2IvY1xuICAgICAgICAvLyBUbyBkbyB0aGlzLCB0YWtlIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIGFmdGVyXG4gICAgICAgIC8vIHRoZSAqKiwgYW5kIHNlZSBpZiBpdCB3b3VsZCBtYXRjaCB0aGUgZmlsZSByZW1haW5kZXIuXG4gICAgICAgIC8vIElmIHNvLCByZXR1cm4gc3VjY2Vzcy5cbiAgICAgICAgLy8gSWYgbm90LCB0aGUgKiogXCJzd2FsbG93c1wiIGEgc2VnbWVudCwgYW5kIHRyeSBhZ2Fpbi5cbiAgICAgICAgLy8gVGhpcyBpcyByZWN1cnNpdmVseSBhd2Z1bC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYS8qKi9iLyoqL2MgbWF0Y2hpbmcgYS9iL3gveS96L2NcbiAgICAgICAgLy8gLSBhIG1hdGNoZXMgYVxuICAgICAgICAvLyAtIGRvdWJsZXN0YXJcbiAgICAgICAgLy8gICAtIG1hdGNoT25lKGIveC95L3ovYywgYi8qKi9jKVxuICAgICAgICAvLyAgICAgLSBiIG1hdGNoZXMgYlxuICAgICAgICAvLyAgICAgLSBkb3VibGVzdGFyXG4gICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoeC95L3ovYywgYykgLT4gbm9cbiAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZSh5L3ovYywgYykgLT4gbm9cbiAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZSh6L2MsIGMpIC0+IG5vXG4gICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoYywgYykgeWVzLCBoaXRcbiAgICAgICAgdmFyIGZyID0gZmlcbiAgICAgICAgdmFyIHByID0gcGkgKyAxXG4gICAgICAgIGlmIChwciA9PT0gcGwpIHtcbiAgICAgICAgICB0aGlzLmRlYnVnKCcqKiBhdCB0aGUgZW5kJylcbiAgICAgICAgICAvLyBhICoqIGF0IHRoZSBlbmQgd2lsbCBqdXN0IHN3YWxsb3cgdGhlIHJlc3QuXG4gICAgICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAgIC8vIGhvd2V2ZXIsIGl0IHdpbGwgbm90IHN3YWxsb3cgLy54LCB1bmxlc3NcbiAgICAgICAgICAvLyBvcHRpb25zLmRvdCBpcyBzZXQuXG4gICAgICAgICAgLy8gLiBhbmQgLi4gYXJlICpuZXZlciogbWF0Y2hlZCBieSAqKiwgZm9yIGV4cGxvc2l2ZWx5XG4gICAgICAgICAgLy8gZXhwb25lbnRpYWwgcmVhc29ucy5cbiAgICAgICAgICBmb3IgKDsgZmkgPCBmbDsgZmkrKykge1xuICAgICAgICAgICAgaWYgKGZpbGVbZmldID09PSAnLicgfHwgZmlsZVtmaV0gPT09ICcuLicgfHxcbiAgICAgICAgICAgICAgKCFvcHRpb25zLmRvdCAmJiBmaWxlW2ZpXS5jaGFyQXQoMCkgPT09ICcuJykpIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb2ssIGxldCdzIHNlZSBpZiB3ZSBjYW4gc3dhbGxvdyB3aGF0ZXZlciB3ZSBjYW4uXG4gICAgICAgIHdoaWxlIChmciA8IGZsKSB7XG4gICAgICAgICAgdmFyIHN3YWxsb3dlZSA9IGZpbGVbZnJdXG5cbiAgICAgICAgICB0aGlzLmRlYnVnKCdcXG5nbG9ic3RhciB3aGlsZScsIGZpbGUsIGZyLCBwYXR0ZXJuLCBwciwgc3dhbGxvd2VlKVxuXG4gICAgICAgICAgLy8gWFhYIHJlbW92ZSB0aGlzIHNsaWNlLiAgSnVzdCBwYXNzIHRoZSBzdGFydCBpbmRleC5cbiAgICAgICAgICBpZiAodGhpcy5tYXRjaE9uZShmaWxlLnNsaWNlKGZyKSwgcGF0dGVybi5zbGljZShwciksIHBhcnRpYWwpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKCdnbG9ic3RhciBmb3VuZCBtYXRjaCEnLCBmciwgZmwsIHN3YWxsb3dlZSlcbiAgICAgICAgICAgIC8vIGZvdW5kIGEgbWF0Y2guXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjYW4ndCBzd2FsbG93IFwiLlwiIG9yIFwiLi5cIiBldmVyLlxuICAgICAgICAgICAgLy8gY2FuIG9ubHkgc3dhbGxvdyBcIi5mb29cIiB3aGVuIGV4cGxpY2l0bHkgYXNrZWQuXG4gICAgICAgICAgICBpZiAoc3dhbGxvd2VlID09PSAnLicgfHwgc3dhbGxvd2VlID09PSAnLi4nIHx8XG4gICAgICAgICAgICAgICghb3B0aW9ucy5kb3QgJiYgc3dhbGxvd2VlLmNoYXJBdCgwKSA9PT0gJy4nKSkge1xuICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdkb3QgZGV0ZWN0ZWQhJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAqKiBzd2FsbG93cyBhIHNlZ21lbnQsIGFuZCBjb250aW51ZS5cbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ2dsb2JzdGFyIHN3YWxsb3cgYSBzZWdtZW50LCBhbmQgY29udGludWUnKVxuICAgICAgICAgICAgZnIrK1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIG1hdGNoIHdhcyBmb3VuZC5cbiAgICAgICAgLy8gSG93ZXZlciwgaW4gcGFydGlhbCBtb2RlLCB3ZSBjYW4ndCBzYXkgdGhpcyBpcyBuZWNlc3NhcmlseSBvdmVyLlxuICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgKnBhdHRlcm4qIGxlZnQsIHRoZW5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChwYXJ0aWFsKSB7XG4gICAgICAgICAgLy8gcmFuIG91dCBvZiBmaWxlXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnXFxuPj4+IG5vIG1hdGNoLCBwYXJ0aWFsPycsIGZpbGUsIGZyLCBwYXR0ZXJuLCBwcilcbiAgICAgICAgICBpZiAoZnIgPT09IGZsKSByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiAqKlxuICAgICAgLy8gbm9uLW1hZ2ljIHBhdHRlcm5zIGp1c3QgaGF2ZSB0byBtYXRjaCBleGFjdGx5XG4gICAgICAvLyBwYXR0ZXJucyB3aXRoIG1hZ2ljIGhhdmUgYmVlbiB0dXJuZWQgaW50byByZWdleHBzLlxuICAgICAgdmFyIGhpdFxuICAgICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgICBoaXQgPSBmID09PSBwXG4gICAgICAgIHRoaXMuZGVidWcoJ3N0cmluZyBtYXRjaCcsIHAsIGYsIGhpdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpdCA9IGYubWF0Y2gocClcbiAgICAgICAgdGhpcy5kZWJ1ZygncGF0dGVybiBtYXRjaCcsIHAsIGYsIGhpdClcbiAgICAgIH1cblxuICAgICAgaWYgKCFoaXQpIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIE5vdGU6IGVuZGluZyBpbiAvIG1lYW5zIHRoYXQgd2UnbGwgZ2V0IGEgZmluYWwgXCJcIlxuICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uICBUaGlzIGNhbiBvbmx5IG1hdGNoIGFcbiAgICAvLyBjb3JyZXNwb25kaW5nIFwiXCIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS5cbiAgICAvLyBJZiB0aGUgZmlsZSBlbmRzIGluIC8sIHRoZW4gaXQgY2FuIG9ubHkgbWF0Y2ggYVxuICAgIC8vIGEgcGF0dGVybiB0aGF0IGVuZHMgaW4gLywgdW5sZXNzIHRoZSBwYXR0ZXJuIGp1c3RcbiAgICAvLyBkb2Vzbid0IGhhdmUgYW55IG1vcmUgZm9yIGl0LiBCdXQsIGEvYi8gc2hvdWxkICpub3QqXG4gICAgLy8gbWF0Y2ggXCJhL2IvKlwiLCBldmVuIHRob3VnaCBcIlwiIG1hdGNoZXMgYWdhaW5zdCB0aGVcbiAgICAvLyBbXi9dKj8gcGF0dGVybiwgZXhjZXB0IGluIHBhcnRpYWwgbW9kZSwgd2hlcmUgaXQgbWlnaHRcbiAgICAvLyBzaW1wbHkgbm90IGJlIHJlYWNoZWQgeWV0LlxuICAgIC8vIEhvd2V2ZXIsIGEvYi8gc2hvdWxkIHN0aWxsIHNhdGlzZnkgYS8qXG5cbiAgICAvLyBub3cgZWl0aGVyIHdlIGZlbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4sIG9yIHdlJ3JlIGRvbmUuXG4gICAgaWYgKGZpID09PSBmbCAmJiBwaSA9PT0gcGwpIHtcbiAgICAgIC8vIHJhbiBvdXQgb2YgcGF0dGVybiBhbmQgZmlsZW5hbWUgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgIC8vIGFuIGV4YWN0IGhpdCFcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChmaSA9PT0gZmwpIHtcbiAgICAgIC8vIHJhbiBvdXQgb2YgZmlsZSwgYnV0IHN0aWxsIGhhZCBwYXR0ZXJuIGxlZnQuXG4gICAgICAvLyB0aGlzIGlzIG9rIGlmIHdlJ3JlIGRvaW5nIHRoZSBtYXRjaCBhcyBwYXJ0IG9mXG4gICAgICAvLyBhIGdsb2IgZnMgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHBhcnRpYWxcbiAgICB9IGVsc2UgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8gaWYgKHBpID09PSBwbCkge1xuICAgICAgLy8gcmFuIG91dCBvZiBwYXR0ZXJuLCBzdGlsbCBoYXZlIGZpbGUgbGVmdC5cbiAgICAgIC8vIHRoaXMgaXMgb25seSBhY2NlcHRhYmxlIGlmIHdlJ3JlIG9uIHRoZSB2ZXJ5IGxhc3RcbiAgICAgIC8vIGVtcHR5IHNlZ21lbnQgb2YgYSBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC5cbiAgICAgIC8vIGEvKiBzaG91bGQgbWF0Y2ggYS9iL1xuICAgICAgcmV0dXJuIChmaSA9PT0gZmwgLSAxKSAmJiAoZmlsZVtmaV0gPT09ICcnKVxuICAgIH1cblxuICAgIC8vIHNob3VsZCBiZSB1bnJlYWNoYWJsZS5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBFcnJvcignd3RmPycpXG4gIH1cblxuICBicmFjZUV4cGFuZCAoKSB7XG4gICAgcmV0dXJuIGJyYWNlRXhwYW5kKHRoaXMucGF0dGVybiwgdGhpcy5vcHRpb25zKVxuICB9XG5cbiAgcGFyc2UgKHBhdHRlcm4sIGlzU3ViKSB7XG4gICAgYXNzZXJ0VmFsaWRQYXR0ZXJuKHBhdHRlcm4pXG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgICAvLyBzaG9ydGN1dHNcbiAgICBpZiAocGF0dGVybiA9PT0gJyoqJykge1xuICAgICAgaWYgKCFvcHRpb25zLm5vZ2xvYnN0YXIpXG4gICAgICAgIHJldHVybiBHTE9CU1RBUlxuICAgICAgZWxzZVxuICAgICAgICBwYXR0ZXJuID0gJyonXG4gICAgfVxuICAgIGlmIChwYXR0ZXJuID09PSAnJykgcmV0dXJuICcnXG5cbiAgICBsZXQgcmUgPSAnJ1xuICAgIGxldCBoYXNNYWdpYyA9IGZhbHNlXG4gICAgbGV0IGVzY2FwaW5nID0gZmFsc2VcbiAgICAvLyA/ID0+IG9uZSBzaW5nbGUgY2hhcmFjdGVyXG4gICAgY29uc3QgcGF0dGVybkxpc3RTdGFjayA9IFtdXG4gICAgY29uc3QgbmVnYXRpdmVMaXN0cyA9IFtdXG4gICAgbGV0IHN0YXRlQ2hhclxuICAgIGxldCBpbkNsYXNzID0gZmFsc2VcbiAgICBsZXQgcmVDbGFzc1N0YXJ0ID0gLTFcbiAgICBsZXQgY2xhc3NTdGFydCA9IC0xXG4gICAgbGV0IGNzXG4gICAgbGV0IHBsXG4gICAgbGV0IHNwXG4gICAgLy8gLiBhbmQgLi4gbmV2ZXIgbWF0Y2ggYW55dGhpbmcgdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggLixcbiAgICAvLyBldmVuIHdoZW4gb3B0aW9ucy5kb3QgaXMgc2V0LiAgSG93ZXZlciwgaWYgdGhlIHBhdHRlcm5cbiAgICAvLyBzdGFydHMgd2l0aCAuLCB0aGVuIHRyYXZlcnNhbCBwYXR0ZXJucyBjYW4gbWF0Y2guXG4gICAgbGV0IGRvdFRyYXZBbGxvd2VkID0gcGF0dGVybi5jaGFyQXQoMCkgPT09ICcuJ1xuICAgIGxldCBkb3RGaWxlQWxsb3dlZCA9IG9wdGlvbnMuZG90IHx8IGRvdFRyYXZBbGxvd2VkXG4gICAgY29uc3QgcGF0dGVyblN0YXJ0ID0gKCkgPT5cbiAgICAgIGRvdFRyYXZBbGxvd2VkXG4gICAgICAgID8gJydcbiAgICAgICAgOiBkb3RGaWxlQWxsb3dlZFxuICAgICAgICA/ICcoPyEoPzpefFxcXFwvKVxcXFwuezEsMn0oPzokfFxcXFwvKSknXG4gICAgICAgIDogJyg/IVxcXFwuKSdcbiAgICBjb25zdCBzdWJQYXR0ZXJuU3RhcnQgPSAocCkgPT5cbiAgICAgIHAuY2hhckF0KDApID09PSAnLidcbiAgICAgICAgPyAnJ1xuICAgICAgICA6IG9wdGlvbnMuZG90XG4gICAgICAgID8gJyg/ISg/Ol58XFxcXC8pXFxcXC57MSwyfSg/OiR8XFxcXC8pKSdcbiAgICAgICAgOiAnKD8hXFxcXC4pJ1xuXG5cbiAgICBjb25zdCBjbGVhclN0YXRlQ2hhciA9ICgpID0+IHtcbiAgICAgIGlmIChzdGF0ZUNoYXIpIHtcbiAgICAgICAgLy8gd2UgaGFkIHNvbWUgc3RhdGUtdHJhY2tpbmcgY2hhcmFjdGVyXG4gICAgICAgIC8vIHRoYXQgd2Fzbid0IGNvbnN1bWVkIGJ5IHRoaXMgcGFzcy5cbiAgICAgICAgc3dpdGNoIChzdGF0ZUNoYXIpIHtcbiAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgIHJlICs9IHN0YXJcbiAgICAgICAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnPyc6XG4gICAgICAgICAgICByZSArPSBxbWFya1xuICAgICAgICAgICAgaGFzTWFnaWMgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmUgKz0gJ1xcXFwnICsgc3RhdGVDaGFyXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKCdjbGVhclN0YXRlQ2hhciAlaiAlaicsIHN0YXRlQ2hhciwgcmUpXG4gICAgICAgIHN0YXRlQ2hhciA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGM7IChpIDwgcGF0dGVybi5sZW5ndGgpICYmIChjID0gcGF0dGVybi5jaGFyQXQoaSkpOyBpKyspIHtcbiAgICAgIHRoaXMuZGVidWcoJyVzXFx0JXMgJXMgJWonLCBwYXR0ZXJuLCBpLCByZSwgYylcblxuICAgICAgLy8gc2tpcCBvdmVyIGFueSB0aGF0IGFyZSBlc2NhcGVkLlxuICAgICAgaWYgKGVzY2FwaW5nKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gY29tcGxldGVseSBub3QgYWxsb3dlZCwgZXZlbiBlc2NhcGVkLiAqL1xuICAgICAgICBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVTcGVjaWFsc1tjXSkge1xuICAgICAgICAgIHJlICs9ICdcXFxcJ1xuICAgICAgICB9XG4gICAgICAgIHJlICs9IGNcbiAgICAgICAgZXNjYXBpbmcgPSBmYWxzZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY2FzZSAnLyc6IHtcbiAgICAgICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBwYXRoLXNwbGl0IGJ5IG5vdy5cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1xcXFwnOlxuICAgICAgICAgIGlmIChpbkNsYXNzICYmIHBhdHRlcm4uY2hhckF0KGkgKyAxKSA9PT0gJy0nKSB7XG4gICAgICAgICAgICByZSArPSBjXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICAgICAgICBlc2NhcGluZyA9IHRydWVcbiAgICAgICAgY29udGludWVcblxuICAgICAgICAvLyB0aGUgdmFyaW91cyBzdGF0ZUNoYXIgdmFsdWVzXG4gICAgICAgIC8vIGZvciB0aGUgXCJleHRnbG9iXCIgc3R1ZmYuXG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgIGNhc2UgJ0AnOlxuICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICB0aGlzLmRlYnVnKCclc1xcdCVzICVzICVqIDwtLSBzdGF0ZUNoYXInLCBwYXR0ZXJuLCBpLCByZSwgYylcblxuICAgICAgICAgIC8vIGFsbCBvZiB0aG9zZSBhcmUgbGl0ZXJhbHMgaW5zaWRlIGEgY2xhc3MsIGV4Y2VwdCB0aGF0XG4gICAgICAgICAgLy8gdGhlIGdsb2IgWyFhXSBtZWFucyBbXmFdIGluIHJlZ2V4cFxuICAgICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKCcgIGluIGNsYXNzJylcbiAgICAgICAgICAgIGlmIChjID09PSAnIScgJiYgaSA9PT0gY2xhc3NTdGFydCArIDEpIGMgPSAnXidcbiAgICAgICAgICAgIHJlICs9IGNcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3RhdGVDaGFyLCB0aGVuIGl0IG1lYW5zXG4gICAgICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgc29tZXRoaW5nIGxpa2UgKiogb3IgKz8gaW4gdGhlcmUuXG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSBzdGF0ZUNoYXIsIHRoZW4gcHJvY2VlZCB3aXRoIHRoaXMgb25lLlxuICAgICAgICAgIHRoaXMuZGVidWcoJ2NhbGwgY2xlYXJTdGF0ZUNoYXIgJWonLCBzdGF0ZUNoYXIpXG4gICAgICAgICAgY2xlYXJTdGF0ZUNoYXIoKVxuICAgICAgICAgIHN0YXRlQ2hhciA9IGNcbiAgICAgICAgICAvLyBpZiBleHRnbG9iIGlzIGRpc2FibGVkLCB0aGVuICsoYXNkZnxmb28pIGlzbid0IGEgdGhpbmcuXG4gICAgICAgICAgLy8ganVzdCBjbGVhciB0aGUgc3RhdGVjaGFyICpub3cqLCByYXRoZXIgdGhhbiBldmVuIGRpdmluZyBpbnRvXG4gICAgICAgICAgLy8gdGhlIHBhdHRlcm5MaXN0IHN0dWZmLlxuICAgICAgICAgIGlmIChvcHRpb25zLm5vZXh0KSBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSAnKCc6IHtcbiAgICAgICAgICBpZiAoaW5DbGFzcykge1xuICAgICAgICAgICAgcmUgKz0gJygnXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc3RhdGVDaGFyKSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCgnXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHBsRW50cnkgPSB7XG4gICAgICAgICAgICB0eXBlOiBzdGF0ZUNoYXIsXG4gICAgICAgICAgICBzdGFydDogaSAtIDEsXG4gICAgICAgICAgICByZVN0YXJ0OiByZS5sZW5ndGgsXG4gICAgICAgICAgICBvcGVuOiBwbFR5cGVzW3N0YXRlQ2hhcl0ub3BlbixcbiAgICAgICAgICAgIGNsb3NlOiBwbFR5cGVzW3N0YXRlQ2hhcl0uY2xvc2UsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnXFx0JywgcGxFbnRyeSlcbiAgICAgICAgICBwYXR0ZXJuTGlzdFN0YWNrLnB1c2gocGxFbnRyeSlcbiAgICAgICAgICAvLyBuZWdhdGlvbiBpcyAoPzooPyEoPzpqcykoPzo8cmVzdD4pKVteL10qKVxuICAgICAgICAgIHJlICs9IHBsRW50cnkub3BlblxuICAgICAgICAgIC8vIG5leHQgZW50cnkgc3RhcnRzIHdpdGggYSBkb3QgbWF5YmU/XG4gICAgICAgICAgaWYgKHBsRW50cnkuc3RhcnQgPT09IDAgJiYgcGxFbnRyeS50eXBlICE9PSAnIScpIHtcbiAgICAgICAgICAgIGRvdFRyYXZBbGxvd2VkID0gdHJ1ZVxuICAgICAgICAgICAgcmUgKz0gc3ViUGF0dGVyblN0YXJ0KHBhdHRlcm4uc2xpY2UoaSArIDEpKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRlYnVnKCdwbFR5cGUgJWogJWonLCBzdGF0ZUNoYXIsIHJlKVxuICAgICAgICAgIHN0YXRlQ2hhciA9IGZhbHNlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJyknOiB7XG4gICAgICAgICAgY29uc3QgcGxFbnRyeSA9IHBhdHRlcm5MaXN0U3RhY2tbcGF0dGVybkxpc3RTdGFjay5sZW5ndGggLSAxXVxuICAgICAgICAgIGlmIChpbkNsYXNzIHx8ICFwbEVudHJ5KSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCknXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBwYXR0ZXJuTGlzdFN0YWNrLnBvcCgpXG5cbiAgICAgICAgICAvLyBjbG9zaW5nIGFuIGV4dGdsb2JcbiAgICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgICAgaGFzTWFnaWMgPSB0cnVlXG4gICAgICAgICAgcGwgPSBwbEVudHJ5XG4gICAgICAgICAgLy8gbmVnYXRpb24gaXMgKD86KD8hanMpW14vXSopXG4gICAgICAgICAgLy8gVGhlIG90aGVycyBhcmUgKD86PHBhdHRlcm4+KTx0eXBlPlxuICAgICAgICAgIHJlICs9IHBsLmNsb3NlXG4gICAgICAgICAgaWYgKHBsLnR5cGUgPT09ICchJykge1xuICAgICAgICAgICAgbmVnYXRpdmVMaXN0cy5wdXNoKE9iamVjdC5hc3NpZ24ocGwsIHsgcmVFbmQ6IHJlLmxlbmd0aCB9KSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3wnOiB7XG4gICAgICAgICAgY29uc3QgcGxFbnRyeSA9IHBhdHRlcm5MaXN0U3RhY2tbcGF0dGVybkxpc3RTdGFjay5sZW5ndGggLSAxXVxuICAgICAgICAgIGlmIChpbkNsYXNzIHx8ICFwbEVudHJ5KSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXHwnXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICAgICAgICByZSArPSAnfCdcbiAgICAgICAgICAvLyBuZXh0IHN1YnBhdHRlcm4gY2FuIHN0YXJ0IHdpdGggYSBkb3Q/XG4gICAgICAgICAgaWYgKHBsRW50cnkuc3RhcnQgPT09IDAgJiYgcGxFbnRyeS50eXBlICE9PSAnIScpIHtcbiAgICAgICAgICAgIGRvdFRyYXZBbGxvd2VkID0gdHJ1ZVxuICAgICAgICAgICAgcmUgKz0gc3ViUGF0dGVyblN0YXJ0KHBhdHRlcm4uc2xpY2UoaSArIDEpKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlc2UgYXJlIG1vc3RseSB0aGUgc2FtZSBpbiByZWdleHAgYW5kIGdsb2JcbiAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgLy8gc3dhbGxvdyBhbnkgc3RhdGUtdHJhY2tpbmcgY2hhciBiZWZvcmUgdGhlIFtcbiAgICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG5cbiAgICAgICAgICBpZiAoaW5DbGFzcykge1xuICAgICAgICAgICAgcmUgKz0gJ1xcXFwnICsgY1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbkNsYXNzID0gdHJ1ZVxuICAgICAgICAgIGNsYXNzU3RhcnQgPSBpXG4gICAgICAgICAgcmVDbGFzc1N0YXJ0ID0gcmUubGVuZ3RoXG4gICAgICAgICAgcmUgKz0gY1xuICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgJ10nOlxuICAgICAgICAgIC8vICBhIHJpZ2h0IGJyYWNrZXQgc2hhbGwgbG9zZSBpdHMgc3BlY2lhbFxuICAgICAgICAgIC8vICBtZWFuaW5nIGFuZCByZXByZXNlbnQgaXRzZWxmIGluXG4gICAgICAgICAgLy8gIGEgYnJhY2tldCBleHByZXNzaW9uIGlmIGl0IG9jY3Vyc1xuICAgICAgICAgIC8vICBmaXJzdCBpbiB0aGUgbGlzdC4gIC0tIFBPU0lYLjIgMi44LjMuMlxuICAgICAgICAgIGlmIChpID09PSBjbGFzc1N0YXJ0ICsgMSB8fCAhaW5DbGFzcykge1xuICAgICAgICAgICAgcmUgKz0gJ1xcXFwnICsgY1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzcGxpdCB3aGVyZSB0aGUgbGFzdCBbIHdhcywgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmVcbiAgICAgICAgICAvLyBhbiBpbnZhbGlkIHJlLiBpZiBzbywgcmUtd2FsayB0aGUgY29udGVudHMgb2YgdGhlXG4gICAgICAgICAgLy8gd291bGQtYmUgY2xhc3MgdG8gcmUtdHJhbnNsYXRlIGFueSBjaGFyYWN0ZXJzIHRoYXRcbiAgICAgICAgICAvLyB3ZXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzXG4gICAgICAgICAgLy8gVE9ETzogSXQgd291bGQgcHJvYmFibHkgYmUgZmFzdGVyIHRvIGRldGVybWluZSB0aGlzXG4gICAgICAgICAgLy8gd2l0aG91dCBhIHRyeS9jYXRjaCBhbmQgYSBuZXcgUmVnRXhwLCBidXQgaXQncyB0cmlja3lcbiAgICAgICAgICAvLyB0byBkbyBzYWZlbHkuICBGb3Igbm93LCB0aGlzIGlzIHNhZmUgYW5kIHdvcmtzLlxuICAgICAgICAgIGNzID0gcGF0dGVybi5zdWJzdHJpbmcoY2xhc3NTdGFydCArIDEsIGkpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFJlZ0V4cCgnWycgKyBicmFFeHBFc2NhcGUoY2hhclVuZXNjYXBlKGNzKSkgKyAnXScpXG4gICAgICAgICAgICAvLyBsb29rcyBnb29kLCBmaW5pc2ggdXAgdGhlIGNsYXNzLlxuICAgICAgICAgICAgcmUgKz0gY1xuICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICAvLyBvdXQgb2Ygb3JkZXIgcmFuZ2VzIGluIEpTIGFyZSBlcnJvcnMsIGJ1dCBpbiBnbG9iIHN5bnRheCxcbiAgICAgICAgICAgIC8vIHRoZXkncmUganVzdCBhIHJhbmdlIHRoYXQgbWF0Y2hlcyBub3RoaW5nLlxuICAgICAgICAgICAgcmUgPSByZS5zdWJzdHJpbmcoMCwgcmVDbGFzc1N0YXJ0KSArICcoPzokLiknIC8vIG1hdGNoIG5vdGhpbmcgZXZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgICAgICBpbkNsYXNzID0gZmFsc2VcbiAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIHN3YWxsb3cgYW55IHN0YXRlIGNoYXIgdGhhdCB3YXNuJ3QgY29uc3VtZWRcbiAgICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG5cbiAgICAgICAgICBpZiAocmVTcGVjaWFsc1tjXSAmJiAhKGMgPT09ICdeJyAmJiBpbkNsYXNzKSkge1xuICAgICAgICAgICAgcmUgKz0gJ1xcXFwnXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmUgKz0gY1xuICAgICAgICAgIGJyZWFrXG5cbiAgICAgIH0gLy8gc3dpdGNoXG4gICAgfSAvLyBmb3JcblxuICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBsZWZ0IGEgY2xhc3Mgb3Blbi5cbiAgICAvLyBcIlthYmNcIiBpcyB2YWxpZCwgZXF1aXZhbGVudCB0byBcIlxcW2FiY1wiXG4gICAgaWYgKGluQ2xhc3MpIHtcbiAgICAgIC8vIHNwbGl0IHdoZXJlIHRoZSBsYXN0IFsgd2FzLCBhbmQgZXNjYXBlIGl0XG4gICAgICAvLyB0aGlzIGlzIGEgaHVnZSBwaXRhLiAgV2Ugbm93IGhhdmUgdG8gcmUtd2Fsa1xuICAgICAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSB3b3VsZC1iZSBjbGFzcyB0byByZS10cmFuc2xhdGVcbiAgICAgIC8vIGFueSBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBwYXNzZWQgdGhyb3VnaCBhcy1pc1xuICAgICAgY3MgPSBwYXR0ZXJuLnNsaWNlKGNsYXNzU3RhcnQgKyAxKVxuICAgICAgc3AgPSB0aGlzLnBhcnNlKGNzLCBTVUJQQVJTRSlcbiAgICAgIHJlID0gcmUuc3Vic3RyaW5nKDAsIHJlQ2xhc3NTdGFydCkgKyAnXFxcXFsnICsgc3BbMF1cbiAgICAgIGhhc01hZ2ljID0gaGFzTWFnaWMgfHwgc3BbMV1cbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgaGFkIGEgKyggdGhpbmcgYXQgdGhlICplbmQqXG4gICAgLy8gb2YgdGhlIHBhdHRlcm4uXG4gICAgLy8gZWFjaCBwYXR0ZXJuIGxpc3Qgc3RhY2sgYWRkcyAzIGNoYXJzLCBhbmQgd2UgbmVlZCB0byBnbyB0aHJvdWdoXG4gICAgLy8gYW5kIGVzY2FwZSBhbnkgfCBjaGFycyB0aGF0IHdlcmUgcGFzc2VkIHRocm91Z2ggYXMtaXMgZm9yIHRoZSByZWdleHAuXG4gICAgLy8gR28gdGhyb3VnaCBhbmQgZXNjYXBlIHRoZW0sIHRha2luZyBjYXJlIG5vdCB0byBkb3VibGUtZXNjYXBlIGFueVxuICAgIC8vIHwgY2hhcnMgdGhhdCB3ZXJlIGFscmVhZHkgZXNjYXBlZC5cbiAgICBmb3IgKHBsID0gcGF0dGVybkxpc3RTdGFjay5wb3AoKTsgcGw7IHBsID0gcGF0dGVybkxpc3RTdGFjay5wb3AoKSkge1xuICAgICAgbGV0IHRhaWxcbiAgICAgIHRhaWwgPSByZS5zbGljZShwbC5yZVN0YXJ0ICsgcGwub3Blbi5sZW5ndGgpXG4gICAgICB0aGlzLmRlYnVnKCdzZXR0aW5nIHRhaWwnLCByZSwgcGwpXG4gICAgICAvLyBtYXliZSBzb21lIGV2ZW4gbnVtYmVyIG9mIFxcLCB0aGVuIG1heWJlIDEgXFwsIGZvbGxvd2VkIGJ5IGEgfFxuICAgICAgdGFpbCA9IHRhaWwucmVwbGFjZSgvKCg/OlxcXFx7Mn0pezAsNjR9KShcXFxcPylcXHwvZywgKF8sICQxLCAkMikgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIHNob3VsZCBhbHJlYWR5IGJlIGRvbmUgKi9cbiAgICAgICAgaWYgKCEkMikge1xuICAgICAgICAgIC8vIHRoZSB8IGlzbid0IGFscmVhZHkgZXNjYXBlZCwgc28gZXNjYXBlIGl0LlxuICAgICAgICAgICQyID0gJ1xcXFwnXG4gICAgICAgIH1cblxuICAgICAgICAvLyBuZWVkIHRvIGVzY2FwZSBhbGwgdGhvc2Ugc2xhc2hlcyAqYWdhaW4qLCB3aXRob3V0IGVzY2FwaW5nIHRoZVxuICAgICAgICAvLyBvbmUgdGhhdCB3ZSBuZWVkIGZvciBlc2NhcGluZyB0aGUgfCBjaGFyYWN0ZXIuICBBcyBpdCB3b3JrcyBvdXQsXG4gICAgICAgIC8vIGVzY2FwaW5nIGFuIGV2ZW4gbnVtYmVyIG9mIHNsYXNoZXMgY2FuIGJlIGRvbmUgYnkgc2ltcGx5IHJlcGVhdGluZ1xuICAgICAgICAvLyBpdCBleGFjdGx5IGFmdGVyIGl0c2VsZi4gIFRoYXQncyB3aHkgdGhpcyB0cmljayB3b3Jrcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSBhbSBzb3JyeSB0aGF0IHlvdSBoYXZlIHRvIHNlZSB0aGlzLlxuICAgICAgICByZXR1cm4gJDEgKyAkMSArICQyICsgJ3wnXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmRlYnVnKCd0YWlsPSVqXFxuICAgJXMnLCB0YWlsLCB0YWlsLCBwbCwgcmUpXG4gICAgICBjb25zdCB0ID0gcGwudHlwZSA9PT0gJyonID8gc3RhclxuICAgICAgICA6IHBsLnR5cGUgPT09ICc/JyA/IHFtYXJrXG4gICAgICAgIDogJ1xcXFwnICsgcGwudHlwZVxuXG4gICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgIHJlID0gcmUuc2xpY2UoMCwgcGwucmVTdGFydCkgKyB0ICsgJ1xcXFwoJyArIHRhaWxcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgdHJhaWxpbmcgdGhpbmdzIHRoYXQgb25seSBtYXR0ZXIgYXQgdGhlIHZlcnkgZW5kLlxuICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICBpZiAoZXNjYXBpbmcpIHtcbiAgICAgIC8vIHRyYWlsaW5nIFxcXFxcbiAgICAgIHJlICs9ICdcXFxcXFxcXCdcbiAgICB9XG5cbiAgICAvLyBvbmx5IG5lZWQgdG8gYXBwbHkgdGhlIG5vZG90IHN0YXJ0IGlmIHRoZSByZSBzdGFydHMgd2l0aFxuICAgIC8vIHNvbWV0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGNhcHR1cmUgYSBkb3RcbiAgICBjb25zdCBhZGRQYXR0ZXJuU3RhcnQgPSBhZGRQYXR0ZXJuU3RhcnRTZXRbcmUuY2hhckF0KDApXVxuXG4gICAgLy8gSGFjayB0byB3b3JrIGFyb3VuZCBsYWNrIG9mIG5lZ2F0aXZlIGxvb2tiZWhpbmQgaW4gSlNcbiAgICAvLyBBIHBhdHRlcm4gbGlrZTogKi4hKHgpLiEoeXx6KSBuZWVkcyB0byBlbnN1cmUgdGhhdCBhIG5hbWVcbiAgICAvLyBsaWtlICdhLnh5ei55eicgZG9lc24ndCBtYXRjaC4gIFNvLCB0aGUgZmlyc3QgbmVnYXRpdmVcbiAgICAvLyBsb29rYWhlYWQsIGhhcyB0byBsb29rIEFMTCB0aGUgd2F5IGFoZWFkLCB0byB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHBhdHRlcm4uXG4gICAgZm9yIChsZXQgbiA9IG5lZ2F0aXZlTGlzdHMubGVuZ3RoIC0gMTsgbiA+IC0xOyBuLS0pIHtcbiAgICAgIGNvbnN0IG5sID0gbmVnYXRpdmVMaXN0c1tuXVxuXG4gICAgICBjb25zdCBubEJlZm9yZSA9IHJlLnNsaWNlKDAsIG5sLnJlU3RhcnQpXG4gICAgICBjb25zdCBubEZpcnN0ID0gcmUuc2xpY2UobmwucmVTdGFydCwgbmwucmVFbmQgLSA4KVxuICAgICAgbGV0IG5sQWZ0ZXIgPSByZS5zbGljZShubC5yZUVuZClcbiAgICAgIGNvbnN0IG5sTGFzdCA9IHJlLnNsaWNlKG5sLnJlRW5kIC0gOCwgbmwucmVFbmQpICsgbmxBZnRlclxuXG4gICAgICAvLyBIYW5kbGUgbmVzdGVkIHN0dWZmIGxpa2UgKigqLmpzfCEoKi5qc29uKSksIHdoZXJlIG9wZW4gcGFyZW5zXG4gICAgICAvLyBtZWFuIHRoYXQgd2Ugc2hvdWxkICpub3QqIGluY2x1ZGUgdGhlICkgaW4gdGhlIGJpdCB0aGF0IGlzIGNvbnNpZGVyZWRcbiAgICAgIC8vIFwiYWZ0ZXJcIiB0aGUgbmVnYXRlZCBzZWN0aW9uLlxuICAgICAgY29uc3QgY2xvc2VQYXJlbnNCZWZvcmUgPSBubEJlZm9yZS5zcGxpdCgnKScpLmxlbmd0aFxuICAgICAgY29uc3Qgb3BlblBhcmVuc0JlZm9yZSA9IG5sQmVmb3JlLnNwbGl0KCcoJykubGVuZ3RoIC0gY2xvc2VQYXJlbnNCZWZvcmVcbiAgICAgIGxldCBjbGVhbkFmdGVyID0gbmxBZnRlclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGVuUGFyZW5zQmVmb3JlOyBpKyspIHtcbiAgICAgICAgY2xlYW5BZnRlciA9IGNsZWFuQWZ0ZXIucmVwbGFjZSgvXFwpWysqP10/LywgJycpXG4gICAgICB9XG4gICAgICBubEFmdGVyID0gY2xlYW5BZnRlclxuXG4gICAgICBjb25zdCBkb2xsYXIgPSBubEFmdGVyID09PSAnJyAmJiBpc1N1YiAhPT0gU1VCUEFSU0UgPyAnKD86JHxcXFxcLyknIDogJydcblxuICAgICAgcmUgPSBubEJlZm9yZSArIG5sRmlyc3QgKyBubEFmdGVyICsgZG9sbGFyICsgbmxMYXN0XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHJlIGlzIG5vdCBcIlwiIGF0IHRoaXMgcG9pbnQsIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmVcbiAgICAvLyBpdCBkb2Vzbid0IG1hdGNoIGFnYWluc3QgYW4gZW1wdHkgcGF0aCBwYXJ0LlxuICAgIC8vIE90aGVyd2lzZSBhLyogd2lsbCBtYXRjaCBhLywgd2hpY2ggaXQgc2hvdWxkIG5vdC5cbiAgICBpZiAocmUgIT09ICcnICYmIGhhc01hZ2ljKSB7XG4gICAgICByZSA9ICcoPz0uKScgKyByZVxuICAgIH1cblxuICAgIGlmIChhZGRQYXR0ZXJuU3RhcnQpIHtcbiAgICAgIHJlID0gcGF0dGVyblN0YXJ0KCkgKyByZVxuICAgIH1cblxuICAgIC8vIHBhcnNpbmcganVzdCBhIHBpZWNlIG9mIGEgbGFyZ2VyIHBhdHRlcm4uXG4gICAgaWYgKGlzU3ViID09PSBTVUJQQVJTRSkge1xuICAgICAgcmV0dXJuIFtyZSwgaGFzTWFnaWNdXG4gICAgfVxuXG4gICAgLy8gaWYgaXQncyBub2Nhc2UsIGFuZCB0aGUgbGNhc2UvdXBwZXJjYXNlIGRvbid0IG1hdGNoLCBpdCdzIG1hZ2ljXG4gICAgaWYgKG9wdGlvbnMubm9jYXNlICYmICFoYXNNYWdpYykge1xuICAgICAgaGFzTWFnaWMgPSBwYXR0ZXJuLnRvVXBwZXJDYXNlKCkgIT09IHBhdHRlcm4udG9Mb3dlckNhc2UoKVxuICAgIH1cblxuICAgIC8vIHNraXAgdGhlIHJlZ2V4cCBmb3Igbm9uLW1hZ2ljYWwgcGF0dGVybnNcbiAgICAvLyB1bmVzY2FwZSBhbnl0aGluZyBpbiBpdCwgdGhvdWdoLCBzbyB0aGF0IGl0J2xsIGJlXG4gICAgLy8gYW4gZXhhY3QgbWF0Y2ggYWdhaW5zdCBhIGZpbGUgZXRjLlxuICAgIGlmICghaGFzTWFnaWMpIHtcbiAgICAgIHJldHVybiBnbG9iVW5lc2NhcGUocGF0dGVybilcbiAgICB9XG5cbiAgICBjb25zdCBmbGFncyA9IG9wdGlvbnMubm9jYXNlID8gJ2knIDogJydcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFJlZ0V4cCgnXicgKyByZSArICckJywgZmxhZ3MpLCB7XG4gICAgICAgIF9nbG9iOiBwYXR0ZXJuLFxuICAgICAgICBfc3JjOiByZSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXIpIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gc2hvdWxkIGJlIGltcG9zc2libGUgKi8ge1xuICAgICAgLy8gSWYgaXQgd2FzIGFuIGludmFsaWQgcmVndWxhciBleHByZXNzaW9uLCB0aGVuIGl0IGNhbid0IG1hdGNoXG4gICAgICAvLyBhbnl0aGluZy4gIFRoaXMgdHJpY2sgbG9va3MgZm9yIGEgY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2ZcbiAgICAgIC8vIHRoZSBzdHJpbmcsIHdoaWNoIGlzIG9mIGNvdXJzZSBpbXBvc3NpYmxlLCBleGNlcHQgaW4gbXVsdGktbGluZVxuICAgICAgLy8gbW9kZSwgYnV0IGl0J3Mgbm90IGEgL20gcmVnZXguXG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnJC4nKVxuICAgIH1cbiAgfVxuXG4gIG1ha2VSZSAoKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwIHx8IHRoaXMucmVnZXhwID09PSBmYWxzZSkgcmV0dXJuIHRoaXMucmVnZXhwXG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGlzLnNldCBpcyBhIDJkIGFycmF5IG9mIHBhcnRpYWxcbiAgICAvLyBwYXR0ZXJuIHN0cmluZ3MsIG9yIFwiKipcIi5cbiAgICAvL1xuICAgIC8vIEl0J3MgYmV0dGVyIHRvIHVzZSAubWF0Y2goKS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0XG4gICAgLy8gYmUgdXNlZCwgcmVhbGx5LCBidXQgaXQncyBwcmV0dHkgY29udmVuaWVudCBzb21ldGltZXMsXG4gICAgLy8gd2hlbiB5b3UganVzdCB3YW50IHRvIHdvcmsgd2l0aCBhIHJlZ2V4LlxuICAgIGNvbnN0IHNldCA9IHRoaXMuc2V0XG5cbiAgICBpZiAoIXNldC5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVnZXhwID0gZmFsc2VcbiAgICAgIHJldHVybiB0aGlzLnJlZ2V4cFxuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgICBjb25zdCB0d29TdGFyID0gb3B0aW9ucy5ub2dsb2JzdGFyID8gc3RhclxuICAgICAgOiBvcHRpb25zLmRvdCA/IHR3b1N0YXJEb3RcbiAgICAgIDogdHdvU3Rhck5vRG90XG4gICAgY29uc3QgZmxhZ3MgPSBvcHRpb25zLm5vY2FzZSA/ICdpJyA6ICcnXG5cbiAgICAvLyBjb2FsZXNjZSBnbG9ic3RhcnMgYW5kIHJlZ2V4cGlmeSBub24tZ2xvYnN0YXIgcGF0dGVybnNcbiAgICAvLyBpZiBpdCdzIHRoZSBvbmx5IGl0ZW0sIHRoZW4gd2UganVzdCBkbyBvbmUgdHdvU3RhclxuICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LCBhbmQgdGhlcmUgYXJlIG1vcmUsIHByZXBlbmQgKFxcL3x0d29TdGFyXFwvKT8gdG8gbmV4dFxuICAgIC8vIGlmIGl0J3MgdGhlIGxhc3QsIGFwcGVuZCAoXFwvdHdvU3RhcnwpIHRvIHByZXZpb3VzXG4gICAgLy8gaWYgaXQncyBpbiB0aGUgbWlkZGxlLCBhcHBlbmQgKFxcL3xcXC90d29TdGFyXFwvKSB0byBwcmV2aW91c1xuICAgIC8vIHRoZW4gZmlsdGVyIG91dCBHTE9CU1RBUiBzeW1ib2xzXG4gICAgbGV0IHJlID0gc2V0Lm1hcChwYXR0ZXJuID0+IHtcbiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLm1hcChwID0+XG4gICAgICAgIHR5cGVvZiBwID09PSAnc3RyaW5nJyA/IHJlZ0V4cEVzY2FwZShwKVxuICAgICAgICA6IHAgPT09IEdMT0JTVEFSID8gR0xPQlNUQVJcbiAgICAgICAgOiBwLl9zcmNcbiAgICAgICkucmVkdWNlKChzZXQsIHApID0+IHtcbiAgICAgICAgaWYgKCEoc2V0W3NldC5sZW5ndGggLSAxXSA9PT0gR0xPQlNUQVIgJiYgcCA9PT0gR0xPQlNUQVIpKSB7XG4gICAgICAgICAgc2V0LnB1c2gocClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0XG4gICAgICB9LCBbXSlcbiAgICAgIHBhdHRlcm4uZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICBpZiAocCAhPT0gR0xPQlNUQVIgfHwgcGF0dGVybltpLTFdID09PSBHTE9CU1RBUikge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgcGF0dGVybltpKzFdID0gJyg/OlxcXFxcXC98JyArIHR3b1N0YXIgKyAnXFxcXFxcLyk/JyArIHBhdHRlcm5baSsxXVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXR0ZXJuW2ldID0gdHdvU3RhclxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpID09PSBwYXR0ZXJuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBwYXR0ZXJuW2ktMV0gKz0gJyg/OlxcXFxcXC98JyArIHR3b1N0YXIgKyAnKT8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0dGVybltpLTFdICs9ICcoPzpcXFxcXFwvfFxcXFxcXC8nICsgdHdvU3RhciArICdcXFxcXFwvKScgKyBwYXR0ZXJuW2krMV1cbiAgICAgICAgICBwYXR0ZXJuW2krMV0gPSBHTE9CU1RBUlxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIHBhdHRlcm4uZmlsdGVyKHAgPT4gcCAhPT0gR0xPQlNUQVIpLmpvaW4oJy8nKVxuICAgIH0pLmpvaW4oJ3wnKVxuXG4gICAgLy8gbXVzdCBtYXRjaCBlbnRpcmUgcGF0dGVyblxuICAgIC8vIGVuZGluZyBpbiBhICogb3IgKiogd2lsbCBtYWtlIGl0IGxlc3Mgc3RyaWN0LlxuICAgIHJlID0gJ14oPzonICsgcmUgKyAnKSQnXG5cbiAgICAvLyBjYW4gbWF0Y2ggYW55dGhpbmcsIGFzIGxvbmcgYXMgaXQncyBub3QgdGhpcy5cbiAgICBpZiAodGhpcy5uZWdhdGUpIHJlID0gJ14oPyEnICsgcmUgKyAnKS4qJCdcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlZ2V4cCA9IG5ldyBSZWdFeHAocmUsIGZsYWdzKVxuICAgIH0gY2F0Y2ggKGV4KSAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIHNob3VsZCBiZSBpbXBvc3NpYmxlICovIHtcbiAgICAgIHRoaXMucmVnZXhwID0gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVnZXhwXG4gIH1cblxuICBtYXRjaCAoZiwgcGFydGlhbCA9IHRoaXMucGFydGlhbCkge1xuICAgIHRoaXMuZGVidWcoJ21hdGNoJywgZiwgdGhpcy5wYXR0ZXJuKVxuICAgIC8vIHNob3J0LWNpcmN1aXQgaW4gdGhlIGNhc2Ugb2YgYnVzdGVkIHRoaW5ncy5cbiAgICAvLyBjb21tZW50cywgZXRjLlxuICAgIGlmICh0aGlzLmNvbW1lbnQpIHJldHVybiBmYWxzZVxuICAgIGlmICh0aGlzLmVtcHR5KSByZXR1cm4gZiA9PT0gJydcblxuICAgIGlmIChmID09PSAnLycgJiYgcGFydGlhbCkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICAgIC8vIHdpbmRvd3M6IG5lZWQgdG8gdXNlIC8sIG5vdCBcXFxuICAgIGlmIChwYXRoLnNlcCAhPT0gJy8nKSB7XG4gICAgICBmID0gZi5zcGxpdChwYXRoLnNlcCkuam9pbignLycpXG4gICAgfVxuXG4gICAgLy8gdHJlYXQgdGhlIHRlc3QgcGF0aCBhcyBhIHNldCBvZiBwYXRocGFydHMuXG4gICAgZiA9IGYuc3BsaXQoc2xhc2hTcGxpdClcbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgJ3NwbGl0JywgZilcblxuICAgIC8vIGp1c3QgT05FIG9mIHRoZSBwYXR0ZXJuIHNldHMgaW4gdGhpcy5zZXQgbmVlZHMgdG8gbWF0Y2hcbiAgICAvLyBpbiBvcmRlciBmb3IgaXQgdG8gYmUgdmFsaWQuICBJZiBuZWdhdGluZywgdGhlbiBqdXN0IG9uZVxuICAgIC8vIG1hdGNoIG1lYW5zIHRoYXQgd2UgaGF2ZSBmYWlsZWQuXG4gICAgLy8gRWl0aGVyIHdheSwgcmV0dXJuIG9uIHRoZSBmaXJzdCBoaXQuXG5cbiAgICBjb25zdCBzZXQgPSB0aGlzLnNldFxuICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnc2V0Jywgc2V0KVxuXG4gICAgLy8gRmluZCB0aGUgYmFzZW5hbWUgb2YgdGhlIHBhdGggYnkgbG9va2luZyBmb3IgdGhlIGxhc3Qgbm9uLWVtcHR5IHNlZ21lbnRcbiAgICBsZXQgZmlsZW5hbWVcbiAgICBmb3IgKGxldCBpID0gZi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgZmlsZW5hbWUgPSBmW2ldXG4gICAgICBpZiAoZmlsZW5hbWUpIGJyZWFrXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBzZXRbaV1cbiAgICAgIGxldCBmaWxlID0gZlxuICAgICAgaWYgKG9wdGlvbnMubWF0Y2hCYXNlICYmIHBhdHRlcm4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbGUgPSBbZmlsZW5hbWVdXG4gICAgICB9XG4gICAgICBjb25zdCBoaXQgPSB0aGlzLm1hdGNoT25lKGZpbGUsIHBhdHRlcm4sIHBhcnRpYWwpXG4gICAgICBpZiAoaGl0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiAhdGhpcy5uZWdhdGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkaWRuJ3QgZ2V0IGFueSBoaXRzLiAgdGhpcyBpcyBzdWNjZXNzIGlmIGl0J3MgYSBuZWdhdGl2ZVxuICAgIC8vIHBhdHRlcm4sIGZhaWx1cmUgb3RoZXJ3aXNlLlxuICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0aGlzLm5lZ2F0ZVxuICB9XG5cbiAgc3RhdGljIGRlZmF1bHRzIChkZWYpIHtcbiAgICByZXR1cm4gbWluaW1hdGNoLmRlZmF1bHRzKGRlZikuTWluaW1hdGNoXG4gIH1cbn1cblxubWluaW1hdGNoLk1pbmltYXRjaCA9IE1pbmltYXRjaFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///25835\n")},64043:(__unused_webpack_module,exports,__webpack_require__)=>{eval(";(function (sax) { // wrapper for non-node envs\n sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n sax.SAXParser = SAXParser\n sax.SAXStream = SAXStream\n sax.createStream = createStream\n\n // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n // since that's the earliest that a buffer overrun could occur. This way, checks are\n // as rare as required, but as often as necessary to ensure never crossing this bound.\n // Furthermore, buffers are only tested at most once per write(), so passing a very\n // large string into write() might have undesirable effects, but this is manageable by\n // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme\n // edge case, result in creating at most one complete copy of the string passed in.\n // Set to Infinity to have unlimited buffers.\n sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n var buffers = [\n 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n 'procInstName', 'procInstBody', 'entity', 'attribName',\n 'attribValue', 'cdata', 'script'\n ]\n\n sax.EVENTS = [\n 'text',\n 'processinginstruction',\n 'sgmldeclaration',\n 'doctype',\n 'comment',\n 'opentagstart',\n 'attribute',\n 'opentag',\n 'closetag',\n 'opencdata',\n 'cdata',\n 'closecdata',\n 'error',\n 'end',\n 'ready',\n 'script',\n 'opennamespace',\n 'closenamespace'\n ]\n\n function SAXParser (strict, opt) {\n if (!(this instanceof SAXParser)) {\n return new SAXParser(strict, opt)\n }\n\n var parser = this\n clearBuffers(parser)\n parser.q = parser.c = ''\n parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n parser.opt = opt || {}\n parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n parser.tags = []\n parser.closed = parser.closedRoot = parser.sawRoot = false\n parser.tag = parser.error = null\n parser.strict = !!strict\n parser.noscript = !!(strict || parser.opt.noscript)\n parser.state = S.BEGIN\n parser.strictEntities = parser.opt.strictEntities\n parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n parser.attribList = []\n\n // namespaces form a prototype chain.\n // it always points at the current tag,\n // which protos to its parent tag.\n if (parser.opt.xmlns) {\n parser.ns = Object.create(rootNS)\n }\n\n // mostly just for error reporting\n parser.trackPosition = parser.opt.position !== false\n if (parser.trackPosition) {\n parser.position = parser.line = parser.column = 0\n }\n emit(parser, 'onready')\n }\n\n if (!Object.create) {\n Object.create = function (o) {\n function F () {}\n F.prototype = o\n var newf = new F()\n return newf\n }\n }\n\n if (!Object.keys) {\n Object.keys = function (o) {\n var a = []\n for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n return a\n }\n }\n\n function checkBufferLength (parser) {\n var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n var maxActual = 0\n for (var i = 0, l = buffers.length; i < l; i++) {\n var len = parser[buffers[i]].length\n if (len > maxAllowed) {\n // Text/cdata nodes can get big, and since they're buffered,\n // we can get here under normal conditions.\n // Avoid issues by emitting the text node now,\n // so at least it won't get any bigger.\n switch (buffers[i]) {\n case 'textNode':\n closeText(parser)\n break\n\n case 'cdata':\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n break\n\n case 'script':\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n break\n\n default:\n error(parser, 'Max buffer length exceeded: ' + buffers[i])\n }\n }\n maxActual = Math.max(maxActual, len)\n }\n // schedule the next check for the earliest possible buffer overrun.\n var m = sax.MAX_BUFFER_LENGTH - maxActual\n parser.bufferCheckPosition = m + parser.position\n }\n\n function clearBuffers (parser) {\n for (var i = 0, l = buffers.length; i < l; i++) {\n parser[buffers[i]] = ''\n }\n }\n\n function flushBuffers (parser) {\n closeText(parser)\n if (parser.cdata !== '') {\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n }\n if (parser.script !== '') {\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n }\n\n SAXParser.prototype = {\n end: function () { end(this) },\n write: write,\n resume: function () { this.error = null; return this },\n close: function () { return this.write(null) },\n flush: function () { flushBuffers(this) }\n }\n\n var Stream\n try {\n Stream = (__webpack_require__(2203).Stream)\n } catch (ex) {\n Stream = function () {}\n }\n if (!Stream) Stream = function () {}\n\n var streamWraps = sax.EVENTS.filter(function (ev) {\n return ev !== 'error' && ev !== 'end'\n })\n\n function createStream (strict, opt) {\n return new SAXStream(strict, opt)\n }\n\n function SAXStream (strict, opt) {\n if (!(this instanceof SAXStream)) {\n return new SAXStream(strict, opt)\n }\n\n Stream.apply(this)\n\n this._parser = new SAXParser(strict, opt)\n this.writable = true\n this.readable = true\n\n var me = this\n\n this._parser.onend = function () {\n me.emit('end')\n }\n\n this._parser.onerror = function (er) {\n me.emit('error', er)\n\n // if didn't throw, then means error was handled.\n // go ahead and clear error, so we can write again.\n me._parser.error = null\n }\n\n this._decoder = null\n\n streamWraps.forEach(function (ev) {\n Object.defineProperty(me, 'on' + ev, {\n get: function () {\n return me._parser['on' + ev]\n },\n set: function (h) {\n if (!h) {\n me.removeAllListeners(ev)\n me._parser['on' + ev] = h\n return h\n }\n me.on(ev, h)\n },\n enumerable: true,\n configurable: false\n })\n })\n }\n\n SAXStream.prototype = Object.create(Stream.prototype, {\n constructor: {\n value: SAXStream\n }\n })\n\n SAXStream.prototype.write = function (data) {\n if (typeof Buffer === 'function' &&\n typeof Buffer.isBuffer === 'function' &&\n Buffer.isBuffer(data)) {\n if (!this._decoder) {\n var SD = (__webpack_require__(13193).StringDecoder)\n this._decoder = new SD('utf8')\n }\n data = this._decoder.write(data)\n }\n\n this._parser.write(data.toString())\n this.emit('data', data)\n return true\n }\n\n SAXStream.prototype.end = function (chunk) {\n if (chunk && chunk.length) {\n this.write(chunk)\n }\n this._parser.end()\n return true\n }\n\n SAXStream.prototype.on = function (ev, handler) {\n var me = this\n if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n me._parser['on' + ev] = function () {\n var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n args.splice(0, 0, ev)\n me.emit.apply(me, args)\n }\n }\n\n return Stream.prototype.on.call(me, ev, handler)\n }\n\n // this really needs to be replaced with character classes.\n // XML allows all manner of ridiculous numbers and digits.\n var CDATA = '[CDATA['\n var DOCTYPE = 'DOCTYPE'\n var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n // This implementation works on strings, a single character at a time\n // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n // without a significant breaking change to either this parser, or the\n // JavaScript language. Implementation of an emoji-capable xml parser\n // is left as an exercise for the reader.\n var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n function isWhitespace (c) {\n return c === ' ' || c === '\\n' || c === '\\r' || c === '\\t'\n }\n\n function isQuote (c) {\n return c === '\"' || c === '\\''\n }\n\n function isAttribEnd (c) {\n return c === '>' || isWhitespace(c)\n }\n\n function isMatch (regex, c) {\n return regex.test(c)\n }\n\n function notMatch (regex, c) {\n return !isMatch(regex, c)\n }\n\n var S = 0\n sax.STATE = {\n BEGIN: S++, // leading byte order mark or whitespace\n BEGIN_WHITESPACE: S++, // leading whitespace\n TEXT: S++, // general stuff\n TEXT_ENTITY: S++, // & and such.\n OPEN_WAKA: S++, // <\n SGML_DECL: S++, // \n SCRIPT: S++, //